const { useState, useEffect, useRef, useMemo } = React;

/* ============ Brand / data ============ */
const PRICE = 30.99;
const COMPARE = 99;

const IMAGES = [
  { src: 'img/hero-front.webp',       alt: '11 air pulsing settings & 12 vibration settings' },
  { src: 'img/features-callouts.webp',alt: 'feature callouts: clitoral stimulation, controls, magnetic charging, body safe silicone' },
  { src: 'img/three-quarter.webp',    alt: 'heart throb in three-quarter view, air pulsing visualization' },
  { src: 'img/charging.webp',         alt: 'quick charging cable included, USB rechargeable' },
  { src: 'img/front-flat.webp',       alt: 'plusOne heart throb, front view' },
];

const REVIEW_STATS = {
  avg: 4.8,
  count: 1284,
  bars: [
    { stars: 5, pct: 86 },
    { stars: 4, pct: 9  },
    { stars: 3, pct: 3  },
    { stars: 2, pct: 1  },
    { stars: 1, pct: 1  },
  ],
};

const REVIEWS = [
  { name: 'Mara R.',    badge: 'verified buyer', stars: 5, title: 'finally — quiet & gentle',
    body: 'i was nervous to try air pulsing but this is the gentlest, most intuitive thing. the two motors work beautifully together and the heart shape actually fits really well in my hand.',
    date: 'apr 2026' },
  { name: 'Jamie L.',   badge: 'verified buyer', stars: 5, title: 'cute on the nightstand',
    body: 'looks like a candle dish, not a sex toy. the silicone is so soft. charge lasted longer than the listed hour for me.',
    date: 'mar 2026' },
  { name: 'Priya S.',   badge: 'verified buyer', stars: 4, title: 'great for couples',
    body: 'we use it together — the independent controls are clutch. minus a star because i wish the lowest setting was a touch lower.',
    date: 'mar 2026' },
];

const FAQ = [
  { q: 'is it waterproof?',
    a: 'yes — heart throb is fully submersible (IPX7). use it in the shower or bath, and rinse with warm water and a mild soap after each use.' },
  { q: 'how do air pulsing & vibration differ?',
    a: 'air pulsing creates gentle suction-like pulses without touching the skin directly — it stimulates the clitoris through pressure waves. vibration is contact-based. heart throb gives you both, independently controlled.' },
  { q: 'how long does the charge last?',
    a: 'about 1 hour of continuous use on a full charge, which takes ~90 minutes. the magnetic cable snaps on — no fiddly ports.' },
  { q: 'what is it made of?',
    a: 'body-safe medical grade silicone with an ABS air pulsing chamber. phthalate-free, latex-free, hypoallergenic.' },
  { q: 'is the shipping discreet?',
    a: 'always. plain padded mailer, no branding, no mention of contents on the label.' },
  { q: 'what\'s your return policy?',
    a: 'unopened items can be returned within 30 days for a full refund. for hygiene reasons, opened items aren\'t eligible — but if anything is defective we\'ll replace it, no questions asked.' },
];

const FEATURES = [
  { title: 'independently control', body: 'the air pulsing and vibrating motors' },
  { title: 'clitoral stimulation',  body: 'through air pulsing and vibrations' },
  { title: 'easily toggle',         body: 'through 11 air pulsing speeds and 12 vibration settings' },
  { title: 'high quality',          body: 'body-safe medical grade silicone' },
  { title: 'magnetic',              body: 'snap-on charging connection' },
  { title: 'whisper quiet',         body: 'under 50dB — quieter than a quiet conversation' },
];

/* ============ Small components ============ */
function Star({filled=true, size=14}){
  return (
    <svg width={size} height={size} viewBox="0 0 24 24" fill={filled? '#E5A032':'#E7DECF'} aria-hidden="true">
      <path d="M12 2l2.92 6.91 7.5.64-5.72 4.95 1.74 7.34L12 17.77 5.56 21.84l1.74-7.34L1.58 9.55l7.5-.64L12 2z"/>
    </svg>
  );
}
function Stars({n=5, size=14}){
  return <span style={{display:'inline-flex',gap:2,verticalAlign:'middle'}}>
    {[0,1,2,3,4].map(i=> <Star key={i} filled={i<n} size={size}/>)}
  </span>;
}
function IconHeart({size=20, color='currentColor'}){
  return <svg width={size} height={size} viewBox="0 0 24 24" fill={color} aria-hidden="true">
    <path d="M12 21s-7.5-4.5-9.5-9C1.2 9 2.7 5 6.5 5c2 0 3.5 1 5.5 3 2-2 3.5-3 5.5-3 3.8 0 5.3 4 4 7-2 4.5-9.5 9-9.5 9z"/>
  </svg>;
}
function IconCart({size=20}){
  return <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
    <path d="M3 4h2l2.5 12.5a2 2 0 0 0 2 1.5h8a2 2 0 0 0 2-1.5L21 8H6"/>
    <circle cx="10" cy="21" r="1"/><circle cx="18" cy="21" r="1"/>
  </svg>;
}
function IconCheck({size=16}){
  return <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg>;
}
function IconChev({open}){
  return <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" style={{transform:`rotate(${open?180:0}deg)`,transition:'transform .2s'}}><polyline points="6 9 12 15 18 9"/></svg>;
}
function IconMenu(){
  return <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><line x1="3" y1="7" x2="21" y2="7"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="17" x2="21" y2="17"/></svg>;
}
function IconX(){
  return <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round"><line x1="6" y1="6" x2="18" y2="18"/><line x1="18" y1="6" x2="6" y2="18"/></svg>;
}

/* ============ Page parts ============ */
function AnnouncementBar(){
  const msgs = [
    'free discreet shipping over $50',
    '30-day happiness guarantee',
    'ships today if you order before 2pm pt',
  ];
  const [i,setI] = useState(0);
  useEffect(()=>{ const t = setInterval(()=>setI(x=>(x+1)%msgs.length), 3800); return ()=>clearInterval(t); },[]);
  return (
    <div style={{background:'var(--raspberry)',color:'#fff',fontSize:13,fontWeight:600,letterSpacing:'.02em',padding:'9px 16px',textAlign:'center',position:'relative',overflow:'hidden'}}>
      <div style={{display:'inline-flex',alignItems:'center',gap:10}}>
        <IconHeart size={13} color="#fff"/>
        <span key={i} style={{animation:'fadeIn .35s ease'}}>{msgs[i]}</span>
        <IconHeart size={13} color="#fff"/>
      </div>
      <style>{`@keyframes fadeIn{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}`}</style>
    </div>
  );
}

