/* ============================================================================
   circuitRF — User Documentation stylesheet
   ----------------------------------------------------------------------------
   ONE stylesheet drives all three guides (Quick Start, New User's Guide,
   Reference Guide). Every page links it with a RELATIVE path, e.g.:

       <link rel="stylesheet" href="../assets/css/circuitrf-docs.css">

   so the docs work both online and offline (open the .html straight from disk).

   ----------------------------------------------------------------------------
   HOW TO CHANGE THE LOOK  (read this first)
   ----------------------------------------------------------------------------
   Almost everything is a CSS variable in the :root and the dark-mode block
   below. To re-theme the docs you should only need to touch THOSE TWO BLOCKS:

     • Brand colors ....... --crf-cyan / --crf-coral / --crf-ink  (the brand kit)
     • Page colors ........ --bg, --surface, --text, --muted, --border, --link
     • Type & rhythm ...... --font-sans, --font-mono, --maxw, --radius, --gap

   Light vs. dark is automatic: the dark palette lives in the
   `@media (prefers-color-scheme: dark)` block and simply re-points the SAME
   variable names. Add a new color = add ONE variable in BOTH blocks.

   Section map (search these banners to jump around):
     [VARS]      theme variables (light)        [VARS-DARK] dark overrides
     [BASE]      page / typography               [CHROME]   header + footer
     [NAV]       breadcrumb + table of contents  [CONTENT]  prose elements
     [TABLE]     parameter / data tables         [CALLOUT]  note/tip/warning
     [SYMBOL]    component symbol figures        [SHOT]     UI capture frames
     [CODE]      code + netlist blocks           [UTIL]     helpers / print
     [SEARCH]    the header + landing search boxes
   ============================================================================ */

/* ---------------------------------------------------------------- [VARS] --- */
:root {
  /* Brand kit (src/Ui/Assets/artwork/colors.css) — keep in sync with the app */
  --crf-ink:    #0F2233;
  --crf-cyan:   #22D3EE;
  --crf-coral:  #FF6A3D;

  /* Page palette (LIGHT) */
  --bg:         #FFFFFF;   /* page background                       */
  --surface:    #F6F8FA;   /* cards, code, table header background  */
  --surface-2:  #EEF2F5;   /* zebra rows, subtle fills             */
  --text:       #1A2632;   /* body text                            */
  --muted:      #5C6B7A;   /* captions, secondary text             */
  --border:     #DCE3EA;   /* hairlines, table borders             */
  --link:       #0E7C99;   /* links (cyan, darkened for contrast)  */
  --link-hover: #0A5E74;
  --accent:     var(--crf-coral);   /* the coral dot / active accent */

  /* Callout tints (LIGHT) */
  --note-bg:    #EAF6FA;  --note-bar:  var(--crf-cyan);
  --tip-bg:     #ECF7EE;  --tip-bar:   #34A853;
  --warn-bg:    #FFF3EC;  --warn-bar:  var(--crf-coral);

  /* Search (LIGHT) — the matched-word highlight and the input's focus ring. */
  --hilite:     #BCEEF7;
  --focus-ring: #A9E9F5;

  /* Type & rhythm — change these to restyle spacing/width globally */
  --font-sans: "IBM Plex Sans", "Inter", -apple-system, BlinkMacSystemFont,
               "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --font-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, Consolas,
               "Liberation Mono", monospace;
  --maxw:      52rem;     /* reading column width                   */
  --radius:    10px;      /* card / figure corner radius            */
  --gap:       1.25rem;   /* default vertical rhythm                */
}

