feat(storefront): update FAQ and legal documentation

- Added new FAQ sections for account security, ordering and checkout, returns, shipping, and contact information.
- Introduced legal documents including privacy policy, terms of service, data protection, and general terms and conditions.
- Updated package dependencies to include gray-matter and remark-gfm for enhanced markdown support.
This commit is contained in:
2026-03-13 21:39:25 +03:00
parent f1dbf0b6ee
commit c8f5d8d096
52 changed files with 2273 additions and 261 deletions

View File

@@ -0,0 +1,152 @@
import type { Metadata } from "next";
import Link from "next/link";
import { ContactForm } from "@/components/contact/ContactForm";
export const metadata: Metadata = {
title: "Contact Us",
description:
"Get in touch with The Pet Loft. Postal address, support and service emails, and send us an inquiry.",
};
function FacebookIcon() {
return (
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z" />
</svg>
);
}
function InstagramIcon() {
return (
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z" />
</svg>
);
}
function TwitterIcon() {
return (
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" />
</svg>
);
}
const socialLinks = [
{ href: "https://facebook.com", label: "Facebook", icon: FacebookIcon },
{ href: "https://instagram.com", label: "Instagram", icon: InstagramIcon },
{ href: "https://twitter.com", label: "Twitter / X", icon: TwitterIcon },
];
export default function ContactUsPage() {
return (
<main className="mx-auto min-w-0 max-w-[1400px] px-4 py-8 md:px-6 md:py-12">
<h1 className="font-[family-name:var(--font-fraunces)] text-2xl font-bold text-[#1a2e2d] md:text-3xl">
Contact Us
</h1>
<p className="mt-2 text-[#3d5554]">
We&apos;d love to hear from you. Use the form to send an inquiry or find our details below.
</p>
<div className="mt-8 grid grid-cols-1 gap-10 lg:grid-cols-2 lg:gap-16">
{/* Left column: address, emails, socials */}
<section className="flex flex-col gap-8" aria-label="Contact details">
<section aria-labelledby="postal-heading">
<h2
id="postal-heading"
className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]"
>
Postal address
</h2>
<address className="mt-2 not-italic text-[#1a2e2d] leading-relaxed">
The Pet Loft
<br />
123 High Street
<br />
London, SW1A 1AA
<br />
United Kingdom
</address>
</section>
<section aria-labelledby="emails-heading">
<h2
id="emails-heading"
className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]"
>
Support and service emails
</h2>
<ul className="mt-2 space-y-1 text-[#1a2e2d]">
<li>
<a
href="mailto:support@thepetloft.com"
className="text-[#38a99f] underline transition-colors hover:text-[#236f6b]"
>
support@thepetloft.com
</a>
<span className="ml-1 text-[#3d5554]"> general support</span>
</li>
<li>
<a
href="mailto:service@thepetloft.com"
className="text-[#38a99f] underline transition-colors hover:text-[#236f6b]"
>
service@thepetloft.com
</a>
<span className="ml-1 text-[#3d5554]"> orders &amp; delivery</span>
</li>
</ul>
</section>
<section aria-labelledby="follow-heading">
<h2
id="follow-heading"
className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]"
>
Follow us
</h2>
<div className="mt-2 flex items-center gap-3">
{socialLinks.map(({ href, label, icon: Icon }) => (
<a
key={label}
href={href}
target="_blank"
rel="noopener noreferrer"
aria-label={label}
className="flex h-9 w-9 items-center justify-center rounded-full bg-[#f0f8f7] text-[#3d5554] transition-colors hover:bg-[#e8f7f6] hover:text-[#236f6b]"
>
<Icon />
</a>
))}
</div>
</section>
</section>
{/* Right column: Inquiries form */}
<section aria-labelledby="inquiries-heading">
<h2
id="inquiries-heading"
className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]"
>
Inquiries
</h2>
<p className="mt-1 text-sm text-[#3d5554]">
Send us a message and we&apos;ll get back to you as soon as we can.
</p>
<div className="mt-5">
<ContactForm />
</div>
</section>
</div>
<p className="mt-10 text-sm text-[#3d5554]">
<Link
href="/shop"
className="font-medium text-[#38a99f] underline transition-colors hover:text-[#236f6b]"
>
Back to shop
</Link>
</p>
</main>
);
}

View File

