/* ═══════════════════════════════════════════════════════════════════════════
   SweepR — Hero Route Stage
   Owns everything inside #heroStage (.hero-stage). bridge-hero.js builds the
   markup; this file is the entire look of it.

   Every class is prefixed .hs-* so nothing can collide with the markup already
   in bridge.html; .hero-stage itself is the one shared selector. Colours,
   radii and easing come from :root in bridge.html — never hardcode a new
   palette here, the page has one.

   Layout: a CSS grid of four zones (you → handoff → shield → recipient) with
   a full-width readout underneath. The <canvas> sits behind the grid at
   inset:0; the glass cards are translucent on purpose so the particle flow
   glows through them instead of being hidden by them.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Stage shell ─────────────────────────────────────────────────────────── */
.hero-stage{
  position:relative;max-width:1120px;margin:38px auto 4px;text-align:left;
  padding:clamp(14px,1.8vw,22px);border-radius:var(--r-xl);
  border:1px solid var(--line);
  background:linear-gradient(180deg,rgba(255,255,255,.05),rgba(255,255,255,.016));
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
  box-shadow:var(--shadow);overflow:hidden;isolation:isolate;
}
/* Gradient hairline, same trick as .card in bridge.html */
.hero-stage::before{
  content:'';position:absolute;inset:0;border-radius:inherit;padding:1px;background:var(--grad);opacity:.26;
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude;pointer-events:none;
}

.hs-canvas{position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none;z-index:0}

/* ── Zone grid ───────────────────────────────────────────────────────────── */
.hs-layer{
  position:relative;z-index:1;display:grid;
  grid-template-columns:minmax(0,1.06fr) minmax(0,.9fr) minmax(0,1.42fr) minmax(0,.92fr);
  grid-template-rows:minmax(clamp(214px,20vw,268px),auto) auto;
  grid-template-areas:"you handoff shield paid" "readout readout readout readout";
  gap:clamp(14px,1.9vw,22px) clamp(10px,1.6vw,20px);
}
/* Head pinned to the top of the row so all four step numbers sit on one line;
   the body below it is centred in whatever height the tallest zone sets. */
.hs-zone{display:grid;grid-template-rows:auto 1fr;gap:9px;min-width:0;align-content:start}
.hs-zone > :not(.hs-zone-head){align-self:center}
.hs-zone--you{grid-area:you}
.hs-zone--handoff{grid-area:handoff}
.hs-zone--shield{grid-area:shield}
.hs-zone--paid{grid-area:paid}

.hs-zone-head{display:flex;align-items:center;gap:7px;font-size:9.5px;font-weight:800;letter-spacing:.17em;text-transform:uppercase;color:var(--faint)}
.hs-step{
  width:17px;height:17px;flex:0 0 auto;border-radius:6px;display:grid;place-items:center;
  background:rgba(255,255,255,.05);border:1px solid var(--line);
  font-size:8.5px;font-weight:800;color:var(--muted);letter-spacing:0;
}