/* ----------------------------------------------------------- [VARS-DARK] --- */
@media (prefers-color-scheme: dark) {
  :root {
    --bg:         #0E1820;
    --surface:    #15222D;
    --surface-2:  #1C2C39;
    --text:       #E6EDF3;
    --muted:      #9DB0C0;
    --border:     #283A48;
    --link:       #56D7EE;   /* brighter cyan for dark bg */
    --link-hover: #8BE6F5;
    --accent:     var(--crf-coral);

    --note-bg:    #102832;  --note-bar:  var(--crf-cyan);
    --tip-bg:     #14271A;  --tip-bar:   #4CC366;
    --warn-bg:    #2A1B12;  --warn-bar:  var(--crf-coral);

    --hilite:     #17505E;
    --focus-ring: #1B4E5B;
  }
}

/* ---------------------------------------------------------------- [BASE] --- */
* { box-sizing: border-box; }

html { scroll-behavior: smooth; scroll-padding-top: 1rem; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-sans);
  font-size: 16px;
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

.page {                      /* the centered reading column */
  max-width: var(--maxw);
  margin: 0 auto;
  padding: 0 1.25rem 4rem;
}

h1, h2, h3, h4 { line-height: 1.25; font-weight: 600; scroll-margin-top: 1rem; }
h1 { font-size: 2.0rem;  margin: 1.6rem 0 0.4rem; letter-spacing: -0.01em; }
h2 { font-size: 1.45rem; margin: 2.4rem 0 0.6rem; padding-top: 0.4rem;
     border-top: 1px solid var(--border); }
h3 { font-size: 1.15rem; margin: 1.6rem 0 0.4rem; }
h4 { font-size: 1.0rem;  margin: 1.2rem 0 0.3rem; color: var(--muted); }
p, li { font-size: 1rem; }
.lede { font-size: 1.12rem; color: var(--muted); margin-top: 0.2rem; }

a       { color: var(--link); text-decoration: none; }
a:hover { color: var(--link-hover); text-decoration: underline; }

strong { font-weight: 600; }
hr { border: 0; border-top: 1px solid var(--border); margin: 2rem 0; }

/* ------------------------------------------------------------- [CHROME] --- */
.doc-header {
  display: flex; align-items: center; gap: 0.8rem; flex-wrap: wrap;
  max-width: var(--maxw); margin: 0 auto; padding: 1.1rem 1.25rem 0.9rem;
}
/* Brand lock-up: the favicon mark (a rounded ink tile that reads on light AND dark, so no
   per-mode swap needed) + a text wordmark. Change the mark by swapping the <img src>. */
.doc-header .brand { display: inline-flex; align-items: center; gap: 0.55rem;
  text-decoration: none; color: inherit; }
.doc-header .logo { height: 32px; width: 32px; display: inline-block; }
.doc-header .wordmark { font-weight: 600; font-size: 1.2rem; letter-spacing: -0.01em; color: var(--text); }
.doc-header a.brand:hover .wordmark { color: var(--link); }
.doc-header .doc-kind {
  margin-left: auto; font-size: 0.8rem; font-weight: 600; letter-spacing: 0.04em;
  text-transform: uppercase; color: var(--muted);
  border: 1px solid var(--border); border-radius: 999px; padding: 0.2rem 0.7rem;
}
.doc-headrule {                /* thin brand gradient rule under the header */
  height: 3px; border: 0; margin: 0;
  background: linear-gradient(90deg, var(--crf-cyan), var(--crf-coral));
  opacity: 0.9;
}

.doc-footer {
  max-width: var(--maxw); margin: 3rem auto 1.5rem; padding: 1.2rem 1.25rem 0;
  border-top: 1px solid var(--border);
  display: flex; align-items: center; gap: 0.7rem;
  font-size: 0.85rem; color: var(--muted);
}
.doc-footer img { height: 22px; width: 22px; }
.doc-footer .spacer { margin-left: auto; }

/* ---------------------------------------------------------------- [NAV] --- */
.breadcrumb { font-size: 0.85rem; color: var(--muted); margin: 0.4rem 0 0; }
.breadcrumb a { color: var(--muted); }
.breadcrumb a:hover { color: var(--link); }

nav.toc {                      /* on-page table of contents card */
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 0.9rem 1.1rem; margin: 1.4rem 0;
}
nav.toc h2 { border: 0; margin: 0 0 0.4rem; padding: 0; font-size: 0.8rem;
  text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); }
