    :root{--bg:#07100d;--panel:#0e1916;--line:#29483f;--ink:#eef6f2;--muted:#a6bbb2;--gold:#d4af37;
  /* --vi-dark-surface-map: this page paints a dark ground of its own, so the
     shared tokens have to follow it. Without this, any shared component
     rendered light-theme ink on near-black — the empty-state copy at 3.4:1 and
     the retry control at 1.24:1, which is not readable at all. */
  --text:#eef6f2; --text-dim:#cfe0d9; --text-muted:#a6bbb2;
  --surface:#0e1916; --surface-2:#122420;
  /* WAVE 4 BLOCK 1 — THE MAP WAS INCOMPLETE, AND THE GAP WAS INVISIBLE TEXT.
     This map covered --surface and --surface-2 and omitted --surface-1.
     knowledge-showcase.css sets `.vic-card{background:var(--surface-1)}`, so
     every collection card on this dark page painted itself #FFFFFF while its
     <h3> inherited the near-white --text above it.
     Measured on the deployed Preview: h3 rgb(238,246,242) on card background
     rgb(255,255,255). CONTRAST 1.09:1 — not "low contrast", invisible — and the
     single largest contributor to ~200 axe colour-contrast failures on this
     route.
     A dark-surface map that omits one surface token is worse than no map: the
     omitted component does not fall back to something readable, it falls back
     to the LIGHT theme's value on a dark page. --accent is mapped for the same
     reason: knowledge-showcase.css uses it for card hover borders and product
     group rules. */
  --surface-1:#0e1916; --surface-3:#16302a; --accent:#4FA490;
  --border:#29483f; --border-strong:#3d6357;
  --accent-2-text:#7FD3BE; --accent-text:#E5BC69}
/* --vi-dark-token-map: style.css declares these on html[data-theme="light"],
   which outranks :root — so the block above alone changed nothing. Same
   specificity, later stylesheet, no !important. */
/* Scoped to this page's own content. Applied to <html> it also repainted the
   site footer, which keeps a light surface, and pushed its heading to a failing
   ratio — fixing one contrast defect by creating another. */
#main-content, .publication-shell {
  --text:#eef6f2; --text-dim:#cfe0d9; --text-muted:#a6bbb2;
  --surface:#0e1916; --surface-2:#122420;
  /* Mirrors the :root map above — see the note there. This is the scope that
     actually takes effect, because style.css declares these on
     html[data-theme="light"], which outranks :root. */
  --surface-1:#0e1916; --surface-3:#16302a; --accent:#4FA490;
  --border:#29483f; --border-strong:#3d6357;
  --accent-2-text:#7FD3BE; --accent-text:#E5BC69;
}*{box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--bg);color:var(--ink);margin:0}.skip-link{position:absolute;top:-80px;left:12px;background:#fff;color:#111;padding:10px 14px;z-index:99}.skip-link:focus{top:12px}.wrap{width:min(100% - 28px,1360px);margin:auto;padding:16px 0 64px}.actions{display:flex;gap:9px;flex-wrap:wrap;margin:18px 0}.actions a,.actions button{background:var(--gold);color:#111;padding:10px 14px;border-radius:10px;text-decoration:none;font-weight:850;border:none;font-size:.9rem;cursor:pointer;font-family:inherit}.actions a:not(:first-child){background:#14241f;color:var(--ink);border:1px solid var(--line)}.notice{border:1px solid #6d5a21;background:#261f0b;padding:16px;border-radius:14px;color:#f3dda0;margin:14px 0}
    .publication-frame-wrap{background:#fff;border-radius:16px;overflow:hidden;border:1px solid var(--line)}
    .publication-frame{display:block;width:100%;height:82vh;border:0;background:#fff}
    .loading,.error{padding:60px;text-align:center}.muted{color:var(--muted)}
    .site-nav{display:flex;align-items:center;gap:16px}.site-nav a{text-decoration:none}.site-nav .brand-home{color:#fff;font-weight:950}.site-nav .nav-link{color:var(--muted)}
    @media(max-width:620px){.wrap{width:min(100% - 20px,1360px)}.actions a,.actions button{flex:1 1 100%;text-align:center}.publication-frame{height:70vh}}
