// Generated by build.mjs — do not edit by hand.
// Edit the source files in source/ (or build.mjs transforms), then re-run: node build.mjs

// ─── Design tokens (match ParentStack prototype) ──────────────────────────
const T = {
  teal: '#1D9E75', tealL: '#9FE1CB', tealS: '#D6F0E8', tealD: '#085041',
  amber: '#EF9F27', amberS: '#FEF3D9', amberD: '#412402',
  bg: '#F7F5F0', surface: '#FFFFFF', subtle: '#F0EDE6', subtleD: '#E8E2D6',
  pri: '#1A1A1A', sec: '#6B6860', muted: '#9E9B94',
  sage: '#5E8A60', sageS: '#E3EDE3',
  violet: '#7264C8', violetS: '#EEEDFE',
  rose: '#C0505A', roseS: '#FAEAEA',
  sky: '#3D7DC8', skyS: '#E3EEF8',
  border: 'rgba(0,0,0,0.08)', borderStrong: 'rgba(0,0,0,0.14)',
};

// ─── Unsplash photo set (kids at camp, outdoor) ───────────────────────────
const U = (id, w = 900) => `https://images.unsplash.com/photo-${id}?w=${w}&q=80&auto=format&fit=crop`;
const PHOTOS = {
  campfireNight:  U('1485217988980-11786ced9454', 1200), // campfire glowing
  kidsCanoe:      U('1503454537195-1dcabb73ffb9', 1000), // kids by water
  kidForest:      U('1502086223501-7ea6ecd79368', 900),  // child walking forest
  kidReading:     U('1497486751825-1233686d5d80', 800),  // boy reading
  kidsRunning:    U('1517677129300-07b130802f46', 900),  // kid running
  swing:          U('1500964757637-5350a193c5fa', 800),  // child on swing
  kidsLake:       U('1547036967-23d11aacaee0', 1100),    // mountain lake
  kidsArt:        U('1591474200742-8e512e6f98f8', 800),  // craft/painting
  kidPaint:       U('1503454537195-1dcabb73ffb9', 800),
  tents:          U('1504280390367-361c6d9f38f4', 1100), // tents at camp
  hikingPath:     U('1469854523086-cc02fe5d8800', 1100), // landscape
  groupSmile:     U('1566004100631-35d015d6a491', 900),  // kids
  rope:           U('1469371670807-013ccf25f16a', 800),
  forestLight:    U('1441974231531-c6227db76b6e', 1100),
  // New picks for V5
  parentsCouple:  U('1604881987996-7e3635a4e02a', 1100), // (guess) diverse couple
  siblingsPlay:   U('1503944168849-8bf86bb04b81', 1000), // (guess) kids playing
  familyDesk:     U('1611224923853-80b023f02d71', 1000), // (guess) planning / desk
  // Curated local photos
  campPinewood:     '/images/camp-pinewood.jpg',
  familyCamping:    '/images/family-camping.jpg',
  beachSandcastles: '/images/beach-sandcastles.jpg',
  artStudio:        '/images/art-studio.jpg',
  familyHome:       '/images/family-home.jpg',
  parentsLaptop:    '/images/parents-laptop.jpg',
  soccerPark:       '/images/soccer-park.jpg',
};

// ─── Tiny icons (only what we need) ───────────────────────────────────────
function LPIcon({ name, size = 18, color = T.teal, stroke = 1.6 }) {
  const paths = {
    star:    <polygon points="12,3 14.8,9.1 21.5,9.8 16.5,14.3 18,21 12,17.5 6,21 7.5,14.3 2.5,9.8 9.2,9.1" />,
    spark:   <><path d="M12 3v6M12 15v6M3 12h6M15 12h6" /><path d="M5.6 5.6l3.2 3.2M15.2 15.2l3.2 3.2M5.6 18.4l3.2-3.2M15.2 8.8l3.2-3.2" /></>,
    cal:     <><rect x="3.5" y="5" width="17" height="15" rx="2"/><line x1="3.5" y1="10" x2="20.5" y2="10"/><line x1="8" y1="3" x2="8" y2="7"/><line x1="16" y1="3" x2="16" y2="7"/></>,
    chat:    <path d="M20.5 14.5a2 2 0 01-2 2H7l-3.5 3.5V5.5a2 2 0 012-2h13a2 2 0 012 2z" />,
    kids:    <><circle cx="12" cy="8" r="3.2"/><path d="M5 20c0-3.5 3.3-6 7-6s7 2.5 7 6" strokeLinecap="round"/></>,
    compare: <><rect x="3" y="5" width="7.5" height="14" rx="1.5"/><rect x="13.5" y="5" width="7.5" height="14" rx="1.5"/></>,
    todo:    <><circle cx="5" cy="7" r="1.5" fill={color}/><circle cx="5" cy="12" r="1.5" fill={color}/><circle cx="5" cy="17" r="1.5" fill={color}/><line x1="9" y1="7" x2="20" y2="7" strokeLinecap="round"/><line x1="9" y1="12" x2="20" y2="12" strokeLinecap="round"/><line x1="9" y1="17" x2="16" y2="17" strokeLinecap="round"/></>,
    bell:    <path d="M6 8a6 6 0 0112 0c0 7 3 9 3 9H3s3-2 3-9zM10.5 20a1.5 1.5 0 003 0" strokeLinecap="round" strokeLinejoin="round"/>,
    home:    <><path d="M3 10l9-7 9 7v10a1 1 0 01-1 1H4a1 1 0 01-1-1V10z" /><path d="M9 21V13h6v8" /></>,
    arrow:   <><line x1="5" y1="12" x2="19" y2="12" strokeLinecap="round"/><polyline points="13,6 19,12 13,18" strokeLinecap="round" strokeLinejoin="round"/></>,
    check:   <polyline points="5,12 10,17 19,7" strokeLinecap="round" strokeLinejoin="round"/>,
    heart:   <path d="M12 21s-7-4.6-9.3-9.1c-1.3-2.6.4-5.9 3.3-5.9 1.8 0 3.3 1 4 2.5C10.7 7 12.2 6 14 6c2.9 0 4.6 3.3 3.3 5.9C15 16.4 12 21 12 21z" strokeLinejoin="round"/>,
    pin:     <><path d="M12 21s-7-6-7-12a7 7 0 0114 0c0 6-7 12-7 12z"/><circle cx="12" cy="9" r="2.6"/></>,
    leaf:    <path d="M20 4c0 9-6 16-15 16 0-9 6-16 15-16zM9 19l9-9" strokeLinejoin="round" strokeLinecap="round"/>,
  };
  return (
    <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke={color} strokeWidth={stroke} style={{ flexShrink: 0 }}>
      {paths[name]}
    </svg>
  );
}