@@ -0,0 +1,44 @@
import Link from "next/link";
import { FaqPageView } from "@/components/support/FaqPageView";
import { getFaqSections } from "@/lib/faq/getFaqSections";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "FAQs",
description:
"Frequently asked questions about ordering, shipping, returns, your account, and how to contact The Pet Loft.",
};
export default function FaqsPage() {
const sections = getFaqSections();
return (
<main className="mx-auto max-w-4xl px-4 py-8 md:px-6 md:py-12">
<Link
href="/shop"
className="mb-6 inline-flex items-center gap-1 text-sm text-[#3d5554] transition-colors hover:text-[#236f6b]"
>
Back to Shop
</Link>
<h1 className="font-[family-name:var(--font-fraunces)] text-2xl font-bold text-[#1a2e2d] md:text-3xl">
Frequently asked questions
</h1>
<p className="mt-2 text-[#3d5554]">
Select a topic below to see common questions and answers.
</p>
<div className="mt-8">
<FaqPageView sections={sections} lastUpdated="March 2025" />
</div>
<p className="mt-10 text-sm text-[#3d5554]">
Can&apos;t find what you need?{" "}
<Link
href="/support/contact-us"
className="font-medium text-[#38a99f] underline transition-colors hover:text-[#236f6b]"
>
Contact us
</Link>
.
</p>
</main>
);
}

View File

@@ -0,0 +1,72 @@
import type { Metadata } from "next";
import Link from "next/link";
export const metadata: Metadata = {
title: "Payment Security",
description:
"The Pet Loft payment security: how we keep your payment details safe with industry-standard encryption.",
};
export default function PaymentSecurityPage() {
return (
<main className="mx-auto max-w-3xl px-4 py-8 md:px-6 md:py-12">
<Link
href="/shop"
className="mb-6 inline-flex items-center gap-1 text-sm text-[#3d5554] transition-colors hover:text-[#236f6b]"
>
Back to Shop
</Link>
<article className="prose prose-[#1a2e2d] max-w-none">
<h1 className="font-[family-name:var(--font-fraunces)] text-2xl font-bold text-[#1a2e2d] md:text-3xl">
Payment Security
</h1>
<p className="mt-2 text-[#3d5554]">Last updated: March 2025</p>
<section className="mt-6 space-y-4">
<h2 className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]">
Secure Checkout
</h2>
<p className="text-[#1a2e2d] leading-relaxed">
All payments are processed securely through Stripe, a PCI-compliant
payment provider trusted by millions of businesses worldwide. We
never store your full card details on our servers.
</p>
</section>
<section className="mt-8 space-y-4">
<h2 className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]">
Industry Standard Protection
</h2>
<p className="text-[#1a2e2d] leading-relaxed">
Our checkout uses TLS encryption to protect your data in transit.
Stripe is certified to PCI Service Provider Level 1, the highest
standard in the payments industry. Your card information is
tokenised and never exposed to our systems.
</p>
</section>
<section className="mt-8 space-y-4">
<h2 className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]">
Accepted Payment Methods
</h2>
<p className="text-[#1a2e2d] leading-relaxed">
We accept major credit and debit cards (Visa, Mastercard, Discover),
Apple Pay, Google Pay, and Klarna. Choose your preferred method at
checkout.
</p>
</section>
<p className="mt-10 text-sm text-[#3d5554]">
Questions about security?{" "}
<Link
href="/contact"
className="font-medium text-[#38a99f] underline transition-colors hover:text-[#236f6b]"
>
Contact us
</Link>
.
</p>
</article>
</main>
);
}

View File

