// v3-sections.jsx — comprehension-focused sections
// Adds: Hook · A Night on HOTMESS · Who It's For · Ghosted · Why Now
// Goal: make the ecosystem understandable in <15 seconds without flattening atmosphere.

// ─────────────────────────────────────────────────────────────────────────────
// HookSection — the emotional charter. Surfaces the reason upfront, not buried.
function HookSection() {
  return (
    <section id="why" className="wrap" style={{ marginTop: 64 }}>
      <div style={{
        padding: "72px 0 64px",
        borderTop: "1px solid var(--gold)",
        borderBottom: "1px solid var(--line)",
        position: "relative",
      }}>
        <div className="mobile-stack" style={{
          display: "grid",
          gridTemplateColumns: "96px 1fr",
          gap: 24, alignItems: "start",
        }}>
          <div className="mono" style={{ color: "var(--gold)" }}>WHY THIS<br/>EXISTS</div>

          <div>
            <Reveal>
              <p className="serif" style={{
                fontSize: "clamp(36px, 6vw, 88px)",
                lineHeight: 1.02, letterSpacing: "-0.015em",
                color: "var(--ink)", margin: 0, maxWidth: "20ch",
              }}>
                Gay men aren't coming home.<br/>
                <span style={{ color: "var(--gold)" }}>They're slipping.</span>
              </p>
            </Reveal>

            <Reveal delay={2}>
              <div className="mobile-stack" style={{
                marginTop: 48, display: "grid",
                gridTemplateColumns: "1fr 1fr", gap: 40,
              }}>
                <p style={{
                  fontSize: 16, color: "var(--ink-2)", lineHeight: 1.65,
                  margin: 0, maxWidth: "44ch",
                }}>
                  Saturday-night messages that go quiet on Sunday afternoon. The chemsex rooms in zone 2 where people we love are still waiting for someone to find them. The thread that ends mid-conversation and never resumes.
                </p>
                <p style={{
                  fontSize: 16, color: "var(--ink-2)", lineHeight: 1.65,
                  margin: 0, maxWidth: "44ch",
                }}>
                  Queer life got split into a dozen disconnected apps — dating here, recovery hidden over there, safety bolted on later. <span style={{ color: "var(--ink)" }}>Meanwhile the city was already running as one room</span>. HOTMESS is the layer that finally admits it.
                </p>
              </div>
            </Reveal>

            <Reveal delay={3}>
              <div style={{
                marginTop: 48, paddingTop: 32,
                borderTop: "1px solid var(--line)",
              }}>
                <p className="serif" style={{
                  fontSize: "clamp(24px, 3.4vw, 44px)", lineHeight: 1.1, letterSpacing: "-0.01em",
                  color: "var(--ink)", margin: 0, maxWidth: "28ch",
                }}>
                  The city was already speaking.<br/>
                  <span style={{ color: "var(--gold)" }}>HOTMESS just made the signals visible.</span>
                </p>

                <div style={{ marginTop: 32, display: "flex", gap: 14, flexWrap: "wrap", alignItems: "center" }}>
                  <a href="#night" className="btn">How a night runs on it →</a>
                  <a href="#what" className="btn btn-ghost">What HOTMESS is ↓</a>
                  <a href="#care" className="mono" style={{ color: "var(--recovery-blue)", borderBottom: "1px solid var(--recovery-blue)", paddingBottom: 4 }}>
                    Care is infrastructure ↓
                  </a>
                </div>
              </div>
            </Reveal>
          </div>
        </div>
      </div>
    </section>
  );
}

Object.assign(window, { HookSection });

