/* ============================================================
   LUMEN design system — v2  (2026-09-26)

   This file is loaded LAST on every page, after lumen-overrides.css
   and lumen-design.css. It does two jobs:

   1. It redefines the --lum-* tokens that v1 built its rules on, so
      the whole existing system re-skins at once instead of being
      overwritten rule by rule. The v1 layout/scaffolding rules stay
      exactly as they are; only the palette and the type faces move.

   2. It carries the v2 shell — the status bar, the nav, the footer —
      which lumen-v2.js injects onto every page, plus the components
      the v2 homepage is built from.

   Direction (locked 2026-09-26 from three probes): the console.
   The product is a render farm you can watch, so the page is built
   like an instrument panel: a hairline grid, mono micro-labels
   against the numbers they name, cut corners, and one accent that
   means "this is live" (cyan) against one that means "resident
   process" (amber). Type does the work — Big Shoulders Display for
   statements, Chakra Petch for interface, Manrope for prose,
   JetBrains Mono for anything that is data.

   Deliberately NOT here: any rule that changes layout on a
   [class*=] selector. That is the single broadest trap in this
   codebase — see the flex-col/justify-between incident. Broad
   selectors below touch type and colour only.
   ============================================================ */

/* ── 1. type stack ─────────────────────────────────────────────
   Four faces, each with exactly one job. No variable font, no
   subsetting games — these are the same woff2 files the probes
   were approved against. */
@font-face{font-family:'Big Shoulders Display';src:url(/fonts/bsd-800.woff2?v=1) format('woff2');font-weight:800;font-style:normal;font-display:swap}
@font-face{font-family:'Big Shoulders Display';src:url(/fonts/bsd-900.woff2?v=1) format('woff2');font-weight:900;font-style:normal;font-display:swap}
@font-face{font-family:'Chakra Petch';src:url(/fonts/chakra-500.woff2?v=1) format('woff2');font-weight:500;font-style:normal;font-display:swap}
@font-face{font-family:'Chakra Petch';src:url(/fonts/chakra-600.woff2?v=1) format('woff2');font-weight:600;font-style:normal;font-display:swap}
@font-face{font-family:'Manrope';src:url(/fonts/manrope-200.woff2?v=1) format('woff2');font-weight:200;font-style:normal;font-display:swap}
@font-face{font-family:'Manrope';src:url(/fonts/manrope-300.woff2?v=1) format('woff2');font-weight:300;font-style:normal;font-display:swap}
@font-face{font-family:'Manrope';src:url(/fonts/manrope-400.woff2?v=1) format('woff2');font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:'Manrope';src:url(/fonts/manrope-500.woff2?v=1) format('woff2');font-weight:500;font-style:normal;font-display:swap}
@font-face{font-family:'JetBrains Mono';src:url(/fonts/jbmono-400.woff2?v=1) format('woff2');font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:'JetBrains Mono';src:url(/fonts/jbmono-500.woff2?v=1) format('woff2');font-weight:500;font-style:normal;font-display:swap}
@font-face{font-family:'Michroma';src:url(/fonts/michroma-400.woff2?v=1) format('woff2');font-weight:400;font-style:normal;font-display:swap}

/* ── 2. tokens ─────────────────────────────────────────────────
   The v2 values, plus the --lum-* names v1 already uses remapped
   onto them. Anything v1 styled with a token is now v2. */
:root{
  /* v2 names */
  --ink:#03050b; --ink2:#070c16; --ink3:#0b1020;
  --line:rgba(122,180,214,.14); --line2:rgba(122,180,214,.28);
  --cyan:#22e0ff; --cyan-dk:#0b6f88; --amber:#ffa62b;
  --text:#dde8f2; --muted:#7c8fa5; --dim:#4d5f74;
  --cut:10px; --cut-lg:16px;
  --mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,monospace;
  --disp:'Big Shoulders Display',Impact,'Arial Narrow',sans-serif;
  --tech:'Chakra Petch',ui-sans-serif,system-ui,sans-serif;
  --body:'Manrope',system-ui,-apple-system,sans-serif;

  /* v1 names remapped — this is what re-skins the inher ited system */
  --lum-bg:var(--ink);
  --lum-surface:var(--ink2);
  --lum-surface-2:var(--ink3);
  --lum-line:var(--line);
  --lum-line-hi:rgba(34,224,255,.34);
  --lum-ink:var(--text);
  --lum-dim:var(--muted);
  --lum-cyan:var(--cyan);
  --lum-cyan-dk:#04222a;
  --lum-amber:var(--amber);
  --lum-display:var(--disp);
  --lum-body:var(--body);
  --lum-cut:var(--cut);
}