nav.toc ol { margin: 0; padding-left: 1.2rem; }
nav.toc li { margin: 0.15rem 0; }

/* Card grid for the landing page */
.card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  gap: var(--gap); margin: 1.6rem 0; }
.card {
  display: block; background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 1.1rem 1.2rem; color: inherit;
  transition: border-color 0.15s, transform 0.15s;
}
.card:hover { border-color: var(--crf-cyan); text-decoration: none; transform: translateY(-2px); }
.card h3 { margin: 0 0 0.3rem; }
.card p  { margin: 0; color: var(--muted); font-size: 0.95rem; }

/* ------------------------------------------------------------ [CONTENT] --- */
ul, ol { padding-left: 1.4rem; }
li { margin: 0.25rem 0; }
kbd {
  font-family: var(--font-mono); font-size: 0.82em;
  background: var(--surface-2); border: 1px solid var(--border);
  border-bottom-width: 2px; border-radius: 5px; padding: 0.05em 0.4em;
}
.term { font-weight: 600; color: var(--text); }          /* a defined term */
abbr { text-decoration: none; border-bottom: 1px dotted var(--muted); cursor: help; }

/* ---------------------------------------------------------------- [TABLE] -- */
table { width: 100%; border-collapse: collapse; margin: 1rem 0; font-size: 0.95rem; }
caption { caption-side: bottom; color: var(--muted); font-size: 0.85rem; padding-top: 0.4rem; }
th, td { text-align: left; vertical-align: top; padding: 0.5rem 0.7rem; border: 1px solid var(--border); }
thead th { background: var(--surface); font-weight: 600; }
tbody tr:nth-child(even) { background: var(--surface-2); }
td code, th code { font-size: 0.88em; }
.param-table td:first-child { font-family: var(--font-mono); white-space: nowrap; font-weight: 600; }

/* -------------------------------------------------------------- [CALLOUT] -- */
.callout { border-left: 4px solid var(--note-bar); background: var(--note-bg);
  border-radius: 0 var(--radius) var(--radius) 0; padding: 0.7rem 1rem; margin: 1.1rem 0; }
.callout p:first-child { margin-top: 0; } .callout p:last-child { margin-bottom: 0; }
.callout .label { font-weight: 700; font-size: 0.78rem; letter-spacing: 0.04em;
  text-transform: uppercase; display: block; margin-bottom: 0.2rem; }
.callout.tip  { border-color: var(--tip-bar);  background: var(--tip-bg); }
.callout.warn { border-color: var(--warn-bar); background: var(--warn-bg); }
.callout.note .label { color: var(--note-bar); }
.callout.tip  .label { color: var(--tip-bar); }
.callout.warn .label { color: var(--warn-bar); }

/* --------------------------------------------------------------- [SYMBOL] -- */
/* Component symbol figures. The SVGs are generated from the live drawing engine
   (see assets/symbols/README.md) as a baked-color LIGHT file and DARK file per
   component, e.g. resistor.svg / resistor-dark.svg. The figure embeds both and
   swaps with the media query below — same approach as the header logo.
   Markup:
     <figure class="symbol"><span class="frame">
       <img class="sym-light" src="../assets/symbols/resistor.svg"      alt="R symbol">
       <img class="sym-dark"  src="../assets/symbols/resistor-dark.svg" alt="">
     </span><figcaption>Resistor (R)</figcaption></figure>
   To refresh after a symbol changes: re-run the generator (README) — no HTML/CSS edit. */