// ─────────────────────────────────────────────────────────────────────────────
// NightOnHotmessSection — narrative timeline. The whole ecosystem in one flow.
function NightOnHotmessSection() {
  const beats = [
    { t: "FRI · 22:30", tag: "VENUE BEACON",   tone: "gold",     head: "A room opens.",         body: "Eagle Vauxhall drops a beacon. The pin on the globe brightens.",                       layer: "Nightlife" },
    { t: "FRI · 23:00", tag: "PULSE WARMS",    tone: "gold",     head: "SE11 climbs.",          body: "Density rises across the postcode. People route toward it without thinking.",          layer: "Movement" },
    { t: "FRI · 23:30", tag: "RADIO LIVE",     tone: "gold",     head: "The room is scored.",   body: "Resident slot goes live on HOTMESS Radio. The whole globe hears what the room hears.", layer: "Atmosphere" },
    { t: "SAT · 00:30", tag: "GHOSTED MUTUAL", tone: "ink",      head: "Two ghosted people, same room.", body: "Mutual energy registers — quietly, both sides. No cold open, no swiping.",  layer: "Chemistry" },
    { t: "SAT · 02:00", tag: "VENDOR DROP",    tone: "gold",     head: "Something worth finding.", body: "A limited batch surfaces within walking distance. The drop expires by morning.",    layer: "Commerce" },
    { t: "SAT · 03:30", tag: "CHECK-IN",       tone: "recovery", head: "A timer pings home.",   body: "A trusted contact gets a quiet ping. Nothing escalates. The night continues.",         layer: "Care" },
    { t: "SAT · 05:00", tag: "RECOVERY OVERLAY", tone: "recovery", head: "The signal softens.", body: "Calm rooms surface. The globe shifts. The people still awake find each other gently.", layer: "Recovery" },
    { t: "SUN · 11:00", tag: "HAND IN HAND",   tone: "recovery", head: "The comedown show.",    body: "Sunday radio airs. Aftercare links live on the bottle. Landing rooms open.",          layer: "Care" },
    { t: "SUN · 14:00", tag: "MARKET",         tone: "ink",      head: "Daytime circulation.",  body: "Preloved drops surface, sellers post, the daytime Radio runs. The city resets quietly.", layer: "Commerce" },
  ];

  return (
    <section id="night" className="wrap" style={{ marginTop: 80 }}>
      <div className="ch">
        <div className="ch-no">§01<br/>A&nbsp;NIGHT<br/>ON&nbsp;HOTMESS</div>
        <div className="ch-head">
          <div className="ch-title">One weekend.<br/>The whole&nbsp;ecosystem.</div>
          <div className="ch-meta">NARRATIVE FLOW · NINE BEATS · ONE CONTINUOUS WORLD</div>
        </div>
      </div>

      <Reveal>
        <p className="serif" style={{
          fontSize: "clamp(24px, 3vw, 38px)", lineHeight: 1.15, maxWidth: "32ch",
          marginTop: 40, color: "var(--ink-2)",
        }}>
          The fastest way to understand HOTMESS is to&nbsp;<span style={{ color: "var(--gold)" }}>watch a weekend run on it</span>.
        </p>
      </Reveal>

      <div style={{ marginTop: 56, position: "relative" }}>
        {/* Vertical timeline rail */}
        <div className="hide-sm" aria-hidden="true" style={{
          position: "absolute",
          left: "min(96px, 12vw)",
          top: 0, bottom: 0,
          width: 1,
          background: "linear-gradient(180deg, transparent, var(--gold) 5%, var(--gold) 95%, transparent)",
          opacity: 0.4,
        }}></div>

        {beats.map((b, i) => {
          const accent = b.tone === "recovery" ? "var(--recovery-blue)" : b.tone === "gold" ? "var(--gold)" : "var(--ink)";
          return (
            <Reveal key={i} delay={(i % 3) + 1}>
              <div className="mobile-stack" style={{
                display: "grid",
                gridTemplateColumns: "minmax(96px, 12vw) 1fr",
                gap: 32, alignItems: "start",
                padding: "32px 0",
                borderTop: i === 0 ? "1px solid var(--line)" : "none",
                borderBottom: "1px solid var(--line)",
                position: "relative",
              }}>
                {/* Timestamp + dot */}
                <div style={{ position: "relative", paddingTop: 6 }}>
                  <span className="hide-sm" aria-hidden="true" style={{
                    position: "absolute",
                    left: "calc(min(96px, 12vw) - 6px)",
                    top: 8,
                    width: 11, height: 11, borderRadius: "50%",
                    background: accent,
                    boxShadow: `0 0 12px ${accent}`,
                  }}></span>
                  <div className="mono" style={{ color: "var(--ink-3)", letterSpacing: "0.12em" }}>{b.t}</div>
                  <div className="mono" style={{ color: accent, marginTop: 6, fontSize: 9 }}>{b.tag}</div>
                </div>

                {/* Body */}
                <div className="mobile-stack" style={{ display: "grid", gridTemplateColumns: "1fr auto", gap: 32, alignItems: "baseline" }}>
                  <div>
                    <div className="display" style={{
                      fontSize: "clamp(28px, 3.6vw, 48px)",
                      lineHeight: 0.95, letterSpacing: "-0.015em",
                      color: accent,
                    }}>{b.head}</div>
                    <p className="serif" style={{
                      fontSize: "clamp(18px, 1.9vw, 22px)", lineHeight: 1.3,
                      color: "var(--ink-2)", marginTop: 12, maxWidth: "52ch",
                    }}>{b.body}</p>
                  </div>
                  <div className="mono hide-sm" style={{
                    color: "var(--ink-4)", whiteSpace: "nowrap", paddingTop: 8,
                    textTransform: "none", letterSpacing: 0, fontFamily: "var(--sans)", fontStyle: "italic", fontSize: 12,
                  }}>
                    layer · {b.layer.toLowerCase()}
                  </div>
                </div>
              </div>
            </Reveal>
          );
        })}
      </div>

      <Reveal>
        <div className="row-96-2" style={{
          marginTop: 56, paddingTop: 28, borderTop: "1px solid var(--gold)",
          alignItems: "baseline",
        }}>
          <div className="mono" style={{ color: "var(--gold)" }}>WHAT YOU JUST SAW</div>
          <p className="serif" style={{ fontSize: "clamp(20px, 2.2vw, 28px)", lineHeight: 1.25, color: "var(--ink)", margin: 0, maxWidth: "44ch" }}>
            Nine layers. <span style={{ color: "var(--gold)" }}>One continuous weekend.</span>
          </p>
          <p style={{ fontSize: 14, color: "var(--ink-2)", lineHeight: 1.5, margin: 0, maxWidth: "44ch" }}>
            None of these are separate apps. They're the same signal layer, scored differently depending on the hour. That's the whole product.
          </p>
        </div>
      </Reveal>
    </section>
  );
}