function Nav({onCart, cartCount}){
  const [scrolled, setScrolled] = useState(false);
  useEffect(()=>{
    const onS = ()=> setScrolled(window.scrollY > 4);
    window.addEventListener('scroll', onS); onS();
    return ()=> window.removeEventListener('scroll', onS);
  },[]);
  return (
    <nav style={{
      position:'sticky',top:0,zIndex:40,
      background: scrolled? 'rgba(251,246,238,.88)':'transparent',
      backdropFilter: scrolled? 'saturate(140%) blur(12px)':'none',
      borderBottom: scrolled? '1px solid var(--line)':'1px solid transparent',
      transition:'background .25s, border-color .25s'
    }}>
      <div style={{maxWidth:1280,margin:'0 auto',padding:'14px 24px',display:'flex',alignItems:'center',justifyContent:'space-between'}}>
        <div style={{display:'flex',alignItems:'center',gap:36}}>
          <a href="#" aria-label="plusOne home" style={{display:'flex',alignItems:'baseline',gap:0,fontWeight:800,fontSize:22,letterSpacing:'-.01em'}}>
            <span style={{color:'var(--slate)'}}>plus</span>
            <span style={{color:'var(--raspberry)'}}>One</span>
            <span style={{fontSize:10,verticalAlign:'super',marginLeft:1,color:'var(--slate-soft)'}}>®</span>
          </a>
          <div className="lp-nav-links lower" style={{display:'flex',gap:26,fontSize:14,fontWeight:600,color:'var(--slate-2)'}}>
            <a href="#features">the product</a>
            <a href="#reviews">reviews</a>
            <a href="#faq">faq</a>
            <a href="#journal">journal</a>
          </div>
        </div>
        <div style={{display:'flex',alignItems:'center',gap:18}}>
          <a className="lp-nav-account lower" href="#" style={{fontSize:14,fontWeight:600,color:'var(--slate-2)'}}>account</a>
          <button onClick={onCart} aria-label="open cart" style={{position:'relative',display:'flex',alignItems:'center',gap:8,padding:'8px 14px',border:'1.5px solid var(--slate)',borderRadius:999,fontWeight:700,fontSize:14,color:'var(--slate)'}}>
            <IconCart size={16}/>
            <span className="lower">cart</span>
            {cartCount>0 && <span style={{background:'var(--raspberry)',color:'#fff',borderRadius:999,padding:'1px 7px',fontSize:11}}>{cartCount}</span>}
          </button>
        </div>
      </div>
    </nav>
  );
}

/* curved heading using SVG textPath */
function CurvedHeading({text, id='curve', flip=false}){
  // a gentle smile arc
  const d = flip
    ? "M 20 60 Q 400 -20 780 60"
    : "M 20 20 Q 400 100 780 20";
  return (
    <svg viewBox="0 0 800 120" style={{width:'100%',maxWidth:760,overflow:'visible'}} aria-hidden="true">
      <defs><path id={id} d={d} fill="none"/></defs>
      <text style={{fontFamily:'Nunito',fontWeight:700,fontSize:54,letterSpacing:'-.01em',fill:'var(--slate)'}}>
        <textPath href={`#${id}`} startOffset="50%" textAnchor="middle">{text}</textPath>
      </text>
    </svg>
  );
}

function Gallery({images, active, setActive}){
  return (
    <div className="lp-gallery" style={{display:'grid',gridTemplateColumns:'72px 1fr',gap:16,alignItems:'start'}}>
      <div className="lp-thumbs" style={{display:'flex',flexDirection:'column',gap:10}}>
        {images.map((im,i)=>(
          <button key={i} onClick={()=>setActive(i)} aria-label={`view image ${i+1}`}
            style={{
              width:72,height:72,borderRadius:14,overflow:'hidden',
              border: i===active? '2px solid var(--raspberry)':'2px solid transparent',
              background:'#fff',padding:0,outline:'none',
              boxShadow: i===active? '0 6px 18px rgba(214,43,79,.18)':'0 2px 8px rgba(60,72,88,.06)',
              transition:'transform .15s'
            }}>
            <img src={im.src} alt="" className="product-img" style={{width:'100%',height:'100%',objectFit:'cover'}}/>
          </button>
        ))}
      </div>
      <div style={{position:'relative',background:'#fff',borderRadius:28,overflow:'hidden',aspectRatio:'1/1',boxShadow:'0 14px 40px rgba(60,72,88,.08)'}}>
        {/* soft ambient blob */}
        <div style={{position:'absolute',inset:0,background:'radial-gradient(60% 50% at 30% 60%, rgba(214,43,79,.10), transparent 60%)'}}/>
        <img src={images[active].src} alt={images[active].alt} className="product-img" style={{position:'absolute',inset:0,width:'100%',height:'100%',objectFit:'contain'}}/>
        {/* badges */}
        <div style={{position:'absolute',top:18,left:18,display:'flex',gap:8}}>
          <span className="lower" style={{background:'var(--raspberry)',color:'#fff',fontSize:12,fontWeight:700,padding:'6px 12px',borderRadius:999,letterSpacing:'.02em'}}>new shape</span>
          <span className="lower" style={{background:'#fff',color:'var(--slate)',border:'1px solid var(--line)',fontSize:12,fontWeight:700,padding:'6px 12px',borderRadius:999}}>${COMPARE-PRICE} off</span>
        </div>
        {/* dot pager */}
        <div style={{position:'absolute',bottom:18,left:'50%',transform:'translateX(-50%)',display:'flex',gap:6}}>
          {images.map((_,i)=>(
            <button key={i} onClick={()=>setActive(i)} aria-label={`go to image ${i+1}`}
              style={{width: i===active? 22:8, height:8, borderRadius:99, background: i===active? 'var(--raspberry)':'#E7DECF', transition:'width .2s'}}/>
          ))}
        </div>
      </div>
    </div>
  );
}