figure.symbol { margin: 1.2rem 0; text-align: center; }
figure.symbol .frame {
  display: inline-block; background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 0.6rem 1rem; color: var(--text);
}
figure.symbol svg, figure.symbol img { max-width: 240px; height: auto; vertical-align: middle; }
figure.symbol figcaption { color: var(--muted); font-size: 0.85rem; margin-top: 0.5rem; }
figure.symbol .sym-dark { display: none; }
figure.symbol .sym-light svg, figure.symbol .sym-dark svg { max-width: 240px; height: auto; }
/* Several glyphs of one component family side by side, so a reader comparing them
   sees all of them at once rather than scrolling between them. The glyph cap drops
   from 240px to 200px in here because three frames at the full size (3 x 234px plus
   the gaps) overrun the 52rem reading column and the third would wrap onto its own
   row - which is the arrangement this rule exists to avoid. Narrower viewports still
   wrap, as they should. */
.symbol-row {
  display: flex; flex-wrap: wrap; justify-content: center;
  align-items: flex-end; gap: 0 1rem; margin: 1.2rem 0;
}
.symbol-row figure.symbol { margin: 0.4rem 0; }
.symbol-row figure.symbol svg,
.symbol-row figure.symbol .sym-light svg,
.symbol-row figure.symbol .sym-dark svg { max-width: 200px; }

.symbol-inline { vertical-align: middle; height: 1.6em; width: auto; }
.symbol-inline.sym-dark { display: none; }
@media (prefers-color-scheme: dark) {
  figure.symbol .sym-light { display: none; }
  figure.symbol .sym-dark  { display: inline-block; }
  .symbol-inline.sym-light { display: none; }
  .symbol-inline.sym-dark  { display: inline-block; }
}

/* ----------------------------------------------------------------- [SHOT] -- */
/* GUI figures. These are VECTOR captures of the running application, generated
   by tools/DocGen and INLINED into the page as <svg> rather than referenced with
   <img>: an SVG loaded as an image cannot see this stylesheet's @font-face rules,
   so a referenced figure would be set in whatever the reader happens to have
   installed. Same light/dark pairing as the symbol figures above.
   There are no PNGs in this documentation and there are not meant to be. */
figure.figure { margin: 1.6rem 0; text-align: center; }
figure.figure .frame {
  /* A flex box, not an inline-block: the inlined <svg> is then centred on BOTH axes inside the
     frame, which is what a short, wide figure (the snap-glyph strip) needs — as an inline-block it
     sat on the text baseline with the frame's line-height under it.

     width:fit-content is what keeps the frame TIGHT around the figure. A flex container is
     block-level, so without it the frame filled the whole article width and a narrow figure — a
     trace card at 440 px, a Wire Profile panel — sat marooned in the middle of a box several times
     its width (owner, 2026-08-20). fit-content shrinks the frame to the SVG's own intrinsic width
     (every generated file carries width/height as well as a viewBox), and max-width holds it to the
     column, at which point the SVG scales down inside it and the frame is the padding plus the
     figure either way. margin-inline:auto re-centres it, since a shrunk block no longer follows the
     figure's text-align. */
  display: flex; align-items: center; justify-content: center;
  width: fit-content; max-width: 100%; margin-inline: auto;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 0.5rem; color: var(--text);
}
figure.figure .sym-light, figure.figure .sym-dark { display: flex; max-width: 100%; }
figure.figure svg { max-width: 100%; height: auto; display: block; margin: 0 auto; }
figure.figure figcaption { color: var(--muted); font-size: 0.85rem; margin-top: 0.5rem; }
figure.figure .sym-dark { display: none; }
@media (prefers-color-scheme: dark) {
  figure.figure .sym-light { display: none; }
  figure.figure .sym-dark  { display: flex; }
}

/* Inline glyphs — a mark drawn by the application's own renderer, sitting INSIDE a table cell
   rather than in a figure. Generated by src/Ui/Diagnostics/InlineGlyphArtwork.cs and by the
   docs factory's per-button toolbar captures; both carry a viewBox, so a width here is enough.
   Same light/dark pairing as everything else. */
