import React, { useEffect, useRef, useState, useLayoutEffect, useMemo, memo } from 'react'; import { motion, useScroll, useTransform, AnimatePresence, useAnimation, useMotionValue, useVelocity, useSpring, useAnimationFrame } from 'framer-motion'; import { ArrowUpRight, Monitor, RefreshCw, Star, FileText, Calendar, Rocket, Globe, Smartphone, Zap, Shield, ChevronRight, X, Grape } from 'lucide-react'; import Hls from 'hls.js'; // --- Global Styles --- const globalStyles = ` @import url('https://fonts.googleapis.com/css2?family=Barlow:wght@400;500;600;700&family=Instrument+Serif:ital@1&display=swap'); :root { --background: 0 0% 0%; --foreground: 0 0% 100%; --font-heading: 'Instrument Serif', serif; --font-body: 'Barlow', sans-serif; } html { scroll-behavior: smooth; } body { background-color: hsl(var(--background)); color: hsl(var(--foreground)); font-family: var(--font-body); -webkit-font-smoothing: antialiased; margin: 0; overflow-x: hidden; } .font-heading { font-family: var(--font-heading); } .font-body { font-family: var(--font-body); } .liquid-glass { background: rgba(255, 255, 255, 0.01); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.1); position: relative; border: 1px solid rgba(255, 255, 255, 0.05); } .liquid-glass-strong { background: rgba(255, 255, 255, 0.03); backdrop-filter: blur(50px); -webkit-backdrop-filter: blur(50px); box-shadow: 4px 4px 4px rgba(0,0,0,0.05), inset 0 1px 1px rgba(255, 255, 255, 0.15); position: relative; border: 1px solid rgba(255, 255, 255, 0.1); } .fade-bottom { background: linear-gradient(to bottom, transparent, black); } .fade-top { background: linear-gradient(to top, transparent, black); } input, textarea, select { background: rgba(255,255,255,0.03) !important; border: 1px solid rgba(255,255,255,0.1) !important; color: white !important; outline: none !important; } `; // --- Utility: Wrap Math for Infinite Scrolling --- const wrap = (min, max, v) => { const rangeSize = max - min; return ((((v - min) % rangeSize) + rangeSize) % rangeSize) + min; }; // --- Shared Component: Badge --- const Badge = ({ children }) => (
{children}
); // --- Components: Booking Form Modal --- const BookingForm = ({ isOpen, onClose, calDataProps }) => { const [step, setStep] = useState(1); const [isSubmitting, setIsSubmitting] = useState(false); const [formData, setFormData] = useState({ need: '', name: '', email: '', company: '', url: '', competitor: '', offer: '', budget: '', }); const encode = (data) => { return Object.keys(data) .map(key => encodeURIComponent(key) + "=" + encodeURIComponent(data[key])) .join("&"); }; const handleSubmit = async () => { setIsSubmitting(true); try { const isSandbox = window.location.href.startsWith('blob:'); if (!isSandbox) { await fetch("/", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: encode({ "form-name": "booking-intel", ...formData }) }); } else { console.log("Sandbox mode detected: Skipped Netlify form submission. Form Data:", formData); } } catch (error) { console.warn("Netlify Form submission error:", error); } finally { setIsSubmitting(false); setStep(5); } }; const handleNext = () => { if (step === 4) handleSubmit(); else setStep(step + 1); }; if (!isOpen) return null; return ( {/* Hidden form for Netlify */}
{step === 1 && (

What are we building?

{["A brand new website", "A high-converting rework"].map((opt) => ( ))}
)} {step === 2 && (

The Basics

setFormData({...formData, name: e.target.value})} />
setFormData({...formData, email: e.target.value})} />
setFormData({...formData, company: e.target.value})} />
)} {step === 3 && (

The Strategy Intel

setFormData({...formData, url: e.target.value})} />
setFormData({...formData, competitor: e.target.value})} />