/* ── 3. base ───────────────────────────────────────────────────
   Scoped to .lum-v2, which lumen-v2.js sets on <html> as its first
   act. If the script never runs the page keeps its v1 skin rather
   than sitting on a half-applied background. */
.lum-v2{background:var(--ink)}
.lum-v2 body{
  background:var(--ink); color:var(--text);
  font-family:var(--body); font-weight:300;
  -webkit-font-smoothing:antialiased;
}
.lum-v2 ::selection{background:var(--cyan);color:#00131a}
.lum-v2 a{text-decoration:none}

/* ── upstream chrome, removed ──────────────────────────────────
   The harvested pages bring their own nav and footer. Both are
   hidden here rather than by JS setting style/class on them, and the
   reason is hydration: the footer ships in the static HTML and the
   nav is client-rendered into #layout-header, so React owns both and
   a class JS writes onto them can be patched straight back off.

   Keying the rule on .lum-v2 gets it off those nodes and onto an
   ancestor instead — but NOT, as first assumed, onto one React
   leaves alone. Next renders <html className={fontVars}>, so the
   root's class attribute is React's too and hydration strips a class
   added before it. lumen-v2.js therefore re-applies .lum-v2 from a
   MutationObserver; if that ever goes away, everything below stops
   applying and the symptom is the old nav sitting on top of the new
   one, not an error.

   The :has(nav) guard is deliberate. A bare [class*="top-0"] also
   matches ordinary positioned content, and v1 already learned this
   the expensive way: a broad attribute rule aimed at a carousel took
   the hero with it. Content blocks do not contain a <nav>. */
.lum-v2 #layout-header,
.lum-v2 div[class*="top-0"]:has(nav),
.lum-v2 footer:not(.v2-footer){display:none !important}

/* ── 4. primitives ─────────────────────────────────────────── */
.v2-wrap{width:min(1320px,100% - 64px);margin-inline:auto}

.v2-cut,.cut{clip-path:polygon(var(--cut) 0,100% 0,100% calc(100% - var(--cut)),calc(100% - var(--cut)) 100%,0 100%,0 var(--cut))}
.v2-cut-lg,.cut-lg{clip-path:polygon(var(--cut-lg) 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%,0 var(--cut-lg))}

.v2-mono{font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase}
.v2-tech{font-family:var(--tech);font-weight:600;letter-spacing:.06em;text-transform:uppercase}

.v2-eyebrow{font-family:var(--mono);font-size:11px;letter-spacing:.22em;text-transform:uppercase;
  color:var(--cyan);display:flex;align-items:center;gap:12px}
.v2-eyebrow::before{content:'';width:26px;height:1px;background:var(--cyan);opacity:.7;flex:none}

.v2-dot{width:5px;height:5px;border-radius:50%;background:var(--cyan);display:inline-block;
  box-shadow:0 0 8px var(--cyan);animation:v2pulse 2.4s ease-in-out infinite;flex:none}
@keyframes v2pulse{0%,100%{opacity:1}50%{opacity:.25}}

/* ── 5. buttons ────────────────────────────────────────────── */
.v2-btn{display:inline-flex;align-items:center;gap:9px;height:44px;padding:0 24px;
  font-family:var(--tech);font-weight:600;font-size:12.5px;letter-spacing:.13em;text-transform:uppercase;
  clip-path:polygon(9px 0,100% 0,100% calc(100% - 9px),calc(100% - 9px) 100%,0 100%,0 9px);
  transition:transform .16s,box-shadow .22s,background .2s,color .2s;cursor:pointer;border:0}
.v2-btn-p{background:var(--cyan);color:#00131a}
.v2-btn-p:hover{box-shadow:0 0 26px rgba(34,224,255,.45);transform:translateY(-1px)}
.v2-btn-g{background:rgba(34,224,255,.05);color:var(--text);box-shadow:inset 0 0 0 1px var(--line2)}
.v2-btn-g:hover{background:rgba(34,224,255,.11);box-shadow:inset 0 0 0 1px var(--cyan);color:#fff}
.v2-btn-sm{height:36px;padding:0 17px;font-size:11px}

/* ── 6. shell: status bar ──────────────────────────────────── */
.v2-statusbar{border-bottom:1px solid var(--line);background:#02040a}
.v2-statusbar .in{display:flex;align-items:center;gap:26px;height:32px;
  font-family:var(--mono);font-size:10px;letter-spacing:.13em;color:var(--dim);text-transform:uppercase}
.v2-statusbar .sp{flex:1}
.v2-statusbar b{color:var(--muted);font-weight:400}
.v2-statusbar .live{display:flex;align-items:center;gap:8px;color:var(--cyan)}

/* ── 7. shell: nav ─────────────────────────────────────────── */
.v2-nav{position:sticky;top:0;z-index:200;border-bottom:1px solid var(--line);
  background:rgba(3,5,11,.86);backdrop-filter:blur(14px)}
.v2-nav .in{display:flex;align-items:center;height:74px;gap:40px}
.v2-logo{display:flex;align-items:center;gap:11px;flex:none}
.v2-logo .mk{width:26px;height:26px;flex:none}
.v2-logo .wm{font-family:'Michroma',sans-serif;font-size:16px;letter-spacing:.24em;color:#fff}
.v2-navlinks{display:flex;gap:30px;font-family:var(--tech);font-size:13px;font-weight:500;
  letter-spacing:.09em;text-transform:uppercase;color:var(--muted)}
.v2-navlinks a{color:inherit;transition:color .18s;white-space:nowrap}
.v2-navlinks a:hover{color:var(--cyan)}
.v2-navright{margin-left:auto;display:flex;align-items:center;gap:12px}

/* The wallet pill. wallet.js injects its own <style> into <head> after this
   sheet, so at equal specificity ITS rules win — the button is styled there,
   not here. These rules only cover the slot it lands in. */
.v2-walletslot{display:flex;align-items:center}

/* ── 8. shell: footer ──────────────────────────────────────── */
.v2-footer{border-top:1px solid var(--line);padding:58px 0 30px;background:#02040a;position:relative;z-index:1}
.v2-fgrid{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr 1fr;gap:36px}
.v2-fgrid h4{font-family:var(--mono);font-size:10px;letter-spacing:.18em;color:var(--dim);
  text-transform:uppercase;margin-bottom:16px;font-weight:400}
.v2-fgrid a{display:block;font-size:14px;color:var(--muted);padding:5px 0;transition:color .16s}
.v2-fgrid a:hover{color:var(--cyan)}
.v2-fbot{display:flex;justify-content:space-between;gap:20px;margin-top:46px;padding-top:20px;
  border-top:1px solid var(--line);font-family:var(--mono);font-size:10px;letter-spacing:.13em;
  color:var(--dim);text-transform:uppercase;flex-wrap:wrap}

/* ── 9. homepage components ────────────────────────────────── */
.v2-hero{position:relative;padding:64px 0 56px;overflow:hidden}
.v2-hero::before{content:'';position:absolute;inset:0;
  background:radial-gradient(900px 520px at 74% 42%,rgba(34,224,255,.10),transparent 62%),
             radial-gradient(700px 400px at 8% 8%,rgba(255,166,43,.05),transparent 60%);
  pointer-events:none}
.v2-hero .in{position:relative;display:grid;grid-template-columns:1.02fr .98fr;gap:52px;align-items:center}
.v2-hero h1{font-family:var(--disp);font-weight:900;font-size:clamp(60px,7.4vw,116px);line-height:.86;
  letter-spacing:-.005em;text-transform:uppercase;color:#fff;margin:20px 0 0}
.v2-hero h1 em{font-style:normal;color:var(--cyan);text-shadow:0 0 34px rgba(34,224,255,.4)}
.v2-hero .sub{margin-top:22px;font-size:17.5px;line-height:1.62;color:var(--muted);max-width:49ch;font-weight:300}
.v2-hero .sub b{color:var(--text);font-weight:500}
.v2-cta{display:flex;gap:12px;margin-top:32px;flex-wrap:wrap}
.v2-hudrow{display:flex;gap:34px;margin-top:38px;padding-top:22px;border-top:1px solid var(--line);flex-wrap:wrap}
.v2-hudrow div{font-family:var(--mono);font-size:10px;letter-spacing:.14em;color:var(--dim);text-transform:uppercase}
.v2-hudrow b{display:block;font-family:var(--tech);font-size:20px;font-weight:600;color:var(--text);
  letter-spacing:0;margin-top:5px}

.v2-panel{position:relative;background:linear-gradient(160deg,#080e1a,#04070f);
  box-shadow:inset 0 0 0 1px var(--line),0 30px 80px -40px rgba(0,0,0,.9)}
.v2-panel .bar{display:flex;align-items:center;gap:10px;height:34px;padding:0 14px;
  border-bottom:1px solid var(--line);font-family:var(--mono);font-size:10px;letter-spacing:.14em;
  color:var(--dim);text-transform:uppercase}
.v2-panel .bar .sp{flex:1}
.v2-panel .bar .on{color:var(--cyan)}
.v2-panel canvas{width:100%;height:clamp(360px,44vh,470px);display:block}
.v2-panel .foot{display:flex;gap:22px;padding:12px 14px;border-top:1px solid var(--line);
  font-family:var(--mono);font-size:10px;letter-spacing:.12em;color:var(--dim);text-transform:uppercase;flex-wrap:wrap}
.v2-panel .foot b{color:var(--cyan);font-weight:500}
.v2-corner{position:absolute;width:11px;height:11px;border:1px solid var(--cyan);opacity:.55;pointer-events:none}
.v2-corner.tl{top:-1px;left:-1px;border-right:0;border-bottom:0}
.v2-corner.br{bottom:-1px;right:-1px;border-left:0;border-top:0}

.v2-sect{padding:92px 0;border-top:1px solid var(--line);position:relative}
.v2-sect .head{display:grid;grid-template-columns:96px 1fr;gap:24px;align-items:start;margin-bottom:44px}
.v2-idx{font-family:var(--mono);font-size:11px;letter-spacing:.16em;color:var(--dim);
  padding-top:9px;display:flex;flex-direction:column;gap:10px;align-items:flex-start}
.v2-idx::after{content:'';width:1px;height:42px;background:linear-gradient(var(--line2),transparent)}
.v2-h2{font-family:var(--disp);font-weight:800;font-size:clamp(34px,4vw,58px);line-height:.96;
  letter-spacing:.002em;text-transform:uppercase;color:#fff;margin-top:12px}
.v2-lead{margin-top:14px;font-size:16.5px;line-height:1.62;color:var(--muted);max-width:62ch;font-weight:300}

.v2-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.v2-card{position:relative;padding:30px 28px 34px;background:linear-gradient(165deg,#080e1a,#05080f);
  box-shadow:inset 0 0 0 1px var(--line);transition:box-shadow .25s,transform .25s}
.v2-card:hover{box-shadow:inset 0 0 0 1px rgba(34,224,255,.42),0 0 40px -12px rgba(34,224,255,.3);transform:translateY(-2px)}
.v2-card .n{font-family:var(--mono);font-size:10px;letter-spacing:.18em;color:var(--cyan)}
.v2-card h3{font-family:var(--tech);font-weight:600;font-size:21px;letter-spacing:.03em;text-transform:uppercase;
  color:#fff;margin:16px 0 12px}
.v2-card p{font-size:14.6px;line-height:1.68;color:var(--muted);font-weight:300}
.v2-card .rule{height:2px;width:34px;background:var(--cyan);margin-bottom:4px;box-shadow:0 0 12px var(--cyan)}

.v2-stats{display:grid;grid-template-columns:repeat(6,1fr);gap:1px;background:var(--line);
  box-shadow:inset 0 0 0 1px var(--line)}
.v2-stat{background:#05080f;padding:22px 18px 20px}
.v2-stat b{display:block;font-family:var(--tech);font-weight:600;font-size:34px;color:#fff;letter-spacing:-.01em}
.v2-stat b i{font-style:normal;font-size:15px;color:var(--cyan)}
.v2-stat span{display:block;font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;color:var(--dim);
  text-transform:uppercase;margin-top:8px}
.v2-stats.is-stale{opacity:.45}
.v2-gpus{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}
.v2-gpu{display:flex;align-items:center;gap:9px;padding:8px 13px;background:rgba(10,16,28,.75);
  box-shadow:inset 0 0 0 1px var(--line);font-family:var(--mono);font-size:11px;color:var(--muted);
  clip-path:polygon(7px 0,100% 0,100% calc(100% - 7px),calc(100% - 7px) 100%,0 100%,0 7px)}
.v2-gpu i{width:5px;height:5px;border-radius:50%;background:var(--cyan);box-shadow:0 0 7px var(--cyan);font-style:normal;flex:none}

.v2-steps{display:grid;grid-template-columns:repeat(3,1fr);gap:0}
.v2-step{padding:0 34px 0 0;position:relative}
.v2-step + .v2-step{padding-left:34px;border-left:1px solid var(--line)}
.v2-step .k{font-family:var(--disp);font-weight:900;font-size:66px;line-height:.8;color:transparent;
  -webkit-text-stroke:1px rgba(34,224,255,.5)}
.v2-step h3{font-family:var(--tech);font-weight:600;font-size:19px;letter-spacing:.05em;text-transform:uppercase;
  color:#fff;margin:18px 0 11px}
.v2-step p{font-size:14.6px;line-height:1.7;color:var(--muted);font-weight:300}

.v2-gal{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.v2-gal figure{position:relative;overflow:hidden;background:#05080f;box-shadow:inset 0 0 0 1px var(--line);margin:0}
.v2-gal img{width:100%;aspect-ratio:4/3;object-fit:cover;opacity:.94;transition:transform .5s,opacity .3s;display:block}
.v2-gal figure:hover img{transform:scale(1.04);opacity:1}
.v2-gal figcaption{position:absolute;left:0;bottom:0;right:0;display:flex;justify-content:space-between;
  padding:11px 13px;background:linear-gradient(transparent,rgba(2,4,10,.95));
  font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;color:var(--muted);text-transform:uppercase}
.v2-gal figcaption b{color:var(--cyan);font-weight:400}

/* align-items:start, not center. The right-hand column is an image stacked on a
   data table and is roughly three times the height of the copy beside it, so
   centring floated the copy into the middle of the section with a large empty
   band above it. */
.v2-split{display:grid;grid-template-columns:1fr 1fr;gap:52px;align-items:start}
.v2-kv{border-top:1px solid var(--line)}
.v2-kv div{display:flex;justify-content:space-between;align-items:baseline;padding:16px 2px;border-bottom:1px solid var(--line)}
.v2-kv span{font-family:var(--mono);font-size:11px;letter-spacing:.14em;color:var(--dim);text-transform:uppercase}
.v2-kv b{font-family:var(--tech);font-weight:600;font-size:19px;color:#fff}

.v2-band{position:relative;padding:76px 0;border-top:1px solid var(--line);overflow:hidden}
.v2-band::before{content:'';position:absolute;inset:0;
  background:radial-gradient(760px 320px at 22% 50%,rgba(34,224,255,.13),transparent 66%);pointer-events:none}
.v2-band .in{position:relative;display:flex;align-items:center;justify-content:space-between;gap:40px;flex-wrap:wrap}
.v2-band h2{margin:0;max-width:19ch}

/* ── 10. reveal ─────────────────────────────────────────────────
   Pairs with the observer in lumen-v2.js. Anything given .v2-rv is
   hidden until it intersects — so the observer MUST run, and the
   homepage's above-the-fold blocks are marked already-in. */
.v2-rv{opacity:0;transform:translateY(18px);
  transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}
.v2-rv.is-in{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){.v2-rv{opacity:1;transform:none;transition:none}}

/* ── 11. harvested content, retargeted ─────────────────────────
   The 17 subpages are Next harvests: their body markup is React's
   and cannot be restructured. What they CAN be given is the v2 type
   and colour, which is most of what makes a page read as one site.

   Type and colour ONLY on these broad selectors. Nothing here sets
   display/flex/grid/padding/margin — that is how a shell pass turns
   into a layout regression, and the damage is silent. */
.lum-v2 [id^="block-"] .typo-h1,
.lum-v2 [id^="block-"] .typo-h2,
.lum-v2 [id^="block-"] h1,
.lum-v2 [id^="block-"] h2{
  font-family:var(--disp) !important; font-weight:800 !important;
  text-transform:uppercase; letter-spacing:.004em; color:#fff;
}
.lum-v2 [id^="block-"] .typo-h3,
.lum-v2 [id^="block-"] .typo-h4,
.lum-v2 [id^="block-"] h3,
.lum-v2 [id^="block-"] h4{
  font-family:var(--tech) !important; font-weight:600 !important;
  text-transform:uppercase; letter-spacing:.03em; color:#fff;
}
.lum-v2 [id^="block-"] .typo-paragraph-lg,
.lum-v2 [id^="block-"] .typo-paragraph-md,
.lum-v2 [id^="block-"] p{font-family:var(--body); font-weight:300}
.lum-v2 [id^="block-"] .typo-label,
.lum-v2 [id^="block-"] .typo-label-md,
.lum-v2 [id^="block-"] .typo-label-lg{
  font-family:var(--mono) !important; letter-spacing:.16em; text-transform:uppercase;
}
.lum-v2 [id^="block-"] a{transition:color .16s}
.lum-v2 [id^="block-"] a:hover{color:var(--cyan)}

/* Subpage heroes sit under the v2 status bar + nav, which together are
   ~106px taller than nothing. Only the hero blocks are nudged. */
.lum-v2 .block-hero-intersection{padding-top:8px}

/* ── 11b. imagery ──────────────────────────────────────────────
   Pictures for the sections that were pure text. Two shapes:

   .v2-fig       a 4:3 card image, inserted at the top of a benefit
                 card that previously carried only a 64px glyph.
   .v2-fig-band  a 21:9 strip that opens the section under a subpage
                 hero — cropped from a 16:9 master so it reads as a
                 cinematic band rather than a second hero.

   Both are the same visual grammar as .v2-gal: dark plate, hairline
   inset ring, a slow scale on hover. Nothing here changes layout on
   a [class*=] selector, and both are inert until lumen-imagery.js
   inserts them, so a page that never gets one is unaffected. */
.v2-fig,.v2-fig-band{margin:0;position:relative;overflow:hidden;background:#05080f;
  box-shadow:inset 0 0 0 1px var(--line)}
.v2-fig{margin-bottom:16px}
.v2-fig img,.v2-fig-band img{display:block;width:100%;object-fit:cover;
  transition:transform .7s cubic-bezier(.2,.7,.2,1),opacity .35s}
.v2-fig img{aspect-ratio:4/3;opacity:.93}
.v2-fig-band img{aspect-ratio:21/9;opacity:.9}
.v2-fig:hover img{transform:scale(1.04);opacity:1}
/* no hover state on the band: its transform is owned by the drift animation,
   and an animation beats a plain declaration, so a hover rule there would
   simply never fire. */
.v2-fig-band{margin:26px 0 6px}
/* A chapter plate is a 21:9 crop of a 16:9 master, so there is always more
   image than the frame shows. Drifting across it slowly is free motion — it
   reads as a camera move, and it costs nothing against the video budget. The
   cycle is deliberately long: at 26s the eye never catches it looping. */
.v2-fig-band img{animation:v2drift 26s ease-in-out infinite alternate}
@keyframes v2drift{
  from{transform:scale(1.02) translate3d(-1.2%,-0.8%,0)}
  to  {transform:scale(1.09) translate3d(1.2%,0.8%,0)}
}
@media (prefers-reduced-motion:reduce){
  .v2-fig-band img{animation:none}
}
/* Inside a homepage card the figure bleeds to the card edge — the card's own
   30/28px padding is what makes a contained image look like a thumbnail. */
.v2-card .v2-fig{margin:-30px -28px 22px;box-shadow:none}
.v2-step .v2-fig{margin:0 0 20px}
.v2-token-fig{margin-top:30px}
/* the strip carries a hairline label so it reads as a chapter plate, not
   as a picture that failed to load */
.v2-fig-band figcaption{position:absolute;left:0;bottom:0;display:flex;align-items:center;gap:10px;
  padding:10px 16px;background:linear-gradient(90deg,rgba(2,4,10,.92),transparent 70%);
  font-family:var(--mono);font-size:9.5px;letter-spacing:.18em;color:var(--muted);text-transform:uppercase}
.v2-fig-band figcaption::before{content:'';width:18px;height:1px;background:var(--cyan);opacity:.8}

/* A looping clip where motion earns its place. Same plate, same ring —
   the only difference the eye should catch is that it moves. */
.v2-loop{position:relative;overflow:hidden;background:#05080f;box-shadow:inset 0 0 0 1px var(--line)}
.v2-loop video{display:block;width:100%;aspect-ratio:16/9;object-fit:cover;opacity:.94}
.v2-loop::after{content:'';position:absolute;top:8px;right:8px;width:5px;height:5px;border-radius:50%;
  background:var(--cyan);box-shadow:0 0 8px var(--cyan);animation:v2pulse 2.4s ease-in-out infinite}
@media (prefers-reduced-motion:reduce){
  .v2-fig img,.v2-fig-band img{transition:none}
  .v2-fig:hover img,.v2-fig-band:hover img{transform:none}
  /* The <video> deliberately stays in the layout. It is never played under
     reduced motion, so it paints its own poster — which is frame 0 of the
     clip, so there is no jump. An earlier version hid the element and swapped
     in background-image:var(--poster) instead; that needed a --poster custom
     property on every wrapper, and the three flow steps never got one, so
     they rendered as three empty boxes. */
  .v2-loop::after{display:none}
  /* The boot film is skipped entirely rather than played without motion — a
     five-second full-screen video with nothing moving is just a delay. The
     script returns early on the same query; this is the CSS half of that. */
  .boot{display:none}
}

/* On the harvested pages the card plate is Tailwind's. The margin that bleeds
   the picture to the card's edge is set from the card's own computed padding by
   lumen-imagery.js — the padding is p-2 on some pages and p-1.5 on others, so
   a fixed value here would be wrong on half of them. Only the corner has to
   match, and every card plate on this site uses the same radius. */
.lum-v2 .v2-fig-card{box-shadow:none;border-radius:6px;overflow:hidden}

/* ── 11c. boot film ─────────────────────────────────────────────
   The opening is a rendered shot, generated image-to-video on 火山方舟
   (gen-boot.js → gen-boot-video.js) and served as /cdn/lumen/boot.mp4.
   The overlay is created by lumen-boot.js, so with JS off there is
   simply no overlay — the page starts visible rather than behind a
   black rectangle that nothing can remove.

   The wordmark is HTML, not part of the film: the video model garbles
   type (PACKWOOD's UNCOMMON came back as "PACKWOO"), so the film carries
   only the picture and the type is set in our own font on top of it. */
.boot{position:fixed;inset:0;z-index:900;background:var(--ink);overflow:hidden;
  transition:opacity .8s ease,visibility .8s ease}
.boot.done{opacity:0;visibility:hidden;pointer-events:none}
/* cover wherever the crop survives; contain on portrait, where cover would
   slice the subject off both sides of a phone */
.boot .b-film{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
@media (max-aspect-ratio:1/1){.boot .b-film{object-fit:contain}}
.boot .b-word{position:absolute;left:0;right:0;bottom:12%;display:flex;align-items:center;
  justify-content:center;gap:14px;opacity:0;transform:translateY(10px);
  transition:opacity 1.1s ease,transform 1.1s ease}
/* the mark lands a beat after the film starts — the film is the reveal, the
   wordmark is the full stop */
.boot.playing .b-word{opacity:1;transform:none;transition-delay:1.9s}
.boot .b-word .b-mk{width:30px;height:30px;flex:none}
.boot .b-word span{font-family:'Michroma',sans-serif;font-size:19px;letter-spacing:.34em;
  color:#fff;text-shadow:0 0 28px rgba(34,224,255,.55)}
.boot .b-skip{position:absolute;right:26px;bottom:22px;z-index:2;opacity:0;
  font-family:var(--mono);font-size:10px;letter-spacing:.3em;text-transform:uppercase;
  color:var(--dim);transition:opacity .6s ease .4s;cursor:pointer}
.boot.playing .b-skip{opacity:.55}

/* ── 12. responsive ─────────────────────────────────────────── */
@media (max-width:1080px){
  .v2-hero .in{grid-template-columns:1fr;gap:40px}
  .v2-stats{grid-template-columns:repeat(3,1fr)}
  .v2-fgrid{grid-template-columns:1fr 1fr}
  .v2-split{grid-template-columns:1fr;gap:34px}
}
@media (max-width:760px){
  .v2-wrap{width:calc(100% - 36px)}
  .v2-cards,.v2-steps,.v2-gal{grid-template-columns:1fr}
  .v2-step + .v2-step{border-left:0;padding-left:0;border-top:1px solid var(--line);margin-top:28px;padding-top:28px}
  .v2-sect .head{grid-template-columns:1fr;gap:10px}
  .v2-stats{grid-template-columns:repeat(2,1fr)}
  .v2-navlinks{display:none}
  .v2-nav .in{gap:18px}
  .v2-statusbar .in{gap:14px;overflow:hidden}
  .v2-hero h1{font-size:clamp(46px,13vw,72px)}
}