.snap-glyph.sym-dark, .toolbar-glyph.sym-dark { display: none; }
.snap-glyph.sym-light, .toolbar-glyph.sym-light { display: inline-block; vertical-align: middle; }
@media (prefers-color-scheme: dark) {
  .snap-glyph.sym-light, .toolbar-glyph.sym-light { display: none; }
  .snap-glyph.sym-dark,  .toolbar-glyph.sym-dark  { display: inline-block; vertical-align: middle; }
}
.snap-glyph svg    { width: 1.15rem; height: auto; display: block; }
.toolbar-glyph svg { width: 2.6rem;  height: auto; display: block; }
table.toolbar-table td.glyph-cell { width: 3.2rem; text-align: center; }

/* Legacy raster frame — kept for any page still carrying a hand-placed screenshot.
   Nothing generated uses it; a new figure must be a capture, not a bitmap. */
figure.shot { margin: 1.4rem 0; }
figure.shot img { width: 100%; height: auto; border: 1px solid var(--border); border-radius: var(--radius); display: block; }
figure.shot figcaption { color: var(--muted); font-size: 0.85rem; margin-top: 0.5rem; }
.shot-todo {
  border: 2px dashed var(--border); border-radius: var(--radius);
  background: repeating-linear-gradient(45deg, transparent, transparent 12px,
              var(--surface) 12px, var(--surface) 24px);
  color: var(--muted); padding: 2rem 1.2rem; text-align: center; font-size: 0.92rem;
}
.shot-todo .tag { display: inline-block; font-family: var(--font-mono); font-size: 0.8rem;
  background: var(--bg); border: 1px solid var(--border); border-radius: 6px;
  padding: 0.1rem 0.5rem; margin-top: 0.5rem; }

/* ----------------------------------------------------------------- [CODE] -- */
code { font-family: var(--font-mono); font-size: 0.9em;
  background: var(--surface-2); border-radius: 5px; padding: 0.08em 0.35em; }
pre { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius);
  padding: 0.9rem 1.1rem; overflow-x: auto; line-height: 1.5; }
pre code { background: none; border: 0; padding: 0; font-size: 0.86rem; }
pre.netlist { border-left: 4px solid var(--crf-cyan); }      /* .cnl listings */
.cmd { display: block; }
.cmd .prompt { color: var(--muted); user-select: none; }     /* shell $ prompt */

/* ----------------------------------------------------------------- [UTIL] -- */
.small { font-size: 0.85rem; color: var(--muted); }
.center { text-align: center; }
.nowrap { white-space: nowrap; }
.steps { counter-reset: step; list-style: none; padding-left: 0; }
.steps > li { counter-increment: step; position: relative; padding-left: 2.2rem; margin: 0.7rem 0; }
/* A step long enough to need paragraphs of its own: the counter badge is positioned
   against the TOP of the <li>, so a leading <p>'s own top margin would drop the text a
   line below its own number. */
.steps > li > p:first-child { margin-top: 0; }
.steps > li > p:last-child  { margin-bottom: 0; }
.steps > li > ul            { margin: 0.35rem 0; }
.steps > li::before {
  content: counter(step); position: absolute; left: 0; top: 0.05rem;
  width: 1.5rem; height: 1.5rem; border-radius: 50%; background: var(--crf-cyan);
  color: var(--crf-ink); font-weight: 700; font-size: 0.85rem;
  display: flex; align-items: center; justify-content: center;
}


/* ------------------------------------------------------------- [SEARCH] --- */
/* Two boxes, one set of rules. The small one sits at the right of every page
   header; the wide one is on the landing page only, between the three guide
   cards and the prose. They are the same markup from the same emitter
   (tools/DocGen/Pipeline/HtmlEmitter.cs, SearchBox) and the same script
   (assets/js/docs-search.js) — the classes below differ only in SIZE and in
   whether the result panel floats over the page or pushes it down.

   Both are rendered `hidden` and unhidden by the script, so a page with no
   JavaScript shows no search field rather than one that does nothing. */

.doc-search, .search-hero { position: relative; }

