// Nav, LiveBadge, Hero, Marquee, Stats // Reads from window.locale set by index.html (function injectNavStyles() { if (document.getElementById('tvm-nav-styles')) return; const s = document.createElement('style'); s.id = 'tvm-nav-styles'; s.textContent = ` .tvm-hamburger { display: none; background: none; border: none; padding: 6px; cursor: pointer; color: var(--tvm-text, #1d1d1f); border-radius: 8px; transition: background 0.2s ease; flex-shrink: 0; } .tvm-hamburger:hover { background: rgba(0,0,0,0.06); } .tvm-mobile-backdrop { display: none; position: fixed; inset: 0; z-index: 98; background: rgba(0,0,0,0.18); } .tvm-mobile-backdrop.open { display: block; } .tvm-mobile-nav { display: none; position: fixed; top: 56px; left: 0; right: 0; z-index: 99; background: rgba(255,255,255,0.96); backdrop-filter: blur(40px) saturate(1.8); -webkit-backdrop-filter: blur(40px) saturate(1.8); border-bottom: 0.5px solid rgba(0,0,0,0.08); box-shadow: inset 0 1px 0 rgba(255,255,255,0.9), 0 8px 32px rgba(0,0,0,0.10); } .tvm-mobile-nav-inner { padding: 16px 20px 24px; display: flex; flex-direction: column; gap: 4px; } .tvm-mobile-nav-link { display: flex; align-items: center; gap: 12px; padding: 14px 16px; font-size: 17px; font-weight: 500; color: var(--tvm-text, #1d1d1f); text-decoration: none; border-radius: 12px; transition: background 0.15s ease; } .tvm-mobile-nav-link svg { flex-shrink: 0; opacity: 0.55; } .tvm-mobile-nav-link:hover, .tvm-mobile-nav-link:active { background: rgba(0,0,0,0.05); } @media (max-width: 768px) { .tvm-hamburger { display: flex; align-items: center; justify-content: center; } .tvm-nav-links { display: none !important; } .tvm-nav-cta { display: none !important; } .tvm-mobile-nav { display: block; transform: translateY(-8px); opacity: 0; pointer-events: none; transition: transform 0.24s cubic-bezier(0.25,0.46,0.45,0.94), opacity 0.24s ease; } .tvm-mobile-nav.open { transform: translateY(0); opacity: 1; pointer-events: auto; } } `; document.head.appendChild(s); })(); function Nav() { const C = COPY[window.locale]; const [open, setOpen] = React.useState(false); return ( <> {open &&
setOpen(false)} />}
{[ , , , , , ].map((icon, i) => ( setOpen(false)}>{icon}{C.nav[i]} ))} setOpen(false)}>{C.cta}
); } function LiveBadge() { const C = COPY[window.locale]; const [n, setN] = React.useState(() => Math.floor(Math.random() * 3000) + 11000); React.useEffect(() => { const interval = 3000 + Math.random() * 4000; const t = setInterval(() => { setN(v => v + Math.floor(Math.random() * 5) - 2); }, interval); return () => clearInterval(t); }, []); return (
); } function Hero() { const C = COPY[window.locale]; function scrollToCheckout(e) { e.preventDefault(); var el = document.getElementById('checkout'); if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); } return (

{C.hero1}
{C.hero2}

{C.heroSub}

{C.anchor1} {C.anchor2}

{C.heroCta}
{C.trust.map(t => (
{t}
))}
); } function Marquee() { const C = COPY[window.locale]; const r1a = row1partners.map((logo, i) => React.cloneElement(logo, { key: 'r1a' + i })); const r1b = row1partners.map((logo, i) => React.cloneElement(logo, { key: 'r1b' + i })); const r2a = row2partners.map((logo, i) => React.cloneElement(logo, { key: 'r2a' + i })); const r2b = row2partners.map((logo, i) => React.cloneElement(logo, { key: 'r2b' + i })); return (
{C.marqueeLabel}
); } function Stats() { const C = COPY[window.locale]; const items = [ ["2 400+", C.statsLabels[0]], ["4.9 / 5", C.statsLabels[1]], ["15 min", C.statsLabels[2]], ["99 %", C.statsLabels[3]], ]; return (
{items.map(([num, lbl]) => (
{num}
{lbl}
))}
); } Object.assign(window, { Nav, Hero, Marquee, Stats });