/* ── 1. YOU — the identity chips that dissolve ───────────────────────────── */
.hs-chips{display:flex;flex-direction:column;gap:6px}
.hs-chip{
  padding:7px 10px 8px;border-radius:11px;min-width:0;
  background:var(--glass-2);border:1px solid var(--line);
  transition:opacity .55s var(--ease),background .55s var(--ease),border-color .55s var(--ease);
}
.hs-chip-label{display:block;font-size:8.5px;font-weight:800;letter-spacing:.16em;text-transform:uppercase;color:var(--faint)}
.hs-chip-value{
  display:block;margin-top:3px;font-size:clamp(11px,1.02vw,12.5px);font-weight:600;
  color:rgba(238,241,255,.86);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color .3s var(--ease);
}
.hs-chip-gone{
  display:none;margin-top:3px;font-size:10.5px;font-weight:700;letter-spacing:.02em;color:var(--mint);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.hs-chip-gone::before{content:'';display:inline-block;width:9px;height:1.5px;margin:0 6px 3px 0;background:rgba(52,224,176,.7);border-radius:2px}
/* mid-shred: the value is being scrambled by JS, so light it like burning text */
.hs-chip.is-shredding{background:rgba(232,121,249,.075);border-color:rgba(232,121,249,.36)}
.hs-chip.is-shredding .hs-chip-value{color:var(--magenta);text-shadow:0 0 16px rgba(232,121,249,.55)}
/* settled: nothing was collected, so the chip stays as an empty outline */
.hs-chip.is-gone{opacity:.66;background:rgba(255,255,255,.012);border-color:rgba(255,255,255,.055);border-style:dashed}
.hs-chip.is-gone .hs-chip-value{display:none}
.hs-chip.is-gone .hs-chip-gone{display:block}

/* ── 2 & 4. Node cards ───────────────────────────────────────────────────── */
.hs-node{
  padding:11px 13px 12px;border-radius:var(--r-md);min-width:0;
  background:linear-gradient(180deg,rgba(255,255,255,.05),rgba(255,255,255,.016));
  border:1px solid var(--line);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  transition:border-color .6s var(--ease),box-shadow .6s var(--ease),opacity .6s var(--ease);
}
.hs-node-title{font-size:9.5px;font-weight:800;letter-spacing:.15em;text-transform:uppercase;color:var(--faint)}
.hs-addr{
  margin-top:7px;font-size:clamp(12px,1.12vw,14px);font-weight:700;letter-spacing:.01em;color:var(--cyan);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.hs-node--mint.is-live{border-color:rgba(34,211,238,.34);box-shadow:0 12px 34px rgba(34,211,238,.14)}
.hs-facts{list-style:none;margin:9px 0 0;padding:0;display:flex;flex-direction:column;gap:3px}
.hs-facts li{position:relative;padding-left:11px;font-size:10.5px;line-height:1.5;color:var(--muted)}
.hs-facts li::before{content:'';position:absolute;left:0;top:7px;width:4px;height:4px;border-radius:50%;background:rgba(34,211,238,.6)}

/* ── 3. The shield ───────────────────────────────────────────────────────── */
.hs-shield{display:flex;flex-direction:column;align-items:center;gap:10px}
.hs-fan{display:flex;flex-wrap:wrap;justify-content:center;gap:5px}
.hs-strand{
  padding:3px 8px;border-radius:8px;font-size:9.5px;font-weight:700;letter-spacing:.02em;
  background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.2);color:rgba(196,181,253,.72);
  opacity:.4;transition:opacity .5s var(--ease),color .5s var(--ease),border-color .5s var(--ease);
}
.hs-fan.is-on .hs-strand{opacity:.72}
/* per-venue, so the strands light in the order the fragments reach them */
.hs-strand.is-on{opacity:1;color:rgba(214,205,255,.95);border-color:rgba(139,92,246,.38);background:rgba(139,92,246,.14)}
.hs-ring{
  position:relative;width:clamp(88px,10.4vw,124px);aspect-ratio:1;border-radius:50%;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;text-align:center;
  border:1px solid rgba(232,121,249,.3);
  background:radial-gradient(circle at 50% 42%,rgba(232,121,249,.16),rgba(139,92,246,.06) 58%,transparent 74%);
  transition:border-color .6s var(--ease),box-shadow .6s var(--ease);
}
.hs-ring::after{
  content:'';position:absolute;inset:-7px;border-radius:50%;
  border:1px dashed rgba(232,121,249,.26);animation:hs-spin 30s linear infinite;
}
@keyframes hs-spin{to{transform:rotate(360deg)}}
.hs-ring.is-on{border-color:rgba(232,121,249,.55);box-shadow:0 0 40px rgba(232,121,249,.18)}
.hs-ring-k{font-family:'Space Grotesk','Inter',sans-serif;font-size:clamp(14px,1.5vw,18px);font-weight:700;letter-spacing:-.02em;color:var(--ink)}
.hs-ring-sub{font-size:8.5px;font-weight:800;letter-spacing:.15em;text-transform:uppercase;color:var(--faint);max-width:11ch;line-height:1.35}
.hs-tags{display:flex;flex-wrap:wrap;justify-content:center;gap:6px}
.hs-tag{
  padding:4px 9px;border-radius:9px;font-size:9.5px;font-weight:700;letter-spacing:.02em;
  background:var(--glass-2);border:1px solid var(--line);color:var(--muted);opacity:.36;
  transition:opacity .55s var(--ease),color .55s var(--ease),background .55s var(--ease),border-color .55s var(--ease);
}
.hs-tag b{font-weight:800;letter-spacing:.09em;color:var(--magenta)}
.hs-tag.is-on{opacity:1;color:var(--ink);background:rgba(232,121,249,.09);border-color:rgba(232,121,249,.32)}

/* ── 4. Recipient ────────────────────────────────────────────────────────── */
.hs-node--paid{opacity:.44}
.hs-node--paid.is-arrived{opacity:1;border-color:rgba(52,224,176,.36);box-shadow:0 12px 34px rgba(52,224,176,.14)}
.hs-paid-row{display:flex;align-items:center;gap:9px;margin-top:8px}
.hs-paid-check{
  width:24px;height:24px;flex:0 0 auto;border-radius:9px;display:grid;place-items:center;
  background:rgba(52,224,176,.13);border:1px solid rgba(52,224,176,.32);color:var(--mint);
}
.hs-paid-check svg{width:13px;height:13px}
.hs-paid-title{font-family:'Space Grotesk','Inter',sans-serif;font-size:clamp(13.5px,1.3vw,16px);font-weight:700;letter-spacing:-.02em;line-height:1.15}
.hs-paid-sub{margin-top:8px;font-size:10.5px;line-height:1.55;color:var(--muted)}
.hs-paid-sub b{color:var(--mint);font-weight:700}

/* ── Traceability readout ────────────────────────────────────────────────── */
.hs-readout{grid-area:readout;display:flex;flex-direction:column;gap:9px;padding-top:clamp(11px,1.5vw,15px);border-top:1px solid var(--line)}
.hs-meter-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.hs-meter-name{font-size:10px;font-weight:800;letter-spacing:.17em;text-transform:uppercase;color:var(--faint)}
.hs-meter-note{
  padding:2px 8px;border-radius:7px;border:1px solid var(--line);
  font-size:9px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:rgba(226,232,255,.3);
}
.hs-meter{position:relative;height:6px;border-radius:999px;background:rgba(255,255,255,.055)}
/* Width is driven per-frame by bridge-hero.js, so it must NOT transition —
   only the colour band does. */
.hs-meter-fill{
  position:absolute;left:0;top:0;bottom:0;width:100%;border-radius:999px;
  background-color:var(--rose);color:var(--rose);
  transition:background-color .8s var(--ease),color .8s var(--ease);
}
.hs-meter-fill::after{content:'';position:absolute;inset:0;border-radius:inherit;background:linear-gradient(90deg,rgba(255,255,255,.34),rgba(255,255,255,0) 62%)}
.hs-meter-fill::before{
  content:'';position:absolute;right:-3px;top:50%;width:9px;height:9px;margin-top:-4.5px;border-radius:50%;
  background:#fff;box-shadow:0 0 14px currentColor;color:inherit;
}
.hs-meter-fill.is-warm{background-color:var(--amber);color:var(--amber)}
.hs-meter-fill.is-cool{background-color:var(--violet);color:var(--violet)}
.hs-meter-fill.is-clear{background-color:var(--mint);color:var(--mint)}
.hs-meter-foot{display:flex;align-items:baseline;gap:8px 14px;flex-wrap:wrap}
/* Same four bands as the fill, so the number and the bar can never disagree. */
.hs-meter-value{
  font-family:'Space Grotesk','Inter',sans-serif;font-size:clamp(21px,2.3vw,29px);font-weight:700;
  letter-spacing:-.035em;line-height:1;min-width:3.4ch;
  color:var(--rose);transition:color .8s var(--ease);
}
.hs-meter-value.is-warm{color:var(--amber)}
.hs-meter-value.is-cool{color:var(--violet)}
.hs-meter-value.is-clear{color:var(--mint)}
.hs-meter-caption{font-size:11.5px;font-weight:650;color:var(--muted);letter-spacing:.01em}
.hs-meter-caption.is-clear{color:var(--mint)}
.hs-note{margin-left:auto;max-width:56ch;font-size:10.5px;line-height:1.55;color:var(--faint);text-align:right}

/* ── Responsive ──────────────────────────────────────────────────────────── */
@media (max-width:1020px){
  .hs-layer{grid-template-columns:minmax(0,1fr) minmax(0,1fr);grid-template-rows:auto auto auto;
    grid-template-areas:"you handoff" "shield shield" "paid readout"}
  .hs-zone--paid{justify-content:flex-start}
}
/* ── Phone: one column, with the four step numbers pulled out into a gutter
      and joined by a vertical rail. That is what the 44px of padding-left is
      reserving space for — the rail lives in it, so the story still reads as
      one continuous journey when the zones are stacked. ─────────────────── */
@media (max-width:860px){
  .hs-layer{grid-template-columns:minmax(0,1fr);grid-template-rows:auto;
    grid-template-areas:"you" "handoff" "shield" "paid" "readout";
    gap:clamp(18px,4.4vw,24px);padding-left:44px;position:relative}
  /* the rail, tinted through the same four stage colours as the filaments */
  .hs-layer::before{
    content:'';position:absolute;left:17.5px;top:12px;bottom:14px;width:2px;border-radius:2px;
    background:linear-gradient(180deg,
      rgba(251,113,133,.55),rgba(34,211,238,.55) 32%,
      rgba(232,121,249,.55) 64%,rgba(52,224,176,.55));
    opacity:.75;pointer-events:none;
  }
  .hs-zone{position:relative;justify-content:flex-start}
  /* the number sits on the rail; the solid background punches a hole in it */
  .hs-zone .hs-step{
    position:absolute;left:-35px;top:-1px;width:19px;height:19px;
    background:#0b0d17;border-color:rgba(255,255,255,.14);color:var(--ink);
  }
  .hs-zone-head{gap:0}
  .hs-readout{margin-left:-44px;padding-left:0}
  .hs-note{margin-left:0;text-align:left;max-width:none}
  .hs-meter-foot{gap:6px 12px}
  .hs-meter-caption{flex:1 1 100%}
  .hs-fan{justify-content:flex-start;gap:5px}
  .hs-tags{justify-content:flex-start}
  .hs-shield{align-items:flex-start}
  /* the canvas filaments are drawn for a four-across layout; stacked, they are
     just long vertical smears, and they cost fill rate on a phone */
  .hs-canvas{display:none}
}
@media (max-width:420px){
  .hero-stage{border-radius:var(--r-lg);padding:13px 12px}
  .hs-layer{padding-left:38px}
  .hs-chip-value,.hs-chip-gone{font-size:11px}
  .hs-meter-value{font-size:23px}
}

/* ── Reduced motion: bridge-hero.js renders one static final frame and never
      starts a rAF loop, so nothing here may move either. ─────────────────── */
@media (prefers-reduced-motion: reduce){
  .hs-ring::after{animation:none}
  .hs-chip,.hs-chip-value,.hs-node,.hs-tag,.hs-strand,.hs-ring,.hs-meter-fill{transition:none}
}
