diff --git a/src/app/LandingPageClient.tsx b/src/app/LandingPageClient.tsx index 9f6de08..60c926a 100644 --- a/src/app/LandingPageClient.tsx +++ b/src/app/LandingPageClient.tsx @@ -1,24 +1,7 @@ "use client"; -import Header, { Footer, LandingPageWrapper, Section } from "@/components/landing/LandingPageWrapper"; import HeroSection from "@/components/landing/HeroSection"; -import FeaturesAndStats from "@/components/landing/FeaturesAndStats"; -import TestimonialsAndCTA from "@/components/landing/TestimonialsAndCTA"; export default function LandingPageClient() { - return ( - -
- -
- -
- -
- -
- -
-
- ); + return ; } \ No newline at end of file diff --git a/src/app/indian-river-direct/stops/page.tsx b/src/app/indian-river-direct/stops/page.tsx new file mode 100644 index 0000000..dd9cb35 --- /dev/null +++ b/src/app/indian-river-direct/stops/page.tsx @@ -0,0 +1,184 @@ +"use client"; + +import { useEffect, useState, useRef } from "react"; +import Link from "next/link"; +import { gsap } from "gsap"; +import { supabase } from "@/lib/supabase"; +import StorefrontHeader from "@/components/storefront/StorefrontHeader"; +import StorefrontFooter from "@/components/storefront/StorefrontFooter"; +import LayoutContainer from "@/components/layout/LayoutContainer"; +import { formatDate } from "@/lib/format-date"; + +type Stop = { + id: string; + city: string; + state: string; + date: string; + time: string; + location: string; + address: string | null; + slug: string; + cutoff_time: string | null; +}; + +const BRAND_NAME = "Indian River Direct"; +const BRAND_SLUG = "indian-river-direct"; +const BRAND_ACCENT = "blue"; +const BRAND_ID = "b1cb7a96-d82b-40b1-80b1-d6dd26c56e28"; + +export default function IndianRiverStopsPage() { + const containerRef = useRef(null); + const [stops, setStops] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + async function loadStops() { + const { data } = await supabase + .from("stops") + .select("id, city, state, date, time, location, address, slug, cutoff_time") + .eq("active", true) + .eq("brand_id", BRAND_ID) + .order("date", { ascending: true }); + + setStops(data ?? []); + setLoading(false); + } + loadStops(); + + // GSAP animations + if (typeof window !== "undefined" && containerRef.current) { + const ctx = gsap.context(() => { + gsap.from(".stop-card", { + y: 30, + opacity: 0, + duration: 0.5, + stagger: 0.08, + ease: "power3.out", + }); + }, containerRef); + return () => ctx.revert(); + } + }, []); + + const now = new Date(); + const upcomingStops = stops.filter(s => new Date(s.date) >= now); + const pastStops = stops.filter(s => new Date(s.date) < now); + + return ( +
+ + +
+ + {/* Header */} +
+

+ {BRAND_NAME} +

+

+ Pickup Stops +

+

+ Fresh Florida citrus delivered to a stop near you. +

+
+
+ + {loading ? ( +
+ {[1, 2, 3, 4].map(i => ( +
+ ))} +
+ ) : upcomingStops.length === 0 ? ( +
+
+ + + +
+

No Upcoming Stops

+

Check back soon for new pickup locations!

+
+ ) : ( +
+ {upcomingStops.map((stop) => ( + +
+ {/* Date badge */} +
+
+ + {new Date(stop.date).toLocaleDateString('en-US', { month: 'short' })} + + + {new Date(stop.date).getDate()} + +
+
+ + {/* Stop info */} +
+

+ {stop.city}, {stop.state} +

+

{stop.location}

+ {stop.address && ( +

{stop.address}

+ )} +
+ + {/* Time & CTA */} +
+
+

{stop.time}

+ {stop.cutoff_time && ( +

Order by {stop.cutoff_time}

+ )} +
+
+ + + +
+
+
+ + ))} + + {/* Past stops */} + {pastStops.length > 0 && ( +
+

Past Stops

+
+ {pastStops.slice(0, 5).map(stop => ( +
+
+ {new Date(stop.date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} +
+
+

{stop.city}, {stop.state}

+

{stop.location}

+
+ Completed +
+ ))} +
+
+ )} +
+ )} + +
+ + +
+ ); +} \ No newline at end of file diff --git a/src/app/tuxedo/stops/page.tsx b/src/app/tuxedo/stops/page.tsx new file mode 100644 index 0000000..bac8094 --- /dev/null +++ b/src/app/tuxedo/stops/page.tsx @@ -0,0 +1,183 @@ +"use client"; + +import { useEffect, useState, useRef } from "react"; +import Link from "next/link"; +import { gsap } from "gsap"; +import { supabase } from "@/lib/supabase"; +import StorefrontHeader from "@/components/storefront/StorefrontHeader"; +import StorefrontFooter from "@/components/storefront/StorefrontFooter"; +import LayoutContainer from "@/components/layout/LayoutContainer"; +import { formatDate } from "@/lib/format-date"; + +type Stop = { + id: string; + city: string; + state: string; + date: string; + time: string; + location: string; + address: string | null; + slug: string; + cutoff_time: string | null; +}; + +const BRAND_NAME = "Tuxedo Corn"; +const BRAND_SLUG = "tuxedo"; +const BRAND_ACCENT = "green"; + +export default function TuxedoStopsPage() { + const containerRef = useRef(null); + const [stops, setStops] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + async function loadStops() { + const { data } = await supabase + .from("stops") + .select("id, city, state, date, time, location, address, slug, cutoff_time") + .eq("active", true) + .eq("brand_id", "64294306-5f42-463d-a5e8-2ad6c81a96de") // Tuxedo brand + .order("date", { ascending: true }); + + setStops(data ?? []); + setLoading(false); + } + loadStops(); + + // GSAP animations + if (typeof window !== "undefined" && containerRef.current) { + const ctx = gsap.context(() => { + gsap.from(".stop-card", { + y: 30, + opacity: 0, + duration: 0.5, + stagger: 0.08, + ease: "power3.out", + }); + }, containerRef); + return () => ctx.revert(); + } + }, []); + + const now = new Date(); + const upcomingStops = stops.filter(s => new Date(s.date) >= now); + const pastStops = stops.filter(s => new Date(s.date) < now); + + return ( +
+ + +
+ + {/* Header */} +
+

+ {BRAND_NAME} +

+

+ Pickup Stops +

+

+ Fresh Olathe Sweet™ sweet corn delivered to a stop near you. +

+
+
+ + {loading ? ( +
+ {[1, 2, 3, 4].map(i => ( +
+ ))} +
+ ) : upcomingStops.length === 0 ? ( +
+
+ + + +
+

No Upcoming Stops

+

Check back soon for new pickup locations!

+
+ ) : ( +
+ {upcomingStops.map((stop, index) => ( + +
+ {/* Date badge */} +
+
+ + {new Date(stop.date).toLocaleDateString('en-US', { month: 'short' })} + + + {new Date(stop.date).getDate()} + +
+
+ + {/* Stop info */} +
+

+ {stop.city}, {stop.state} +

+

{stop.location}

+ {stop.address && ( +

{stop.address}

+ )} +
+ + {/* Time & CTA */} +
+
+

{stop.time}

+ {stop.cutoff_time && ( +

Order by {stop.cutoff_time}

+ )} +
+
+ + + +
+
+
+ + ))} + + {/* Past stops */} + {pastStops.length > 0 && ( +
+

Past Stops

+
+ {pastStops.slice(0, 5).map(stop => ( +
+
+ {new Date(stop.date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} +
+
+

{stop.city}, {stop.state}

+

{stop.location}

+
+ Completed +
+ ))} +
+
+ )} +
+ )} + +
+ + +
+ ); +} \ No newline at end of file diff --git a/src/components/landing/HeroSection.tsx b/src/components/landing/HeroSection.tsx index 155e93b..de1e861 100644 --- a/src/components/landing/HeroSection.tsx +++ b/src/components/landing/HeroSection.tsx @@ -1,477 +1,401 @@ "use client"; -import React, { useEffect, useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import Link from "next/link"; +import { gsap } from "gsap"; +import { ScrollTrigger } from "gsap/ScrollTrigger"; +// Register GSAP plugins +if (typeof window !== "undefined") { + gsap.registerPlugin(ScrollTrigger); +} + +// ───────────────────────────────────────────────────────────────────────────── +// TYPES +// ───────────────────────────────────────────────────────────────────────────── +interface ScrollProgress { + progress: number; + direction: number; + velocity: number; +} + +// ───────────────────────────────────────────────────────────────────────────── +// CINEMATIC HERO SECTION - SCROLL-DRIVEN ANIMATIONS +// ───────────────────────────────────────────────────────────────────────────── export default function HeroSection() { + const containerRef = useRef(null); + const heroRef = useRef(null); const [mounted, setMounted] = useState(false); + const [scrollProgress, setScrollProgress] = useState({ + progress: 0, + direction: 1, + velocity: 0, + }); useEffect(() => { - setMounted(true); + // Mark as mounted on client-side + const timer = setTimeout(() => { + setMounted(true); + }, 100); + return () => clearTimeout(timer); }, []); + // ─── SCROLL PROGRESS TRACKING ─────────────────────────────────────────────── + useEffect(() => { + if (!mounted) return; + + const handleScroll = () => { + const scrollY = window.scrollY; + const docHeight = document.documentElement.scrollHeight - window.innerHeight; + const progress = Math.min(scrollY / docHeight, 1); + + setScrollProgress(prev => ({ + progress, + direction: scrollY > prev.progress ? 1 : -1, + velocity: Math.abs(scrollY - prev.progress) * 10, + })); + }; + + window.addEventListener("scroll", handleScroll, { passive: true }); + return () => window.removeEventListener("scroll", handleScroll); + }, [mounted]); + + // ─── GSAP SCROLL ANIMATIONS ──────────────────────────────────────────────── + useEffect(() => { + if (!mounted || !containerRef.current) return; + + const ctx = gsap.context(() => { + // Hero section timeline + const heroTl = gsap.timeline({ + scrollTrigger: { + trigger: heroRef.current, + start: "top top", + end: "bottom top", + scrub: 1.5, + pin: true, + anticipatePin: 1, + }, + }); + + // Hero content fade out on scroll + heroTl + .to(".hero-title", { + y: -120, + opacity: 0, + scale: 0.95, + ease: "power2.inOut", + }) + .to( + ".hero-subtitle", + { + y: -80, + opacity: 0, + ease: "power2.inOut", + }, + "<" + ) + .to( + ".hero-cta", + { + y: -60, + opacity: 0, + ease: "power2.inOut", + }, + "<+0.1" + ) + .to( + ".hero-visual", + { + scale: 1.3, + y: 100, + ease: "power2.inOut", + }, + "<" + ) + .to( + ".hero-badge", + { + y: -40, + opacity: 0, + ease: "power2.inOut", + }, + "<" + ); + + // Parallax floating elements + const floatElements = gsap.utils.toArray(".parallax-float"); + floatElements.forEach((el, i) => { + gsap.to(el, { + y: -150 - i * 30, + scrollTrigger: { + trigger: el, + start: "top bottom", + end: "bottom top", + scrub: 1, + }, + }); + }); + + // Staggered text reveal on scroll + const revealTextElements = gsap.utils.toArray(".reveal-text"); + revealTextElements.forEach((el) => { + gsap.fromTo( + el, + { opacity: 0, y: 60, skewY: 3 }, + { + opacity: 1, + y: 0, + skewY: 0, + duration: 1.2, + ease: "power3.out", + scrollTrigger: { + trigger: el, + start: "top 85%", + end: "top 50%", + toggleActions: "play none none reverse", + }, + } + ); + }); + + // Scale reveal for cards + const revealScaleElements = gsap.utils.toArray(".reveal-scale"); + revealScaleElements.forEach((el, i) => { + gsap.fromTo( + el, + { opacity: 0, scale: 0.85, y: 50 }, + { + opacity: 1, + scale: 1, + y: 0, + duration: 0.8, + delay: i * 0.1, + ease: "back.out(1.4)", + scrollTrigger: { + trigger: el, + start: "top 85%", + toggleActions: "play none none reverse", + }, + } + ); + }); + + // Horizontal reveal for feature cards + const revealHorizontalElements = gsap.utils.toArray(".reveal-horizontal"); + revealHorizontalElements.forEach((el) => { + gsap.fromTo( + el, + { opacity: 0, x: -60 }, + { + opacity: 1, + x: 0, + duration: 1, + ease: "power3.out", + scrollTrigger: { + trigger: el, + start: "top 80%", + toggleActions: "play none none reverse", + }, + } + ); + }); + + // Counter animations + const counterElements = gsap.utils.toArray(".counter-animate"); + counterElements.forEach((el) => { + const target = parseInt(el.getAttribute("data-target") || "0", 10); + const obj = { val: 0 }; + gsap.to(obj, { + val: target, + duration: 2, + ease: "power2.out", + onUpdate: () => { + if (el.textContent !== null) { + el.textContent = Math.floor(obj.val).toLocaleString(); + } + }, + scrollTrigger: { + trigger: el, + start: "top 80%", + toggleActions: "play none none none", + }, + }); + }); + }, containerRef); + + return () => ctx.revert(); + }, [mounted]); + + const scrollToContent = () => { + const nextSection = document.getElementById("story"); + if (nextSection) { + nextSection.scrollIntoView({ behavior: "smooth" }); + } + }; + return ( <> - + {/* ─── SCROLL PROGRESS INDICATOR ────────────────────────────────────────── */} +
+
+
+ {/* ─── HERO SECTION - PINNED SCROLL SEQUENCE ───────────────────────────── */}
- {/* Colorful Grid Pattern with Blue Tint */} -
+ {/* ─── PARALLAX BACKGROUND LAYERS ─────────────────────────────────────── */} +
+ {/* Gradient orbs */} +
+
+ + {/* Grid pattern */} +
+
- {/* Decorative Colorful Blobs */} - {/* Coral/Pink Blob - Top Right */} -
- - {/* Mint/Teal Blob - Bottom Left */} -
- - {/* Golden/Amber Blob - Top Left */} -
- - {/* Lavender/Purple Blob - Bottom Right */} -
- - {/* Color Overlay from Bottom Right - Golden/Amber tones */} -
- - {/* Colorful Accent Dots */} -
-
-
-
-
-
-
-
- -
-
- {/* Left Column - Content */} -
+ {/* ─── HERO CONTENT ────────────────────────────────────────────────────── */} +
+
+ + {/* Left Column - Animated Content */} +
{/* Animated Badge */} -
- - + Farm-Fresh Delivery Platform
- {/* Main Headline */} -
-

+

- Harvest -
- - Fresh Routes - + From Field + To Fresh

{/* Subtext */} -

- We connect produce farms with reliable trucking partners, - ensuring your harvest reaches markets faster, fresher, and more - efficiently than ever before. + We connect produce farms with reliable distribution networks, + ensuring your harvest reaches markets faster and fresher than ever.

- {/* Colorful Gradient Divider */} -
- {/* CTAs */} -
+
{ + e.currentTarget.style.transform = "translateY(-3px)"; + e.currentTarget.style.boxShadow = "0 12px 40px rgba(26, 77, 46, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.2)"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.transform = "translateY(0)"; + e.currentTarget.style.boxShadow = "0 8px 32px rgba(26, 77, 46, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.15)"; }} > - Start Your Route - + Start Your Route + { + e.currentTarget.style.background = "#1a4d2e"; + e.currentTarget.style.color = "white"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.background = "rgba(26, 77, 46, 0.03)"; + e.currentTarget.style.color = "#1a4d2e"; }} > - Browse Farms - - + + + Browse Farms
- {/* Trust Indicators with Colorful Gradients */} -
+ {/* Stats */} +
{[ - { stat: "500+", label: "Farm Brands", gradient: "linear-gradient(135deg, rgba(133, 210, 197, 0.25) 0%, rgba(107, 185, 165, 0.15) 100%)", borderColor: "rgba(133, 210, 197, 0.5)", statColor: "#2d8a7a" }, - { stat: "98%", label: "On-Time", gradient: "linear-gradient(135deg, rgba(245, 199, 126, 0.25) 0%, rgba(201, 162, 80, 0.15) 100%)", borderColor: "rgba(245, 199, 126, 0.5)", statColor: "#c17a30" }, - { stat: "50K+", label: "Deliveries", gradient: "linear-gradient(135deg, rgba(232, 168, 124, 0.25) 0%, rgba(247, 129, 130, 0.15) 100%)", borderColor: "rgba(232, 168, 124, 0.5)", statColor: "#b85a50" }, - ].map((item, index) => ( -
-
( +
+
{item.stat}
-
+
{item.label}
@@ -479,378 +403,835 @@ export default function HeroSection() {
- {/* Right Column - Visual */} -
- {/* Main Visual Container */} -
- {/* SVG Map/Routes Visual */} - + {/* SVG Route Map Visual */} + + {/* Background with grain */} + + + + + + + + + + + + + + + + + + + + + + {/* Animated Route Path */} + + + {/* Secondary Route */} + + + {/* Farm Location - Animated Pulse */} + + + + + + + + {/* Hub Location */} + + + + + + + + {/* Stop Points */} + {[ + { x: 180, y: 280, label: "Stop 1", delay: "1.2s" }, + { x: 360, y: 120, label: "Stop 2", delay: "1.4s" }, + { x: 420, y: 90, label: "Market", delay: "1.6s" }, + ].map((stop, i) => ( + + + + + ))} + + {/* Decorative Trees */} + {[[60, 100], [440, 360], [50, 440], [450, 180]].map((coords, i) => ( + + ))} + + {/* Compass */} + + + + + N + + + + {/* Floating Cards */} +
+
- {/* Background Map */} - - - {/* Grid Lines */} - - - - - - - - - - {/* Route Path */} - - - {/* Secondary Route */} - - - {/* Farm Location */} - - - - - {/* Farm Icon */} - - - Farm Origin - - - - {/* Distribution Hub */} - - - - - {/* Hub Icon */} - - - Distribution Hub - - - - {/* Stop Points */} - {[ - { x: 180, y: 280, label: "Stop 1" }, - { x: 350, y: 120, label: "Stop 2" }, - { x: 400, y: 100, label: "Market" }, - ].map((stop, i) => ( - - - - - {stop.label} - - - ))} - - {/* Decorative Trees/Fields */} - {([[80, 400], [420, 350], [70, 150], [430, 200], [150, 430], [380, 400]] as [number, number][]).map((coords, i) => ( - - ))} - - {/* Compass Rose */} - - - - - - N - - - - - {/* Floating Stat Cards */} -
-
-
- 2.4T -
-
- Miles Saved -
-
+
2.4T
+
Miles Saved
+
-
+
-
-
- 12hrs -
-
- Avg Delivery -
-
+
12hrs
+
Avg Delivery
+
-
+
-
-
- - - Live Tracking - -
-
+ + Live Tracking
- {/* Scroll Indicator */} -
- window.scrollTo({ - top: window.innerHeight, - behavior: "smooth", - }) - } + {/* ─── SCROLL INDICATOR ────────────────────────────────────────────────── */} +
-
- - Scroll - - - - + Scroll to explore + +
+
- {/* Decorative Leaf Elements */} - - + {/* Decorative leaves */} + + - - - + +
+ + {/* ─── STORY SECTION - STICKY SCROLL NARRATIVE ──────────────────────────── */} +
+
+ {/* Sticky Container */} +
+ {/* Background gradient that shifts */} +
+ +
+ {/* Story Step 1 */} +
+ + The Challenge + +

+ Fresh produce should not +
+ sit in transit for days +

+

+ Traditional distribution means your harvest loses freshness, + quality, and value before reaching customers. +

+
+ + {/* Story Step 2 */} +
+ + The Solution + +

+ Intelligent route +
+ optimization +

+

+ Our platform analyzes patterns, traffic, and delivery windows + to get your produce from field to market in hours, not days. +

+
+ + {/* Story Step 3 */} +
+ + The Result + +

+ 40% faster delivery +
+ 98% on-time rate +

+

+ Farms using Route Commerce see dramatic improvements in + freshness, customer satisfaction, and operational efficiency. +

+
+
+
+
+
+ + {/* ─── FEATURES SECTION - PROGRESSIVE REVEAL ───────────────────────────── */} +
+
+ {/* Section Header */} +
+ + Platform Features + +

+ Everything You Need +

+
+ + {/* Feature Cards Grid */} +
+ {[ + { + icon: ( + + + + + + ), + title: "Product Catalogs", + description: "Showcase seasonal produce with rich media galleries and real-time availability updates.", + color: "#1a4d2e", + }, + { + icon: ( + + + + + ), + title: "Route Planning", + description: "Optimize delivery routes with intelligent mapping and real-time scheduling.", + color: "#c97a3e", + }, + { + icon: ( + + + + + ), + title: "Order Management", + description: "Track orders from placement through delivery with automated status updates.", + color: "#7a5c9e", + }, + { + icon: ( + + + + + + ), + title: "Wholesale Portal", + description: "Give buyers a dedicated space to browse pricing and place bulk orders.", + color: "#5c8a8f", + }, + { + icon: ( + + + + + ), + title: "Harvest Reach", + description: "Send email and SMS campaigns about seasonal availability and new harvests.", + color: "#c97a3e", + }, + { + icon: ( + + + + + + ), + title: "Smart Analytics", + description: "Uncover sales trends and operational insights with real-time dashboards.", + color: "#6b8f71", + }, + ].map((feature, index) => ( +
{ + e.currentTarget.style.transform = "translateY(-8px) scale(1.02)"; + e.currentTarget.style.boxShadow = "0 20px 60px rgba(26, 77, 46, 0.12)"; + e.currentTarget.style.borderColor = feature.color + "40"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.transform = "translateY(0) scale(1)"; + e.currentTarget.style.boxShadow = "0 8px 32px rgba(0, 0, 0, 0.04)"; + e.currentTarget.style.borderColor = "rgba(26, 77, 46, 0.08)"; + }} + > + {/* Icon */} +
+ {feature.icon} +
+ + {/* Content */} +

+ {feature.title} +

+

+ {feature.description} +

+ + {/* Hover Arrow */} +
+ + + +
+
+ ))} +
+
+
+ + {/* ─── STATS SECTION - SCROLL-TRIGGERED COUNTERS ──────────────────────── */} +
+ {/* Decorative elements */} +
+
+ +
+
+ + Our Impact + +
+ + {/* Stats Grid */} +
+ {[ + { value: 500, suffix: "+", label: "Produce Brands" }, + { value: 50000, suffix: "+", label: "Orders Delivered" }, + { value: 98, suffix: "%", label: "On-Time Delivery" }, + { value: 2000000, prefix: "$", suffix: "+", label: "Weekly Sales" }, + ].map((stat, i) => ( +
+
+ {stat.prefix && {stat.prefix}} + + 0 + + {stat.suffix} +
+

+ {stat.label} +

+
+ ))} +
+
+
+ + {/* ─── CTA SECTION - FINAL REVEAL ─────────────────────────────────────── */} +
+ {/* Decorative orbs */} +
+
+ +
+
+ {/* Label */} + + Get Started Today + + + {/* Headline */} +

+ Ready to Grow +
+ Your Routes? +

+ + {/* Subtitle */} +

+ Join hundreds of produce brands who trust Route Commerce + to power their farm-fresh operations. +

+ + {/* CTA Buttons */} +
+ { + e.currentTarget.style.transform = "translateY(-3px)"; + e.currentTarget.style.boxShadow = "0 12px 40px rgba(26, 77, 46, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.2)"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.transform = "translateY(0)"; + e.currentTarget.style.boxShadow = "0 8px 32px rgba(26, 77, 46, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.15)"; + }} + > + Start Free Trial + + + + + + { + e.currentTarget.style.background = "#1a4d2e"; + e.currentTarget.style.color = "white"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.background = "rgba(26, 77, 46, 0.03)"; + e.currentTarget.style.color = "#1a4d2e"; + }} + > + View Farms + +
+ + {/* Disclaimer */} +

+ No credit card required · 14-day free trial · Cancel anytime +

+
+
+
+ + {/* ─── GLOBAL STYLES ────────────────────────────────────────────────────── */} + ); } \ No newline at end of file