// ─────────────────────────────────────────────────────────────────────────────
// WhoItsForSection — user-type matrix. Different people, different layers.
function WhoItsForSection() {
  const users = [
    { who: "THE CLUBBER",       uses: "Movement + nightlife.",      detail: "Pulse to read the room. Beacons to land where the night is.",            tone: "ink" },
    { who: "THE SOBER USER",    uses: "Safer nearby people.",       detail: "Recovery overlays, calm rooms, ghosted defaults. The night you can still attend.", tone: "recovery" },
    { who: "THE TRAVELLER",     uses: "Local queer energy.",        detail: "Drop into any city's globe. Read the rooms before you arrive.",          tone: "ink" },
    { who: "THE SELLER",        uses: "Preloved drops.",            detail: "Surface a batch near closing time. Limited window, real foot traffic.",  tone: "gold" },
    { who: "THE VENUE",         uses: "Pulse gravity.",             detail: "Persistent pin. The room shows up the moment it's alive.",               tone: "gold" },
    { who: "THE DJ",            uses: "Radio atmosphere.",          detail: "Resident slots score the globe. Your set heard wherever the night is.",  tone: "gold" },
    { who: "THE CREATOR",       uses: "Cultural visibility.",       detail: "Promoter pins move with you. Pulse picks up your room.",                 tone: "gold" },
    { who: "THE RECOVERY USER", uses: "A softer landing.",          detail: "Hand in Hand. Sunday radio. Aftercare on the bottle, on the globe.",     tone: "recovery" },
    { who: "THE FLIRT",         uses: "Ghosted chemistry.",         detail: "Mutuality first. No cold open. No swiping fatigue.",                     tone: "ink" },
    { who: "THE RETAILER",      uses: "Signal commerce.",           detail: "Become a live signal inside the scene. Not banner inventory.",           tone: "gold" },
  ];

  return (
    <section id="who" className="wrap" style={{ marginTop: 120 }}>
      <div className="ch">
        <div className="ch-no">§03<br/>WHO&nbsp;USES&nbsp;IT</div>
        <div className="ch-head">
          <div className="ch-title">Different people<br/>use HOTMESS&nbsp;differently.</div>
          <div className="ch-meta">TEN ARCHETYPES · TEN ENTRANCES · ONE WORLD</div>
        </div>
      </div>

      <Reveal>
        <p className="serif" style={{
          fontSize: "clamp(22px, 2.6vw, 32px)", lineHeight: 1.25, maxWidth: "40ch",
          marginTop: 40, color: "var(--ink-2)",
        }}>
          HOTMESS is not one archetype. Different rooms of the city walk in through&nbsp;<span style={{ color: "var(--gold)" }}>different&nbsp;doors</span>.
        </p>
      </Reveal>

      <Reveal delay={2}>
        <div style={{ marginTop: 48, border: "1px solid var(--line)" }}>
          {/* Header */}
          <div className="mobile-stack" style={{
            display: "grid", gridTemplateColumns: "minmax(200px, 1.2fr) minmax(180px, 1fr) 2fr",
            gap: 20, padding: "14px 24px", background: "rgba(200,150,44,0.04)",
            borderBottom: "1px solid var(--gold)",
          }}>
            <div className="mono" style={{ color: "var(--gold)" }}>USER</div>
            <div className="mono" style={{ color: "var(--gold)" }}>USES HOTMESS FOR</div>
            <div className="mono" style={{ color: "var(--gold)" }}>WHAT THAT LOOKS LIKE</div>
          </div>

          {users.map((u, i) => {
            const accent = u.tone === "recovery" ? "var(--recovery-blue)" : u.tone === "gold" ? "var(--gold)" : "var(--ink)";
            return (
              <div key={u.who} style={{
                display: "grid", gridTemplateColumns: "minmax(200px, 1.2fr) minmax(180px, 1fr) 2fr",
                gap: 20, padding: "20px 24px", alignItems: "baseline",
                borderTop: i > 0 ? "1px solid var(--line)" : "none",
              }}>
                <div className="display" style={{
                  fontSize: "clamp(20px, 2vw, 26px)", lineHeight: 1, letterSpacing: "-0.005em",
                  color: accent,
                }}>{u.who}</div>
                <div className="serif" style={{
                  fontSize: "clamp(17px, 1.8vw, 21px)", lineHeight: 1.2,
                  color: "var(--ink)", fontStyle: "italic",
                }}>{u.uses}</div>
                <div style={{ fontSize: 14, color: "var(--ink-2)", lineHeight: 1.55 }}>{u.detail}</div>
              </div>
            );
          })}
        </div>
      </Reveal>

      <Reveal>
        <p className="mono" style={{ marginTop: 28, color: "var(--ink-3)", textAlign: "right", textTransform: "none", letterSpacing: 0, fontStyle: "italic", fontFamily: "var(--sans)", fontSize: 13 }}>
          Different doors. Same continuous queer&nbsp;world.
        </p>
      </Reveal>
    </section>
  );
}