.doc-search { margin-left: 0.8rem; flex: 0 1 15rem; min-width: 9rem; }
.search-hero { margin: 1.6rem 0 2.2rem; }

.search-input {
  width: 100%; font: inherit; font-size: 0.92rem; color: var(--text);
  background: var(--surface); border: 1px solid var(--border);
  border-radius: 999px; padding: 0.4rem 0.9rem;
  transition: border-color 0.15s, background 0.15s;
  /* The platform's own clear button and magnifier are drawn in the platform's
     colours and are invisible on the dark palette — so neither is used. */
  -webkit-appearance: none; appearance: none;
}
.search-input::-webkit-search-decoration,
.search-input::-webkit-search-cancel-button { -webkit-appearance: none; }
.search-input::placeholder { color: var(--muted); }
.search-input:focus {
  outline: none; background: var(--bg);
  border-color: var(--crf-cyan);
  /* Stated twice on purpose: a browser without color-mix() drops that declaration
     entirely, and would then draw no focus ring at all. The flat variable above it
     is the one it keeps. */
  box-shadow: 0 0 0 3px var(--focus-ring);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--crf-cyan) 25%, transparent);
}

.search-hero .search-input {
  font-size: 1.05rem; padding: 0.75rem 1.1rem; border-radius: var(--radius);
}

/* The results. In the header they float over the page — the header is fixed
   furniture and pushing the article down on every keystroke is unreadable. On
   the landing page the box is IN the article, so its panel is too. */
.search-panel {
  border: 1px solid var(--border); border-radius: var(--radius);
  background: var(--bg); overflow-y: auto; overscroll-behavior: contain;
}
.doc-search .search-panel {
  position: absolute; z-index: 40; top: calc(100% + 0.45rem); right: 0;
  width: min(30rem, 88vw); max-height: min(28rem, 70vh);
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.18);
}
.search-hero .search-panel { margin-top: 0.6rem; max-height: 32rem; }

.search-hit {
  display: block; padding: 0.6rem 0.9rem; color: inherit; text-decoration: none;
  border-bottom: 1px solid var(--border);
}
.search-hit:last-child { border-bottom: 0; }
.search-hit:hover { text-decoration: none; }
/* One highlight for hover AND for the keyboard cursor: the arrow keys and the
   mouse are picking the same thing, so they must not be able to point at two. */
.search-hit:hover, .search-hit.is-active { background: var(--surface); }
.search-hit.is-active { box-shadow: inset 3px 0 0 var(--crf-cyan); }

.hit-title { display: block; font-weight: 600; color: var(--link); font-size: 0.98rem; }
.hit-crumb {
  display: block; font-size: 0.76rem; color: var(--muted);
  text-transform: uppercase; letter-spacing: 0.04em; margin-top: 0.1rem;
}
.hit-text {
  display: block; font-size: 0.86rem; color: var(--muted); line-height: 1.5;
  margin-top: 0.25rem;
}
.search-hit mark {
  background: var(--hilite);
  background: color-mix(in srgb, var(--crf-cyan) 30%, transparent);
  color: var(--text); border-radius: 3px; padding: 0 0.1em;
}
.search-empty { margin: 0; padding: 0.8rem 0.9rem; color: var(--muted); font-size: 0.9rem; }

@media (max-width: 34rem) {
  /* Below this the header's three items cannot share a line. The search box takes
     its own, full width, rather than shrinking to a field too narrow to read. */
  .doc-search { flex: 1 0 100%; margin-left: 0; }
  .doc-search .search-panel { width: 100%; }
}

@media print {
  .doc-header .doc-kind, nav.toc, nav.page-nav,
  .doc-search, .search-hero { display: none; }
  a { color: var(--text); text-decoration: underline; }
  body { font-size: 11pt; }
}

/* ------------------------------------------------------------------ [NAV] -- */
/* The Previous/Next chain and the complete table of contents. Both are
   GENERATED from docs/user/src/_nav.txt — the one reading order through the
   whole set — so a page can never be in the contents but out of the chain, or
   reachable from neither. See tools/DocGen/Pipeline/SiteNav.cs. */
