// components.jsx — Icons, nav, footer, cart drawer, shared UI // Components are exported to window so sections.jsx can use them. /* ========================================================= Icons — minimal stroke set ========================================================= */ const Ic = { search: (p) => ( ), user: (p) => ( ), bag: (p) => ( ), heart: (p) => ( ), heartFill: (p) => ( ), arrow: (p) => ( ), star: (p) => ( ), plus: (p) => ( ), minus: (p) => ( ), close: (p) => ( ), slider: (p) => ( ), /* Benefit icons */ collagen: (p) => ( ), hydration: (p) => ( ), shield: (p) => ( ), clock: (p) => ( ), }; /* ========================================================= Brand mark — simplified V + helix ========================================================= */ function BrandMark({ size = 32, dark = false }) { const stroke = dark ? '#0E3D2E' : '#C9A47A'; const v = dark ? '#0E3D2E' : '#0E3D2E'; return ( {/* Arc */} {/* V */} {/* Helix rungs */} ); } /* ========================================================= Authenticity seal — used in hero ========================================================= */ function AuthSeal() { return ( VELORA · BIOPEPTIDE SCIENCES · CERTIFIED PURE ·{' '} {/* center */} V AUTHENTIC PURITY · INTEGRITY ); } /* ========================================================= Vial visualisation — drawn in SVG, color-coded by product ========================================================= */ function Vial({ accent = '#7A5BC7', label = 'NAD+', strength = '500mg', angle = 0, scale = 1 }) { // accent = cap color return ( {/* shadow */} {/* colored cap (top) */} {/* silver crimp */} {/* neck */} {/* body */} {/* meniscus / liquid */} {/* label */} VELORA BIOPEPTIDE SCIENCES 5 ? 16 : label.length > 4 ? 18 : 22} fill="#0E3D2E" > {label} {strength} LYOPHILIZED POWDER For Professional Use Only 3ml · Multi-dose Vial {/* highlight */} ); } /* ========================================================= Nav — showcase only (no cart / search / account) ========================================================= */ function Nav() { const [scrolled, setScrolled] = React.useState(false); const [menuOpen, setMenuOpen] = React.useState(false); React.useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 24); window.addEventListener('scroll', onScroll); return () => window.removeEventListener('scroll', onScroll); }, []); React.useEffect(() => { document.body.style.overflow = menuOpen ? 'hidden' : ''; return () => { document.body.style.overflow = ''; }; }, [menuOpen]); const closeMenu = () => setMenuOpen(false); return ( <>