Files
route-commerce/src/app/privacy-policy/page.tsx
T
tyler 0245aa29cc fix(buyer/billing/comms/a11y): Codex review pass round 2
Tuxedo buyer path (subagent 2):
- src/app/tuxedo/page.tsx: remove duplicate CinematicShowcase render
- src/components/storefront/CinematicShowcase.tsx: wire up useCart, Add to Cart button, brand-aware fulfillment
- src/app/tuxedo/stops/TuxedoStopsList.tsx: improved empty state with calendar icon + CTAs
- src/app/cart/CartClient.tsx: guard against empty cart checkout; 'Cart is Empty' state

Billing reconciliation (subagent 3):
- src/actions/billing/billing-overview.ts: NEW — single source of truth
- src/app/admin/settings/billing/page.tsx: use getBillingOverview
- src/app/admin/settings/billing/BillingClientPage.tsx: rewritten to consume BillingOverview (status pill, addons state, removable flags, derived invoice amounts, usage footer)
- src/app/admin/page.tsx: use getBillingOverview (aligns dashboard with billing)
- src/components/admin/DashboardClient.tsx: 'Active Products' now reads from getBillingOverview
- supabase/migrations/203_plan_usage_active_products.sql: get_brand_plan_info counts products as active=true AND deleted_at IS NULL