// ─────────────────────────────────────────────────────────────────────────────
// GhostedSection — mutuality-first interaction. Strategic positioning vs. swipe culture.
function GhostedSection() {
  const fixes = [
    { problem: "REJECTION FATIGUE",       fix: "Conversation unlocks only on mutual interest. You never see the no." },
    { problem: "SPAM + COLD MESSAGING",   fix: "No mass open. Both sides have to signal first." },
    { problem: "PROFILE SURVEILLANCE",    fix: "Ghosted is the default. You're invisible unless you choose otherwise." },
    { problem: "EMOTIONAL BURNOUT",       fix: "The interaction is opt-in twice. Less noise. More chemistry." },
    { problem: "AGGRESSION + HYPER-DM",   fix: "No one can DM you without the mutual handshake. Quiet city by default." },
    { problem: "ALGORITHMIC CHASE",       fix: "Ghosted doesn't gamify. No streaks, no ratings, no rank." },
  ];

  return (
    <section id="ghosted" className="wrap" style={{ marginTop: 120 }}>
      <div className="ch">
        <div className="ch-no">§07<br/>GHOSTED</div>
        <div className="ch-head">
          <div className="ch-title">Mutuality<br/>before message.</div>
          <div className="ch-meta">CHEMISTRY LAYER · OPT-IN · DOUBLE-CONSENT</div>
        </div>
      </div>

      {/* Lede + diagram */}
      <div className="grid-2" style={{ alignItems: "center", marginTop: 32, gap: 56 }}>
        <Reveal>
          <p className="serif" style={{
            fontSize: "clamp(28px, 4vw, 56px)", lineHeight: 1.05, letterSpacing: "-0.01em",
            maxWidth: "22ch", color: "var(--ink)",
          }}>
            Two rooms light up.<br/><span style={{ color: "var(--gold)" }}>Then the conversation begins.</span>
          </p>
          <p style={{ fontSize: 17, color: "var(--ink-2)", lineHeight: 1.6, maxWidth: "44ch", marginTop: 24 }}>
            Ghosted is HOTMESS' chemistry layer. Mutual energy registers <em style={{ color: "var(--ink)" }}>before</em> anyone has to speak. No cold open. No mass DM. No rank, no rating, no streak.
          </p>
          <p style={{ fontSize: 17, color: "var(--ink-2)", lineHeight: 1.6, maxWidth: "44ch", marginTop: 16 }}>
            Visibility is opt-in. <span style={{ color: "var(--gold)" }}>Ghosted is the default</span> for anything that matters.
          </p>
        </Reveal>

        <Reveal delay={2}>
          <GhostedDiagram />
        </Reveal>
      </div>

      {/* What it fixes — 3x2 grid */}
      <Reveal>
        <div className="row-96" style={{ marginTop: 64, paddingTop: 32, borderTop: "1px solid var(--line)" }}>
          <div className="mono" style={{ color: "var(--gold)" }}>WHAT IT FIXES</div>
          <div className="mobile-stack" style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(280px, 1fr))", gap: 0 }}>
            {fixes.map((f, i) => (
              <div key={f.problem} style={{
                padding: "20px 24px 20px 0",
                borderTop: "1px solid var(--line)",
              }}>
                <div className="mono" style={{ color: "var(--ink-3)", textDecoration: "line-through", textDecorationThickness: "1px" }}>{f.problem}</div>
                <p style={{ marginTop: 10, fontSize: 14, color: "var(--ink)", lineHeight: 1.5 }}>{f.fix}</p>
              </div>
            ))}
          </div>
        </div>
      </Reveal>

      {/* Closing */}
      <Reveal>
        <p className="serif" style={{
          fontSize: "clamp(22px, 2.6vw, 32px)", lineHeight: 1.25,
          marginTop: 48, color: "var(--ink-2)", maxWidth: "44ch",
        }}>
          The city stays quieter.<br/><span style={{ color: "var(--ink)" }}>And&nbsp;<span style={{ color: "var(--gold)" }}>chemistry actually lands</span> when it happens.</span>
        </p>
      </Reveal>
    </section>
  );
}