function Hero({active, setActive, onAdd, qty, setQty}){
  return (
    <section className="lp-hero-section" style={{maxWidth:1280,margin:'0 auto',padding:'24px 24px 60px'}}>
      <div className="lp-hero-grid" style={{display:'grid',gridTemplateColumns:'1.05fr 1fr',gap:64,alignItems:'start'}}>
        <Gallery images={IMAGES} active={active} setActive={setActive}/>
        <div style={{paddingTop:8}}>
          <div className="lower" style={{fontSize:13,fontWeight:700,letterSpacing:'.08em',color:'var(--raspberry)'}}>plusOne® · air pulsing series</div>
          <h1 className="lower lp-hero-title" style={{fontSize:56,lineHeight:1,margin:'10px 0 8px',letterSpacing:'-.02em',fontWeight:800}}>
            heart throb<span style={{color:'var(--raspberry)'}}>.</span>
          </h1>
          <p className="lower lp-hero-desc" style={{fontSize:19,color:'var(--slate-2)',margin:'0 0 18px',maxWidth:520,lineHeight:1.45}}>
            an air-pulsing vibe shaped like the thing it makes do flips. 11 pulse speeds, 12 vibrations, two motors you can run on their own or together.
          </p>
          <div style={{display:'flex',alignItems:'center',gap:14,marginBottom:24}}>
            <Stars n={5} size={18}/>
            <span className="lower" style={{fontSize:14,fontWeight:600,color:'var(--slate-2)'}}>
              <b style={{color:'var(--slate)'}}>{REVIEW_STATS.avg}</b> · {REVIEW_STATS.count.toLocaleString()} reviews
            </span>
          </div>

          {/* Price */}
          <div style={{display:'flex',alignItems:'baseline',gap:12,marginBottom:24}}>
            <span style={{fontSize:36,fontWeight:800,color:'var(--slate)'}}>${PRICE}</span>
            <span style={{fontSize:20,fontWeight:600,color:'var(--slate-soft)',textDecoration:'line-through'}}>${COMPARE}</span>
            <span className="lower" style={{fontSize:12,fontWeight:700,color:'var(--raspberry)',background:'var(--blush)',padding:'4px 10px',borderRadius:999}}>save ${COMPARE-PRICE}</span>
          </div>

{/* qty + cta */}
          <div style={{display:'flex',gap:12,marginBottom:18}}>
            <div style={{display:'flex',alignItems:'center',border:'2px solid var(--slate)',borderRadius:999,padding:'0 6px',height:54}}>
              <button onClick={()=>setQty(Math.max(1,qty-1))} aria-label="decrease" style={{width:36,height:36,borderRadius:'50%',fontWeight:800,fontSize:20,color:'var(--slate)'}}>–</button>
              <span style={{width:32,textAlign:'center',fontWeight:800,fontSize:16}}>{qty}</span>
              <button onClick={()=>setQty(qty+1)} aria-label="increase" style={{width:36,height:36,borderRadius:'50%',fontWeight:800,fontSize:20,color:'var(--slate)'}}>+</button>
            </div>
            <button onClick={onAdd} className="lower" style={{
              flex:1,height:54,borderRadius:999,
              background:'var(--raspberry)',color:'#fff',fontWeight:800,fontSize:16,letterSpacing:'.02em',
              boxShadow:'0 10px 24px rgba(214,43,79,.32)',
              display:'flex',alignItems:'center',justifyContent:'center',gap:10
            }}>
              <IconCart size={18}/>
              add to cart · ${PRICE * qty}
            </button>
          </div>

          {/* trust list */}
          <ul className="lp-trust-list" style={{listStyle:'none',padding:0,margin:'12px 0 0',display:'grid',gridTemplateColumns:'1fr 1fr',gap:'8px 18px'}}>
            {['discreet shipping, always','30-day happiness guarantee','body-safe medical silicone','1-year warranty included'].map((t,i)=>(
              <li key={i} className="lower" style={{display:'flex',alignItems:'center',gap:8,fontSize:14,color:'var(--slate-2)',fontWeight:600}}>
                <span style={{display:'inline-flex',alignItems:'center',justifyContent:'center',width:20,height:20,borderRadius:'50%',background:'var(--blush)',color:'var(--raspberry)'}}><IconCheck size={12}/></span>
                {t}
              </li>
            ))}
          </ul>
        </div>
      </div>
    </section>
  );
}

function StatsStrip(){
  const items = [
    { n: '11', l: 'air pulsing\nsettings' },
    { n: '12', l: 'vibration\nsettings' },
    { n: '2',  l: 'independent\nmotors' },
    { n: 'IPX7', l: 'waterproof,\nshower-ready' },
    { n: '<50dB', l: 'whisper\nquiet' },
  ];
  return (
    <section className="lp-stats-section" style={{background:'var(--slate)',color:'#fff',padding:'40px 24px'}}>
      <div className="lp-stats-grid" style={{maxWidth:1280,margin:'0 auto',display:'grid',gridTemplateColumns:'repeat(5,1fr)',gap:24}}>
        {items.map((it,i)=>(
          <div key={i} style={{textAlign:'center',padding:'8px 12px',borderLeft: i? '1px solid rgba(255,255,255,.12)':'none'}}>
            <div style={{fontSize:42,fontWeight:800,letterSpacing:'-.02em',color:'#fff'}}>{it.n}</div>
            <div className="lower" style={{fontSize:13,color:'rgba(255,255,255,.7)',marginTop:4,whiteSpace:'pre-line',lineHeight:1.3}}>{it.l}</div>
          </div>
        ))}
      </div>
    </section>
  );
}