nav.page-nav {
  display: grid; grid-template-columns: 1fr 1fr; gap: 1rem;
  margin: 3rem 0 0.5rem; padding-top: 1.2rem; border-top: 1px solid var(--border);
}
nav.page-nav a {
  display: flex; flex-direction: column; gap: 0.15rem; padding: 0.7rem 0.9rem;
  border: 1px solid var(--border); border-radius: var(--radius);
  background: var(--surface); text-decoration: none;
}
nav.page-nav a:hover { border-color: var(--crf-cyan); text-decoration: none; }
nav.page-nav a.next { text-align: right; }
nav.page-nav .dir {
  font-size: 0.72rem; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted);
}
nav.page-nav .name { font-weight: 600; color: var(--link); }

.site-toc { margin: 1.2rem 0 0; }
.site-toc h3 {
  margin: 1.6rem 0 0.4rem; font-size: 0.8rem; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--muted); border: 0;
}
.site-toc ul { list-style: none; margin: 0; padding: 0; }
.site-toc li {
  padding: 0.4rem 0; border-top: 1px solid var(--border);
  display: grid; grid-template-columns: minmax(11rem, 15rem) 1fr; gap: 0.2rem 1rem; align-items: baseline;
}
.site-toc li a { font-weight: 600; }
.site-toc li span { color: var(--muted); font-size: 0.92rem; }
@media (max-width: 40rem) {
  nav.page-nav { grid-template-columns: 1fr; }
  nav.page-nav a.next { text-align: left; }
  .site-toc li { grid-template-columns: 1fr; }
}

/* ==== BEGIN GENERATED FONT BLOCK (tools/DocGen) ==== */
/* ---------------------------------------------------------------- [FONTS] --
   GENERATED BLOCK - do not hand-edit. Rewritten by tools/DocGen on every run;
   see FontExtractor.cs. The .ttf files beside it are extracted from the
   application's own assets, so a doc page renders with the exact typefaces the
   captured figures were drawn with rather than a browser substitution.
   Licences: assets/fonts/OFL.txt (Inter, IBM Plex Sans) and
   assets/fonts/DejaVu Fonts License.txt (DejaVu Sans).
   ------------------------------------------------------------------------- */
@font-face {
  font-family: "Inter";
  src: url("../fonts/Inter-Light.ttf") format("truetype");
  font-weight: 300;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Inter";
  src: url("../fonts/Inter-Regular.ttf") format("truetype");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Inter";
  src: url("../fonts/Inter-Medium.ttf") format("truetype");
  font-weight: 500;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Inter";
  src: url("../fonts/Inter-SemiBold.ttf") format("truetype");
  font-weight: 600;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Inter";
  src: url("../fonts/Inter-Bold.ttf") format("truetype");
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "IBM Plex Sans";
  src: url("../fonts/IBMPlexSans-Regular.ttf") format("truetype");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "IBM Plex Sans";
  src: url("../fonts/IBMPlexSans-Italic.ttf") format("truetype");
  font-weight: 400;
  font-style: italic;
  font-display: swap;
}
@font-face {
  font-family: "IBM Plex Sans";
  src: url("../fonts/IBMPlexSans-SemiBold.ttf") format("truetype");
  font-weight: 600;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "IBM Plex Sans";
  src: url("../fonts/IBMPlexSans-Bold.ttf") format("truetype");
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "DejaVu Sans";
  src: url("../fonts/DejaVuSans.ttf") format("truetype");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "DejaVu Sans";
  src: url("../fonts/DejaVuSans-Bold.ttf") format("truetype");
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "DejaVu Sans";
  src: url("../fonts/DejaVuSans-Oblique.ttf") format("truetype");
  font-weight: 400;
  font-style: italic;
  font-display: swap;
}
/* ==== END GENERATED FONT BLOCK ==== */