// Small SVG diagram for Ghosted: two circles, mutual handshake unlock
function GhostedDiagram() {
  return (
    <div style={{
      border: "1px solid var(--line)",
      background: "radial-gradient(ellipse at center, rgba(200,150,44,0.06) 0%, rgba(0,0,0,0) 60%), #0a0a0d",
      padding: 32, display: "flex", justifyContent: "center",
    }}>
      <svg viewBox="0 0 400 280" width="100%" style={{ maxWidth: 440 }}>
        <defs>
          <radialGradient id="aRing" cx="50%" cy="50%" r="50%">
            <stop offset="0%" stopColor="rgba(200,150,44,0.5)" />
            <stop offset="100%" stopColor="rgba(200,150,44,0)" />
          </radialGradient>
          <radialGradient id="bRing" cx="50%" cy="50%" r="50%">
            <stop offset="0%" stopColor="rgba(106,167,255,0.5)" />
            <stop offset="100%" stopColor="rgba(106,167,255,0)" />
          </radialGradient>
        </defs>

        {/* Person A */}
        <g transform="translate(110, 140)">
          <circle r="48" fill="url(#aRing)">
            <animate attributeName="r" values="40;58;40" dur="3.4s" repeatCount="indefinite" />
            <animate attributeName="opacity" values="0.9;0.4;0.9" dur="3.4s" repeatCount="indefinite" />
          </circle>
          <circle r="22" fill="none" stroke="var(--gold)" strokeWidth="1.4" />
          <circle r="4" fill="var(--gold)" />
        </g>
        <text x="110" y="220" textAnchor="middle" fontFamily="var(--mono)" fontSize="10" fill="var(--gold)" letterSpacing="0.16em">YOU</text>
        <text x="110" y="236" textAnchor="middle" fontFamily="var(--mono)" fontSize="9" fill="rgba(246,244,239,0.5)" letterSpacing="0.12em">signal · sent</text>

        {/* Connector — animates from dashed to solid when both light up */}
        <line x1="158" y1="140" x2="242" y2="140"
              stroke="rgba(200,150,44,0.4)" strokeWidth="1.2" strokeDasharray="4 4">
          <animate attributeName="stroke" values="rgba(200,150,44,0.3);rgba(200,150,44,1);rgba(200,150,44,0.3)" dur="3.4s" repeatCount="indefinite" />
          <animate attributeName="stroke-dasharray" values="4 4;0;4 4" dur="3.4s" repeatCount="indefinite" />
        </line>
        <text x="200" y="128" textAnchor="middle" fontFamily="var(--mono)" fontSize="9" fill="var(--gold)" letterSpacing="0.14em">
          MUTUAL
          <animate attributeName="opacity" values="0.3;1;0.3" dur="3.4s" repeatCount="indefinite" />
        </text>

        {/* Person B */}
        <g transform="translate(290, 140)">
          <circle r="48" fill="url(#bRing)">
            <animate attributeName="r" values="40;58;40" dur="3.4s" begin="0.6s" repeatCount="indefinite" />
            <animate attributeName="opacity" values="0.9;0.4;0.9" dur="3.4s" begin="0.6s" repeatCount="indefinite" />
          </circle>
          <circle r="22" fill="none" stroke="var(--recovery-blue)" strokeWidth="1.4" />
          <circle r="4" fill="var(--recovery-blue)" />
        </g>
        <text x="290" y="220" textAnchor="middle" fontFamily="var(--mono)" fontSize="10" fill="var(--recovery-blue)" letterSpacing="0.16em">THEM</text>
        <text x="290" y="236" textAnchor="middle" fontFamily="var(--mono)" fontSize="9" fill="rgba(246,244,239,0.5)" letterSpacing="0.12em">signal · received</text>

        {/* Bottom note */}
        <text x="200" y="270" textAnchor="middle" fontFamily="var(--mono)" fontSize="9" fill="rgba(246,244,239,0.4)" letterSpacing="0.12em">CONVERSATION UNLOCKS ONLY WHEN BOTH SIDES LIGHT UP</text>
      </svg>
    </div>
  );
}