function FeaturesBlock(){
  return (
    <section id="features" className="lp-features-section" style={{padding:'90px 24px 60px',position:'relative',overflow:'hidden'}}>
      {/* wavy decorative lines */}
      <svg style={{position:'absolute',right:-80,top:60,width:520,opacity:.55,pointerEvents:'none'}} viewBox="0 0 500 400" fill="none">
        <path d="M-20 380 C 120 260, 280 320, 540 200" stroke="#F19BAA" strokeWidth="2"/>
        <path d="M-20 360 C 140 240, 300 300, 540 180" stroke="#E76480" strokeWidth="1.5"/>
        <path d="M-20 340 C 160 220, 320 280, 540 160" stroke="#D62B4F" strokeWidth="1.2"/>
      </svg>
      <div style={{maxWidth:1180,margin:'0 auto',textAlign:'center',position:'relative'}}>
        <div style={{display:'flex',justifyContent:'center'}}>
          <CurvedHeading text="every part has a job." id="curveA"/>
        </div>
        <p className="lower" style={{maxWidth:580,margin:'0 auto 50px',color:'var(--slate-2)',fontSize:17}}>
          a heart-shaped silicone shell, two independent motors, and a magnetic snap charge. that's the whole product.
        </p>

        <div className="lp-features-grid" style={{position:'relative',display:'grid',gridTemplateColumns:'1fr 1.1fr 1fr',gap:32,alignItems:'center',textAlign:'left'}}>
          <div style={{display:'flex',flexDirection:'column',gap:36}}>
            {FEATURES.slice(0,3).map((f,i)=>(
              <FeatureCallout key={i} {...f} align="right"/>
            ))}
          </div>
          <div style={{position:'relative'}}>
            <div style={{position:'absolute',inset:'-8% -4%',background:'radial-gradient(60% 60% at 50% 55%, rgba(214,43,79,.18), transparent 65%)',borderRadius:'50%'}}/>
            <img src="img/three-quarter.webp" alt="heart throb product" className="product-img" style={{position:'relative',width:'100%'}}/>
          </div>
          <div style={{display:'flex',flexDirection:'column',gap:36}}>
            {FEATURES.slice(3).map((f,i)=>(
              <FeatureCallout key={i} {...f} align="left"/>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
}

function FeatureCallout({title, body, align}){
  return (
    <div style={{textAlign: align==='right'? 'right':'left',position:'relative'}}>
      <div className="lower" style={{fontSize:18,fontWeight:800,color:'var(--slate)',marginBottom:4,letterSpacing:'-.01em'}}>{title}</div>
      <div className="lower" style={{fontSize:14,color:'var(--slate-2)',lineHeight:1.5,maxWidth:240, marginLeft: align==='right'? 'auto':0}}>{body}</div>
      {/* hand-drawn arrow */}
      <svg style={{position:'absolute',top:18, [align==='right'?'right':'left']: -38}} width="32" height="32" viewBox="0 0 32 32" fill="none">
        {align==='right'
          ? <path d="M2 16 C 14 22, 22 14, 30 18 M 26 22 L 30 18 L 26 14" stroke="var(--slate)" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"/>
          : <path d="M30 16 C 18 22, 10 14, 2 18 M 6 22 L 2 18 L 6 14" stroke="var(--slate)" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"/>}
      </svg>
    </div>
  );
}

function HowItWorks(){
  const steps = [
    { n:'01', t:'press & hold', d:'hold the power button for 3 seconds. a soft glow says it\'s on.' },
    { n:'02', t:'pick your wave', d:'tap ▲ for air pulse, ▽ for vibration. independent — or both at once.' },
    { n:'03', t:'cycle through', d:'11 pulse speeds, 12 vibration patterns. find your favorite, save it nowhere — your secret.' },
    { n:'04', t:'rinse & charge', d:'rinse warm + mild soap. snap on the magnetic cable when done.' },
  ];
  return (
    <section className="lp-how-section" style={{background:'#fff',padding:'90px 24px'}}>
      <div style={{maxWidth:1180,margin:'0 auto'}}>
        <div className="lp-how-grid" style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:60,alignItems:'center'}}>
          <div>
            <div className="lower" style={{fontSize:13,fontWeight:700,letterSpacing:'.1em',color:'var(--raspberry)'}}>how it works</div>
            <h2 className="lower" style={{fontSize:44,margin:'8px 0 14px',letterSpacing:'-.02em',fontWeight:800,lineHeight:1.05}}>four buttons.<br/>that's the whole interface.</h2>
            <p className="lower" style={{color:'var(--slate-2)',fontSize:17,maxWidth:460,marginBottom:32}}>
              no app, no pairing, no charging dock. heart throb is the rare thing that gets out of its own way.
            </p>
            <div style={{display:'grid',gap:18}}>
              {steps.map(s=>(
                <div key={s.n} style={{display:'flex',gap:18}}>
                  <div style={{flex:'0 0 56px',height:56,borderRadius:16,background:'var(--blush)',color:'var(--raspberry)',display:'flex',alignItems:'center',justifyContent:'center',fontWeight:800,fontSize:18,letterSpacing:'.02em'}}>{s.n}</div>
                  <div>
                    <div className="lower" style={{fontWeight:800,fontSize:17,color:'var(--slate)'}}>{s.t}</div>
                    <div className="lower" style={{color:'var(--slate-2)',fontSize:14,marginTop:2}}>{s.d}</div>
                  </div>
                </div>
              ))}
            </div>
          </div>
          <div style={{position:'relative',background:'var(--cream)',borderRadius:32,padding:'40px',aspectRatio:'1/1',display:'flex',alignItems:'center',justifyContent:'center',overflow:'hidden'}}>
            <svg style={{position:'absolute',inset:0,width:'100%',height:'100%',opacity:.5}} viewBox="0 0 400 400" fill="none">
              <circle cx="200" cy="200" r="120" stroke="#F7CDD5" strokeWidth="1.2" strokeDasharray="2 6"/>
              <circle cx="200" cy="200" r="160" stroke="#F7CDD5" strokeWidth="1" strokeDasharray="2 8"/>
              <circle cx="200" cy="200" r="195" stroke="#F7CDD5" strokeWidth="1" strokeDasharray="2 10"/>
            </svg>
            <img src="img/front-flat.webp" alt="heart throb" className="product-img" style={{position:'relative',width:'72%',animation:'beat 1.6s ease-in-out infinite'}}/>
            <style>{`@keyframes beat{0%,100%{transform:scale(1)}30%{transform:scale(1.04)}45%{transform:scale(1.01)}}`}</style>
          </div>
        </div>
      </div>
    </section>
  );
}

function Charging(){
  return (
    <section className="lp-charging-section" style={{padding:'80px 24px',background:'var(--cream-2)',position:'relative',overflow:'hidden'}}>
      <div className="lp-charging-grid" style={{maxWidth:1180,margin:'0 auto',display:'grid',gridTemplateColumns:'1fr 1fr',gap:60,alignItems:'center'}}>
        <div style={{position:'relative'}}>
          <img src="img/charging.webp" alt="heart throb with magnetic charging cable" className="product-img" style={{width:'100%'}}/>
        </div>
        <div>
          <div className="lower" style={{fontSize:13,fontWeight:700,letterSpacing:'.1em',color:'var(--raspberry)'}}>in the box</div>
          <h2 className="lower" style={{fontSize:42,margin:'8px 0 16px',letterSpacing:'-.02em',fontWeight:800,lineHeight:1.05}}>
            everything you need.<br/>nothing you don't.
          </h2>
          <ul style={{listStyle:'none',padding:0,margin:'0 0 26px',display:'grid',gap:12}}>
            {[
              ['1 ×','heart throb air pulsing vibe'],
              ['1 ×','magnetic snap-on charging cable, 4 ft'],
              ['1 ×','soft drawstring storage pouch'],
              ['1 ×','little quickstart card (you won\'t need it)'],
            ].map(([k,v],i)=>(
              <li key={i} className="lower" style={{display:'flex',gap:14,fontSize:16,color:'var(--slate)',fontWeight:600,borderBottom:'1px dashed var(--line)',paddingBottom:12}}>
                <span style={{color:'var(--raspberry)',fontWeight:800,minWidth:34}}>{k}</span>
                <span style={{color:'var(--slate-2)'}}>{v}</span>
              </li>
            ))}
          </ul>
          <div style={{display:'flex',gap:14,flexWrap:'wrap'}}>
            <Pill label="USB-A · ~90 min full charge"/>
            <Pill label="1 hour continuous use"/>
            <Pill label="IPX7 waterproof"/>
          </div>
        </div>
      </div>
    </section>
  );
}

function Pill({label}){
  return <span className="lower" style={{display:'inline-flex',alignItems:'center',gap:8,padding:'8px 14px',background:'#fff',border:'1.5px solid var(--line)',borderRadius:999,fontSize:13,fontWeight:700,color:'var(--slate)'}}>
    <span style={{width:6,height:6,borderRadius:'50%',background:'var(--raspberry)'}}/>{label}
  </span>;
}

function Compare(){
  const rows = [
    ['air pulsing motor', true, true, false],
    ['vibration motor', true, true, true],
    ['independent dual control', true, false, false],
    ['body-safe medical silicone', true, true, false],
    ['IPX7 fully waterproof', true, false, true],
    ['magnetic charging', true, false, false],
    ['under 50dB whisper quiet', true, false, false],
    ['app required', false, true, true],
  ];
  const head = ['', 'heart throb', 'typical air-pulse vibe', 'classic bullet vibe'];
  return (
    <section className="lp-compare-section" style={{padding:'90px 24px',background:'#fff'}}>
      <div style={{maxWidth:1080,margin:'0 auto'}}>
        <div style={{textAlign:'center',marginBottom:36}}>
          <div className="lower" style={{fontSize:13,fontWeight:700,letterSpacing:'.1em',color:'var(--raspberry)'}}>how it compares</div>
          <h2 className="lower" style={{fontSize:42,margin:'8px 0 0',letterSpacing:'-.02em',fontWeight:800}}>more for less — and less to fiddle with.</h2>
        </div>
        <div style={{overflow:'hidden',border:'1px solid var(--line)',borderRadius:24}}>
          <table style={{width:'100%',borderCollapse:'collapse'}}>
            <thead>
              <tr style={{background:'var(--cream)'}}>
                {head.map((h,i)=>(
                  <th key={i} className="lower" style={{
                    textAlign:i===0?'left':'center',padding:'18px 18px',
                    fontSize:14,fontWeight:800,
                    color:i===1? 'var(--raspberry)':'var(--slate-2)',
                    borderBottom:'1px solid var(--line)'
                  }}>{h}</th>
                ))}
              </tr>
            </thead>
            <tbody>
              {rows.map((r,i)=>(
                <tr key={i} style={{borderBottom:'1px solid var(--line)'}}>
                  <td className="lower" style={{padding:'14px 18px',fontSize:14,fontWeight:600,color:'var(--slate)'}}>{r[0]}</td>
                  {r.slice(1).map((v,j)=>{
                    const want = r[0]==='app required'? !v : v;
                    return <td key={j} style={{textAlign:'center',padding:'14px 18px',background:j===0? 'rgba(214,43,79,.04)':'transparent'}}>
                      {want
                        ? <span style={{display:'inline-flex',alignItems:'center',justifyContent:'center',width:26,height:26,borderRadius:'50%',background:'var(--blush)',color:'var(--raspberry)'}}><IconCheck size={14}/></span>
                        : <span style={{color:'var(--slate-soft)',fontSize:18}}>—</span>}
                    </td>;
                  })}
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      </div>
    </section>
  );
}

function Reviews(){
  const [filter, setFilter] = useState('all');
  const filtered = filter==='all'? REVIEWS : REVIEWS.filter(r=> r.stars===Number(filter));
  return (
    <section id="reviews" className="lp-reviews-section" style={{padding:'90px 24px',background:'var(--cream)'}}>
      <div style={{maxWidth:1180,margin:'0 auto'}}>
        <div className="lp-reviews-grid" style={{display:'grid',gridTemplateColumns:'360px 1fr',gap:48,alignItems:'start'}}>
          <div>
            <div className="lower" style={{fontSize:13,fontWeight:700,letterSpacing:'.1em',color:'var(--raspberry)'}}>reviews</div>
            <h2 className="lower" style={{fontSize:42,margin:'8px 0 18px',letterSpacing:'-.02em',fontWeight:800,lineHeight:1.05}}>
              <span style={{fontSize:64}}>{REVIEW_STATS.avg}</span>
              <span style={{fontSize:24,color:'var(--slate-soft)',marginLeft:6}}>/ 5</span>
            </h2>
            <div style={{marginBottom:6}}><Stars n={5} size={18}/></div>
            <div className="lower" style={{fontSize:14,color:'var(--slate-2)',marginBottom:24}}>based on {REVIEW_STATS.count.toLocaleString()} verified reviews</div>
            <div style={{display:'grid',gap:8}}>
              {REVIEW_STATS.bars.map(b=>(
                <button key={b.stars} onClick={()=>setFilter(filter===String(b.stars)? 'all':String(b.stars))}
                  style={{display:'flex',alignItems:'center',gap:10,background:'transparent',padding:0,textAlign:'left',cursor:'pointer'}}>
                  <span className="lower" style={{fontSize:13,fontWeight:700,width:42,color: filter===String(b.stars)? 'var(--raspberry)':'var(--slate-2)'}}>{b.stars} star</span>
                  <span style={{flex:1,height:8,background:'var(--line)',borderRadius:99,overflow:'hidden'}}>
                    <span style={{display:'block',height:'100%',width:`${b.pct}%`,background: filter===String(b.stars)? 'var(--raspberry)':'var(--slate)',borderRadius:99,transition:'width .3s'}}/>
                  </span>
                  <span style={{fontSize:12,fontWeight:700,color:'var(--slate-soft)',width:36,textAlign:'right'}}>{b.pct}%</span>
                </button>
              ))}
            </div>
            <button className="lower" style={{marginTop:24,padding:'12px 20px',border:'1.5px solid var(--slate)',borderRadius:999,fontWeight:700,fontSize:14}}>write a review</button>
          </div>
          <div style={{display:'grid',gap:14}}>
            {filtered.length===0 && (
              <div className="lower" style={{padding:'40px',background:'#fff',borderRadius:20,textAlign:'center',color:'var(--slate-soft)'}}>no reviews match this filter yet.</div>
            )}
            {filtered.map((r,i)=>(
              <article key={i} style={{background:'#fff',padding:24,borderRadius:20,boxShadow:'0 2px 14px rgba(60,72,88,.05)'}}>
                <header style={{display:'flex',justifyContent:'space-between',alignItems:'center',marginBottom:8}}>
                  <div style={{display:'flex',alignItems:'center',gap:10}}>
                    <div style={{width:36,height:36,borderRadius:'50%',background:'var(--blush)',color:'var(--raspberry)',display:'flex',alignItems:'center',justifyContent:'center',fontWeight:800,fontSize:14}}>{r.name[0]}</div>
                    <div>
                      <div className="lower" style={{fontWeight:800,fontSize:14}}>{r.name}</div>
                      <div className="lower" style={{fontSize:12,color:'var(--slate-soft)',display:'flex',alignItems:'center',gap:6}}>
                        <IconCheck size={11}/> {r.badge} · {r.date}
                      </div>
                    </div>
                  </div>
                  <Stars n={r.stars} size={14}/>
                </header>
                <div className="lower" style={{fontWeight:800,fontSize:16,color:'var(--slate)',marginTop:6}}>"{r.title}"</div>
                <p className="lower" style={{color:'var(--slate-2)',fontSize:14,margin:'6px 0 0',lineHeight:1.55}}>{r.body}</p>
              </article>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
}

function FAQSection(){
  const [open, setOpen] = useState(0);
  return (
    <section id="faq" className="lp-faq-section" style={{padding:'90px 24px',background:'#fff'}}>
      <div style={{maxWidth:780,margin:'0 auto'}}>
        <div style={{textAlign:'center',marginBottom:40}}>
          <div className="lower" style={{fontSize:13,fontWeight:700,letterSpacing:'.1em',color:'var(--raspberry)'}}>questions</div>
          <h2 className="lower" style={{fontSize:42,margin:'8px 0 0',letterSpacing:'-.02em',fontWeight:800}}>the things people ask.</h2>
        </div>
        <div style={{display:'grid',gap:10}}>
          {FAQ.map((f,i)=>{
            const isOpen = open===i;
            return (
              <div key={i} style={{border:'1.5px solid var(--line)',borderRadius:18,background: isOpen? 'var(--cream)':'#fff',overflow:'hidden',transition:'background .2s'}}>
                <button onClick={()=>setOpen(isOpen? -1:i)} style={{width:'100%',display:'flex',alignItems:'center',justifyContent:'space-between',padding:'18px 22px',textAlign:'left'}}>
                  <span className="lower" style={{fontSize:17,fontWeight:800,color:'var(--slate)'}}>{f.q}</span>
                  <IconChev open={isOpen}/>
                </button>
                <div style={{maxHeight: isOpen? 200:0,overflow:'hidden',transition:'max-height .3s ease'}}>
                  <p className="lower" style={{padding:'0 22px 20px',margin:0,color:'var(--slate-2)',fontSize:15,lineHeight:1.55}}>{f.a}</p>
                </div>
              </div>
            );
          })}
        </div>
      </div>
    </section>
  );
}

function PromiseStrip(){
  const items = [
    { t:'discreet shipping', d:'plain padded mailer. no branding, no contents listed on the label.' },
    { t:'30-day happiness', d:'unopened returns within 30 days. defective? we replace it, no questions.' },
    { t:'1-year warranty',  d:'covers the electronics and the silicone. just hit us up.' },
    { t:'real humans',      d:'support team based in portland, 8am–8pm PT, every day.' },
  ];
  return (
    <section className="lp-promise-section" style={{padding:'70px 24px',background:'var(--blush)'}}>
      <div className="lp-promise-grid" style={{maxWidth:1180,margin:'0 auto',display:'grid',gridTemplateColumns:'repeat(4,1fr)',gap:24}}>
        {items.map((it,i)=>(
          <div key={i}>
            <IconHeart size={22} color="var(--raspberry)"/>
            <div className="lower" style={{fontSize:18,fontWeight:800,marginTop:10,color:'var(--slate)'}}>{it.t}</div>
            <div className="lower" style={{fontSize:14,color:'var(--slate-2)',marginTop:6,lineHeight:1.5}}>{it.d}</div>
          </div>
        ))}
      </div>
    </section>
  );
}

function FinalCTA({onAdd}){
  return (
    <section className="lp-cta-section" style={{padding:'100px 24px',background:'var(--cream-2)',textAlign:'center',position:'relative',overflow:'hidden'}}>
      <svg style={{position:'absolute',left:-60,bottom:-40,width:400,opacity:.5,pointerEvents:'none'}} viewBox="0 0 500 400" fill="none">
        <path d="M-20 380 C 120 260, 280 320, 540 200" stroke="#F19BAA" strokeWidth="2"/>
        <path d="M-20 360 C 140 240, 300 300, 540 180" stroke="#E76480" strokeWidth="1.5"/>
      </svg>
      <div style={{maxWidth:680,margin:'0 auto',position:'relative'}}>
        <img src="img/front-flat.webp" alt="" className="product-img" style={{width:200,margin:'0 auto 20px',animation:'beat 1.6s ease-in-out infinite'}}/>
        <h2 className="lower lp-cta-title" style={{fontSize:54,margin:'0 0 14px',letterSpacing:'-.02em',fontWeight:800,lineHeight:1.05}}>your heart, your call.</h2>
        <p className="lower" style={{fontSize:18,color:'var(--slate-2)',margin:'0 0 28px'}}>
          ships in a plain padded mailer, today if you order before 2pm. comes home with a 30-day guarantee.
        </p>
        <button onClick={onAdd} className="lower" style={{
          padding:'18px 38px',borderRadius:999,background:'var(--raspberry)',color:'#fff',
          fontWeight:800,fontSize:18,boxShadow:'0 14px 30px rgba(214,43,79,.32)',
          display:'inline-flex',alignItems:'center',gap:12
        }}>
          <IconCart size={18}/> add heart throb · ${PRICE}
        </button>
        <div className="lower" style={{marginTop:14,fontSize:13,color:'var(--slate-soft)'}}>free shipping over $50 · pay in 4 with shop pay</div>
      </div>
    </section>
  );
}

function Footer(){
  const cols = [
    { h:'shop', items:['the product','bundles','gift cards','journal'] },
    { h:'help', items:['shipping','returns','warranty','contact'] },
    { h:'plusOne', items:['about','our promise','press','wholesale'] },
  ];
  return (
    <footer className="lp-footer" style={{background:'var(--slate)',color:'rgba(255,255,255,.85)',padding:'70px 24px 30px'}}>
      <div style={{maxWidth:1280,margin:'0 auto'}}>
        <div className="lp-footer-grid" style={{display:'grid',gridTemplateColumns:'1.4fr 1fr 1fr 1fr',gap:48,marginBottom:50}}>
          <div>
            <div style={{fontSize:28,fontWeight:800,letterSpacing:'-.01em'}}>
              <span>plus</span><span style={{color:'var(--blush-2)'}}>One</span><span style={{fontSize:11,verticalAlign:'super',marginLeft:2,opacity:.6}}>®</span>
            </div>
            <p className="lower" style={{maxWidth:340,marginTop:12,color:'rgba(255,255,255,.65)',fontSize:14,lineHeight:1.55}}>
              honest, body-safe pleasure products designed in portland. 100,000+ humans served, 1,200+ five-star reviews.
            </p>
            <form onSubmit={e=>e.preventDefault()} style={{marginTop:22,display:'flex',gap:8,maxWidth:360}}>
              <input className="lower" placeholder="email for 10% off your first" style={{flex:1,padding:'12px 16px',borderRadius:999,border:'1px solid rgba(255,255,255,.2)',background:'rgba(255,255,255,.06)',color:'#fff',fontSize:14,outline:'none',fontFamily:'inherit'}}/>
              <button className="lower" style={{padding:'0 18px',borderRadius:999,background:'var(--blush-2)',color:'var(--slate)',fontWeight:800,fontSize:13}}>join</button>
            </form>
          </div>
          {cols.map((c,i)=>(
            <div key={i}>
              <div className="lower" style={{fontSize:12,letterSpacing:'.12em',fontWeight:800,marginBottom:14,color:'rgba(255,255,255,.55)'}}>{c.h}</div>
              <ul style={{listStyle:'none',padding:0,margin:0,display:'grid',gap:10}}>
                {c.items.map((it,j)=><li key={j} className="lower" style={{fontSize:14}}>{it}</li>)}
              </ul>
            </div>
          ))}
        </div>
        <div style={{borderTop:'1px solid rgba(255,255,255,.12)',paddingTop:22,display:'flex',justifyContent:'space-between',alignItems:'center',flexWrap:'wrap',gap:12}}>
          <div className="lower" style={{fontSize:12,color:'rgba(255,255,255,.5)'}}>© 2026 plusOne, inc. · adults 18+ only · made with care</div>
          <div className="lower" style={{display:'flex',gap:20,fontSize:12,color:'rgba(255,255,255,.6)'}}>
            <a>privacy</a><a>terms</a><a>accessibility</a><a>do not sell my info</a>
          </div>
        </div>
      </div>
    </footer>
  );
}

function CartDrawer({open, onClose, items, qtyChange, removeItem}){
  const subtotal = items.reduce((s,i)=> s+i.price*i.qty, 0);
  return (
    <>
      <div onClick={onClose} style={{
        position:'fixed',inset:0,background:'rgba(60,72,88,.4)',zIndex:50,
        opacity: open?1:0, pointerEvents: open?'auto':'none', transition:'opacity .2s'
      }}/>
      <aside aria-hidden={!open} style={{
        position:'fixed',top:0,right:0,bottom:0,width:420,maxWidth:'92vw',background:'var(--cream)',zIndex:51,
        transform: open? 'translateX(0)':'translateX(105%)',transition:'transform .28s ease',
        display:'flex',flexDirection:'column',boxShadow:'-20px 0 40px rgba(60,72,88,.18)'
      }}>
        <header style={{padding:'20px 24px',display:'flex',justifyContent:'space-between',alignItems:'center',borderBottom:'1px solid var(--line)'}}>
          <div className="lower" style={{fontSize:20,fontWeight:800}}>your cart</div>
          <button onClick={onClose} aria-label="close cart" style={{padding:8}}><IconX/></button>
        </header>
        <div style={{flex:1,overflowY:'auto',padding:'20px 24px'}}>
          {items.length===0
            ? <div className="lower" style={{textAlign:'center',padding:'60px 0',color:'var(--slate-soft)'}}>your cart is empty.<br/>(it's lonely in here.)</div>
            : items.map((it,i)=>(
              <div key={i} style={{display:'flex',gap:14,padding:'14px 0',borderBottom:'1px dashed var(--line)'}}>
                <div style={{width:74,height:74,background:'#fff',borderRadius:14,padding:6,flexShrink:0}}>
                  <img src="img/front-flat.webp" className="product-img" style={{width:'100%',height:'100%',objectFit:'contain'}} alt=""/>
                </div>
                <div style={{flex:1}}>
                  <div className="lower" style={{fontWeight:800,fontSize:15}}>{it.title}</div>
                  <div style={{display:'flex',justifyContent:'space-between',alignItems:'center',marginTop:8}}>
                    <div style={{display:'flex',alignItems:'center',border:'1.5px solid var(--line)',borderRadius:999}}>
                      <button onClick={()=>qtyChange(i,-1)} style={{width:28,height:28,fontWeight:800,color:'var(--slate-2)'}}>–</button>
                      <span style={{width:22,textAlign:'center',fontSize:13,fontWeight:800}}>{it.qty}</span>
                      <button onClick={()=>qtyChange(i,1)} style={{width:28,height:28,fontWeight:800,color:'var(--slate-2)'}}>+</button>
                    </div>
                    <div style={{fontWeight:800,fontSize:15}}>${it.price*it.qty}</div>
                  </div>
                </div>
                <button onClick={()=>removeItem(i)} aria-label="remove" style={{alignSelf:'flex-start',color:'var(--slate-soft)',fontSize:12}} className="lower">remove</button>
              </div>
            ))
          }
        </div>
        {items.length>0 && (
          <footer style={{padding:'20px 24px',borderTop:'1px solid var(--line)',background:'#fff'}}>
            <div style={{display:'flex',justifyContent:'space-between',marginBottom:6}}>
              <span className="lower" style={{color:'var(--slate-2)'}}>subtotal</span>
              <span style={{fontWeight:800}}>${subtotal}</span>
            </div>
            <div className="lower" style={{fontSize:12,color:'var(--slate-soft)',marginBottom:14}}>shipping & taxes calculated at checkout · ships discreetly</div>
            <button className="lower" style={{width:'100%',padding:'16px',background:'var(--raspberry)',color:'#fff',fontWeight:800,fontSize:16,borderRadius:999,boxShadow:'0 8px 20px rgba(214,43,79,.28)'}}>checkout · ${subtotal}</button>
          </footer>
        )}
      </aside>
    </>
  );
}

function StickyAddBar({onAdd, total}){
  const [show, setShow] = useState(false);
  useEffect(()=>{
    const onS = ()=> setShow(window.scrollY > 760 && window.scrollY < document.body.scrollHeight - window.innerHeight - 300);
    window.addEventListener('scroll', onS); onS();
    return ()=> window.removeEventListener('scroll', onS);
  },[]);
  return (
    <div className="lp-sticky-bar" style={{
      position:'fixed',bottom: show? 16:-80, left:'50%',transform:'translateX(-50%)',
      transition:'bottom .3s ease',zIndex:30,
      background:'#fff',border:'1px solid var(--line)',borderRadius:999,padding:'8px 8px 8px 22px',
      display:'flex',alignItems:'center',gap:18,boxShadow:'0 14px 36px rgba(60,72,88,.14)'
    }}>
      <img src="img/front-flat.webp" alt="" className="product-img" style={{width:32,height:32,objectFit:'contain'}}/>
      <div className="lower" style={{fontSize:14}}>
        <b>heart throb</b> · <span style={{color:'var(--slate-soft)'}}>${total}</span>
      </div>
      <button onClick={onAdd} className="lower" style={{padding:'12px 22px',background:'var(--raspberry)',color:'#fff',fontWeight:800,fontSize:14,borderRadius:999,display:'flex',alignItems:'center',gap:8}}>
        <IconCart size={14}/> add to cart
      </button>
    </div>
  );
}

function Toast({show, text}){
  return <div style={{
    position:'fixed',top:80,left:'50%',transform:`translateX(-50%) translateY(${show?0:-20}px)`,
    background:'var(--slate)',color:'#fff',padding:'12px 22px',borderRadius:999,fontWeight:700,fontSize:14,
    zIndex:60,opacity: show?1:0,transition:'all .25s',display:'flex',alignItems:'center',gap:8,
    boxShadow:'0 10px 30px rgba(60,72,88,.3)'
  }} className="lower"><IconCheck size={14}/> {text}</div>;
}

/* ============ App ============ */
function App(){
  const [active, setActive] = useState(0);
  const [qty, setQty] = useState(1);
  const [cart, setCart] = useState([]);
  const [drawerOpen, setDrawerOpen] = useState(false);
  const [toast, setToast] = useState({show:false, text:''});


  const addToCart = ()=>{
    // Start a fresh funnel order and head into the upsell flow.
    if (window.HTFunnel) {
      window.HTFunnel.resetOrder();
      window.HTFunnel.addItem({
        sku: 'heart-throb',
        title: 'heart throb · air pulsing vibe',
        price: PRICE,
        qty,
        kind: 'main',
      });
      // Mark base offer as accepted (this is the entry point of the funnel).
      window.HTFunnel.trackOffer('heart-throb', true);
    }
    setCart(prev=>{
      const key = 'heart-throb';
      const existing = prev.findIndex(p=>p.key===key);
      if(existing>=0){
        const next = [...prev];
        next[existing] = {...next[existing], qty: next[existing].qty + qty};
        return next;
      }
      return [...prev, {
        key,
        title: 'heart throb',
        price: PRICE,
        qty,
      }];
    });
    setToast({show:true, text:'added — continuing'});
    setTimeout(()=> {
      window.location.href = 'Upsell 1.html';
    }, 700);
  };

  const openCart = ()=> setDrawerOpen(true);
  const qtyChange = (i,d)=> setCart(prev=> prev.map((it,idx)=> idx===i? {...it, qty: Math.max(1, it.qty+d)}: it));
  const removeItem = (i)=> setCart(prev=> prev.filter((_,idx)=> idx!==i));

  const cartCount = cart.reduce((s,i)=> s+i.qty, 0);

  return (
    <>
      <AnnouncementBar/>
      <Nav onCart={openCart} cartCount={cartCount}/>
      <Hero
        active={active} setActive={setActive}
        qty={qty} setQty={setQty}
        onAdd={addToCart}
      />
      <StatsStrip/>
      <FeaturesBlock/>
      <HowItWorks/>
      <Charging/>
      <Compare/>
      <Reviews/>
      <FAQSection/>
      <PromiseStrip/>
      <FinalCTA onAdd={addToCart}/>
      <Footer/>
      <CartDrawer open={drawerOpen} onClose={()=>setDrawerOpen(false)} items={cart} qtyChange={qtyChange} removeItem={removeItem}/>
      <StickyAddBar onAdd={addToCart} total={PRICE * qty}/>
      <Toast show={toast.show} text={toast.text}/>
    </>
  );
}

ReactDOM.createRoot(document.getElementById('root')).render(<App/>);