// ─── Logo ─────────────────────────────────────────────────────────────────
function LPLogo({ size = 22, light = false, mono = false }) {
  const fg = mono ? (light ? '#fff' : T.tealD) : (light ? '#fff' : T.tealD);
  return (
    <div style={{ display: 'flex', alignItems: 'center', gap: 9, userSelect: 'none' }}>
      <div style={{
        width: size + 14, height: size + 14, borderRadius: 9,
        background: light ? 'rgba(255,255,255,0.14)' : T.tealS,
        display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0,
        border: light ? '1px solid rgba(255,255,255,0.22)' : 'none',
      }}>
        <svg width={size} height={size} viewBox="0 0 18 18" fill="none">
          <path d="M9 2L2 7v9h5v-5h4v5h5V7L9 2z" stroke={fg} strokeWidth="1.5" fill="none" strokeLinejoin="round" strokeLinecap="round"/>
        </svg>
      </div>
      <span style={{ fontFamily: "'DM Serif Display', serif", fontSize: size, color: fg, letterSpacing: '-0.012em', lineHeight: 1 }}>
        ParentStack
      </span>
    </div>
  );
}

// ─── Mini Chat surface (CampFinder AI) ───────────────────────────────────
// Shows a stylized chat: user prompt + AI typing/response + camp result cards.
// `step` 0..3 drives reveal stages.
function MiniChat({ width = 360, step = 3, scale = 1, dark = false }) {
  const stepRevealed = (s) => step >= s;
  return (
    <div style={{
      width, background: dark ? '#0F2A22' : T.surface,
      borderRadius: 18, overflow: 'hidden',
      boxShadow: '0 30px 80px -30px rgba(0,40,30,0.35), 0 2px 8px rgba(0,0,0,0.04)',
      border: `0.5px solid ${dark ? 'rgba(255,255,255,0.06)' : T.border}`,
      fontSize: 11 * scale, color: dark ? '#fff' : T.pri,
    }}>
      {/* topbar */}
      <div style={{ padding: '10px 14px', borderBottom: `0.5px solid ${dark ? 'rgba(255,255,255,0.08)' : T.border}`, display:'flex', alignItems:'center', gap:8 }}>
        <div style={{ width: 22, height: 22, borderRadius: 7, background: dark ? T.teal : T.tealS, display:'flex', alignItems:'center', justifyContent:'center' }}>
          <LPIcon name="spark" size={12} color={dark ? '#fff' : T.tealD} stroke={2} />
        </div>
        <div style={{ flex: 1 }}>
          <div style={{ fontSize: 11 * scale, fontWeight: 600, color: dark ? '#fff' : T.pri }}>Camp Finder</div>
          <div style={{ fontSize: 9 * scale, color: dark ? 'rgba(255,255,255,0.5)' : T.muted }}>AI-powered search</div>
        </div>
        <div style={{ display:'flex', gap: 4 }}>
          {[T.rose, T.amber, T.teal].map(c => <div key={c} style={{ width: 7, height: 7, borderRadius: '50%', background: c, opacity: 0.75 }}/>)}
        </div>
      </div>
      {/* messages */}
      <div style={{ padding: '14px 14px 12px', display:'flex', flexDirection:'column', gap: 10 }}>
        {/* user msg */}
        <div style={{ alignSelf: 'flex-end', maxWidth: '78%', background: T.teal, color: '#fff', padding: '8px 12px', borderRadius: '14px 14px 4px 14px', fontSize: 11 * scale, lineHeight: 1.4 }}>
          9-year-old, loves animals — outdoor camps near Palo Alto?
        </div>
        {/* AI bubble */}
        {stepRevealed(1) && (
          <div className="lp-fade-up" style={{ alignSelf: 'flex-start', maxWidth: '86%', background: dark ? 'rgba(255,255,255,0.06)' : T.subtle, color: dark ? '#fff' : T.pri, padding: '8px 12px', borderRadius: '14px 14px 14px 4px', fontSize: 11 * scale, lineHeight: 1.45 }}>
            {step === 1 ? (
              <span style={{ display:'inline-flex', alignItems:'center', gap: 4 }}>
                <span className="dot-blink" style={{ width: 5, height: 5, borderRadius: '50%', background: T.muted, display:'inline-block' }}/>
                <span className="dot-blink" style={{ width: 5, height: 5, borderRadius: '50%', background: T.muted, display:'inline-block' }}/>
                <span className="dot-blink" style={{ width: 5, height: 5, borderRadius: '50%', background: T.muted, display:'inline-block' }}/>
              </span>
            ) : (
              <>Found <b>3 outdoor camps</b> within 30 mi. Top match: nature-focused day camp at the Baylands preserve. 🌲</>
            )}
          </div>
        )}
        {/* result cards */}
        {stepRevealed(3) && (
          <div className="lp-fade-up" style={{ display:'flex', flexDirection:'column', gap: 8, marginTop: 4 }}>
            {[
              { name: 'Peninsula Nature Explorers', loc: 'Palo Alto · 2.1 mi', rating: 4.6, price: '$620/wk', photo: PHOTOS.kidsCanoe },
              { name: 'Redwood Creek Outdoor Academy', loc: 'Boulder Creek · 12 mi', rating: 4.8, price: '$1,200/wk', photo: PHOTOS.forestLight },
            ].map(c => (
              <div key={c.name} style={{ background: dark ? 'rgba(255,255,255,0.04)' : T.surface, border: `0.5px solid ${dark ? 'rgba(255,255,255,0.08)' : T.border}`, borderRadius: 10, padding: 8, display:'flex', gap: 9, alignItems:'center' }}>
                <div className="lp-photo" style={{ width: 38, height: 38, borderRadius: 7, backgroundImage:`url(${c.photo})`, flexShrink: 0 }}/>
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div style={{ fontSize: 10.5 * scale, fontWeight: 600, color: dark ? '#fff' : T.pri, lineHeight: 1.25, marginBottom: 2, overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>{c.name}</div>
                  <div style={{ display:'flex', gap: 8, alignItems:'center' }}>
                    <span style={{ fontSize: 9.5 * scale, color: dark ? 'rgba(255,255,255,0.6)' : T.muted }}>{c.loc}</span>
                    <span style={{ display:'inline-flex', alignItems:'center', gap: 2, fontSize: 9.5 * scale, color: dark ? 'rgba(255,255,255,0.85)' : T.sec }}>
                      <LPIcon name="star" size={9} color={T.amber} stroke={0}/> {c.rating}
                    </span>
                  </div>
                </div>
                <div style={{ fontSize: 9.5 * scale, fontWeight: 600, color: T.teal, whiteSpace:'nowrap' }}>{c.price}</div>
              </div>
            ))}
          </div>
        )}
      </div>
    </div>
  );
}

// ─── Mini Calendar surface ───────────────────────────────────────────────
function MiniCalendar({ width = 360, highlightDay = 24, showSavedCamp = true, scale = 1, dark = false }) {
  const weeks = [
    [null,null,null,1,2,3,4],
    [5,6,7,8,9,10,11],
    [12,13,14,15,16,17,18],
    [19,20,21,22,23,24,25],
    [26,27,28,29,30,null,null],
  ];
  const evs = {
    8:  [{ c: T.amber }],
    14: [{ c: T.sage }],
    17: [{ c: T.violet }],
    22: [{ c: T.amber }],
    24: [{ c: T.teal }, { c: T.sage }],
    28: [{ c: T.rose }],
  };
  const multiBars = [
    { row: 0, startCol: 4, endCol: 6, color: T.sage,   label: 'Spring break' },
    { row: 1, startCol: 4, endCol: 4, color: T.amber,  label: 'Soccer' },
    { row: 2, startCol: 1, endCol: 1, color: T.rose,   label: 'Dentist' },
    { row: 3, startCol: 4, endCol: 6, color: T.teal,   label: 'Camp' },
  ];
  const barPalette = {
    [T.teal]:   { bg: T.tealS,   fg: T.tealD },
    [T.sage]:   { bg: T.sageS,   fg: T.sage  },
    [T.amber]:  { bg: T.amberS,  fg: T.amberD},
    [T.rose]:   { bg: T.roseS,   fg: T.rose  },
    [T.violet]: { bg: T.violetS, fg: T.violet},
  };
  return (
    <div style={{
      width, background: T.surface, borderRadius: 18, overflow:'hidden',
      boxShadow: '0 30px 80px -30px rgba(0,40,30,0.35), 0 2px 8px rgba(0,0,0,0.04)',
      border: `0.5px solid ${T.border}`,
    }}>
      {/* topbar */}
      <div style={{ padding: '12px 16px 10px', borderBottom: `0.5px solid ${T.border}`, display:'flex', alignItems:'center', justifyContent:'space-between' }}>
        <div style={{ display:'flex', alignItems:'center', gap: 10 }}>
          <div style={{ fontFamily: "'DM Serif Display', serif", fontSize: 15 * scale, color: T.pri }}>April 2026</div>
          <div style={{ display:'flex', alignItems:'center', gap: 5, background: T.tealS, padding: '3px 8px', borderRadius: 6 }}>
            <div style={{ width: 5, height: 5, borderRadius: '50%', background: T.teal }}/>
            <span style={{ fontSize: 8.5 * scale, color: T.tealD, fontWeight: 500 }}>Google synced</span>
          </div>
        </div>
        <div style={{ display:'flex', gap: 2, background: T.subtle, borderRadius: 6, padding: 2 }}>
          {['M','W','D'].map((v,i) => (
            <div key={v} style={{ padding: '2px 7px', borderRadius: 4, fontSize: 9 * scale, fontWeight: i === 0 ? 600 : 400, color: i === 0 ? T.pri : T.muted, background: i === 0 ? T.surface : 'transparent' }}>{v}</div>
          ))}
        </div>
      </div>
      {/* day names */}
      <div style={{ display:'grid', gridTemplateColumns: 'repeat(7,1fr)', padding: '6px 8px 4px' }}>
        {['S','M','T','W','T','F','S'].map((d,i) => (
          <div key={i} style={{ fontSize: 8.5 * scale, fontWeight: 600, color: T.muted, textAlign:'center', letterSpacing: '0.06em' }}>{d}</div>
        ))}
      </div>
      {/* weeks */}
      <div style={{ padding: '0 8px 12px', position:'relative' }}>
        {weeks.map((week, wi) => (
          <div key={wi} style={{ position:'relative', display:'grid', gridTemplateColumns: 'repeat(7,1fr)', height: 44 * scale }}>
            {week.map((day, di) => {
              const isToday = day === highlightDay;
              const dayEvs = day && evs[day] ? evs[day] : [];
              return (
                <div key={di} style={{ display:'flex', flexDirection:'column', alignItems:'center', padding: '4px 0 0' }}>
                  {day !== null && (
                    <>
                      <div style={{
                        width: 18 * scale, height: 18 * scale, borderRadius: '50%',
                        background: isToday ? T.teal : 'transparent',
                        color: isToday ? '#fff' : T.pri,
                        display:'flex', alignItems:'center', justifyContent:'center',
                        fontSize: 9.5 * scale, fontWeight: isToday ? 700 : 400,
                      }}>{day}</div>
                      <div style={{ marginTop: 14, display:'flex', gap: 2 }}>
                        {dayEvs.slice(0,3).map((e,i) => (
                          <div key={i} style={{ width: 4, height: 4, borderRadius: '50%', background: e.c }}/>
                        ))}
                      </div>
                    </>
                  )}
                </div>
              );
            })}
            {/* multi-day bars */}
            {multiBars.filter(b => b.row === wi).map((b, i) => (
              <div key={i} className={showSavedCamp && b.color === T.teal ? 'lp-fade-up' : ''} style={{
                position:'absolute', top: 22, left: `calc(${b.startCol / 7 * 100}% + 2px)`,
                width: `calc(${(b.endCol - b.startCol + 1) / 7 * 100}% - 4px)`,
                height: 14, borderRadius: 4,
                background: barPalette[b.color].bg,
                color: barPalette[b.color].fg,
                fontSize: 8.5 * scale, fontWeight: 600,
                display: showSavedCamp || b.color !== T.teal ? 'flex' : 'none',
                alignItems:'center', padding: '0 5px', overflow:'hidden', whiteSpace:'nowrap',
                borderLeft: `2px solid ${b.color}`,
              }}>{b.label}</div>
            ))}
          </div>
        ))}
      </div>
    </div>
  );
}

// ─── Auto-playing demo: chat → results → calendar (loops) ────────────────
function ProductDemoLoop({ chatWidth = 320, calWidth = 320, gap = 22, scale = 1 }) {
  const [phase, setPhase] = React.useState(0); // 0: ask, 1: typing, 2: reply, 3: results, 4: saved->cal
  React.useEffect(() => {
    const seq = [
      { p: 0, ms: 1600 },
      { p: 1, ms: 1100 },
      { p: 2, ms: 1300 },
      { p: 3, ms: 2400 },
      { p: 4, ms: 2600 },
    ];
    let idx = 0;
    let cancelled = false;
    function tick() {
      if (cancelled) return;
      setPhase(seq[idx].p);
      const wait = seq[idx].ms;
      idx = (idx + 1) % seq.length;
      setTimeout(tick, wait);
    }
    tick();
    return () => { cancelled = true; };
  }, []);

  const chatStep = Math.min(phase, 3); // 0..3
  const showSaved = phase >= 4;

  return (
    <div style={{ position:'relative', display:'flex', alignItems:'center', gap }}>
      <div style={{ position:'relative' }}>
        <MiniChat width={chatWidth} step={chatStep} scale={scale} />
        {phase >= 3 && (
          <div className="lp-fade-up" style={{
            position:'absolute', top: -10, right: -14,
            background: T.amber, color: T.amberD,
            padding: '6px 12px', borderRadius: 999,
            fontSize: 11, fontWeight: 600,
            boxShadow: '0 8px 24px rgba(239,159,39,0.35)',
            transform: 'rotate(4deg)',
          }}>
            3 matches found ✦
          </div>
        )}
      </div>
      {/* arrow between */}
      <div style={{ display:'flex', flexDirection:'column', alignItems:'center', gap: 4, opacity: phase >= 4 ? 1 : 0.4, transition: 'opacity 0.3s' }}>
        <div style={{ width: 28, height: 28, borderRadius: '50%', background: phase >= 4 ? T.teal : T.subtle, display:'flex', alignItems:'center', justifyContent:'center', color: phase >= 4 ? '#fff' : T.muted, transition: 'background 0.3s' }}>
          <LPIcon name="check" size={14} color={phase >= 4 ? '#fff' : T.muted} stroke={2.5} />
        </div>
        <span style={{ fontSize: 9, color: T.muted, fontWeight: 600, letterSpacing: '0.08em', textTransform: 'uppercase' }}>saved</span>
      </div>
      <div style={{ position:'relative' }}>
        <MiniCalendar width={calWidth} highlightDay={24} showSavedCamp={showSaved} scale={scale}/>
      </div>
    </div>
  );
}

// ─── Photo tile helper ────────────────────────────────────────────────────
function PhotoTile({ src, w, h, radius = 18, style = {}, label, className = '' }) {
  return (
    <div className={`lp-photo ${className}`} style={{
      width: w, height: h, borderRadius: radius,
      backgroundImage: `url(${src})`,
      position: 'relative', overflow: 'hidden', flexShrink: 0,
      ...style,
    }}>
      {label && (
        <div style={{
          position:'absolute', left: 14, bottom: 12,
          background: 'rgba(0,0,0,0.5)', color: '#fff',
          padding: '5px 10px', borderRadius: 999,
          fontSize: 11, fontWeight: 500, backdropFilter: 'blur(4px)',
        }}>{label}</div>
      )}
    </div>
  );
}

// Loops form endpoint (configured in build.mjs)
const LOOPS_FORM_URL = "https://app.loops.so/api/newsletter-form/cmpbtta3o01qx0jyuw4ks2t6d";

// ─── Email signup field ───────────────────────────────────────────────────
function EmailSignup({ variant = 'inline', placeholder = 'you@email.com', cta = 'Get early access', accent = T.teal, dark = false, onSubmit }) {
  const [val, setVal] = React.useState('');
  const [done, setDone] = React.useState(false);
  const [submitting, setSubmitting] = React.useState(false);
  async function submit(e) {
    e.preventDefault();
    if (!val || !val.includes('@') || submitting) return;
    setSubmitting(true);
    try {
      if (LOOPS_FORM_URL && !LOOPS_FORM_URL.startsWith('__')) {
        await fetch(LOOPS_FORM_URL, {
          method: 'POST',
          headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
          body: new URLSearchParams({ email: val, source: 'parentstack.ai-landing' }),
        });
      }
    } catch (err) { /* swallow; user still sees confirmation */ }
    setDone(true);
    if (onSubmit) onSubmit(val);
  }
  if (done) {
    return (
      <div style={{
        display:'flex', alignItems:'center', gap: 10,
        background: dark ? 'rgba(255,255,255,0.08)' : T.tealS,
        color: dark ? '#fff' : T.tealD,
        borderRadius: variant === 'pill' ? 999 : 14,
        padding: '14px 22px', fontSize: 14, fontWeight: 500,
        border: dark ? '1px solid rgba(255,255,255,0.14)' : `1px solid ${T.tealL}`,
        animation: 'fadeUp 0.4s both',
      }}>
        <div style={{ width: 22, height: 22, borderRadius: '50%', background: T.teal, color: '#fff', display:'flex', alignItems:'center', justifyContent:'center' }}>
          <LPIcon name="check" size={12} color="#fff" stroke={3}/>
        </div>
        You're on the list. We'll be in touch soon. 🌲
      </div>
    );
  }
  return (
    <form onSubmit={submit} style={{
      display:'flex', alignItems:'center', gap: variant === 'stacked' ? 12 : 6,
      flexDirection: variant === 'stacked' ? 'column' : 'row',
      background: variant === 'pill' ? (dark ? 'rgba(255,255,255,0.08)' : T.surface) : 'transparent',
      borderRadius: variant === 'pill' ? 999 : variant === 'stacked' ? 0 : 14,
      padding: variant === 'pill' ? 6 : 0,
      border: variant === 'pill' ? (dark ? '1px solid rgba(255,255,255,0.16)' : `1px solid ${T.border}`) : 'none',
      boxShadow: variant === 'pill' && !dark ? '0 8px 24px -10px rgba(0,40,30,0.18)' : 'none',
    }}>
      <input
        type="email"
        value={val}
        onChange={e => setVal(e.target.value)}
        placeholder={placeholder}
        style={{
          flex: variant === 'stacked' ? 'none' : 1,
          background: variant === 'pill' ? 'transparent' : (dark ? 'rgba(255,255,255,0.08)' : T.surface),
          border: variant === 'pill' ? 'none' : (dark ? '1px solid rgba(255,255,255,0.16)' : `1px solid ${T.border}`),
          borderRadius: variant === 'pill' ? 999 : 12,
          padding: variant === 'pill' ? '10px 18px' : '14px 18px',
          fontSize: 14,
          color: dark ? '#fff' : T.pri,
          width: variant === 'stacked' ? '100%' : 'auto',
          outline: 'none',
        }}
      />
      <button type="submit" style={{
        background: accent, color: '#fff', border: 'none',
        borderRadius: variant === 'pill' ? 999 : 12,
        padding: variant === 'pill' ? '10px 18px' : '14px 20px',
        fontSize: 14, fontWeight: 600, cursor: 'pointer',
        display:'flex', alignItems:'center', gap: 7,
        whiteSpace: 'nowrap',
        width: variant === 'stacked' ? '100%' : 'auto',
        justifyContent: 'center',
      }}>
        {cta}
        <LPIcon name="arrow" size={14} color="#fff" stroke={2}/>
      </button>
    </form>
  );
}

// ─── Mini To-dos surface ─────────────────────────────────────────────────
function MiniTodos({ width = 360, scale = 1 }) {
  const items = [
    { done: true,  text: 'Register Emma for swim camp',         tag: 'Camp',     tagBg: T.tealS,   tagFg: T.tealD,  who: 'S' },
    { done: false, text: 'RSVP Jake — Liam\'s pirate party',    tag: 'RSVP',     tagBg: T.amberS,  tagFg: T.amberD, who: 'D', due: 'Fri' },
    { done: false, text: 'Buy Halloween costume — vampire',     tag: 'Shopping', tagBg: T.violetS, tagFg: T.violet, who: 'S', due: 'Oct 28' },
    { done: false, text: 'Pack lunch box for field trip',       tag: 'School',   tagBg: T.sageS,   tagFg: T.sage,   who: 'D', due: 'Tue' },
    { done: false, text: 'Schedule Emma\'s dentist cleaning',   tag: 'Health',   tagBg: T.roseS,   tagFg: T.rose,   who: 'S' },
    { done: true,  text: 'Submit camp medical form',            tag: 'Forms',    tagBg: T.skyS,    tagFg: T.sky,    who: 'D' },
  ];
  return (
    <div style={{
      width, background: T.surface, borderRadius: 18, overflow:'hidden',
      boxShadow: '0 30px 80px -30px rgba(0,40,30,0.35), 0 2px 8px rgba(0,0,0,0.04)',
      border: `0.5px solid ${T.border}`,
      fontSize: 11 * scale, color: T.pri,
    }}>
      {/* topbar */}
      <div style={{ padding: '12px 14px', borderBottom: `0.5px solid ${T.border}`, display:'flex', alignItems:'center', gap:8 }}>
        <div style={{ width: 22, height: 22, borderRadius: 7, background: T.tealS, display:'flex', alignItems:'center', justifyContent:'center' }}>
          <LPIcon name="todo" size={12} color={T.tealD} stroke={2} />
        </div>
        <div style={{ flex: 1 }}>
          <div style={{ fontSize: 11 * scale, fontWeight: 600, color: T.pri }}>Shared to-dos</div>
          <div style={{ fontSize: 9 * scale, color: T.muted }}>Sarah · David · this week</div>
        </div>
        <div style={{ display:'flex' }}>
          {[{ i: 'S', bg: T.teal }, { i: 'D', bg: T.amber }].map((a, idx) => (
            <div key={a.i} style={{
              width: 20, height: 20, borderRadius: '50%',
              background: a.bg, color: '#fff',
              display:'flex', alignItems:'center', justifyContent:'center',
              fontSize: 9 * scale, fontWeight: 700,
              border: '2px solid ' + T.surface, marginLeft: idx ? -6 : 0,
            }}>{a.i}</div>
          ))}
        </div>
      </div>

      {/* progress strip */}
      <div style={{ padding: '10px 14px 8px', display:'flex', alignItems:'center', gap: 9, borderBottom: `0.5px solid ${T.border}` }}>
        <div style={{ flex: 1, height: 4, background: T.subtle, borderRadius: 999, overflow:'hidden' }}>
          <div style={{ width: '33%', height: '100%', background: T.teal, borderRadius: 999 }}/>
        </div>
        <span style={{ fontSize: 9.5 * scale, color: T.sec, fontWeight: 500 }}>2 / 6 done</span>
      </div>

      {/* list */}
      <div style={{ padding: '6px 6px 10px' }}>
        {items.map((it, i) => (
          <div key={i} style={{
            display:'flex', alignItems:'flex-start', gap: 9,
            padding: '8px 10px', borderRadius: 8,
            background: i === 1 ? T.amberS + '88' : 'transparent',
          }}>
            <div style={{
              width: 14 * scale, height: 14 * scale, borderRadius: 4, flexShrink: 0, marginTop: 1.5,
              border: it.done ? 'none' : `1.4px solid ${T.borderStrong}`,
              background: it.done ? T.teal : 'transparent',
              display:'flex', alignItems:'center', justifyContent:'center',
            }}>
              {it.done && <LPIcon name="check" size={9} color="#fff" stroke={3}/>}
            </div>
            <div style={{ flex: 1, minWidth: 0 }}>
              <div style={{
                fontSize: 10.5 * scale,
                color: it.done ? T.muted : T.pri,
                textDecoration: it.done ? 'line-through' : 'none',
                lineHeight: 1.35, marginBottom: 4,
                fontWeight: it.done ? 400 : 500,
              }}>{it.text}</div>
              <div style={{ display:'flex', gap: 6, alignItems:'center' }}>
                <span style={{
                  background: it.tagBg, color: it.tagFg,
                  fontSize: 8.5 * scale, fontWeight: 600,
                  padding: '1.5px 7px', borderRadius: 4,
                  letterSpacing: '0.02em',
                }}>{it.tag}</span>
                {it.due && (
                  <span style={{ fontSize: 9 * scale, color: i === 1 ? T.amberD : T.muted, fontWeight: i === 1 ? 600 : 400 }}>
                    Due {it.due}
                  </span>
                )}
              </div>
            </div>
            <div style={{
              width: 16 * scale, height: 16 * scale, borderRadius: '50%',
              background: it.who === 'S' ? T.teal : T.amber, color: '#fff',
              display:'flex', alignItems:'center', justifyContent:'center',
              fontSize: 8 * scale, fontWeight: 700, flexShrink: 0, marginTop: 1,
            }}>{it.who}</div>
          </div>
        ))}
      </div>
    </div>
  );
}

// ─── Mini Kid Profiles surface ───────────────────────────────────────────
function MiniProfiles({ width = 360, scale = 1 }) {
  const kids = [
    { name: 'Emma',  age: 9, color: T.amber, bg: T.amberS, initial: 'E',
      fields: [
        { k: 'Allergies',    v: 'Peanuts, bees' },
        { k: 'T-shirt',      v: 'Youth M' },
        { k: 'Pediatrician', v: 'Dr. Park · Palo Alto' },
      ],
    },
    { name: 'Jake',  age: 6, color: T.teal,  bg: T.tealS,  initial: 'J',
      fields: [
        { k: 'Allergies',    v: 'None' },
        { k: 'T-shirt',      v: 'Youth S' },
        { k: 'Pediatrician', v: 'Dr. Park · Palo Alto' },
      ],
    },
    { name: 'Mia',   age: 3, color: T.rose,  bg: T.roseS,  initial: 'M',
      fields: [
        { k: 'Allergies',    v: 'Dairy' },
        { k: 'Diapers',      v: 'Size 5' },
        { k: 'Pediatrician', v: 'Dr. Park · Palo Alto' },
      ],
    },
  ];
  return (
    <div style={{
      width, background: T.surface, borderRadius: 18, overflow:'hidden',
      boxShadow: '0 30px 80px -30px rgba(0,40,30,0.35), 0 2px 8px rgba(0,0,0,0.04)',
      border: `0.5px solid ${T.border}`,
      fontSize: 11 * scale, color: T.pri,
    }}>
      {/* topbar */}
      <div style={{ padding: '12px 14px', borderBottom: `0.5px solid ${T.border}`, display:'flex', alignItems:'center', gap:8 }}>
        <div style={{ width: 22, height: 22, borderRadius: 7, background: T.tealS, display:'flex', alignItems:'center', justifyContent:'center' }}>
          <LPIcon name="kids" size={12} color={T.tealD} stroke={2} />
        </div>
        <div style={{ flex: 1 }}>
          <div style={{ fontSize: 11 * scale, fontWeight: 600, color: T.pri }}>My kids</div>
          <div style={{ fontSize: 9 * scale, color: T.muted }}>3 profiles</div>
        </div>
        <div style={{
          width: 22, height: 22, borderRadius: 6, background: T.subtle,
          display:'flex', alignItems:'center', justifyContent:'center',
          fontSize: 13 * scale, color: T.sec, fontWeight: 500, lineHeight: 1,
        }}>+</div>
      </div>

      {/* cards */}
      <div style={{ padding: '12px', display:'flex', flexDirection:'column', gap: 10 }}>
        {kids.map((k, i) => (
          <div key={k.name} style={{
            background: T.surface, border: `0.5px solid ${T.border}`,
            borderRadius: 10, padding: '12px 12px 10px',
          }}>
            {/* card head */}
            <div style={{ display:'flex', alignItems:'center', gap: 10, marginBottom: 10 }}>
              <div style={{
                width: 34, height: 34, borderRadius: '50%',
                background: k.bg, color: k.color,
                display:'flex', alignItems:'center', justifyContent:'center',
                fontFamily: "'DM Serif Display', serif",
                fontSize: 17 * scale, fontWeight: 400, flexShrink: 0,
              }}>{k.initial}</div>
              <div style={{ flex: 1, minWidth: 0 }}>
                <div style={{ fontSize: 12 * scale, fontWeight: 600, color: T.pri, lineHeight: 1.2 }}>{k.name}</div>
                <div style={{ fontSize: 9.5 * scale, color: T.muted }}>{k.age} years old</div>
              </div>
              <div style={{
                fontSize: 9 * scale, color: T.tealD, fontWeight: 600,
                background: T.tealS, padding: '2px 8px', borderRadius: 999,
                letterSpacing: '0.02em',
              }}>Complete</div>
            </div>
            {/* fields */}
            <div style={{ display:'flex', flexDirection:'column', gap: 5 }}>
              {k.fields.map(f => (
                <div key={f.k} style={{ display:'flex', justifyContent:'space-between', gap: 12, fontSize: 9.5 * scale }}>
                  <span style={{ color: T.muted, flexShrink: 0 }}>{f.k}</span>
                  <span style={{ color: T.pri, fontWeight: 500, textAlign:'right', overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>{f.v}</span>
                </div>
              ))}
            </div>
          </div>
        ))}
      </div>
    </div>
  );
}

Object.assign(window, { MiniProfiles });


function SmallFeatureEditorial({ tag, title, body, photo, slotId, slotSrc, slotPlaceholder, mock }) {
  const hasOverlay = !!mock;
  return (
    <div>
      <div className="lp-feature-photo" style={{ position: 'relative', marginBottom: hasOverlay ? 56 : 24 }}>
        <PhotoTile src={photo} w="100%" h={260} radius={6} style={{ width: '100%' }}/>
        {hasOverlay && (
          <div className="float-slow lp-feature-mock" style={{ position:'absolute', bottom: -32, right: -16, zIndex: 2 }}>
            {mock}
          </div>
        )}
      </div>
      <p style={{ fontSize: 11, color: T.tealD, fontWeight: 600, letterSpacing: '0.14em', textTransform: 'uppercase', marginBottom: 12 }}>{tag}</p>
      <h3 style={{ fontFamily: "'DM Serif Display', serif", fontSize: 26, fontWeight: 400, lineHeight: 1.15, marginBottom: 12, letterSpacing: '-0.015em' }}>{title}</h3>
      <p style={{ fontSize: 14, color: T.sec, lineHeight: 1.6 }}>{body}</p>
    </div>
  );
}


// ═══════════════════════════════════════════════════════════════════════════
// V5 — Hybrid v2 (Editorial chrome + "family OS" voice)
// Same magazine layout as V4, but with a confident, tech-leaning headline:
// "Built for the logistics of raising kids."
// ═══════════════════════════════════════════════════════════════════════════

function V5HybridV2() {
  return (
    <div style={{ background: T.bg, color: T.pri, fontFamily: "'DM Sans', sans-serif", minHeight: '100vh' }}>

      {/* ─── Top bar ─────────────────────────────────────────────── */}
      <header className="lp-pad-x" style={{ padding: '24px 56px 0', display:'flex', justifyContent:'space-between', alignItems:'center', maxWidth: 1440, margin: '0 auto' }}>
        <LPLogo size={22} />
        <div style={{ display:'flex', alignItems:'center', gap: 28 }}>
          <div style={{
            display:'inline-flex', alignItems:'center', gap: 7,
            background: T.amberS, color: T.amberD,
            padding: '5px 12px', borderRadius: 999, fontSize: 11.5, fontWeight: 600,
            letterSpacing: '0.04em',
          }}>
            <span style={{ width: 6, height: 6, borderRadius: '50%', background: T.amber, animation: 'pulse 2s infinite' }}/>
            WAVE 1 OPENING SOON
          </div>
        </div>
      </header>

      {/* ─── Hero ───────────────────────────────────────────────── */}
      <section className="lp-hero lp-pad-x lp-grid-2 lp-pad-y-tight" style={{ maxWidth: 1440, margin: '0 auto', padding: '72px 56px 96px', display:'grid', gridTemplateColumns: '1.05fr 1fr', gap: 64, alignItems:'center' }}>
        {/* Left: editorial text with modern copy */}
        <div className="lp-fade-up">
          <h1 style={{
            fontFamily: "'DM Serif Display', serif",
            fontSize: 'clamp(54px, 6.4vw, 92px)',
            fontWeight: 400, lineHeight: 0.98, letterSpacing: '-0.022em', color: T.pri,
            marginBottom: 32,
          }}>
            Built for the<br/>
            <i style={{ color: T.tealD, fontFamily: "'DM Serif Display', serif" }}>logistics</i> of<br/>
            raising kids.
          </h1>
          <p style={{
            fontSize: 'clamp(15px, 1.4vw, 18px)',
            lineHeight: 1.55, color: T.sec,
            maxWidth: 520, marginBottom: 28,
          }}>
            A single home for everything family logistics — camps, calendars, kid profiles, and everything else that keeps your family running.
          </p>
          <div style={{ maxWidth: 480, marginBottom: 16 }}>
            <EmailSignup variant="pill" cta="Get my invite" accent={T.tealD}/>
          </div>
          <p style={{ fontSize: 13, color: T.muted }}>
            No spam. Unsubscribe any time.
          </p>
        </div>

        {/* Right: editorial photo collage with product peeking */}
        <div className="lp-hero-collage" style={{ position:'relative', height: 600 }}>
          <PhotoTile src={PHOTOS.campPinewood} w={420} h={500}
            style={{ position:'absolute', right: 0, top: 30, boxShadow: '0 30px 80px -30px rgba(0,40,30,0.4)' }}
            radius={6}
          />
          <PhotoTile src={PHOTOS.campfireNight} w={200} h={240}
            style={{ position:'absolute', left: 0, top: 60, boxShadow: '0 20px 50px -20px rgba(0,40,30,0.35)' }}
            radius={6}
          />
          <PhotoTile src={PHOTOS.kidForest} w={180} h={200}
            style={{ position:'absolute', left: 40, bottom: 0, boxShadow: '0 20px 50px -20px rgba(0,40,30,0.3)' }}
            radius={6}
          />
          <div className="float-slow" style={{ position:'absolute', left: 150, top: 230, zIndex: 4 }}>
            <MiniChat width={280} step={3} scale={0.95}/>
          </div>
          <div className="float-med" style={{ position:'absolute', right: -30, bottom: -20, zIndex: 3 }}>
            <MiniCalendar width={260} highlightDay={24} scale={0.9}/>
          </div>
          </div>
      </section>

      {/* ─── Mission + Vision ─────────────────────────────────────── */}
      <section className="lp-pad-x" style={{ borderTop: `1px solid ${T.border}`, borderBottom: `1px solid ${T.border}`, padding: '88px 56px', background: T.surface }}>
        <div className="lp-grid-2" style={{ maxWidth: 1100, margin: '0 auto', display:'grid', gridTemplateColumns: '1fr 1fr', gap: 80, alignItems:'flex-start' }}>
          <div>
            <p style={{ fontSize: 11, color: T.tealD, fontWeight: 600, letterSpacing: '0.16em', textTransform: 'uppercase', marginBottom: 18 }}>
              Our mission
            </p>
            <p style={{
              fontFamily: "'DM Serif Display', serif",
              fontSize: 'clamp(24px, 2.4vw, 30px)',
              lineHeight: 1.28, color: T.pri, fontWeight: 400,
              letterSpacing: '-0.012em',
            }}>
              Make parenting easier for modern families by reducing the
              hidden labor of <i style={{ color: T.tealD }}>research, planning,
              coordination, and follow-through</i>.
            </p>
          </div>
          <div>
            <p style={{ fontSize: 11, color: T.tealD, fontWeight: 600, letterSpacing: '0.16em', textTransform: 'uppercase', marginBottom: 18 }}>
              Our vision
            </p>
            <p style={{
              fontFamily: "'DM Serif Display', serif",
              fontSize: 'clamp(24px, 2.4vw, 30px)',
              lineHeight: 1.28, color: T.pri, fontWeight: 400,
              letterSpacing: '-0.012em',
            }}>
              A world where parents spend less time managing childhood,
              and more time <i style={{ color: T.tealD }}>experiencing it</i> with their kids.
            </p>
          </div>
        </div>
      </section>

      {/* ─── Four things, done right ──────────────────────────── */}
      <section className="lp-pad-x" style={{ maxWidth: 1440, margin: '0 auto', padding: '96px 56px 64px' }}>
        <div style={{ marginBottom: 60, display:'flex', alignItems:'baseline', justifyContent:'space-between', gap: 24 }}>
          <div>
            <p style={{ fontSize: 11, color: T.tealD, fontWeight: 600, letterSpacing: '0.14em', textTransform: 'uppercase', marginBottom: 12 }}>Four things, done right</p>
            <h2 style={{ fontFamily: "'DM Serif Display', serif", fontSize: 'clamp(36px, 4.2vw, 58px)', fontWeight: 400, lineHeight: 1, letterSpacing: '-0.02em', maxWidth: 720 }}>
              Built to <i style={{ color: T.tealD }}>share the mental load.</i>
            </h2>
          </div>
        </div>

        {/* feature 1 — camp finder */}
        <V4Feature
          tag="01 · Camp Finder"
          title="AI does the searching."
          body="Describe your kid in plain English — age, what they love, your zip code. ParentStack returns a real shortlist in seconds, not 14 unfiltered tabs. Save the ones you like, drop the rest."
          photo={PHOTOS.kidsLake}
          mock={<MiniChat width={340} step={3}/>}
          reverse={false}
        />

        {/* feature 2 — family feed + calendar */}
        <V4Feature
          tag="02 · Family Feed and Calendar"
          title="One family, one view."
          body="School, camps, dentist, soccer practice, dance class. A shared feed of what's happening this week, plus a calendar that syncs with Google Calendar. Your partner sees the same thing you do."
          photo={PHOTOS.parentsLaptop}
          mock={<MiniCalendar width={340} highlightDay={24}/>}
          reverse={true}
        />

        {/* row: 2 smaller features */}
        <div className="lp-grid-2" style={{ display:'grid', gridTemplateColumns: '1fr 1fr', gap: 40, marginTop: 16 }}>
          <SmallFeatureEditorial
            tag="03 · Kid Profiles"
            title="One place for every detail."
            body="Allergies, t-shirt sizes, emergency contacts, pediatrician info. Stored in one place so you can find it when a camp, school, or doctor's office asks."
            photo={PHOTOS.soccerPark}
            mock={<MiniProfiles width={260} scale={0.85}/>}
          />
          <SmallFeatureEditorial
            tag="04 · Shared To-dos"
            title="Everything that isn't on the calendar."
            body="RSVPs, packing lists, costume hunts, registration deadlines. Shared with your partner so the load is split and nothing slips through."
            photo={PHOTOS.familyHome}
            mock={<MiniTodos width={260} scale={0.85}/>}
          />
        </div>
      </section>

      {/* ─── How it works — broader three-step ────────────────── */}
      <section className="lp-pad-x" style={{ background: T.surface, borderTop: `1px solid ${T.border}`, borderBottom: `1px solid ${T.border}`, padding: '88px 56px' }}>
        <div style={{ maxWidth: 1440, margin: '0 auto' }}>

          <div style={{ marginBottom: 60, display:'flex', justifyContent:'space-between', alignItems:'flex-end', flexWrap:'wrap', gap: 24 }}>
            <div>
              <p style={{ fontSize: 11, color: T.tealD, fontWeight: 600, letterSpacing: '0.14em', textTransform: 'uppercase', marginBottom: 14 }}>How it works</p>
              <h2 style={{ fontFamily: "'DM Serif Display', serif", fontSize: 'clamp(34px, 4vw, 52px)', fontWeight: 400, lineHeight: 1.05, letterSpacing: '-0.024em' }}>
                From birthday RSVPs to summer camp —<br/><i style={{ color: T.tealD }}>all in one quiet place.</i>
              </h2>
            </div>
            <p style={{ fontSize: 14, color: T.sec, maxWidth: 340, lineHeight: 1.55 }}>
              We're keeping it small on purpose. Less app, more time back.
            </p>
          </div>

          <div className="lp-grid-3" style={{ display:'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: 40, position: 'relative' }}>
            <svg style={{ position:'absolute', top: 36, left: '16.5%', width: '67%', height: 2 }} preserveAspectRatio="none" viewBox="0 0 100 1">
              <line x1="0" y1="0.5" x2="100" y2="0.5" stroke={T.tealL} strokeWidth="1" strokeDasharray="2 3"/>
            </svg>
            {[
              { step: 1, title: 'Drop in anything from your family\'s life', body: 'Camps, birthday parties, dentist visits, soccer practice — add it all to one home.' },
              { step: 2, title: 'Let it plan, track, and remind',           body: 'AI helps you find camps and activities. ParentStack fills the forms, tracks RSVPs, and quietly nudges what matters.' },
              { step: 3, title: 'Everyone stays in sync',                   body: 'Shared with your co-parent and synced with Google Calendar. No copy-paste. No forgotten weeks.' },
            ].map(s => (
              <div key={s.step}>
                <div style={{
                  width: 72, height: 72, borderRadius: '50%',
                  background: T.bg, border: `1px solid ${T.border}`,
                  display:'flex', alignItems:'center', justifyContent:'center',
                  fontFamily: "'DM Serif Display', serif", fontSize: 32, color: T.tealD,
                  marginBottom: 28, position:'relative', zIndex: 2,
                }}>
                  {s.step}
                </div>
                <h4 style={{ fontFamily: "'DM Serif Display', serif", fontSize: 26, fontWeight: 400, letterSpacing: '-0.018em', marginBottom: 12, lineHeight: 1.15 }}>{s.title}</h4>
                <p style={{ fontSize: 15, color: T.sec, lineHeight: 1.65 }}>{s.body}</p>
              </div>
            ))}
          </div>

        </div>
      </section>

      {/* ─── Photo strip ───────────────────────────────────────── */}
      <section style={{ padding: '64px 0', overflow:'hidden' }}>
        <div className="lp-pad-x" style={{ marginBottom: 32, padding: '0 56px', maxWidth: 1440, margin: '0 auto 32px' }}>
          <p style={{ fontFamily: "'DM Serif Display', serif", fontStyle:'italic', fontSize: 22, color: T.sec }}>
            — the joy is the point.
          </p>
        </div>
        <div style={{ display:'flex', gap: 16, width: 'max-content' }} className="marquee-track">
          {(() => {
            const curated = [
              PHOTOS.campPinewood,
              PHOTOS.familyCamping,
              PHOTOS.beachSandcastles,
              PHOTOS.artStudio,
              PHOTOS.familyHome,
              PHOTOS.parentsLaptop,
              PHOTOS.soccerPark,
            ];
            // Two passes for the marquee loop
            return [...curated, ...curated].map((src, i) => (
              <div key={i} className="lp-photo lp-strip-tile" style={{
                width: '320px', height: '240px', borderRadius: '4px',
                backgroundImage: `url(${src})`, flexShrink: 0,
              }}/>
            ));
          })()}
        </div>
      </section>

      {/* ─── Footer signup — editorial "open the gates" ──────────── */}
      <section className="lp-pad-x" style={{ background: T.tealD, color:'#fff', padding: '88px 56px 96px', textAlign:'center' }}>
        <p style={{ fontSize: 11, color: T.tealL, fontWeight: 600, letterSpacing: '0.14em', textTransform: 'uppercase', marginBottom: 18 }}>One more thing —</p>
        <h2 style={{ fontFamily: "'DM Serif Display', serif", fontSize: 'clamp(36px, 4vw, 56px)', fontWeight: 400, letterSpacing: '-0.02em', lineHeight: 1.05, marginBottom: 22, maxWidth: 700, marginLeft:'auto', marginRight:'auto' }}>
          Be first when we open.
        </h2>
        <p style={{ fontSize: 16, color: 'rgba(255,255,255,0.72)', lineHeight: 1.5, maxWidth: 480, margin: '0 auto 32px' }}>
          We're sending invites in small batches. Get yours and help shape what we build.
        </p>
        <div style={{ maxWidth: 460, margin: '0 auto 14px' }}>
          <EmailSignup variant="pill" cta="Get my invite" accent={T.amber} dark/>
        </div>
      </section>

      <footer className="lp-pad-x lp-footer-row" style={{ padding: '32px 56px', maxWidth: 1440, margin: '0 auto', display:'flex', justifyContent:'space-between', alignItems:'center', flexWrap:'wrap', gap: 16 }}>
        <LPLogo size={18}/>
        <div style={{ display:'flex', alignItems:'center', gap: 20 }}>
          <a href="mailto:neha@mycamps.ai" style={{ fontSize: 12, color: T.sec, fontWeight: 500 }}>Contact us</a>
          <span style={{ fontSize: 12, color: T.muted }}>·</span>
          <p style={{ fontSize: 12, color: T.muted }}>© 2026 ParentStack · Made in California with two cups of coffee</p>
        </div>
      </footer>
    </div>
  );
}

function V4Feature({ tag, title, body, photo, slotId, slotPlaceholder, mock, reverse }) {
  return (
    <div className="lp-grid-2" style={{
      display:'grid', gridTemplateColumns: '1fr 1fr', gap: 56,
      alignItems:'center', marginBottom: 88,
      direction: reverse ? 'rtl' : 'ltr',
    }}>
      <div style={{ direction: 'ltr' }}>
        <p style={{ fontSize: 11, color: T.tealD, fontWeight: 600, letterSpacing: '0.14em', textTransform: 'uppercase', marginBottom: 14 }}>{tag}</p>
        <h3 style={{ fontFamily: "'DM Serif Display', serif", fontSize: 44, fontWeight: 400, lineHeight: 1.05, letterSpacing: '-0.022em', marginBottom: 20, maxWidth: 480 }}>
          {title}
        </h3>
        <p style={{ fontSize: 15, color: T.sec, lineHeight: 1.65, maxWidth: 460 }}>{body}</p>
      </div>
      <div className="lp-feature-photo" style={{ direction: 'ltr', position:'relative', height: 420 }}>
        <PhotoTile src={photo} w="100%" h={420} radius={6} style={{ width: '100%' }}/>
        <div className="float-slow lp-feature-mock" style={{ position:'absolute', bottom: -32, [reverse ? 'left' : 'right']: -24 }}>
          {mock}
        </div>
      </div>
    </div>
  );
}

window.V5HybridV2 = V5HybridV2;


// ─── Mount ────────────────────────────────────────────────────────────────
ReactDOM.createRoot(document.getElementById('root')).render(<V5HybridV2 />);