@@ -0,0 +1,131 @@
import type { Metadata } from "next";
import Link from "next/link";
export const metadata: Metadata = {
title: "Returns & Refunds Policy",
description:
"The Pet Loft returns policy: how to return items, refund process, and conditions for easy returns.",
};
export default function ReturnsPolicyPage() {
return (
<main className="mx-auto max-w-3xl px-4 py-8 md:px-6 md:py-12">
<Link
href="/shop"
className="mb-6 inline-flex items-center gap-1 text-sm text-[#3d5554] transition-colors hover:text-[#236f6b]"
>
Back to Shop
</Link>
<article className="prose prose-[#1a2e2d] max-w-none">
<h1 className="font-[family-name:var(--font-fraunces)] text-2xl font-bold text-[#1a2e2d] md:text-3xl">
Returns & Refunds Policy
</h1>
<p className="mt-2 text-[#3d5554]">Last updated: 02 February 2026</p>
<section className="mt-6 space-y-4">
<h2 className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]">
Right of Withdrawal
</h2>
<p className="text-[#1a2e2d] leading-relaxed">
You have the right to withdraw from your contract within 14 days
without giving any reason. The withdrawal period expires 14 days
from the day on which you (or a third party indicated by you, other
than the carrier) acquire physical possession of the goods.
</p>
</section>
<section className="mt-8 space-y-4">
<h2 className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]">
How to withdraw
</h2>
<p className="text-[#1a2e2d] leading-relaxed">
To exercise the right of withdrawal, you must inform us at The Pet
Loft UK, Customer Services, 39a Walton Road, Woking, GU21 5DL, or by
email at{" "}
<a
href="mailto:service@thepetloft.co.uk"
className="font-medium text-[#38a99f] underline transition-colors hover:text-[#236f6b]"
>
service@thepetloft.co.uk
</a>{" "}
of your decision by an unequivocal statement (e.g. a letter by post
or email). You may use the model withdrawal form, but it is not
obligatory. To meet the deadline, it is sufficient for you to send
your communication before the withdrawal period has expired.
</p>
</section>
<section className="mt-8 space-y-4">
<h2 className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]">
Effects of withdrawal
</h2>
<p className="text-[#1a2e2d] leading-relaxed">
If you withdraw, we shall reimburse all payments received from you,
including delivery costs (except supplementary costs from choosing a
delivery type other than our least expensive standard option),
without undue delay and in any event not later than 14 days from the
day we are informed of your withdrawal. The cost of returning the
goods is borne by you and will be deducted from the refund amount.
We will use the same means of payment as you used for the initial
transaction unless you have expressly agreed otherwise. We may
withhold reimbursement until we have received the goods back or you
have supplied evidence of having sent them back, whichever is the
earliest.
</p>
</section>
<section className="mt-8 space-y-4">
<h2 className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]">
Return address
</h2>
<p className="text-[#1a2e2d] leading-relaxed">
Please send the goods back to: <strong>Fanaaka Ltd</strong>, 39a
Walton Road, Woking, GU21 5DL without undue delay and in any event
not later than 14 days from the day you communicate your withdrawal.
The deadline is met if you send the goods back before the 14-day
period has expired. You incur the cost of returning the goods; this
amount will be deducted from your refund. You are only liable for
any diminished value resulting from handling
beyond what is necessary to establish the nature, characteristics,
and functioning of the goods.
</p>
</section>
<section className="mt-8 space-y-4">
<h2 className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]">
Exclusions
</h2>
<p className="text-[#1a2e2d] leading-relaxed">
The right of withdrawal does not apply to:
</p>
<ul className="list-inside list-disc space-y-1 text-[#1a2e2d]">
<li>
Goods made to order or clearly tailored to your personal
requirements
</li>
<li>
Goods that may perish quickly or whose use-by date would expire
rapidly
</li>
<li>
Goods not suitable for return for reasons of health or hygiene if
their seal has been broken after delivery
</li>
<li>Goods that were, after delivery, inseparably mixed with other goods</li>
</ul>
</section>
<p className="mt-10 text-sm text-[#3d5554]">
Need help?{" "}
<Link
href="/support/contact-us"
className="font-medium text-[#38a99f] underline transition-colors hover:text-[#236f6b]"
>
Contact us
</Link>
.
</p>
</article>
</main>
);
}

View File

@@ -0,0 +1,71 @@
import type { Metadata } from "next";
import Link from "next/link";
export const metadata: Metadata = {
title: "Shipping Policy",
description:
"The Pet Loft shipping policy: free delivery on orders over £40, delivery times, and carrier information.",
};
export default function ShippingPolicyPage() {
return (
<main className="mx-auto max-w-3xl px-4 py-8 md:px-6 md:py-12">
<Link
href="/shop"
className="mb-6 inline-flex items-center gap-1 text-sm text-[#3d5554] transition-colors hover:text-[#236f6b]"
>
Back to Shop
</Link>
<article className="prose prose-[#1a2e2d] max-w-none">
<h1 className="font-[family-name:var(--font-fraunces)] text-2xl font-bold text-[#1a2e2d] md:text-3xl">
Shipping Policy
</h1>
<p className="mt-2 text-[#3d5554]">Last updated: March 2025</p>
<section className="mt-6 space-y-4">
<h2 className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]">
Free Delivery on Orders Over £40
</h2>
<p className="text-[#1a2e2d] leading-relaxed">
We offer free standard delivery on all orders over £40. The discount
is automatically applied at checkout no code required.
</p>
</section>
<section className="mt-8 space-y-4">
<h2 className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]">
Delivery Times
</h2>
<p className="text-[#1a2e2d] leading-relaxed">
Standard delivery typically takes 35 working days for UK mainland.
We partner with trusted carriers including DPD and Evri to get your
pet supplies to you safely and on time.
</p>
</section>
<section className="mt-8 space-y-4">
<h2 className="font-[family-name:var(--font-fraunces)] text-lg font-semibold text-[#236f6b]">
Terms & Conditions
</h2>
<p className="text-[#1a2e2d] leading-relaxed">
Free shipping applies to UK mainland only. Orders under £40 may
incur a delivery charge. Delivery times are estimates and may vary
during peak periods. We reserve the right to exclude certain items
from free delivery promotions.
</p>
</section>
<p className="mt-10 text-sm text-[#3d5554]">
Questions?{" "}
<Link
href="/contact"
className="font-medium text-[#38a99f] underline transition-colors hover:text-[#236f6b]"
>
Contact us
</Link>
.
</p>
</article>
</main>
);
}