// ─────────────────────────────────────────────────────────────────────────────
// WhyNowSection — category timing argument
function WhyNowSection() {
  const reasons = [
    { tag: "VENUE LOSS",           v: "Queer venues in London have closed at a rate of one every two months for a decade. The rooms still standing need infrastructure to hold each other." },
    { tag: "AMBIENT SPACE LOSS",   v: "The internet kept the apps. It lost the magazines, the radio stations, the bars-after-the-bar. The places queer life used to drift through." },
    { tag: "ALGORITHM EXHAUSTION", v: "Every queer feed is now run by a company that doesn't know what queer is. Recommendation systems flatten what they touch." },
    { tag: "DATING FATIGUE",       v: "Swipe culture has trained us to perform for strangers and resent the result. Mutuality-first is the rebuild." },
    { tag: "SAFETY UNDERINVESTMENT",v:"After-dark queer safety is still mostly volunteer. Building Silent SOS into the night is overdue, not novel." },
    { tag: "LONELINESS, IN PUBLIC",v: "More queer people than ever live in the same postcodes. Fewer have any way to feel each other through the wall." },
    { tag: "FRAGMENTED RECOVERY",  v: "Comedown care still lives in WhatsApp groups, Sunday lunches, and one trusted DJ. It deserves a layer." },
    { tag: "QUEER COMMERCE DRIFT", v: "Sellers, makers, and small queer brands are scattered across platforms that don't know what to do with them. The signal needs a home." },
  ];

  return (
    <section id="why-now" className="wrap" style={{ marginTop: 120 }}>
      <div className="ch">
        <div className="ch-no">§18<br/>WHY&nbsp;NOW</div>
        <div className="ch-head">
          <div className="ch-title">Queer infrastructure fragmented.<br/>Now it reconnects.</div>
          <div className="ch-meta">CATEGORY TIMING · EIGHT FORCES · ONE MOMENT</div>
        </div>
      </div>

      <Reveal>
        <p className="serif" style={{
          fontSize: "clamp(28px, 4vw, 56px)", lineHeight: 1.05, letterSpacing: "-0.01em",
          maxWidth: "22ch", marginTop: 40, color: "var(--ink)",
        }}>
          We needed this in 2018.<br/><span style={{ color: "var(--gold)" }}>We can't wait until 2030.</span>
        </p>
      </Reveal>

      <div className="grid-2" style={{ marginTop: 56, gap: 48, alignItems: "start" }}>
        {[reasons.slice(0, 4), reasons.slice(4)].map((col, ci) => (
          <Reveal key={ci} delay={ci + 1}>
            <ul style={{ listStyle: "none", padding: 0, margin: 0, display: "grid", gap: 0 }}>
              {col.map((r) => (
                <li key={r.tag} style={{
                  padding: "24px 0", borderTop: "1px solid var(--line)",
                }}>
                  <div className="mono" style={{ color: "var(--gold)" }}>{r.tag}</div>
                  <p style={{ marginTop: 10, fontSize: 15, lineHeight: 1.6, color: "var(--ink-2)" }}>{r.v}</p>
                </li>
              ))}
            </ul>
          </Reveal>
        ))}
      </div>

      <Reveal>
        <div style={{
          marginTop: 64, padding: "48px clamp(20px, 4vw, 56px)",
          borderTop: "1px solid var(--gold)", borderBottom: "1px solid var(--gold)",
          textAlign: "center",
          background: "radial-gradient(ellipse at center, rgba(200,150,44,0.04) 0%, rgba(0,0,0,0) 60%)",
        }}>
          <p className="serif" style={{
            fontSize: "clamp(28px, 4vw, 56px)", lineHeight: 1.05, letterSpacing: "-0.01em",
            color: "var(--ink)", margin: 0, maxWidth: "26ch", marginLeft: "auto", marginRight: "auto",
          }}>
            HOTMESS exists because<br/><span style={{ color: "var(--gold)" }}>queer infrastructure fragmented</span>.
          </p>
          <p className="serif" style={{
            fontSize: "clamp(20px, 2.4vw, 28px)", lineHeight: 1.2,
            color: "var(--ink-2)", marginTop: 24, marginBottom: 0,
          }}>
            It's time to reconnect it.
          </p>
        </div>
      </Reveal>
    </section>
  );
}

// Export to window
Object.assign(window, {
  NightOnHotmessSection, WhoItsForSection, GhostedSection, WhyNowSection,
});