Harvest Reach dedup + audience preview (manual, subagent 4 didn't complete):
- src/components/admin/CommunicationsPage.tsx: add initialTab prop
- src/app/admin/communications/compose/page.tsx: now renders with initialTab='compose' (single compose experience, no duplicate edit panel)
- src/components/admin/HarvestReach/CampaignComposerPage.tsx: always-visible audience preview panel (count + sample emails), loads via previewCampaignAudience action

Layout/content consistency + a11y sweep (subagent 5):
- src/components/layout/SiteHeader.tsx: Admin link only shows for authenticated admin users
- src/components/Providers.tsx: suppress public SiteHeader/Footer for /admin, /cart, /checkout, /wholesale, /water (fixes duplicate headers)
- src/app/contact/ContactClientPage.tsx: Phone/Email now use tel:/mailto: links; dynamic year
- src/app/blog/page.tsx, changelog, privacy-policy, roadmap, security, terms-and-conditions, waitlist: dynamic year
- src/app/admin/wholesale/WholesaleClient.tsx: proper htmlFor/id, type=email/tel, autoComplete
- src/app/admin/settings/ai/AIClient.tsx: proper htmlFor/id, required + aria-required
- src/app/admin/settings/integrations/IntegrationsClient.tsx: only mask secret fields; add required + aria-required + CredentialField.required type
- src/app/admin/water-log/headgates/HeadgatesManager.tsx: htmlFor/id, aria-required
- src/components/admin/CreateUserModal.tsx: htmlFor/id, required, aria-required, aria-describedby, autoComplete
- src/app/admin/me/AdminMeClient.tsx, products/import, sales/import, water-log/settings, login, brands, tuxedo: a11y polish (ids/required/aria)
2026-06-03 16:39:19 +00:00

140 lines
7.2 KiB
TypeScript

import type { Metadata, Viewport } from "next";
import Link from "next/link";
const BASE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? "https://routecommerce.com";
export const metadata: Metadata = {
title: "Privacy Policy — Route Commerce",
description: "Privacy Policy for Route Commerce platform. Learn how we collect, use, and protect your personal information.",
keywords: ["privacy policy", "data protection", "GDPR", "CCPA", "Route Commerce privacy", "personal information"],
authors: [{ name: "Route Commerce" }],
creator: "Route Commerce",
publisher: "Route Commerce",
openGraph: {
title: "Privacy Policy — Route Commerce",
description: "Learn how Route Commerce collects, uses, and protects your personal information.",
url: `${BASE_URL}/privacy-policy`,
siteName: "Route Commerce",
locale: "en_US",
type: "website",
},
alternates: {
canonical: `${BASE_URL}/privacy-policy`,
},
robots: {
index: true,
follow: true,
},
};
export const viewport: Viewport = {
width: "device-width",
initialScale: 1,
maximumScale: 5,
};
export default function PrivacyPolicyPage() {
return (
<div className="min-h-screen bg-white">
{/* Header */}
<header className="fixed top-0 left-0 right-0 z-50 bg-white/90 backdrop-blur-xl border-b border-[#e5e5e5]">
<div className="max-w-5xl mx-auto px-6 py-4 flex items-center justify-between">
<Link href="/" className="flex items-center gap-3">
<div className="w-11 h-11 rounded-2xl bg-gradient-to-br from-[#1a4d2e] to-[#2d6a4f] flex items-center justify-center shadow-lg shadow-[#1a4d2e]/20">
<svg className="w-6 h-6 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2.5}>
<path strokeLinecap="round" strokeLinejoin="round" d="M13 10V3L4 14h7v7l9-11h-7z" />
</svg>
</div>
<span className="text-xl font-bold text-[#1a1a1a] tracking-tight">Route Commerce</span>
</Link>
<Link href="/" className="text-sm font-medium text-[#666] hover:text-[#1a4d2e] transition-colors">
Back to Home
</Link>
</div>
</header>
<main className="max-w-3xl mx-auto px-6 py-32">
<Link href="/" className="inline-flex items-center gap-2 text-sm text-[#888] hover:text-[#1a4d2e] transition-colors mb-8">
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
<path strokeLinecap="round" strokeLinejoin="round" d="M15 19l-7-7 7-7" />
</svg>
Back to Home
</Link>
<div className="mb-12">
<p className="text-sm font-bold tracking-[0.15em] uppercase text-[#1a4d2e] mb-3">Legal</p>
<h1 className="text-4xl sm:text-5xl font-black text-[#0a0a0a] tracking-tight mb-4">Privacy Policy</h1>
<p className="text-sm text-[#888]">Last updated: {new Date().toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" })}</p>
</div>
<div className="prose prose-stone max-w-none">
<div className="bg-white rounded-3xl border border-[#e5e5e5] p-8 sm:p-10 shadow-sm">
<div className="space-y-6 text-[#555] leading-relaxed">
<p className="text-lg text-[#333]">
Your privacy matters to us. This Privacy Policy explains how Route Commerce collects, uses, and protects your information when you use our platform.
</p>
<h2 className="text-xl font-bold text-[#0a0a0a] mt-8 mb-4">Information We Collect</h2>
<p>We collect information you provide directly, such as when you create an account, place an order, or contact us. This includes:</p>
<ul className="list-disc pl-6 space-y-2">
<li>Name, email address, and phone number</li>
<li>Billing and shipping addresses</li>
<li>Payment information</li>
<li>Order history and preferences</li>
</ul>
<h2 className="text-xl font-bold text-[#0a0a0a] mt-8 mb-4">How We Use Your Information</h2>
<p>We use the information we collect to:</p>
<ul className="list-disc pl-6 space-y-2">
<li>Process and fulfill orders</li>
<li>Communicate with you about your orders</li>
<li>Provide customer support</li>
<li>Improve our services</li>
<li>Send marketing communications (with your consent)</li>
</ul>
<h2 className="text-xl font-bold text-[#0a0a0a] mt-8 mb-4">Data Security</h2>
<p>We implement appropriate technical and organizational measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction.</p>
<h2 className="text-xl font-bold text-[#0a0a0a] mt-8 mb-4">Third-Party Services</h2>
<p>We may share your information with third-party service providers who assist us in operating our platform, including payment processors and shipping carriers. These providers are contractually obligated to protect your information.</p>
<h2 className="text-xl font-bold text-[#0a0a0a] mt-8 mb-4">Your Rights</h2>
<p>You have the right to access, update, or delete your personal information. Contact us at privacy@routecommerce.com to exercise these rights.</p>
<h2 className="text-xl font-bold text-[#0a0a0a] mt-8 mb-4">Cookies</h2>
<p>We use cookies to enhance your browsing experience. You can control cookie preferences through your browser settings.</p>
<h2 className="text-xl font-bold text-[#0a0a0a] mt-8 mb-4">Contact Us</h2>
<p>If you have questions about this Privacy Policy, please contact us at:</p>
<div className="bg-[#fafafa] rounded-2xl p-6 mt-4">
<p className="font-semibold text-[#1a1a1a]">Route Commerce</p>
<p className="text-[#666]">Email: privacy@routecommerce.com</p>
</div>
</div>
</div>
</div>
</main>
{/* Footer */}
<footer className="border-t border-[#e5e5e5] mt-20">
<div className="max-w-5xl mx-auto px-6 py-8">
<div className="flex flex-col md:flex-row items-center justify-between gap-4">
<div className="flex items-center gap-3">
<div className="w-8 h-8 rounded-lg bg-gradient-to-br from-[#1a4d2e] to-[#2d6a4f] flex items-center justify-center">
<svg className="w-4 h-4 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
<path strokeLinecap="round" strokeLinejoin="round" d="M13 10V3L4 14h7v7l9-11h-7z" />
</svg>
</div>
<span className="text-sm text-[#666]">&copy; {new Date().getFullYear()} Route Commerce. All rights reserved.</span>
</div>
<div className="flex items-center gap-6 text-sm text-[#888]">
<Link href="/privacy-policy" className="hover:text-[#1a4d2e] transition-colors">Privacy</Link>
<Link href="/terms-and-conditions" className="hover:text-[#1a4d2e] transition-colors">Terms</Link>
</div>
</div>
</div>
</footer>
</div>
);
}