/* LightHouse page layer - extracted VERBATIM from the prototype's inline <style>
   block (handoff/site/LightHouse.html lines 38-606) by tools/port-lighthouse.py.
   Loads at the SAME cascade position the inline block held: after lighthouse.css,
   before print.css (which stays last and wins). Do not reorder. */

  main { display: block; }
  .seclabel { display: flex; align-items: baseline; gap: 16px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.26em; text-transform: uppercase; color: var(--periwinkle); }

  /* ===== §02 APPLICATIONS SHELL ===== */
  .apps { padding: var(--section-y) 0 72px; } /* D157: bottom held at 72 so the CTA is not adrift - D146's equidistance, not the full section step */ /* D146: 110->72 so the Request Demo CTA sits equidistant (72/72) between the module box and the section end */
  /* D153: was 1440px - the only section on the page that broke the 128px left edge */
  .apps .head { max-width: 760px; margin: 0 0 var(--head-gap); } /* D154: the 40px top stacked dead space on the section padding */
  .apps .head h2 { font-family: var(--rajd); font-weight: 600; color: var(--text-primary); font-size: clamp(28px, 3vw, 40px); line-height: 1.0; letter-spacing: 0; max-width: 17ch; }
  .apps .head h2 em { font-style: normal; color: var(--marigold); }
  .apps-ask { display: flex; justify-content: center; margin-top: 72px; } /* D157: matches the 72px section bottom - equidistant per D146 */ /* D146: 36->72, the other half of the pair */
  .apps-ask .btn { padding: 13px 22px; }






  /* ===== §03 HOW WE WORK ===== */
  .work { padding: var(--section-y) 0; }
  .work .seclabel { margin-bottom: 44px; }
  .howworks { padding: 130px 0 150px; }
  .howworks .seclabel { margin-bottom: 30px; justify-content: flex-start; }
  .howworks h2 { margin: 0 0 36px; text-align: left; }

  /* ===== section chapters - alternate backgrounds + composition =====
     M15: the radial tints move off the background shorthand onto ::after so the
     atmosphere can arrive once with the band (opacity-only, composited) and then
     stay lit. The sections keep canvas-2 + a stacking context so the negative-z
     tint sits above the section canvas but below ALL content.
     M14: the static border-top/bottom pair is deleted - the threshold-hairline
     ::before (below) now owns every band seam and draws as the band enters. */
  .band.solution { background: var(--canvas-2); z-index: 0; }
  .apps { background: var(--canvas-2); position: relative; z-index: 0; }
  .band.solution::after, .apps::after { content: ''; position: absolute; inset: 0; pointer-events: none; z-index: -1; transition: opacity 900ms var(--ease-out-quint) 300ms; }
  .band.solution::after { background: radial-gradient(ellipse 66% 60% at 74% 22%, rgba(136,156,231,0.06), transparent 62%); }
  .apps::after { background: radial-gradient(ellipse 58% 55% at 26% 14%, rgba(202,169,11,0.04), transparent 60%); }
  html.js .band.solution:not(.sealed)::after, html.js .apps:not(.sealed)::after { opacity: 0; }
  @media (max-width: 760px) {
    /* owner audit: lift the section atmospheres out of the black on portrait */
    .band.solution::after { background: radial-gradient(ellipse 120% 50% at 78% 24%, rgba(136,156,231,0.11), transparent 64%); }
    .apps::after { background: radial-gradient(ellipse 110% 46% at 22% 12%, rgba(202,169,11,0.08), transparent 62%); }
    .problem { background: radial-gradient(ellipse 130% 55% at 24% 10%, rgba(136,156,231,0.09), transparent 62%); }
    /* D146: the desktop 72/72 CTA pair tightens to 56/56 on portrait */
    /* D154: D146 equidistance comes from --section-y at both ends now */
  }

  /* ===== Problem - sticky-headline scroll moment =====
     (ROUND-1 RESTORE: the original c6e8808 filing-stack rules return verbatim -
     folder chrome, ftab tabs, sticky stack, D20 pinned-unit block, snap/reduce
     runway collapses. The re-formed .rec-grid band and its lighthouse.css rules
     are retired.) */
  .prob-layout { display: grid; grid-template-columns: 0.82fr 1.18fr; gap: 64px; }
  .prob-layout > * { min-width: 0; }
  .prob-head-in { position: sticky; top: 96px; }
  .problem .fail-grid { display: block; margin-top: 0; }
  .problem .fail-grid::after { content: ''; display: block; height: 160px; }
  .problem .folder { min-height: 440px; }
  /* manila folder cards (trapezoid tab + tint) - sticky filing stack */
  .problem .folder { background-image: radial-gradient(circle, rgba(255,255,255,0.05) 0.5px, transparent 0.5px), linear-gradient(180deg, rgba(202,169,11,0.05), rgba(202,169,11,0.015)); background-size: 6px 6px, auto; background-color: var(--canvas-2); position: sticky; top: 170px; margin-top: 31px; border: 1px solid rgba(202,169,11,0.3); }
  .problem .folder + .folder { margin-top: 84px; }
  .problem .folder:nth-child(1) { z-index: 1; }
  .problem .folder:nth-child(2) { z-index: 2; }
  .problem .folder:nth-child(3) { z-index: 3; }
  .problem .ftab { position: absolute; top: -30px; left: 14px; width: 172px; height: 31px; }
  .problem .folder:nth-child(2) .ftab { left: 198px; }
  .problem .folder:nth-child(3) .ftab { left: 382px; }
  .problem .ftab::before { content: ''; position: absolute; inset: 0; background: rgba(202,169,11,0.3); clip-path: polygon(0 100%, 9% 0, 91% 0, 100% 100%); }
  .problem .ftab::after { content: ''; position: absolute; inset: 1px 1px 0 1px; background: var(--canvas-2); clip-path: polygon(0 100%, 9% 0, 91% 0, 100% 100%); }
  .problem .ftab span { position: relative; z-index: 1; display: flex; align-items: center; justify-content: center; height: 100%; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--marigold); }
  .problem .folder .fviz { margin-top: 24px; margin-bottom: 0; display: flex; justify-content: center; }
  .problem .folder .fviz svg { width: min(340px, 100%); height: auto; }
  @keyframes fvPulse { 0%,100% { opacity: 1; } 50% { opacity: 0.5; } }
  @keyframes fvDash { to { stroke-dashoffset: -16; } }
  /* V12-B: fvBlink + the .xmk crossed-circle retired (nothing blinks forever) */
  .problem .fviz .node-on { animation: fvPulse 3.4s ease-in-out infinite; }
  .problem .fviz .axis-dash { animation: fvDash 3s linear infinite; }
  .problem .fviz .stamp-check, .problem .fviz .stamp { animation: fvPulse 4.2s ease-in-out infinite; }
  @media (prefers-reduced-motion: reduce) { .problem .fviz .node-on, .problem .fviz .axis-dash, .problem .fviz .stamp-check, .problem .fviz .stamp { animation: none; } }
  body.frozen .problem .fviz .node-on, body.frozen .problem .fviz .axis-dash, body.frozen .problem .fviz .stamp-check, body.frozen .problem .fviz .stamp { animation: none; }
  /* offstage sections park their infinite ambient loops (entrances unaffected) */
  .offstage .node-on, .offstage .axis-dash, .offstage .stamp,
  .offstage .stamp-check, .offstage .nd, .offstage .ftl-dot,
  .offstage .wv-glow, .offstage .wv-fill { animation-play-state: paused !important; }
  .problem .folder h3 .ac { color: var(--marigold); }
  @media (max-width: 760px) {
    /* D20 v4.1: ONE pinned unit (head + folders); folders glide in at
       near-native scroll speed (linear, hard clamp = the lock) and the whole
       unit releases together when the sticky runway (stretched .wrap) ends.
       JS sets the exact section height in px; 210vh is the pre-JS fallback. */
    html.js .problem { height: 210vh; }
    html.js .problem > .wrap { height: 100%; } /* sticky containing block = full runway */
    .prob-head { display: contents; }
    html.js .prob-layout { position: sticky; top: calc(88px + env(safe-area-inset-top)); }
    .prob-head-in { display: block; position: static; } /* desktop pins head-in @96px; here the LAYOUT is the pin - head rides inside it */
    .problem .prob-head .big { padding-bottom: 0; }
    .problem .lead { margin-top: 14px; }
    .problem .fail-grid { display: grid; margin-top: 26px; }
    .problem .folder { position: relative; top: auto; min-height: 0; grid-area: 1 / 1; margin-top: 0 !important; will-change: transform; }
    html.js .problem .folder:nth-child(2), html.js .problem .folder:nth-child(3) { transform: translateY(100vh); }
    body.frozen .problem .folder { transform: none !important; }
    @media (prefers-reduced-motion: reduce) {
      .problem .folder { transform: none !important; }
      .problem { height: auto !important; }
      .prob-layout { position: static !important; }
    }
    /* audit M9: ?snap must collapse the filing runway too (the scrub IIFE bails
       under snap, so the tall inline height it would set is never written) */
    body.snap .problem { height: auto !important; }
    body.snap .prob-layout { position: static !important; }
    .problem .fail-grid::after { display: none; }
    .fail-in { padding: 20px 18px 22px; }
    .fail .fviz { height: auto; margin-bottom: 16px; }
    .problem .folder .fviz svg { width: min(312px, 100%); }
    .fail h3 { font-size: 19px; }
    .problem .ftab { width: min(96px, 29%); height: 26px; top: -25px; }
    .problem .ftab span { letter-spacing: 0.1em; }
    .problem .folder:nth-child(1) .ftab { left: 2%; }
    .problem .folder:nth-child(2) .ftab { left: 34.5%; }
    .problem .folder:nth-child(3) .ftab { left: 67%; }
  }
  .problem .bridge { margin-top: 30px; }
  @media (max-width: 900px) {
    .prob-layout { grid-template-columns: 1fr; gap: 40px; }
  }
  /* tablet band only: no pinned head (the <=760 block pins it as a unit) */
  @media (min-width: 761px) and (max-width: 900px) {
    .prob-head-in { position: static; }
  }

  /* ===== Footprint timeline - vertical scroll → horizontal scrub =====
     (M14: border-top replaced by the shared threshold-hairline ::before below) */
  .ftl { height: 150vh; position: relative; }
  .ftl-pin { position: sticky; top: 92px; height: auto; padding: 64px 0 58px; display: block; overflow: visible; }
  .ftl-h { font-family: var(--rajd); font-weight: 600; text-transform: uppercase; font-size: clamp(28px, 3vw, 40px); line-height: 1.0; letter-spacing: 0; color: var(--text-primary); max-width: 22ch; margin: 20px auto 48px; text-align: center; }
  .ftl .wrap { text-align: center; }
  .ftl .seclabel { justify-content: center; }
  .ftl-read { justify-content: center; }
  .ftl-h .ac { color: var(--marigold); }
  .ftl-lane { position: relative; height: 158px; border-top: 1px solid var(--hair); border-bottom: 1px solid var(--hair); }
  /* V13: year hairlines lifted to the hair token; year labels move to a clean
     strip below the lane baseline (out of the evidence field) */
  .ftl-year { position: absolute; top: 0; bottom: 0; border-left: 1px solid var(--hair); }
  .ftl-year span { position: absolute; top: calc(100% + 9px); bottom: auto; left: 8px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.12em; color: var(--text-tertiary); }
  /* V13: the scrubber head carries a small trailing marigold beam cone (alpha
     capped at 0.10), clipped to the lane so it degrades cleanly at the frozen
     park position and never overflows the composition */
  .ftl-beamwrap { position: absolute; inset: 0; overflow: hidden; pointer-events: none; }
  .ftl-cone { position: absolute; top: 0; bottom: 0; left: 0; width: 110px; margin-left: -110px;
    background: linear-gradient(270deg, rgba(202,169,11,0.10), rgba(202,169,11,0.02) 62%, transparent);
    clip-path: polygon(100% 0, 100% 100%, 0 100%); }
  .ftl-dot { position: absolute; width: 5px; height: 5px; border-radius: 50%; background: var(--text-dim); transform: translate(-50%,-50%); transition: background 200ms, box-shadow 200ms; }
  .ftl-dot.lit { background: var(--marigold); box-shadow: 0 0 8px 1px rgba(202,169,11,0.5); }
  .ftl-dot.peri { background: var(--periwinkle); box-shadow: 0 0 8px 1px rgba(136,156,231,0.5); }
  .ftl-dot.flag { background: var(--flag, #e2504b); box-shadow: 0 0 8px 1px rgba(226,80,75,0.55); }
  .ftl-final { font-family: var(--rajd); font-weight: 600; text-transform: uppercase; font-size: clamp(19px, 1.9vw, 25px); letter-spacing: 0.01em; color: var(--text-primary); margin-top: 30px; opacity: 0; transform: translateY(8px); transition: opacity .55s var(--ease-out-quint), transform .55s var(--ease-out-quint); }
  .ftl-final .ac { color: var(--marigold); }
  .ftl-final.fin-on { opacity: 1; transform: none; }
  .ftl-head { position: absolute; top: -6px; bottom: -6px; width: 2px; background: var(--marigold); box-shadow: 0 0 16px 2px rgba(202,169,11,0.45); left: 0; }
  .ftl-head::before { content: ''; position: absolute; top: -7px; left: -5px; width: 12px; height: 9px; background: var(--marigold); clip-path: polygon(0 0, 100% 0, 50% 100%); }



  .ftl-read { display: flex; gap: 56px; margin-top: 38px; align-items: baseline; }
  .ftl-read .rk { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--text-tertiary); display: block; margin-bottom: 9px; }
  .ftl-read .rv { font-family: var(--rajd); font-weight: 600; font-size: 30px; color: var(--text-primary); line-height: 1; }
  .ftl-read .rv.ac { color: var(--marigold); }
  .ftl-read .rv.flag { color: var(--flag); }
  @media (max-width: 900px) {
    .ftl { height: auto; }
    .ftl-pin { position: static; height: auto; padding: 110px 0; }
    .ftl-read { gap: 36px; flex-wrap: wrap; }
  }
  /* M9 - collapse the 150vh scrub runway when the scrub can't play (layout parity
     for reduced-motion and ?snap; gated on the media query + the dedicated
     body.snap class only - NEVER body.frozen, which the mid-scroll failsafe can
     add for motion users). These rules live in the inline block because the
     inline cascade wins over the linked CSS. */
  @media (prefers-reduced-motion: reduce) {
    .ftl { height: auto; }
    .ftl-pin { position: static; padding: 110px 0; }
  }
  body.snap .ftl { height: auto; }
  body.snap .ftl-pin { position: static; padding: 110px 0; }
  @media (max-width: 560px) {
    .ftl-year span { display: none; }
    .ftl-year:nth-child(1) span, .ftl-year:nth-child(5) span, .ftl-year:nth-child(9) span { display: block; }
  }
  /* mobile rhythm: snapshot -> work without the desktop-era dead band */
  @media (max-width: 760px) {
    .ftl-pin { padding: 64px 0 36px; }
    .work { padding: 36px 0 72px; }
  }
  .work .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; }
  @media (max-width: 760px) {
    .work .grid { display: flex; flex-direction: column; }
    .work .wcell .k { display: none; }
    /* absolute top-right tag collided with the wrapping heading - flow it
       static above the heading as a clean meta line (no overlap) */
    .work .wtag { position: static; display: block; margin-bottom: 16px; font-size: 11px; }
  }
  .work .gcbox { background: var(--canvas-2); }
  .work .wcell { padding: 46px 42px 44px; }
  /* desktop-scale padding shrank the mobile text column to 264px vs the
     312px card standard - match the folder-card inset so columns align */
  @media (max-width: 760px) { .work .wcell { padding: 24px 18px 26px; } }
  .work .wcell .k { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--periwinkle); margin-bottom: 26px; }
  .work .wcell h3 { font-family: var(--rajd); font-weight: 600; text-transform: uppercase; color: var(--text-primary); font-size: clamp(19px, 1.9vw, 25px); line-height: 1.05; letter-spacing: 0; margin-bottom: 18px; }
  .work .wcell p { color: var(--text-secondary); font-size: 15px; line-height: 1.6; max-width: 44ch; }
  .work .gcinner.wcell { display: flex; flex-direction: column; height: 100%; }
  .work .wviz { margin-top: auto; padding-top: 26px; display: flex; justify-content: center; }
  .work .wviz svg { display: block; width: 100%; max-width: 360px; height: auto; overflow: visible; }
  .wviz .wv-edge { stroke: rgba(202,169,11,0.35); stroke-width: 1.2; }
  .wviz .wv-pipe { stroke: var(--marigold); stroke-width: 1.6; opacity: .75; }
  /* (.wv-wall / .wv-flow deleted - orphaned by the D124 lit-node-row replacement) */
  .wviz .wv-fill { fill: var(--marigold); }
  .wviz .wv-glow { fill: rgba(202,169,11,0.16); }
  .wviz .wv-surf { fill: var(--surface-2); stroke: var(--marigold); stroke-width: 1.5; }
  .wviz .wv-dim { fill: none; stroke: var(--text-dim); stroke-width: 1.2; }
  .wviz .wv-dimfill { fill: var(--text-tertiary); } /* D161: --text-dim is 2.67:1 on canvas, under the 3:1 needed for a mark that carries meaning */
  .wviz .wv-perim { fill: none; stroke: var(--text-dim); stroke-width: 1.2; stroke-dasharray: 4 4; }
  .wviz .wv-rect { fill: none; stroke: var(--hair-strong); stroke-width: 1.2; }
  .wviz .wv-rect.ac { stroke: rgba(202,169,11,0.6); }
  .wviz .wv-lab { font-family: var(--font-mono); font-size: calc(11px / var(--dscale, 1)); letter-spacing: 0.12em; text-transform: uppercase; fill: var(--text-tertiary); }
  .wviz .wv-lab.ac { fill: var(--marigold); }
  .work .wcell .scale { display: flex; align-items: center; gap: 0; margin-top: 30px; }
  .work .wcell .scale .node { flex: 1; height: 1px; background: var(--hair); position: relative; }
  .work .wcell .scale .node:first-child { flex: 0 0 0; }
  .work .wcell .scale .node .pt { position: absolute; right: -4px; top: -3.5px; width: 8px; height: 8px; border: 1px solid var(--text-dim); background: var(--canvas-2); transform: rotate(45deg); }
  .work .wcell .scale .node.lit .pt { border-color: var(--marigold); background: var(--marigold); box-shadow: 0 0 8px 1px rgba(202,169,11,0.5); }
  .work .wcell .scale .node .lb { position: absolute; right: -4px; top: 16px; transform: translateX(50%); font-family: var(--font-mono); font-size: 8.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-tertiary); white-space: nowrap; }
  .work .wcell .scale .node:first-child .lb { transform: translateX(0); left: 0; right: auto; }

  /* ===== §05 CLOSE ===== */
  .close { position: relative; min-height: 52vh; display: flex; align-items: center; justify-content: center; overflow: hidden; padding: 72px 0; } /* M14 hairline; round-8b: uniform close */
  #closefield { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 0; }
  .close .veil { position: absolute; inset: 0; z-index: 1; pointer-events: none; background: radial-gradient(ellipse 72% 70% at 50% 56%, transparent 0%, rgba(20,20,22,0.62) 68%, var(--canvas) 100%); }
  .close .wrap { position: relative; z-index: 2; text-align: center; }
  .close h2 { font-family: var(--rajd); font-weight: 600; text-transform: uppercase; color: var(--text-primary); font-size: clamp(44px, 6.2vw, 88px); line-height: 0.95; letter-spacing: -0.01em; }
  .close .l2 { display: block; }
  .close .sub { color: var(--text-secondary); margin: 28px auto 0; max-width: 46ch; font-size: 15px; line-height: 1.6; }
  .close .actions { margin-top: 40px; display: flex; gap: 16px; justify-content: center; }

  /* ===== FOOTER (styles live in site-iie.css - single source) ===== */

  /* ===== shared gold-corner entrance + reveal (robust) ===== */
  @keyframes lhFade { from { opacity: 0; } to { opacity: 1; } }
  @keyframes lhCorner { from { opacity: 0; transform: scale(0.4); } to { opacity: 1; transform: scale(1); } }
  @keyframes lhInner { from { opacity: 0; transform: scale(0.985); } to { opacity: 1; transform: none; } }
  @keyframes lhRiseSm { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }

  .gcbox > .corner, .gcbox > .edge, .gcbox > .gcinner { transition: none; }
  .gcbox > .gcinner { opacity: 1; transform: none; }
  html.js .gcbox:not(.in) > .gcinner { opacity: 0; transform: scale(0.985); }
  html.js .gcbox:not(.in) > .corner { opacity: 0; transform: scale(0.4); }
  html.js .gcbox:not(.in) > .edge { opacity: 0; }
  .gcbox.in > .corner  { animation: lhCorner 460ms var(--ease-out-expo) both; }
  .gcbox.in > .edge    { animation: lhFade 420ms ease 220ms both; }
  .gcbox.in > .gcinner { animation: lhInner 600ms var(--ease-out-quint) 320ms both; }

  .reveal { opacity: 1; transform: none; transition: none; }
  html.js .reveal:not(.in) { opacity: 0; transform: translateY(22px); }
  .reveal.in { animation: lhRiseSm 820ms var(--ease-out-quint) both; }

  body.frozen .reveal,
  body.frozen .gcbox > .corner, body.frozen .gcbox > .edge, body.frozen .gcbox > .gcinner {
    animation: none !important; opacity: 1 !important; transform: none !important;
  }
  @media (prefers-reduced-motion: reduce) {
    .gcbox > .corner, .gcbox > .edge, .gcbox > .gcinner { opacity: 1 !important; transform: none !important; animation: none !important; }
    .reveal { opacity: 1 !important; transform: none !important; animation: none !important; }
  }
  @media (max-width: 1040px) {



    .work .grid { grid-template-columns: 1fr; }
  }
  @media (max-width: 720px) {
  }

  /* ===== Stage-1 additions (S1, wiki/23) : What-we-do band · Trust band · Dossier beat · air-gap sever · apps intro ===== */
  /* What we do (Beat 2) + negation beam-pass (B5) */
  .wwd { padding: 118px 0 110px; text-align: center; position: relative; } /* M14: border-top -> threshold hairline */
  .wwd .wrap { position: relative; overflow: hidden; }
  .wwd-sweep { position: absolute; top: -8px; bottom: -8px; width: 30%; left: -34%; pointer-events: none; opacity: 0;
    background: linear-gradient(90deg, transparent, rgba(202,169,11,0.045) 35%, rgba(255,243,200,0.085) 50%, rgba(202,169,11,0.045) 65%, transparent); }
  .wwd .reveal.in .wwd-sweep { animation: wwdSweep 1.9s cubic-bezier(0.33,0,0.2,1) 400ms both; }
  @keyframes wwdSweep { 0% { opacity: 0; transform: translateX(0); } 10% { opacity: 1; } 90% { opacity: 1; } 100% { opacity: 0; transform: translateX(560%); } }
  .wwd-neg { font-family: var(--rajd); font-weight: 600; text-transform: uppercase; font-size: clamp(20px, 2.3vw, 31px); line-height: 1.16; color: var(--text-secondary); }
  .wwd-neg span { display: inline-block; margin: 0 0.32em; opacity: 0.75; }
  .wwd .reveal.in .wwd-neg span { animation: wwdRecede 800ms ease-out both; }
  .wwd .reveal.in .wwd-neg span:nth-child(1) { animation-delay: 750ms; }
  .wwd .reveal.in .wwd-neg span:nth-child(2) { animation-delay: 1050ms; }
  .wwd .reveal.in .wwd-neg span:nth-child(3) { animation-delay: 1350ms; }
  @keyframes wwdRecede { from { opacity: 0.75; } to { opacity: 0.62; } } /* audit: AA floor raised; recede stays visible, settles at 0.62 not 0.4 */
  .wwd-aff { margin: 28px auto 0; max-width: 58ch; font-family: var(--font-ui); font-size: clamp(17px, 1.5vw, 21px); line-height: 1.55; color: var(--text-primary); opacity: 0.55; }
  .wwd .reveal.in .wwd-aff { animation: wwdResolve 900ms ease-out 1550ms both; }
  @keyframes wwdResolve { from { opacity: 0.55; } to { opacity: 1; } }
  .wwd-verbs { display: flex; justify-content: center; gap: 36px; margin-top: 34px; flex-wrap: wrap; }
  .wwd-verbs span { font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--periwinkle); }
  /* Trust band */
  .trustband { padding: var(--section-y) 0; position: relative; } /* M14: border-top -> threshold hairline */
  .tb-grid { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 0.75fr); gap: 64px; align-items: start; }
  .tb-h { font-family: var(--rajd); font-weight: 600; text-transform: uppercase; font-size: clamp(28px, 3vw, 40px); line-height: 1.0; color: var(--text-primary); }
  .tb-body { margin-top: 24px; max-width: 56ch; font-family: var(--font-ui); font-size: var(--fs-dek); line-height: 1.6; color: var(--text-secondary); }
  .tb-principles { list-style: none; margin: 6px 0 0; padding: 0; }
  .tb-principles li { font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--text-primary); padding: 18px 0; border-top: 1px solid var(--hair); position: relative; }
  .tb-principles li:last-child { border-bottom: 1px solid var(--hair); }
  .tb-principles li::before { content: ''; position: absolute; left: 0; top: -1px; height: 1px; width: 0; background: var(--marigold); transition: width 600ms var(--ease-out-quint); }
  .trustband .reveal.in .tb-principles li:nth-child(1)::before { width: 34px; transition-delay: 500ms; }
  .trustband .reveal.in .tb-principles li:nth-child(2)::before { width: 34px; transition-delay: 700ms; }
  .trustband .reveal.in .tb-principles li:nth-child(3)::before { width: 34px; transition-delay: 900ms; }
  /* Dossier beat (B4) */
  .dossier { padding: 128px 0; position: relative; } /* M14: border-top -> threshold hairline */
  .dos-grid { display: grid; grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr); gap: 72px; align-items: center; }
  .dos-h { font-family: var(--rajd); font-weight: 600; text-transform: uppercase; font-size: clamp(28px, 3vw, 40px); line-height: 1.0; color: var(--text-primary); max-width: 14ch; }
  .dos-lead { margin-top: 24px; max-width: 44ch; font-family: var(--font-ui); font-size: var(--fs-dek); line-height: 1.6; color: var(--text-secondary); }
  .dos-anti { margin-top: 38px; display: flex; align-items: baseline; gap: 20px; }
  .dos-anti .rk { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--text-tertiary); }
  .dos-anti .rv { font-family: var(--rajd); font-weight: 600; font-size: 34px; line-height: 1; color: var(--marigold); }
  .dos-doc { border: 1px solid var(--hair); background: rgba(255,255,255,0.015); padding: 30px 30px 28px; }
  .dd-head { display: flex; justify-content: space-between; align-items: baseline; padding-bottom: 14px; border-bottom: 1px solid var(--hair); }
  .dd-title { font-family: var(--rajd); font-weight: 600; letter-spacing: 0.08em; font-size: 15px; color: var(--text-primary); text-transform: uppercase; }
  .dd-ref { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.2em; color: var(--text-tertiary); text-transform: uppercase; } /* V7: 10 -> 11px */
  .dd-row { display: flex; align-items: center; gap: 14px; padding: 13px 0; border-bottom: 1px solid rgba(255,255,255,0.05); opacity: 0; transform: translateY(8px); }
  .dd-claim { font-family: var(--font-mono); font-size: 11.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-secondary); flex: none; width: 186px; }
  .dd-redact { height: 8px; background: rgba(255,255,255,0.10); flex: 1 1 auto; max-width: var(--w, 60%); }
  .dd-pin { width: 7px; height: 7px; border-radius: 50%; flex: none; margin-left: auto; }
  .dd-pin.sup { background: var(--marigold); box-shadow: 0 0 8px rgba(202,169,11,0.45); }
  .dd-pin.flag { background: var(--flag); box-shadow: 0 0 8px rgba(226,80,75,0.4); }
  .dd-pin.peri { background: var(--periwinkle); box-shadow: 0 0 8px rgba(136,156,231,0.4); }
  .dossier .reveal.in .dd-row { animation: ddRow 620ms var(--ease-out-quint) both; animation-delay: calc(260ms + var(--i, 0) * 130ms); }
  @keyframes ddRow { to { opacity: 1; transform: none; } }
  .dd-rule { display: flex; justify-content: space-between; align-items: center; margin: 18px 0 4px; padding: 0 0 10px; position: relative; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.24em; color: var(--text-tertiary); text-transform: uppercase; } /* V7: 9.5 -> 11px */
  .dd-rule::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 1px; background: linear-gradient(90deg, var(--marigold), rgba(202,169,11,0.15)); transform: scaleX(0); transform-origin: left; transition: transform 700ms var(--ease-out-quint) 950ms; }
  .dossier .reveal.in .dd-rule::after { transform: scaleX(1); }
  .dd-verdict { margin-top: 20px; display: inline-block; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.22em; color: var(--marigold); border: 1px solid rgba(202,169,11,0.5); padding: 8px 14px; text-transform: uppercase; opacity: 0; }
  .dossier .reveal.in .dd-verdict { animation: ddRow 600ms var(--ease-out-quint) 1300ms both; }
  /* Air-gap sever (B1) */
  .wv-sever { stroke: rgba(255,255,255,0.28); stroke-width: 1.4; stroke-dasharray: 4 5; }
  .gcbox.in .wv-sever { animation: wvSever 800ms ease-in 950ms both; }
  @keyframes wvSever { 0% { opacity: 1; stroke-dashoffset: 0; } 55% { opacity: 0.55; } 100% { opacity: 0; stroke-dashoffset: -22; } }
  .wv-seal { fill: none; stroke: var(--marigold); stroke-width: 1.4; stroke-dasharray: 256; stroke-dashoffset: 256; opacity: 0; }
  .gcbox.in .wv-seal { animation: wvSeal 800ms var(--ease-out-quint) 1700ms both; }
  @keyframes wvSeal { 0% { stroke-dashoffset: 256; opacity: 1; } 100% { stroke-dashoffset: 0; opacity: 1; } }
  .wv-cap { margin-top: 14px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.2em; color: var(--text-tertiary); text-transform: uppercase; }
  /* Applications intro (H16) */
  .apps .head .apps-intro { margin-top: 22px; max-width: 56ch; font-family: var(--font-ui); font-size: var(--fs-dek); line-height: 1.6; color: var(--text-secondary); }
  /* Stage-1: responsive + reduced-motion + frozen-state contracts */
  @media (max-width: 880px) {
    .tb-grid, .dos-grid { grid-template-columns: 1fr; gap: 40px; }
    .wwd-verbs { gap: 20px; }
    .dd-claim { width: 132px; }
  }
  @media (prefers-reduced-motion: reduce) {
    .wwd-sweep { display: none; }
    .wwd-neg span { opacity: 0.7 !important; animation: none !important; } /* B5 brief: negations at 70% under reduced-motion (5.5:1, AA) */
    .wwd-aff { opacity: 1 !important; animation: none !important; }
    .dossier .dd-row, .dossier .dd-verdict { opacity: 1 !important; transform: none !important; animation: none !important; }
    .dd-rule::after { transform: scaleX(1) !important; transition: none !important; }
    .tb-principles li::before { width: 34px !important; transition: none !important; }
    .wv-sever { opacity: 0 !important; animation: none !important; }
    .wv-seal { opacity: 1 !important; stroke-dashoffset: 0 !important; animation: none !important; }
  }
  body.frozen .wwd-sweep { display: none; }
  body.frozen .wwd-neg span { opacity: 0.62; animation: none; }
  body.frozen .wwd-aff { opacity: 1; animation: none; }
  body.frozen .dd-row, body.frozen .dd-verdict { opacity: 1; transform: none; animation: none; }
  body.frozen .dd-rule::after { transform: scaleX(1); transition: none; }
  body.frozen .tb-principles li::before { width: 34px; transition: none; }
  body.frozen .wv-sever { opacity: 0; animation: none; }
  body.frozen .wv-seal { opacity: 1; stroke-dashoffset: 0; animation: none; }
  html:not(.js) .dd-row, html:not(.js) .dd-verdict { opacity: 1; transform: none; }

  /* ===== Ratified-final additions (tribunal 2026-07-04, wiki/23) ===== */
  .iie-h1--banner { font-size: clamp(34px, 4.8vw, 66px); letter-spacing: 0; }
  .iie-kicker { margin-top: 18px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--text-secondary); }
  .iie-kicker::before { content: ''; display: inline-block; width: 18px; height: 1px; background: var(--marigold); vertical-align: 4px; margin-right: 10px; }
  .enr-body { margin: 18px auto 0; max-width: 62ch; font-family: var(--font-ui); font-size: var(--fs-dek); line-height: 1.6; color: var(--text-secondary); }
  .ftl-body { margin: 0 auto 40px; max-width: 58ch; font-family: var(--font-ui); font-size: var(--fs-dek); line-height: 1.6; color: var(--text-secondary); text-align: center; }
  .work .whead { margin-bottom: var(--head-gap); }
  .work .whead h2 { font-family: var(--rajd); font-weight: 600; text-transform: uppercase; color: var(--text-primary); font-size: clamp(28px, 3vw, 40px); line-height: 1.0; letter-spacing: 0; }
  .tb-h3 { margin-top: 30px; font-family: var(--rajd); font-weight: 600; text-transform: uppercase; font-size: clamp(19px, 1.9vw, 25px); line-height: 1.05; color: var(--text-primary); }
  .tb-restraint { color: var(--text-primary); }
  /* C17/D148 - the before/after finding record (replaces the flip-card ledger widget).
     One person, read twice: tabs switch between the standard-check read and the
     LightHouse read; both views stack in one grid cell so the card keeps one height.
     User-initiated, exempt from play-once. */
  .nbx-card { position: relative; border: 1px solid var(--hair-strong); background: rgba(255,255,255,0.015); padding: 20px 24px 22px; }
  .nbx-head { display: flex; justify-content: space-between; align-items: baseline; padding-bottom: 14px; border-bottom: 1px solid var(--hair-strong); font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--text-tertiary); }
  .nbx-ref { color: var(--marigold); }
  .nbx-switch { display: flex; gap: 26px; padding: 14px 0 6px; }
  .nbx-tab { position: relative; background: none; border: 0; padding: 13px 0 13px; min-height: 44px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--text-tertiary); cursor: pointer; transition: color 200ms; }
  .nbx-tab::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: var(--marigold); transform: scaleX(0); transform-origin: left; transition: transform 260ms var(--ease-out-quint); }
  .nbx-tab[aria-selected="true"] { color: var(--text-primary); }
  .nbx-tab[aria-selected="true"]::after { transform: scaleX(1); }
  /* M23 - one focus-ring token sitewide: 2px --marigold-hover, 3px offset (base.css) */
  .nbx-tab:focus-visible { outline: 2px solid var(--marigold-hover); outline-offset: 3px; }
  /* audit a11y (carried over from the flip card): visibility toggles keep only the
     shown view in the a11y tree, so a screen reader never announces both reads
     concatenated. transition-delay is declared per destination state so the hidden
     view lingers through the fade. */
  .nbx-stage { display: grid; }
  .nbx-view { grid-area: 1 / 1; display: flex; flex-direction: column; align-items: stretch; padding-top: 4px; transition: opacity 360ms var(--ease-out-quint), transform 360ms var(--ease-out-quint), visibility 0s linear 360ms; }
  html.js .nbx[data-view="after"] .nbx-view--before,
  html.js .nbx[data-view="before"] .nbx-view--after { opacity: 0; transform: translateY(10px); pointer-events: none; visibility: hidden; }
  html.js .nbx[data-view="after"] .nbx-view--after,
  html.js .nbx[data-view="before"] .nbx-view--before { opacity: 1; transform: none; visibility: visible; transition-delay: 0s; }
  html:not(.js) .nbx-switch { display: none; }
  html:not(.js) .nbx-view--before { display: none; } /* no-JS files the full read */
  .nbx-row { display: flex; justify-content: space-between; align-items: baseline; gap: 14px; padding: 9px 0; border-bottom: 1px solid rgba(255,255,255,0.06); }
  .nbx-row .k { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--text-tertiary); }
  .nbx-row .v { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-primary); text-align: right; }
  .nbx-row .v.ac { color: var(--marigold); }
  /* D160: the one openable row. Visual height matches its siblings; the touch
     target is extended to 44px with a pseudo-element so the record's rhythm holds. */
  .nbx-rowbtn { position: relative; width: 100%; background: none; border: 0; border-bottom: 1px solid rgba(255,255,255,0.06); font: inherit; text-align: left; cursor: pointer; }
  .nbx-rowbtn::after { content: ''; position: absolute; inset: -7px 0; }
  .nbx-rowbtn:hover .k, .nbx-rowbtn:hover .v { color: var(--text-primary); }
  .nbx-rowbtn:focus-visible { outline: 2px solid var(--marigold-hover); outline-offset: 3px; }
  .nbx-x { position: relative; display: inline-block; width: 10px; height: 10px; margin-left: 10px; vertical-align: -1px; opacity: 0.8; }
  .nbx-x::before, .nbx-x::after { content: ''; position: absolute; left: 0; top: 4.25px; width: 10px; height: 1.5px; background: var(--periwinkle); transition: transform 300ms var(--ease-out-expo); }
  .nbx-x::after { transform: rotate(90deg); }
  .nbx-rowbtn[aria-expanded="true"] .nbx-x::after { transform: rotate(0deg); }
  /* The disclosure opens INSTANTLY and deliberately carries no transition. Two attempts
     to animate it failed the same way: `grid-template-rows` does not interpolate between
     0fr and 1fr when the grid is a flex item, and a follow-up opacity/transform fade also
     stalled at its from-value, leaving the panel invisible while measuring "open". A data
     surface does not need a reveal to be legible, and this cannot half-open on any engine.
     Only the +/- affordance animates, on transform. */
  .nbx-src { display: grid; grid-template-rows: 0fr; }
  .nbx-rowbtn[aria-expanded="true"] + .nbx-src { grid-template-rows: 1fr; }
  .nbx-src-in { overflow: hidden; }
  .nbx-srow { display: flex; justify-content: space-between; align-items: baseline; gap: 14px; padding: 7px 0 7px 14px; border-left: 1px solid var(--hair); margin-left: 2px; }
  .nbx-srow:first-child { padding-top: 11px; }
  .nbx-srow:last-child { padding-bottom: 13px; }
  .nbx-srow .k { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--text-dim); }
  .nbx-srow .v { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-tertiary); text-align: right; }
  .nbx-srow .v.ac { color: var(--marigold); }
  html:not(.js) .nbx-src { grid-template-rows: 1fr; }
  html:not(.js) .nbx-x { display: none; }
  .nbx-scores { display: flex; gap: 34px; padding: 16px 0 4px; }
  .nbx-score { display: flex; flex-direction: column; gap: 5px; flex: 1 1 0; }
  .nbx-score .rk { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--text-tertiary); }
  .nbx-score .rv { font-family: var(--rajd); font-weight: 600; font-size: 24px; line-height: 1; color: var(--text-primary); }
  .nbx-score .rv.ac { color: var(--marigold); }
  .nbx-score .rv.flag { color: var(--flag); }
  .nbx-meter { display: block; height: 3px; background: var(--hair); overflow: hidden; }
  .nbx-fill { display: block; height: 100%; width: var(--w, 0%); transform: scaleX(0); transform-origin: left; transition: transform 500ms var(--ease-out-quint) 120ms; }
  .nbx-fill.ac { background: var(--marigold); }
  .nbx-fill.flag { background: var(--flag); }
  html.js .nbx[data-view="after"] .nbx-view--after .nbx-fill { transform: scaleX(1); }
  html:not(.js) .nbx-fill { transform: scaleX(1); }
  .nbx-verdict { align-self: flex-start; margin-top: 16px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--marigold); border: 1px solid rgba(202,169,11,0.5); padding: 8px 14px; }
  .nbx-verdict.flag { color: var(--flag); border-color: rgba(226,80,75,0.5); }
  /* round-12: the standard check's verdict reads as an inked stamp, not a chip */
  .nbx-stamp { align-self: flex-start; margin-top: 18px; font-family: var(--rajd); font-weight: 600; font-size: 19px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--periwinkle);
    border: 2px solid var(--periwinkle); border-radius: 2px; padding: 6px 16px 5px; transform: rotate(-7deg); opacity: 0.88; }
  .nbx-note { display: block; margin-top: 16px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.1em; color: var(--text-tertiary); }
  .nbx-open { align-self: flex-start; margin-top: 10px; background: none; border: 0; padding: 13px 0; min-height: 44px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--periwinkle); cursor: pointer; transition: color 200ms; }
  .nbx-open .arr { display: inline-block; margin-left: 8px; transition: transform 260ms var(--ease-out-quint); }
  .nbx-open:hover { color: var(--marigold); }
  .nbx-open:hover .arr { transform: translateX(4px); }
  .nbx-open:focus-visible { outline: 2px solid var(--marigold-hover); outline-offset: 3px; }
  .nbx-cta { display: flex; justify-content: center; margin-top: 22px; }
  @media (prefers-reduced-motion: reduce) { .nbx-view, .nbx-fill, .nbx-tab, .nbx-tab::after, .nbx-x::before, .nbx-x::after { transition: none !important; } }
  @media (max-width: 480px) { .nbx-row { flex-wrap: wrap; } .nbx-row .v { text-align: left; } .nbx-scores { gap: 22px; } }
  @media (max-width: 880px) { .ftl-body { margin-bottom: 30px; } }

  /* ===== Design-session HOME-BANDS additions (wiki/32, owner rulings D121-D127) ===== */

  /* M13 - two-tier text-band entrance: claim lands, evidence follows.
     H2 words rise as today; the lead (.r2) follows at +140ms; tertiary furniture
     (.r3) at +260ms. Two tiers max; set pieces keep their own choreography
     (#what excluded per the judge's refined spec - its children already carry
     the tuned sweep/recede/resolve sequence). */
  html.js .reveal:not(.in) .r2, html.js .reveal:not(.in) .r3 { opacity: 0; }
  .reveal.in .r2 { animation: lhRiseSm 820ms var(--ease-out-quint) 140ms both; }
  .reveal.in .r3 { animation: lhRiseSm 820ms var(--ease-out-quint) 260ms both; }

  /* M14 - threshold hairline: each band's top rule draws left-to-right as the
     band enters (the page files its own ledger as you read; dd-rule grammar).
     Replaces the static border-tops. Play once via the section-level .sealed
     class; drawn under reduce/frozen/no-JS. */
  .wwd::before, .trustband::before, .dossier::before, .close::before, .ftl::before,
  .band.solution::before, .apps::before, .sa-engine::before, .lh-missions::before, .sh-decision::before {
    content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px;
    background: var(--hair); transform-origin: left; z-index: 3; pointer-events: none;
    transition: transform 900ms var(--ease-out-quint);
  }
  html.js .wwd:not(.sealed)::before, html.js .trustband:not(.sealed)::before,
  html.js .dossier:not(.sealed)::before, html.js .close:not(.sealed)::before,
  html.js .ftl:not(.sealed)::before, html.js .band.solution:not(.sealed)::before,
  html.js .apps:not(.sealed)::before, html.js .sa-engine:not(.sealed)::before,
  html.js .lh-missions:not(.sealed)::before, html.js .sh-decision:not(.sealed)::before { transform: scaleX(0); }

  /* M30/A3 - afterglow anchor (REFINED: one-shot, stays lit, NO breathing loop).
     As the B5 sweep exits (~2.3s), a standing light column (~40% band width,
     marigold capped at 4% alpha) fades up once behind the affirmation and holds. */
  .wwd .wrap { isolation: isolate; }
  .wwd .wrap::after { content: ''; position: absolute; top: 0; bottom: 0; left: 30%; width: 40%;
    z-index: -1; pointer-events: none; opacity: 0;
    background: linear-gradient(90deg, transparent, rgba(202,169,11,0.04) 50%, transparent); }
  .wwd .wrap.reveal.in::after { animation: wwdAfter 700ms var(--ease-out-quint) 2300ms both; }
  @keyframes wwdAfter { from { opacity: 0; } to { opacity: 1; } }

  /* V5 - promote the affirmation: the category claim outranks the negations
     (the band said "not" louder than "is"). Negations stay dimmed-secondary. */
  .wwd-neg { font-size: clamp(16px, 1.7vw, 22px); }
  .wwd-aff { font-family: var(--rajd); font-weight: 600; text-transform: uppercase;
    font-size: clamp(28px, 3vw, 40px); line-height: 1.08; letter-spacing: 0; max-width: 24ch; }

  /* (M31/A4 lwPinBreathe retired with the flip-card widget - C17/D148; no pulsing
     indicators remain in the band, per the D133 brand rule) */

  /* M32/A5 - alive inside the seal: ~100ms after the B1 seal lands (sever 800ms
     @950ms + seal 800ms @1700ms = 2500ms), the marigold core breathes at the
     folders' 4.2s stamp cadence. Both cards share the delay = one heartbeat
     across the band. 2.6s = sealEnd + 100ms; retune if B1 timing changes. */
  .gcbox.in .wv-glow, .gcbox.in .wv-fill { animation: fvPulse 4.2s ease-in-out 2.6s infinite; }

  /* V-trust (C17/D148 recut) - one settle-and-stop border wipe as a reveal tease
     (dd-rule grammar, plays once, stays lit). The record itself never auto-plays. */
  .nbx-card::before { content: ''; position: absolute; top: -1px; left: 0; right: 0; height: 1px;
    background: linear-gradient(90deg, var(--marigold), rgba(202,169,11,0.15));
    transform: scaleX(0); transform-origin: left; pointer-events: none; }
  .trustband .reveal.in .nbx-card::before { animation: nbxTease 900ms var(--ease-out-quint) 800ms both; }
  @keyframes nbxTease { to { transform: scaleX(1); } }

  /* REPLACE (D124) - embedded card: one lit node in the row. Six equal nodes on
     a hairline baseline, the LightHouse node lit (wv-glow/wv-fill), thin arcs to
     its neighbors (wv-edge adapted for paths), play-once entrance in B1's register. */
  .wviz .wv-base { stroke: var(--hair); stroke-width: 1; }
  .wviz .wv-arc { fill: none; stroke-dasharray: 80; }
  html.js .gcbox:not(.in) .wv-arc { stroke-dashoffset: 80; opacity: 0; }
  html.js .gcbox:not(.in) .wv-lit { opacity: 0; }
  .gcbox.in .wv-arc { animation: wvArc 700ms var(--ease-out-quint) 1150ms both; }
  @keyframes wvArc { from { stroke-dashoffset: 80; opacity: 1; } to { stroke-dashoffset: 0; opacity: 1; } }
  .gcbox.in .wv-lit { animation: lhFade 620ms var(--ease-out-quint) 900ms both; }

  /* --- reduced-motion contract for every addition above --- */
  @media (prefers-reduced-motion: reduce) {
    .r2, .r3 { opacity: 1 !important; animation: none !important; }
    .wwd::before, .trustband::before, .dossier::before, .close::before, .ftl::before,
    .band.solution::before, .apps::before, .sa-engine::before, .lh-missions::before, .sh-decision::before { transform: none !important; transition: none !important; }
    .band.solution::after, .apps::after { opacity: 1 !important; transition: none !important; }
    .wwd .wrap::after { opacity: 1 !important; animation: none !important; }
    .wv-glow, .wv-fill { animation: none !important; }
    .nbx-card::before { transform: scaleX(1) !important; animation: none !important; }
    .wv-arc { stroke-dashoffset: 0 !important; opacity: 1 !important; animation: none !important; }
    .wv-lit { opacity: 1 !important; animation: none !important; }
  }

  /* --- body.frozen (?snap + failsafe) contract for every addition above --- */
  body.frozen .r2, body.frozen .r3 { animation: none !important; opacity: 1 !important; transform: none !important; }
  body.frozen .wwd::before, body.frozen .trustband::before, body.frozen .dossier::before,
  body.frozen .close::before, body.frozen .ftl::before,
  body.frozen .band.solution::before, body.frozen .apps::before,
  body.frozen .sa-engine::before, body.frozen .lh-missions::before, body.frozen .sh-decision::before { transform: none !important; transition: none !important; }
  body.frozen .band.solution::after, body.frozen .apps::after { opacity: 1 !important; transition: none !important; }
  body.frozen .wwd .wrap::after { opacity: 1 !important; animation: none !important; }
  body.frozen .gcbox .wv-glow, body.frozen .gcbox .wv-fill { animation: none !important; opacity: 1 !important; }
  body.frozen .nbx-card::before { transform: scaleX(1) !important; animation: none !important; }
  body.frozen .nbx-view, body.frozen .nbx-fill, body.frozen .nbx-tab::after { transition: none !important; }
  body.snap .nbx-src { grid-template-rows: 1fr !important; } /* D160: the deterministic frame files the source open */
  body.frozen .gcbox .wv-arc { stroke-dashoffset: 0 !important; opacity: 1 !important; animation: none !important; }
  body.frozen .gcbox .wv-lit { opacity: 1 !important; animation: none !important; }

/* ============================================================
   POST-TRANSPLANT ADDITIONS (dev-scope — not part of the verbatim
   block above; keep appended, never interleave).
   D174 (owner, 2026-07-24): CTA-first on mobile, site-wide audit —
   the hero CTA pair files ABOVE the humanLine on phones so it lands
   inside the first viewport (it sat 7px under the 812 fold). Visual
   order only: the column is already flex; reading order Home/Company
   already comply; the closes stay the narrative ask (ruled order).
   ============================================================ */
@media (max-width: 760px) {
  .iie-left .lh-human { order: 1; }
}
