/*!
 * bch2.org editorial design system, v1
 * /assets/editorial/bch2.v1.css
 *
 * Served with "cache-control: immutable". Never edit this file after it is deployed:
 * copy it to bch2.v2.css, change the copy, and update the <link> in every page.
 *
 * Visual language: near-white paper, near-black ink, one deep green accent, hairline
 * rules, square corners, generous whitespace. Instrument Sans for text, Instrument Serif
 * italic for accents, small uppercase JetBrains Mono labels. No glows, gradients or shadows.
 *
 * Fonts are loaded by each page from Google Fonts (see STYLEGUIDE.md, page skeleton).
 *
 *  1 Tokens, fonts        9 Masthead and menu       17 Callouts
 *  2 Locale tokens       10 Page heading            18 Tables
 *  3 Base                11 Sections and split      19 Code and commands
 *  4 Focus, skip link    12 Numbered rows           20 FAQ accordion
 *  5 Layout              13 Specification table     21 Footer
 *  6 Typography          14 Stat strip              22 Utilities
 *  7 Buttons and links   15 Market panel            23 Motion, forced colours, print
 *  8 Notice bar          16 Link directory, closing
 *
 * Breakpoints (media queries cannot read custom properties, so they are literal):
 *   30rem  (480px)  phones: tables stack, rows compact
 *   48rem  (768px)  below: numbered rows stack title over text; closing row stacks;
 *                   footer link groups become 2 columns
 *   56.25rem (900px) split sections become one column
 *   60rem  (960px)  footer becomes one column below this width
 *   64rem  (1024px) masthead collapses into the menu below this width
 *   80rem  (1280px) numbered rows show number | title | text (also 768-899px); narrower
 *                   desktops stack title over text while the list sits in the 2.1fr split
 *                   column. Stat cells put value beside label only from here up.
 */

/* 1 Tokens =============================================================================== */
/* Arrows typed in copy (e.g. "1h → 2d"): Google's Latin subsets have no U+2190-21FF, and the
   next font in the stack on Linux (Liberation Sans) draws them tiny. Pull them from a system
   font with a full-size arrow instead. Loads nothing from the network. */
@font-face {
  font-family: "BCH2 Symbols";
  src: local("Segoe UI Symbol"), local("SegoeUISymbol"), local("DejaVu Sans"), local("DejaVuSans"),
       local("Noto Sans Symbols"), local("NotoSansSymbols-Regular"), local("Noto Sans"), local("NotoSans-Regular");
  unicode-range: U+2190-21FF;
  size-adjust: 90%;
}

/* Metric-matched fallbacks. Until Instrument Sans and Instrument Serif arrive (the Google Fonts
   link uses display=swap), and wherever Google Fonts is blocked, text is set in a local Arial-class
   face (Arial, Liberation Sans, Arimo, Helvetica) or a Georgia- or Times-class italic, scaled to the
   web font's width and given its ascent and descent. Lines then break in nearly the same places and
   keep their height, so the page barely moves when the web fonts swap in.
   - size-adjust: web font width / local font width, measured in the browser on the translated
     homepage strings of the nine Latin-script languages, weighted towards English (Gelasio and
     Tinos stand in for Georgia and Times New Roman, whose advance widths they copy). Short strings
     still differ by a few percent either way; that is the limit of one value per face.
   - ascent/descent-override: the web font's metrics divided by size-adjust (browsers scale the
     overrides by it). Instrument Sans 0.97 / 0.25, Instrument Serif 0.99 / 0.31, no line gap.
   - unicode-range: only the code points the web fonts themselves have (the two share one set), so
     every other character (Cyrillic, CJK, arrows, spaces the fonts lack) falls through to the same
     fonts as before.
   Loads nothing from the network. */
@font-face {
  font-family: "Instrument Sans Fallback";
  src: local("Arial"), local("ArialMT"), local("Liberation Sans"), local("LiberationSans"),
       local("Arimo"), local("Arimo-Regular"), local("Helvetica");
  font-weight: 100 450;
  size-adjust: 101.7%;
  ascent-override: 95.38%;
  descent-override: 24.58%;
  line-gap-override: 0%;
  unicode-range: U+0020-007E, U+00A0-00A3, U+00A5, U+00A7-00AB, U+00AE-00B0, U+00B4, U+00B6-00B8, U+00BA-00BB,
                 U+00BF-0107, U+010A-0113, U+0116-011B, U+011E-0123, U+0126-0127, U+012A-012B, U+012E-0133,
                 U+0136-0137, U+0139-013E, U+0141-0148, U+014A-014D, U+0150-015B, U+015E-0161, U+0164-0165,
                 U+016A-017E, U+01CD-01CE, U+0218-021B, U+0237, U+02C6-02C7, U+02D8-02DD, U+1E80-1E85, U+1E9E,
                 U+1EF2-1EF3, U+2013-2014, U+2018-201A, U+201C-201E, U+2022, U+2026, U+2030, U+2039-203A,
                 U+20AC, U+2122, U+2212;
}
@font-face {
  font-family: "Instrument Sans Fallback";
  src: local("Arial"), local("ArialMT"), local("Liberation Sans"), local("LiberationSans"),
       local("Arimo"), local("Arimo-Regular"), local("Helvetica");
  font-weight: 451 550;
  size-adjust: 102.9%;
  ascent-override: 94.27%;
  descent-override: 24.30%;
  line-gap-override: 0%;
  unicode-range: U+0020-007E, U+00A0-00A3, U+00A5, U+00A7-00AB, U+00AE-00B0, U+00B4, U+00B6-00B8, U+00BA-00BB,
                 U+00BF-0107, U+010A-0113, U+0116-011B, U+011E-0123, U+0126-0127, U+012A-012B, U+012E-0133,
                 U+0136-0137, U+0139-013E, U+0141-0148, U+014A-014D, U+0150-015B, U+015E-0161, U+0164-0165,
                 U+016A-017E, U+01CD-01CE, U+0218-021B, U+0237, U+02C6-02C7, U+02D8-02DD, U+1E80-1E85, U+1E9E,
                 U+1EF2-1EF3, U+2013-2014, U+2018-201A, U+201C-201E, U+2022, U+2026, U+2030, U+2039-203A,
                 U+20AC, U+2122, U+2212;
}
@font-face {
  font-family: "Instrument Sans Fallback";
  src: local("Arial Bold"), local("Arial-BoldMT"), local("Liberation Sans Bold"), local("LiberationSans-Bold"),
       local("Arimo Bold"), local("Arimo-Bold"), local("Helvetica Bold"), local("Helvetica-Bold");
  font-weight: 551 900;
  size-adjust: 97.6%;
  ascent-override: 99.39%;
  descent-override: 25.61%;
  line-gap-override: 0%;
  unicode-range: U+0020-007E, U+00A0-00A3, U+00A5, U+00A7-00AB, U+00AE-00B0, U+00B4, U+00B6-00B8, U+00BA-00BB,
                 U+00BF-0107, U+010A-0113, U+0116-011B, U+011E-0123, U+0126-0127, U+012A-012B, U+012E-0133,
                 U+0136-0137, U+0139-013E, U+0141-0148, U+014A-014D, U+0150-015B, U+015E-0161, U+0164-0165,
                 U+016A-017E, U+01CD-01CE, U+0218-021B, U+0237, U+02C6-02C7, U+02D8-02DD, U+1E80-1E85, U+1E9E,
                 U+1EF2-1EF3, U+2013-2014, U+2018-201A, U+201C-201E, U+2022, U+2026, U+2030, U+2039-203A,
                 U+20AC, U+2122, U+2212;
}
@font-face {
  font-family: "Instrument Serif Fallback Georgia";
  src: local("Georgia Italic"), local("Georgia-Italic"), local("Gelasio Italic"), local("Gelasio-Italic");
  font-style: italic;
  size-adjust: 78%;
  ascent-override: 126.92%;
  descent-override: 39.74%;
  line-gap-override: 0%;
  unicode-range: U+0020-007E, U+00A0-00A3, U+00A5, U+00A7-00AB, U+00AE-00B0, U+00B4, U+00B6-00B8, U+00BA-00BB,
                 U+00BF-0107, U+010A-0113, U+0116-011B, U+011E-0123, U+0126-0127, U+012A-012B, U+012E-0133,
                 U+0136-0137, U+0139-013E, U+0141-0148, U+014A-014D, U+0150-015B, U+015E-0161, U+0164-0165,
                 U+016A-017E, U+01CD-01CE, U+0218-021B, U+0237, U+02C6-02C7, U+02D8-02DD, U+1E80-1E85, U+1E9E,
                 U+1EF2-1EF3, U+2013-2014, U+2018-201A, U+201C-201E, U+2022, U+2026, U+2030, U+2039-203A,
                 U+20AC, U+2122, U+2212;
}
@font-face {
  font-family: "Instrument Serif Fallback Georgia";
  src: local("Georgia"), local("Gelasio Regular"), local("Gelasio-Regular");
  font-style: normal;
  size-adjust: 76.5%;
  ascent-override: 129.41%;
  descent-override: 40.52%;
  line-gap-override: 0%;
  unicode-range: U+0020-007E, U+00A0-00A3, U+00A5, U+00A7-00AB, U+00AE-00B0, U+00B4, U+00B6-00B8, U+00BA-00BB,
                 U+00BF-0107, U+010A-0113, U+0116-011B, U+011E-0123, U+0126-0127, U+012A-012B, U+012E-0133,
                 U+0136-0137, U+0139-013E, U+0141-0148, U+014A-014D, U+0150-015B, U+015E-0161, U+0164-0165,
                 U+016A-017E, U+01CD-01CE, U+0218-021B, U+0237, U+02C6-02C7, U+02D8-02DD, U+1E80-1E85, U+1E9E,
                 U+1EF2-1EF3, U+2013-2014, U+2018-201A, U+201C-201E, U+2022, U+2026, U+2030, U+2039-203A,
                 U+20AC, U+2122, U+2212;
}
@font-face {
  font-family: "Instrument Serif Fallback Times";
  src: local("Times New Roman Italic"), local("TimesNewRomanPS-ItalicMT"), local("Liberation Serif Italic"),
       local("LiberationSerif-Italic"), local("Tinos Italic"), local("Tinos-Italic"), local("Times Italic"), local("Times-Italic");
  font-style: italic;
  size-adjust: 87.5%;
  ascent-override: 113.14%;
  descent-override: 35.43%;
  line-gap-override: 0%;
  unicode-range: U+0020-007E, U+00A0-00A3, U+00A5, U+00A7-00AB, U+00AE-00B0, U+00B4, U+00B6-00B8, U+00BA-00BB,
                 U+00BF-0107, U+010A-0113, U+0116-011B, U+011E-0123, U+0126-0127, U+012A-012B, U+012E-0133,
                 U+0136-0137, U+0139-013E, U+0141-0148, U+014A-014D, U+0150-015B, U+015E-0161, U+0164-0165,
                 U+016A-017E, U+01CD-01CE, U+0218-021B, U+0237, U+02C6-02C7, U+02D8-02DD, U+1E80-1E85, U+1E9E,
                 U+1EF2-1EF3, U+2013-2014, U+2018-201A, U+201C-201E, U+2022, U+2026, U+2030, U+2039-203A,
                 U+20AC, U+2122, U+2212;
}
@font-face {
  font-family: "Instrument Serif Fallback Times";
  src: local("Times New Roman"), local("TimesNewRomanPSMT"), local("Liberation Serif"), local("LiberationSerif"),
       local("Tinos Regular"), local("Tinos-Regular"), local("Times Roman"), local("Times-Roman");
  font-style: normal;
  size-adjust: 83%;
  ascent-override: 119.28%;
  descent-override: 37.35%;
  line-gap-override: 0%;
  unicode-range: U+0020-007E, U+00A0-00A3, U+00A5, U+00A7-00AB, U+00AE-00B0, U+00B4, U+00B6-00B8, U+00BA-00BB,
                 U+00BF-0107, U+010A-0113, U+0116-011B, U+011E-0123, U+0126-0127, U+012A-012B, U+012E-0133,
                 U+0136-0137, U+0139-013E, U+0141-0148, U+014A-014D, U+0150-015B, U+015E-0161, U+0164-0165,
                 U+016A-017E, U+01CD-01CE, U+0218-021B, U+0237, U+02C6-02C7, U+02D8-02DD, U+1E80-1E85, U+1E9E,
                 U+1EF2-1EF3, U+2013-2014, U+2018-201A, U+201C-201E, U+2022, U+2026, U+2030, U+2039-203A,
                 U+20AC, U+2122, U+2212;
}

/* Russian sets the sans in Golos Text (Latin + Cyrillic). Same method, with separate Latin and
   Cyrillic faces (measured on lang/ru.js), because Golos differs from Arial by a different amount in
   each script. Golos Text ascent 0.98, descent 0.22. */
@font-face {
  font-family: "Golos Text Fallback";
  src: local("Arial"), local("ArialMT"), local("Liberation Sans"), local("LiberationSans"),
       local("Arimo"), local("Arimo-Regular"), local("Helvetica");
  font-weight: 100 550;
  size-adjust: 105.5%;
  ascent-override: 92.89%;
  descent-override: 20.85%;
  line-gap-override: 0%;
  unicode-range: U+0020-007E, U+00A0-0107, U+010A-0113, U+0116-011B, U+011E-0123, U+0126-0127, U+012A-012B,
                 U+012E-0133, U+0136-0137, U+0139-013E, U+0141-0148, U+014A-014D, U+0150-015B, U+015E-0161,
                 U+0164-0165, U+016A-017E, U+0192, U+0218-021B, U+0237, U+02BC, U+02C6-02C7, U+02D8-02DD,
                 U+1E80-1E85, U+1E9E, U+1EF2-1EF3, U+2009, U+2010-2014, U+2018-201A, U+201C-201E, U+2020-2022,
                 U+2026, U+202F-2030, U+2039-203A, U+2044, U+20AC, U+20B4, U+20B8, U+20BD, U+2116, U+2122,
                 U+2212, U+2215;
}
@font-face {
  font-family: "Golos Text Fallback";
  src: local("Arial Bold"), local("Arial-BoldMT"), local("Liberation Sans Bold"), local("LiberationSans-Bold"),
       local("Arimo Bold"), local("Arimo-Bold"), local("Helvetica Bold"), local("Helvetica-Bold");
  font-weight: 551 900;
  size-adjust: 101.3%;
  ascent-override: 96.74%;
  descent-override: 21.72%;
  line-gap-override: 0%;
  unicode-range: U+0020-007E, U+00A0-0107, U+010A-0113, U+0116-011B, U+011E-0123, U+0126-0127, U+012A-012B,
                 U+012E-0133, U+0136-0137, U+0139-013E, U+0141-0148, U+014A-014D, U+0150-015B, U+015E-0161,
                 U+0164-0165, U+016A-017E, U+0192, U+0218-021B, U+0237, U+02BC, U+02C6-02C7, U+02D8-02DD,
                 U+1E80-1E85, U+1E9E, U+1EF2-1EF3, U+2009, U+2010-2014, U+2018-201A, U+201C-201E, U+2020-2022,
                 U+2026, U+202F-2030, U+2039-203A, U+2044, U+20AC, U+20B4, U+20B8, U+20BD, U+2116, U+2122,
                 U+2212, U+2215;
}
@font-face {
  font-family: "Golos Text Fallback";
  src: local("Arial"), local("ArialMT"), local("Liberation Sans"), local("LiberationSans"),
       local("Arimo"), local("Arimo-Regular"), local("Helvetica");
  font-weight: 100 550;
  size-adjust: 106.1%;
  ascent-override: 92.36%;
  descent-override: 20.73%;
  line-gap-override: 0%;
  unicode-range: U+0401-040C, U+040E-044F, U+0451-045C, U+045E-045F, U+0490-049D, U+04A0-04A5, U+04AA-04AB,
                 U+04AE-04B3, U+04B6-04BB, U+04C0, U+04C3-04C4, U+04C7-04C8, U+04CB-04CC, U+04CF-04DF,
                 U+04E2-04EB, U+04EE-04F5, U+04F8-04F9, U+0512-0513;
}
@font-face {
  font-family: "Golos Text Fallback";
  src: local("Arial Bold"), local("Arial-BoldMT"), local("Liberation Sans Bold"), local("LiberationSans-Bold"),
       local("Arimo Bold"), local("Arimo-Bold"), local("Helvetica Bold"), local("Helvetica-Bold");
  font-weight: 551 900;
  size-adjust: 99.8%;
  ascent-override: 98.20%;
  descent-override: 22.04%;
  line-gap-override: 0%;
  unicode-range: U+0401-040C, U+040E-044F, U+0451-045C, U+045E-045F, U+0490-049D, U+04A0-04A5, U+04AA-04AB,
                 U+04AE-04B3, U+04B6-04BB, U+04C0, U+04C3-04C4, U+04C7-04C8, U+04CB-04CC, U+04CF-04DF,
                 U+04E2-04EB, U+04EE-04F5, U+04F8-04F9, U+0512-0513;
}

:root {
  color-scheme: light;

  /* Colour. Ratios are WCAG contrast against the ground named. */
  --paper: #f8f9f6;            /* page ground */
  --ink: #14241c;              /* text, strong rules, primary buttons: 15.3:1 on paper */
  --muted: #59645b;            /* secondary text: 5.85:1 on paper, 5.41:1 on wash */
  --green: #066d42;            /* accent, links on hover, focus ring: 6.07:1 on paper */
  --green-deep: #04502f;       /* pressed state on green fills */
  --bright: #bcee7b;           /* accent and focus ring on dark: 12:1 on ink, 4.78:1 on green */
  --wash: #eef1e9;             /* tinted ground for callouts and code */
  --line: #cfd5cc;             /* decorative hairlines only (1.4:1) */
  --line-ui: #7d877f;          /* borders that identify a control: 3.5:1 on paper */
  --on-dark: #f8f9f6;          /* text on ink or green */
  --on-dark-muted: #b8c7bd;    /* secondary text on ink: 9.2:1 */
  --on-green-muted: #d9ebe0;   /* secondary text on green: 5.2:1 */
  --rule-on-dark: rgba(248, 249, 246, 0.32);
  --focus: var(--green);       /* overridden to --bright inside .surface-dark / .surface-green */

  /* Type families */
  --font-sans: "Instrument Sans", "BCH2 Symbols", "Instrument Sans Fallback", "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", system-ui, sans-serif;
  --font-serif: "Instrument Serif", "Instrument Serif Fallback Georgia", "Instrument Serif Fallback Times", Georgia, "Noto Serif", "Times New Roman", serif;
  --font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, "Liberation Mono", "DejaVu Sans Mono", monospace;

  /* Accent (the green italic serif word). Locale rules below swap these. */
  --accent-family: var(--font-serif);
  --accent-style: italic;
  --accent-tracking: -0.005em;   /* never tighter than -0.01em: word spaces collapse */

  /* Type scale */
  --text-xs: 0.75rem;     /* 12px mono labels */
  --text-sm: 0.875rem;    /* 14px captions, secondary nav */
  --text-base: 1rem;      /* 16px body */
  --text-md: 1.125rem;    /* 18px ledes */
  --text-lg: 1.375rem;    /* 22px row titles, h3 */
  --text-xl: clamp(1.875rem, 1.45rem + 1.25vw, 2.625rem);   /* section h2: 30-42px */
  --text-2xl: clamp(2.5rem, 1.6rem + 3.2vw, 4.5rem);        /* page h1, closing row: 40-72px */
  --text-display: clamp(2.75rem, 1rem + 6vw, 6.25rem);      /* homepage h1: 44-100px */

  --leading-tight: 1.02;
  --leading-heading: 1.12;
  --leading-body: 1.6;
  --tracking-display: -0.04em;
  --tracking-heading: -0.025em;
  --tracking-title: -0.012em;
  --tracking-label: 0.08em;

  /* Space */
  --space-3xs: 0.25rem;
  --space-2xs: 0.5rem;
  --space-xs: 0.75rem;
  --space-s: 1rem;
  --space-m: 1.5rem;
  --space-l: 2rem;
  --space-xl: 3rem;
  --space-2xl: 4.5rem;
  --section-pad: clamp(3rem, 2.2rem + 3.6vw, 5.5rem);

  /* Widths */
  --max-width: 1328px;
  --gutter: clamp(16px, 4vw, 56px);
  --measure: 40rem;
  --measure-narrow: 28rem;

  --rule: 1px solid var(--line);
  --rule-strong: 1px solid var(--ink);

  /* Row tracks shared by .index-row, .directory__link and .spec-table--rows, so row
     descriptions and table values start on the same vertical line in every section. */
  --row-num: 2.25rem;
  --row-title: 16rem;
  --row-gap: 1.25rem;
  --row-cols: var(--row-num) minmax(0, var(--row-title)) minmax(0, 1fr);
  --row-label: calc(var(--row-num) + var(--row-title) + 2 * var(--row-gap));
}

/* 2 Locale tokens ======================================================================== */
/* i18n.js sets <html lang>. Instrument Sans/Serif cover Latin (incl. Turkish) only.
   Russian: Golos Text (Latin + Cyrillic, loaded by the page's Google Fonts link) replaces the
   sans for the whole page, so Latin words and Cyrillic words on one line share a typeface;
   accents fall back to Georgia/Noto Serif italic. JetBrains Mono covers Cyrillic.
   CJK has no italic serif, so accents become upright sans and negative tracking is removed. */
html:lang(ru) {
  --font-sans: "Golos Text", "BCH2 Symbols", "Golos Text Fallback", "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", system-ui, sans-serif;
  --tracking-display: -0.03em;
}
html:lang(ja) {
  --font-sans: "Instrument Sans", "BCH2 Symbols", "Instrument Sans Fallback", "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Yu Gothic", YuGothic, Meiryo, "Noto Sans JP", "Noto Sans CJK JP", "Droid Sans Fallback", sans-serif;
  --font-mono: "JetBrains Mono", ui-monospace, Menlo, Consolas, "Hiragino Sans", "Yu Gothic", Meiryo, "Noto Sans JP", "Droid Sans Fallback", monospace;
}
html:lang(zh) {
  --font-sans: "Instrument Sans", "BCH2 Symbols", "Instrument Sans Fallback", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", "Noto Sans CJK SC", "Droid Sans Fallback", sans-serif;
  --font-mono: "JetBrains Mono", ui-monospace, Menlo, Consolas, "PingFang SC", "Microsoft YaHei", "Noto Sans SC", "Droid Sans Fallback", monospace;
}
html:lang(ko) {
  --font-sans: "Instrument Sans", "BCH2 Symbols", "Instrument Sans Fallback", "Apple SD Gothic Neo", "Malgun Gothic", "Noto Sans KR", "Noto Sans CJK KR", "Droid Sans Fallback", sans-serif;
  --font-mono: "JetBrains Mono", ui-monospace, Menlo, Consolas, "Apple SD Gothic Neo", "Malgun Gothic", "Noto Sans KR", "Droid Sans Fallback", monospace;
}
html:lang(ja), html:lang(zh), html:lang(ko) {
  --accent-family: var(--font-sans);
  --accent-style: normal;
  --accent-tracking: 0;
  --tracking-display: -0.01em;
  --tracking-heading: 0;
  --tracking-title: 0;
  --tracking-label: 0.04em;
  --leading-tight: 1.12;
  --leading-heading: 1.3;
  --leading-body: 1.75;
}
html:lang(ja) :is(h1, h2, h3) { word-break: auto-phrase; }
/* Kinsoku: no line starts with ー, small kana or closing punctuation. Short ledes break at
   phrase boundaries like the headings (body keeps overflow-wrap as the fallback). */
html:lang(ja) { line-break: strict; }
html:lang(ja) :is(.hero__lede, .split__lede, .closing__text, .page-heading__lede) { word-break: auto-phrase; }

/* 3 Base ================================================================================= */
*, *::before, *::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  scroll-behavior: smooth;
  scroll-padding-top: 1.5rem;
}

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font-sans);
  font-size: var(--text-base);
  line-height: var(--leading-body);
  font-kerning: normal;
  overflow-wrap: break-word;       /* last resort for long words; see 19 for tokens */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

h1, h2, h3, h4, h5, h6, p, ul, ol, dl, dd, figure, blockquote { margin: 0; }
ul, ol { padding: 0; }

h1, h2, h3, h4 {
  font-weight: 400;
  line-height: var(--leading-heading);
  letter-spacing: var(--tracking-heading);
  text-wrap: balance;
}

p, li, dd { text-wrap: pretty; }
/* Short 2-4 line blocks: balance, so no line ends on a lone word. */
.split__lede, .closing__text, .site-footer__copy, .page-heading__lede { text-wrap: balance; }
strong, b { font-weight: 600; }
img, svg, video { max-width: 100%; }
img { display: block; height: auto; }
button, input, select, textarea { font: inherit; color: inherit; }
button { cursor: pointer; }
hr { border: 0; border-top: var(--rule); margin: var(--space-l) 0; }

a {
  color: inherit;
  text-decoration-line: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.24em;
}
a:hover { color: var(--green); }

::selection { background: var(--bright); color: var(--ink); }

/* 4 Focus, skip link ===================================================================== */
:focus-visible {
  outline: 3px solid var(--focus);
  outline-offset: 3px;
}
:focus:not(:focus-visible) { outline: none; }

.surface-dark, .surface-green { --focus: var(--bright); }

.skip-link {
  position: absolute;
  top: 0.75rem;
  left: var(--gutter);
  z-index: 1000;
  padding: 0.75rem 1.125rem;
  background: var(--ink);
  color: var(--on-dark);
  font-weight: 500;
  text-decoration: none;
  transform: translateY(-250%);
}
.skip-link:focus { transform: none; color: var(--on-dark); }
/* The skip link overlaps both the dark notice bar and the paper masthead. A bright ring with an
   ink halo keeps >= 12:1 against ink on one side and 15:1 (halo) against paper on the other. */
.skip-link { --focus: var(--bright); }
.skip-link:focus-visible { outline-offset: 0; box-shadow: 0 0 0 6px var(--ink); }

/* <main id="main-content" tabindex="-1">: the skip link moves focus into main; main itself
   is not a control, so it never shows a ring. */
main[tabindex="-1"]:focus { outline: none; }

/* 5 Layout =============================================================================== */
.container {
  width: min(var(--max-width), 100% - 2 * var(--gutter));
  margin-inline: auto;
}

.stack > * + * { margin-top: var(--stack-space, var(--space-s)); }

/* 6 Typography =========================================================================== */
.display {
  font-size: var(--text-display);
  line-height: var(--leading-tight);
  letter-spacing: var(--tracking-display);
}

.page-title {
  font-size: var(--text-2xl);
  line-height: 1.04;
  letter-spacing: var(--tracking-display);
}

.section-title {
  font-size: var(--text-xl);
  line-height: 1.08;
  letter-spacing: var(--tracking-heading);
}

.title {
  font-size: var(--text-lg);
  line-height: 1.25;
  letter-spacing: var(--tracking-title);
}

/* Accent: .accent on an element you own, or .has-accent on a translated heading whose
   string contains <span> (the span is recreated by i18n.js; style it from outside). */
.accent,
.has-accent span {
  font-family: var(--accent-family);
  font-style: var(--accent-style);
  font-weight: 400;
  letter-spacing: var(--accent-tracking);
  color: var(--green);
}
.has-accent--break span { display: block; }

.lede {
  font-size: var(--text-md);
  line-height: 1.6;
  color: var(--muted);
  max-width: var(--measure);
}

.muted { color: var(--muted); }

.prose { max-width: var(--measure); }
.prose > * + * { margin-top: 1em; }
.prose > :is(h2, h3) + * { margin-top: 0.75em; }
.prose > * + :is(h2, h3) { margin-top: 1.75em; }
.prose p, .prose li { color: var(--muted); }
.prose :is(strong, b) { color: var(--ink); }
.prose :is(ul, ol) { padding-left: 1.25rem; }
/* Outside ol markers ("1. " in mono) start inside the text column, not in the gutter. */
.prose ol { padding-left: var(--space-l); }
.prose li + li { margin-top: 0.5em; }
.prose h3 { font-size: var(--text-lg); letter-spacing: var(--tracking-title); }
/* Ordered-list numbers in the counter style of numbered rows. */
.prose ol > li::marker { font-family: var(--font-mono); font-size: var(--text-sm); color: var(--green); }
.prose a:not(.btn) { color: var(--ink); }
.prose a:not(.btn):hover { color: var(--green); }
/* Emphasis without a synthesized oblique: the sans stacks load no italic face (Golos Text and the
   CJK fonts have none either), so <em> in text is upright ink. Serif accents keep their italic. */
:where(.prose, .index-row__text) em { font-style: normal; color: var(--ink); }
:where(.surface-dark, .surface-green) :where(.prose, .index-row__text) em { color: var(--on-dark); }

/* 6b Labels (eyebrows) */
.eyebrow {
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  font-weight: 400;
  line-height: 1.5;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--muted);
}
.eyebrow--green { color: var(--green); }
.eyebrow--ink { color: var(--ink); }
/* CJK: the mono face has no CJK glyphs, and fallback CJK at 12px reads spindly. */
html:is(:lang(ja), :lang(zh), :lang(ko)) .eyebrow { font-family: var(--font-sans); font-size: 0.8125rem; letter-spacing: 0.04em; }

/* A square status mark before a label; decorative, state is also in the text. */
.status-mark::before {
  content: "";
  display: inline-block;
  width: 0.5rem;
  height: 0.5rem;
  margin-right: 0.625rem;
  vertical-align: 0.06em;
  background: var(--green);
}

/* 7 Buttons and links ==================================================================== */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.75rem;
  min-height: 3rem;
  padding: 0.75rem 1.375rem;
  border: 1px solid var(--ink);
  border-radius: 0;
  background: var(--ink);
  color: var(--on-dark);
  font-size: var(--text-base);
  font-weight: 500;
  line-height: 1.25;
  text-align: center;
  text-decoration: none;
  transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.btn:hover { background: var(--green); border-color: var(--green); color: var(--on-dark); }
.btn:active { background: var(--green-deep); border-color: var(--green-deep); }

.btn--secondary { background: transparent; color: var(--ink); }
.btn--secondary:hover { background: var(--wash); border-color: var(--ink); color: var(--ink); }
.btn--secondary:active { background: var(--line); border-color: var(--ink); }

.btn--small { min-height: 2.75rem; padding: 0.5rem 1rem; font-size: 0.9375rem; }
.btn--large { min-height: 3.5rem; padding: 0.875rem 1.75rem; font-size: var(--text-md); }
.btn--block { display: flex; width: 100%; }

/* A row of buttons and/or links that wraps. */
.actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs) var(--space-s); }
/* Stacked: one equal-width button per row, label left and arrow right (the homepage trade
   buttons). Use it for a closing row with several buttons: the closing row's auto column is then
   as wide as the widest button, never as wide as all of them in a row. --stack-mobile stacks only
   below 48rem (buttons that sit side by side on desktop). */
.actions--stack { display: grid; grid-template-columns: minmax(0, 1fr); }
.actions--stack > .btn { justify-content: space-between; text-align: left; }
@media (max-width: 47.99rem) {
  .actions--stack-mobile { display: grid; grid-template-columns: minmax(0, 1fr); }
  .actions--stack-mobile > .btn { justify-content: space-between; text-align: left; }
}

/* On ink or green grounds */
.surface-dark .btn, .surface-green .btn { background: var(--on-dark); border-color: var(--on-dark); color: var(--ink); }
.surface-dark .btn:hover, .surface-green .btn:hover { background: var(--bright); border-color: var(--bright); color: var(--ink); }
.surface-dark .btn--secondary, .surface-green .btn--secondary { background: transparent; color: var(--on-dark); }

/* Text link: underlined, ink, green on hover. */
.link {
  color: var(--ink);
  text-decoration-line: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.28em;
}
.link:hover { color: var(--green); }
/* Back link ("← Back to Home"): a small muted text link on its own line, above a page heading
   (whitepaper) or after the content (language). The arrow is typed in the copy (it is part of the
   translated string) and "BCH2 Symbols" draws it full size, so no icon is added. */
.back-link.link { display: inline-block; padding-block: var(--space-3xs); color: var(--muted); font-size: var(--text-sm); line-height: 1.4; }
.back-link.link:hover { color: var(--green); }

/* Arrow icons. Drawn with an SVG mask so they scale with the text and never fall back to
   a tiny system glyph. .arrow = forward (same site), .arrow-ext = leaves the site. Put the
   class on the <a>; the icon is ::after, so it survives i18n.js rewriting child text. */
.arrow, .arrow-ext {
  --icon-forward: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M1.5 8h12M9 3.5 13.5 8 9 12.5' fill='none' stroke='%23000' stroke-width='1.5'/%3E%3C/svg%3E");
  --icon-external: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 12.5 12 4M5 3.75h7.25V11' fill='none' stroke='%23000' stroke-width='1.5'/%3E%3C/svg%3E");
}
.arrow::after, .arrow-ext::after {
  content: "";
  display: inline-block;
  flex: none;
  width: 0.8em;
  height: 0.8em;
  margin-left: 0.4em;
  vertical-align: -0.04em;
  background-color: currentColor;
  -webkit-mask: var(--icon-forward) center / contain no-repeat;
  mask: var(--icon-forward) center / contain no-repeat;
  transition: transform 0.15s ease;
}
.arrow-ext::after {
  width: 0.72em;
  height: 0.72em;
  -webkit-mask-image: var(--icon-external);
  mask-image: var(--icon-external);
}
.btn.arrow::after, .btn.arrow-ext::after { margin-left: 0; }
.arrow:hover::after { transform: translateX(0.2em); }
.arrow-ext:hover::after { transform: translate(0.12em, -0.12em); }

/* 8 Notice bar =========================================================================== */
/* <div class="notice surface-dark"><p class="container notice__text" data-i18n="banner">…</p></div> */
.notice {
  background: var(--ink);
  color: var(--on-dark);
  font-size: var(--text-sm);
  line-height: 1.45;
}
.notice__text { padding-block: 0.625rem; }
.notice a {
  color: var(--on-dark);
  font-weight: 500;
  text-decoration-line: underline;
  text-underline-offset: 0.22em;
}
.notice a:hover { color: var(--bright); }

/* 9 Masthead and menu ==================================================================== */
.masthead__inner {
  display: flex;
  flex-wrap: nowrap;
  align-items: center;
  column-gap: var(--space-l);
  min-height: 6rem;
  padding-block: 1rem;
  border-bottom: var(--rule-strong);
}

.brand {
  display: inline-flex;
  align-items: center;
  gap: 0.625rem;
  margin-right: auto;
  color: var(--ink);
  text-decoration: none;
  flex: none;
}
.brand:hover { color: var(--ink); }
.brand svg { display: block; width: 2.5rem; height: 2.5rem; flex: none; }
.brand__name {
  font-size: 1.75rem;
  font-weight: 700;
  line-height: 1;
  letter-spacing: -0.015em;   /* letters must not touch */
}

.site-nav {
  display: grid;
  flex: 0 1 auto;
  grid-template-columns: minmax(0, auto) auto;
  align-items: center;
  column-gap: var(--space-l);
  row-gap: 0.375rem;
  min-width: 0;
}

.nav-primary {
  grid-column: 1;
  grid-row: 1;
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 0.25rem 1.625rem;
}
.nav-primary a {
  padding-block: 0.25rem;
  border-bottom: 1px solid transparent;
  color: var(--ink);
  font-size: 0.9375rem;
  line-height: 1.4;
  text-decoration: none;
  white-space: nowrap;
}
.nav-primary a:hover,
.nav-primary a[aria-current="page"] { color: var(--green); border-bottom-color: var(--green); }

.nav-secondary {
  grid-column: 1;
  grid-row: 2;
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  align-items: center;
  gap: 0.125rem 1.25rem;
  font-size: var(--text-sm);
  line-height: 1.4;
}
.nav-secondary a {
  padding-block: 0.25rem;
  color: var(--muted);
  text-decoration: none;
  white-space: nowrap;
}
.nav-secondary a:hover,
.nav-secondary a[aria-current="page"] { color: var(--green); text-decoration-line: underline; }

.lang-switch {
  padding-left: 1.25rem;
  border-left: var(--rule);
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  letter-spacing: 0.04em;
  font-variant-emoji: text;      /* i18n.js writes a globe emoji; draw it monochrome if possible */
}
/* Desktop: external-link arrows in the small secondary row read as specks; body links keep them. */
@media (min-width: 64rem) {
  .nav-secondary .arrow-ext::after { display: none; }
}

.site-nav .nav-cta { grid-column: 2; grid-row: 1 / span 2; white-space: nowrap; }
/* One CTA width on every English page, so the primary nav doesn't move between pages: about, price
   and faq say "Mine BCH2", which is narrower than "Start Mining". The minimum is the homepage's
   "Start Mining" width (label + padding), so the homepage is unchanged. English only: i18n.js
   translates the homepage label, and the approved homepage keeps its width in every language. */
@media (min-width: 64rem) {
  html:lang(en) .site-nav .nav-cta { min-inline-size: 7.53rem; justify-content: center; }
}

.menu-toggle {
  display: none;
  align-items: center;
  justify-content: center;
  width: 2.75rem;
  height: 2.75rem;
  padding: 0;
  border: 1px solid var(--ink);
  border-radius: 0;
  background: transparent;
  color: var(--ink);
  flex: none;
}
.menu-toggle:hover { background: var(--wash); }
.menu-toggle__icon,
.menu-toggle__icon::before,
.menu-toggle__icon::after {
  display: block;
  width: 1.125rem;
  height: 0;
  border-top: 2px solid currentColor;
  transition: transform 0.18s ease, border-color 0.18s ease;
}
.menu-toggle__icon { position: relative; }
.menu-toggle__icon::before,
.menu-toggle__icon::after { content: ""; position: absolute; left: 0; }
.menu-toggle__icon::before { top: -8px; }
.menu-toggle__icon::after { top: 4px; }
.menu-toggle[aria-expanded="true"] .menu-toggle__icon { border-top-color: transparent; }
.menu-toggle[aria-expanded="true"] .menu-toggle__icon::before { transform: translateY(6px) rotate(45deg); }
.menu-toggle[aria-expanded="true"] .menu-toggle__icon::after { transform: translateY(-6px) rotate(-45deg); }

/* Narrow desktops: long translations (fr, ru, ja) need tighter navigation. */
@media (min-width: 64rem) and (max-width: 73.74rem) {
  .masthead__inner { column-gap: var(--space-m); }
  .site-nav { column-gap: var(--space-m); }
  .nav-primary { column-gap: 1.25rem; }
  .nav-secondary { column-gap: 0.875rem; font-size: 0.8125rem; }
  .lang-switch { padding-left: 0; border-left: 0; }
  .site-nav .nav-cta { padding-inline: 0.875rem; }
  html:lang(en) .site-nav .nav-cta { min-inline-size: 7.28rem; }
  html:is(:lang(ja), :lang(zh), :lang(ko)) .nav-secondary { font-size: var(--text-sm); }
}

@media (max-width: 63.99rem) {
  .masthead__inner { flex-wrap: wrap; min-height: 4.5rem; padding-block: 0.875rem; column-gap: var(--space-s); }
  .brand svg { width: 2.25rem; height: 2.25rem; }
  .brand__name { font-size: 1.625rem; }
  .menu-toggle { display: inline-flex; }

  .site-nav { display: none; flex: 1 0 100%; order: 3; }
  .site-nav.is-open { display: block; margin-top: 0.875rem; padding-block: 0.25rem 0.75rem; border-top: var(--rule); }

  .nav-primary { display: block; }
  .nav-primary a {
    display: block;
    padding-block: 0.6875rem;
    border-bottom: var(--rule);
    font-size: var(--text-lg);
    letter-spacing: var(--tracking-title);
    white-space: normal;
  }
  .nav-primary a:hover, .nav-primary a[aria-current="page"] { border-bottom-color: var(--line); }

  .nav-secondary {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 8.5rem), 1fr));
    gap: 0 var(--space-s);
    padding-block: 0.75rem 0.25rem;
    font-size: var(--text-base);
  }
  .nav-secondary a { padding-block: 0.5rem; white-space: normal; }
  .lang-switch { padding-left: 0; border-left: 0; font-size: var(--text-sm); }
  .site-nav .nav-cta { display: flex; width: 100%; margin-top: 0.75rem; white-space: normal; }
}

/* 10 Page heading ======================================================================== */
/* Inner pages: eyebrow + h1 (accent span allowed) on the left, lede on the right. */
.page-heading {
  display: grid;
  grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
  align-items: end;
  gap: var(--space-m) clamp(2rem, 4vw, 3.5rem);
  padding-block: clamp(2.25rem, 1.5rem + 3vw, 3.5rem) clamp(1.75rem, 1.4rem + 1.5vw, 2.5rem);
  border-bottom: var(--rule-strong);
}
.page-heading .page-title { margin-top: 0.875rem; }
.page-heading__lede { color: var(--muted); font-size: var(--text-md); max-width: var(--measure-narrow); }
/* A lede of several sentences (over about 200 characters): full column, wrapped like body copy.
   Balanced wrapping at 28rem runs to six lines and breaks after typed hyphens ("proof-"). */
.page-heading__lede--long { max-width: var(--measure); text-wrap: pretty; }
/* Below 1280px the lede column is under 480px and a long lede runs six to eight lines beside a
   one-line title, so the heading stacks: title, then the lede at its full measure. */
@media (max-width: 79.99rem) {
  .page-heading:has(> .page-heading__lede--long) { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 47.99rem) {
  .page-heading { grid-template-columns: minmax(0, 1fr); }
}

/* 11 Sections and split ================================================================== */
.section { padding-block: var(--section-pad); border-top: var(--rule-strong); }
.section--flush { border-top: 0; }
.section__head { margin-bottom: var(--space-l); }

/* Two columns: intro (1) + body (2.1). --even gives two equal columns. */
.split {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 2.1fr);
  gap: var(--space-l) clamp(2rem, 5vw, 4.5rem);
  align-items: start;
}
.split--even { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.split__intro > .eyebrow + * { margin-top: var(--space-xs); }
.split__lede { margin-top: var(--space-s); color: var(--muted); max-width: 24rem; }
@media (min-width: 56.25rem) {
  .split__intro--sticky { position: sticky; top: var(--space-l); }
}
/* Prose in a split body column keeps the row-description measure (homepage Fork text, row text). */
.split .prose { max-width: 38rem; }
@media (max-width: 56.24rem) {
  .split, .split--even { grid-template-columns: minmax(0, 1fr); }
  .split__lede { max-width: var(--measure); }
}

/* 12 Numbered rows ======================================================================= */
/* <ol class="index-list" role="list"><li class="index-row"><h3 class="index-row__title">…
   Numbers (01, 02 …) are generated with a CSS counter: never type them in the markup. */
.index-list {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: var(--rule-strong);
  counter-reset: index;
}
.index-row {
  counter-increment: index;
  display: grid;
  grid-template-columns: var(--row-cols);
  column-gap: var(--row-gap);
  row-gap: var(--space-2xs);
  align-items: baseline;
  padding-block: 1.375rem 1.5rem;
  border-bottom: var(--rule);
}
.index-row::before {
  content: counter(index, decimal-leading-zero);
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  letter-spacing: 0.04em;
  color: var(--green);
}
.index-row__title {
  font-size: var(--text-lg);
  line-height: 1.25;
  letter-spacing: var(--tracking-title);
}
.index-row__text { color: var(--muted); font-size: 0.9375rem; line-height: 1.65; }
/* Row text may be a <div class="index-row__text"> holding paragraphs, a callout and links. */
.index-row__text > * + * { margin-top: var(--space-xs); }
.index-row__text :is(a, strong, b) { color: var(--ink); }
.index-row__text a:hover { color: var(--green); }
/* A note inside row text is a compact callout. */
.index-row__text .callout { padding: var(--space-xs) var(--space-s); }
/* Rows whose copy already carries its numbers ("1. Mine it.", step 1-5): the typed number sits in
   the number column, styled like the counter, and the counter is switched off.
   <ol class="index-list index-list--typed" role="list"><li class="index-row">
   <span class="index-row__num">1.</span><h3 class="index-row__title">…</h3>… */
.index-list--typed > .index-row::before { content: none; }
.index-row__num { font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: 0.04em; color: var(--green); }
/* Stacked rows (title over text): below 48rem, where a 16rem title column would squeeze the
   text to a narrow strip, and on desktops below 80rem where the list sits in the narrow 2.1fr
   split column. Three columns only from 768 to 899px and from 1280px up. */
@media (max-width: 47.99rem), (min-width: 56.25rem) and (max-width: 79.99rem) {
  .index-row { grid-template-columns: var(--row-num) minmax(0, 1fr); }
  .index-row__text { grid-column: 2; max-width: 38rem; }
}
@media (max-width: 40rem) {
  .index-row { padding-block: 1.125rem 1.25rem; }
}

/* 13 Specification table ================================================================= */
/* <table class="spec-table"><tbody><tr><th scope="row">Label</th><td>Value</td></tr>…
   Two columns: a label and a value. Stacks label above value on phones. */
.spec-table {
  width: 100%;
  border-collapse: collapse;
  border-top: var(--rule-strong);
  font-size: 0.9375rem;
  line-height: 1.5;
}
.spec-table th,
.spec-table td {
  padding: 0.8125rem var(--space-s) 0.8125rem 0;
  border-bottom: var(--rule);
  text-align: left;
  vertical-align: baseline;
}
.spec-table tbody th { width: 44%; font-weight: 400; color: var(--muted); }
.spec-table td { color: var(--ink); font-variant-numeric: tabular-nums; }
.spec-table :is(th, td):last-child { padding-right: 0; }
.spec-table thead th {
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  font-weight: 400;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--muted);
  white-space: nowrap;          /* headers such as "Pool fee" never wrap */
  border-bottom: var(--rule-strong);
}
.spec-table .num { text-align: right; white-space: nowrap; }
/* Existing pages mark the label with a first <td> instead of <th scope="row">. */
.spec-table tbody td:first-child:not(:last-child) { width: 44%; color: var(--muted); }
.spec-table code { font-size: 0.875em; background: none; padding: 0; }
/* --rows: a spec table in the same column as numbered rows. Wherever those rows show three
   columns, the label column is as wide as number + title, so values start where row
   descriptions start. */
@media (min-width: 48rem) and (max-width: 56.24rem), (min-width: 80rem) {
  .spec-table--rows tbody th,
  .spec-table--rows tbody td:first-child:not(:last-child) { width: var(--row-label); }
}
@media (max-width: 30rem) {
  .spec-table.spec-table--stack,
  .spec-table--stack tbody,
  .spec-table--stack tbody tr,
  .spec-table--stack tbody th,
  .spec-table--stack tbody td { display: block; width: auto; }
  .spec-table--stack tr { padding-block: 0.6875rem; border-bottom: var(--rule); }
  .spec-table--stack :is(th, td) { padding: 0; border: 0; }
  .spec-table--stack tbody th { font-size: var(--text-sm); }
  /* Column headers (whitepaper tables) stack like the rows, label over label, under the table's
     ink rule with a hairline below: one ink rule per table. */
  .spec-table--stack thead,
  .spec-table--stack thead tr,
  .spec-table--stack thead th { display: block; }
  .spec-table--stack thead th { padding: 0; border-bottom: 0; }
}

/* 14 Stat strip ========================================================================== */
/* <div class="stat-strip"><div class="stat"><div class="stat__value">21M</div>
   <div class="stat__label">Max Supply</div></div>… (value first, label second)
   Where the page's baseline read label then value (price.html), keep the label first in the DOM
   so screen readers read it first; `order` puts the value in front, so both orders look the same. */
.stat-strip {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  border-top: var(--rule-strong);
  border-bottom: var(--rule-strong);
}
.stat {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.25rem 0.875rem;
  min-width: 0;
  padding: 1.375rem 1.5rem;
  border-left: var(--rule);
}
.stat:first-child { border-left: 0; padding-left: 0; }
.stat__value {
  font-size: clamp(1.625rem, 1.3rem + 0.9vw, 2.125rem);
  line-height: 1.1;
  letter-spacing: -0.03em;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.stat__label { color: var(--muted); font-size: var(--text-sm); line-height: 1.35; }
.stat__label + .stat__value { order: -1; }
.stat--live .stat__label::before {
  content: "";
  display: inline-block;
  width: 0.4375rem;
  height: 0.4375rem;
  margin-right: 0.5rem;
  vertical-align: 0.08em;
  background: var(--green);
}
/* Value over label below 80rem. A wrapping row would stack only the cells whose translated
   label is long, so neighbouring cells would disagree. */
@media (max-width: 79.99rem) {
  .stat { flex-direction: column; align-items: flex-start; padding: 1.125rem 1.25rem; }
}
@media (max-width: 47.99rem) {
  .stat-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .stat:nth-child(odd) { border-left: 0; padding-left: 0; }
  .stat:nth-child(n + 3) { border-top: var(--rule); }
  .stat:nth-child(even) { padding-right: 0; }
}

/* 15 Market panel ======================================================================== */
/* <div class="market" data-live-panel data-state="loading"> … site.v1.js sets data-state
   to live or unavailable from the [data-live-value] elements inside. */
.market {
  min-width: 0;
  padding-block: var(--space-s) 0.875rem;
  border-top: var(--rule-strong);
  border-bottom: var(--rule);
}
.market__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-s);
}
.market__pair {
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--ink);
}
.market__signal {
  width: 0.75rem;
  height: 0.75rem;
  border: 1px solid var(--line-ui);
  background: transparent;
  flex: none;
}
.market__price {
  --price-size: clamp(2.75rem, 2.1rem + 2.4vw, 4.25rem);
  min-height: calc(var(--price-size) * 1.02 + 2.625rem);   /* same height in every state */
  padding-block: 1.25rem 1.375rem;
  font-size: var(--price-size);
  line-height: 1.02;
  letter-spacing: -0.04em;
  font-variant-numeric: tabular-nums;
  overflow-wrap: anywhere;
}
.market__stats {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-s) var(--space-m);
  margin: 0;
  padding-top: 1.125rem;
  border-top: var(--rule);
}
.market__stats > div { min-width: 0; }
.market__stats dt { color: var(--muted); font-size: 0.8125rem; line-height: 1.4; }
.market__stats dd {
  margin: 0.25rem 0 0;
  font-size: 1.0625rem;
  line-height: 1.35;
  font-variant-numeric: tabular-nums;
  overflow-wrap: anywhere;
}
.market__source {
  margin-top: 1.25rem;
  padding-top: 0.875rem;
  border-top: var(--rule);
  color: var(--muted);
  font-size: 0.8125rem;
}
.market__source a { color: var(--ink); }
.market__source a:hover { color: var(--green); }

/* States: loading = hollow square + hairline placeholders; live = filled square;
   unavailable = crossed square + a small muted dash in place of the big price. */
.market[data-state="loading"] :is(.market__price, .market__stats dd) {
  color: transparent;
  background: linear-gradient(var(--line-ui), var(--line-ui)) 0 60% / 4ch 1px no-repeat;
  background-origin: content-box;
  background-clip: content-box;
}
.market[data-state="live"] .market__signal { background: var(--green); border-color: var(--green); }
.market[data-state="unavailable"] .market__price {
  display: flex;
  align-items: center;
  font-size: var(--text-lg);
  letter-spacing: 0;
  color: var(--muted);
}
.market[data-state="unavailable"] .market__stats dd { color: var(--muted); }
.market[data-state="unavailable"] .market__signal {
  border-color: var(--muted);
  background: linear-gradient(to top right, transparent calc(50% - 0.75px), var(--muted) calc(50% - 0.75px), var(--muted) calc(50% + 0.75px), transparent calc(50% + 0.75px));
}

/* 16 Link directory ====================================================================== */
/* <ol class="directory" role="list"><li><a class="directory__link" href="…">
   <h3 class="directory__title">…</h3><p class="directory__text">…</p></a></li>… */
.directory {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: var(--rule-strong);
  counter-reset: index;
}
.directory > li { counter-increment: index; border-bottom: var(--rule); }
.directory__link {
  --icon-external: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 12.5 12 4M5 3.75h7.25V11' fill='none' stroke='%23000' stroke-width='1.5'/%3E%3C/svg%3E");
  position: relative;
  display: grid;
  grid-template-columns: var(--row-cols);
  column-gap: var(--row-gap);
  row-gap: 0.25rem;
  align-items: baseline;
  padding-block: 1.125rem 1.1875rem;
  padding-right: 2rem;           /* room for the arrow */
  color: var(--ink);
  text-decoration: none;
}
.directory__link::before {
  content: counter(index, decimal-leading-zero);
  grid-column: 1;
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  letter-spacing: 0.04em;
  color: var(--green);
}
.directory__link::after {
  content: "";
  position: absolute;
  right: 0;
  top: 50%;
  width: 0.875rem;
  height: 0.875rem;
  margin-top: -0.4375rem;
  background-color: currentColor;
  -webkit-mask: var(--icon-external) center / contain no-repeat;
  mask: var(--icon-external) center / contain no-repeat;
  transition: transform 0.15s ease;
}
.directory__title {
  grid-column: 2;
  font-size: 1.1875rem;
  line-height: 1.3;
  letter-spacing: var(--tracking-title);
}
.directory__text { grid-column: 3; color: var(--muted); font-size: 0.9375rem; line-height: 1.55; }
.directory__link:hover { color: var(--green); }
.directory__link:hover::after { transform: translate(0.15em, -0.15em); }
.directory__link:focus-visible { outline-offset: 2px; }
.directory--internal .directory__link { --icon-external: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M1.5 8h12M9 3.5 13.5 8 9 12.5' fill='none' stroke='%23000' stroke-width='1.5'/%3E%3C/svg%3E"); }
@media (max-width: 47.99rem), (min-width: 56.25rem) and (max-width: 79.99rem) {
  .directory__link { grid-template-columns: var(--row-num) minmax(0, 1fr); }
  .directory__title, .directory__text { grid-column: 2; }
  .directory__text { max-width: 38rem; }
}

/* Plain link list (no numbers), e.g. exchanges or downloads */
.link-list { list-style: none; margin: 0; padding: 0; border-top: var(--rule-strong); }
.link-list > li { border-bottom: var(--rule); }
.link-list a {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-s);
  padding-block: 0.9375rem;
  font-size: var(--text-md);
  color: var(--ink);
  text-decoration: none;
}
.link-list a:hover { color: var(--green); }

/* Closing call-to-action row */
.closing {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
  gap: var(--space-m) var(--space-xl);
  padding-block: var(--section-pad);
  border-top: var(--rule-strong);
}
.closing__title {
  font-size: var(--text-2xl);
  line-height: 1.04;
  letter-spacing: var(--tracking-display);
}
.closing__text { margin-top: var(--space-s); color: var(--muted); font-size: var(--text-md); max-width: 31rem; }
/* Several buttons (.actions--stack): the title starts on the line of the first button instead of
   sitting at the foot of a tall stack. From 1280px the buttons form two columns, so the block is
   about as tall as title + text; with an odd count the first (primary) button spans both columns.
   The homepage closing holds one plain .btn and keeps the bottom alignment. */
.closing:has(> .actions--stack) { align-items: start; }
@media (min-width: 80rem) {
  .closing > .actions--stack { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .closing > .actions--stack > .btn:first-child:nth-last-child(odd) { grid-column: 1 / -1; }
}
@media (max-width: 47.99rem) {
  .closing { grid-template-columns: minmax(0, 1fr); align-items: start; }
}

/* 17 Callouts ============================================================================ */
/* <div class="callout"><p><strong>Title.</strong> Text <a href>link</a></p></div> */
.callout {
  padding: 1.25rem 1.5rem;
  border-left: 3px solid var(--green);
  background: var(--wash);
  color: var(--ink);
}
.callout > * + * { margin-top: 0.5rem; }
.callout p { color: var(--muted); max-width: var(--measure); }   /* the box may be wider than the text */
.callout strong { color: var(--ink); }
.callout a { color: var(--ink); }
.callout a:hover { color: var(--green); }
.callout--ink { border-left-color: var(--ink); }

/* Dark panel for technical settings (miner connection etc.) */
.surface-dark { background: var(--ink); color: var(--on-dark); }
.surface-green { background: var(--green); color: var(--on-dark); }
.surface-dark .muted, .surface-dark .eyebrow { color: var(--on-dark-muted); }
.surface-green .muted { color: var(--on-green-muted); }
.surface-dark a, .surface-green a { color: var(--on-dark); }
.surface-dark a:hover, .surface-green a:hover { color: var(--bright); }
.panel { padding: clamp(1.25rem, 1rem + 1vw, 1.875rem); }
.panel__field { padding-block: 1rem; border-top: 1px solid var(--rule-on-dark); }
.panel__field:first-of-type { margin-top: 1.25rem; }
.panel__label { display: block; margin-bottom: 0.375rem; font-size: 0.8125rem; color: var(--on-dark-muted); }

/* 18 Tables ============================================================================== */
/* Any table with more than two columns: wrap it so only the table scrolls.
   <div class="table-scroll" tabindex="0"><table class="data-table">…</table></div> */
.table-scroll,
.table-wrap {
  --scroll-ground: var(--paper);
  --scroll-edge: var(--line-ui);
  max-width: 100%;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  -webkit-overflow-scrolling: touch;
  /* Scroll edges: a 1px --line-ui rule on each side where part of the table is hidden. The two
     "local" fills move with the content and cover the fixed rules at its start and end, so a box
     that does not scroll shows no rule. Solid fills, not shading. */
  background:
    linear-gradient(var(--scroll-ground), var(--scroll-ground)) left / 1px 100% no-repeat local,
    linear-gradient(var(--scroll-ground), var(--scroll-ground)) right / 1px 100% no-repeat local,
    linear-gradient(var(--scroll-edge), var(--scroll-edge)) left / 1px 100% no-repeat scroll,
    linear-gradient(var(--scroll-edge), var(--scroll-edge)) right / 1px 100% no-repeat scroll;
}
.table-scroll > table,
.table-wrap > table { min-width: var(--table-min, 0); }
.data-table { width: 100%; border-collapse: collapse; font-size: 0.9375rem; line-height: 1.5; }
.data-table th,
.data-table td {
  padding: 0.75rem var(--space-s) 0.75rem 0;
  border-bottom: var(--rule);
  text-align: left;
  vertical-align: baseline;
}
.data-table thead th {
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  font-weight: 400;
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--muted);
  white-space: nowrap;
  border-top: var(--rule-strong);
  border-bottom: var(--rule-strong);
}
/* Row keys read like spec-table labels on every page: regular weight, muted. Row-group headers
   (downloads platforms, scope="rowgroup") keep their page's title styling. */
.data-table tbody th { font-weight: 400; }
.data-table tbody th[scope="row"] { color: var(--muted); }
.data-table .num { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.data-table :is(th, td):last-child { padding-right: 0; }   /* right-aligned last column ends on the edge */
/* An empty corner cell (a row-header column without header copy) keeps the ink header rules. */
.data-table thead td { border-top: var(--rule-strong); border-bottom: var(--rule-strong); }
/* On ink: hairlines and header labels use the on-dark tokens (--muted on ink fails contrast). */
.surface-dark .data-table :is(th, td) { border-bottom-color: var(--rule-on-dark); }
.surface-dark .data-table thead :is(th, td) { color: var(--on-dark-muted); border-top-color: var(--rule-on-dark); border-bottom-color: var(--rule-on-dark); }
.surface-dark .data-table tbody th[scope="row"] { color: var(--on-dark-muted); }
.surface-dark :is(.table-scroll, .table-wrap) { --scroll-ground: var(--ink); --scroll-edge: var(--rule-on-dark); }

/* 19 Code and commands =================================================================== */
code, kbd, samp, pre { font-family: var(--font-mono); }
:not(pre) > code {
  font-size: 0.875em;
  padding: 0.08em 0.3em;
  background: var(--wash);
  overflow-wrap: anywhere;      /* prevents overflow; prefer .command or <wbr> for long tokens */
}
pre {
  margin: 0;
  max-width: 100%;
  overflow-x: auto;
  padding: 1.125rem 1.25rem;
  border: var(--rule);
  background: var(--wash);
  font-size: 0.8125rem;
  line-height: 1.65;
  white-space: pre;
}
pre code { font-size: inherit; background: none; padding: 0; overflow-wrap: normal; }

/* Copyable command or token: never breaks inside the token, scrolls inside its own box.
   <div class="command"><code tabindex="0">stratum+tcp://forge.bch2.org:3333</code>
   <button type="button" class="command__copy">Copy</button></div>   (button text must be
   existing, translated copy or an aria-label from existing copy) */
.command {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  min-width: 0;
  padding: 0.5rem 0.5rem 0.5rem 0.875rem;
  border: var(--rule);
  background: var(--wash);
}
.command code {
  flex: 1;
  min-width: 0;
  overflow-x: auto;
  padding: 0.3125rem 0;
  background: none;
  font-size: 0.875rem;
  line-height: 1.5;
  white-space: nowrap;
  overflow-wrap: normal;
}
.command__copy {
  flex: none;
  min-height: 2.25rem;
  padding: 0.375rem 0.75rem;
  border: 1px solid var(--line-ui);
  border-radius: 0;
  background: var(--paper);
  font-size: 0.8125rem;
}
.command__copy:hover { border-color: var(--ink); }
.surface-dark .command { background: rgba(248, 249, 246, 0.05); border-color: var(--rule-on-dark); }
.surface-dark .command__copy { background: transparent; border-color: var(--on-dark-muted); color: var(--on-dark); }
.surface-dark :not(pre) > code { background: rgba(248, 249, 246, 0.08); }
/* The rule above (0,1,2) outranks ".command code" (0,1,1): the box already carries the ground. */
.surface-dark .command code { background: none; }
/* A command box whose token wraps, but only at the <wbr> in the markup, so a stratum URL stays
   fully visible at 320px without scrolling: <div class="command command--wrap"><code>
   stratum+tcp://<wbr>forge.bch2.org:3333</code></div>. No tabindex: nothing scrolls. */
.command--wrap code { white-space: normal; overflow-wrap: normal; word-break: normal; }
/* A token in running text that breaks only where the markup has <wbr>. On <code> it keeps the
   wash chip (".token" outranks ":not(pre) > code", so overflow-wrap stays normal). Stratum URLs
   take one <wbr> after "://", so host and port stay together:
   <code class="token">stratum+tcp://<wbr>forge.bch2.org:3333</code> */
.token { font-family: var(--font-mono); font-size: 0.875em; overflow-wrap: normal; word-break: normal; }

/* 20 FAQ accordion ======================================================================= */
/* Styles the existing markup; behaviour stays in faq.js / mining.js.
   faq.html:    .faq-item > button.faq-q (text + span.faq-icon) + .faq-a > .faq-a-inner; .faq-item.open
   mining.html: .faq-item > button.faq-q[aria-expanded] (text + span[aria-hidden]) + .faq-a(.open) > p */
.faq-section + .faq-section { margin-top: var(--space-xl); }
.faq-section-title,
.faq-section > h2.eyebrow {
  margin-bottom: var(--space-xs);
  font-weight: 400;
  line-height: 1.5;
  text-wrap: wrap;            /* category labels may be h2 elements: cancel the heading rules */
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--green);
}
.faq-item { border-bottom: var(--rule); }
.faq-section-title + .faq-item,
.faq-section > h2 + .faq-item,
.faq-list > .faq-item:first-child { border-top: var(--rule-strong); }
.faq-q {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-m);
  width: 100%;
  margin: 0;
  padding: 1.1875rem 0;
  border: 0;
  border-radius: 0;
  background: none;
  color: var(--ink);
  font-size: 1.1875rem;
  line-height: 1.4;
  letter-spacing: var(--tracking-title);
  text-align: left;
}
.faq-q:hover { color: var(--green); background: none; }
.faq-q:focus-visible { outline-offset: 2px; }
.faq-icon,
.faq-q > span[aria-hidden] {
  flex: none;
  width: 1.25rem;
  height: auto;
  border: 0;
  border-radius: 0;
  background: none;
  color: var(--green);
  font-family: var(--font-mono);
  font-size: 1.125rem;
  line-height: 1;
  text-align: center;
}
.faq-item.open .faq-icon { background: none; color: var(--green); }
/* An open question shows "−" on both pages; the icon never rotates. faq.html: faq.js swaps the
   .faq-icon text. mining.html: mining.js leaves the aria-hidden "+" as it is, so while
   aria-expanded is true that glyph is hidden (font-size 0) and "−" is drawn in ::after. */
.faq-q[aria-expanded="true"] > span[aria-hidden]:not(.faq-icon) { font-size: 0; }
.faq-q[aria-expanded="true"] > span[aria-hidden]:not(.faq-icon)::after { content: "\2212"; font-size: 1.125rem; }
.faq-a { display: none; max-height: none; overflow: visible; padding: 0; }
.faq-item.open .faq-a,
.faq-a.open { display: block; max-height: none; padding: 0; }
.faq-a-inner,
.faq-a > p {
  max-width: var(--measure);
  padding: 0 2.75rem 1.5rem 0;
  border: 0;
  color: var(--muted);
  font-size: var(--text-base);
  line-height: var(--leading-body);
}
.faq-a-inner a, .faq-a > p a { color: var(--ink); }
.faq-a-inner a:hover, .faq-a > p a:hover { color: var(--green); }
.faq-a-inner strong, .faq-a > p strong { color: var(--ink); }
.faq-a-inner ul, .faq-a-inner ol { margin: 0.75rem 0 0.75rem; padding-left: 1.25rem; }
.faq-a-inner li + li { margin-top: var(--space-2xs); }
@media (max-width: 30rem) {
  .faq-q { font-size: 1.0625rem; padding-block: 1rem; }
  .faq-a-inner, .faq-a > p { padding-right: 0; }
}

/* In-page link bar (faq.html .faq-nav is a JS hook: keep the class) */
.faq-nav,
.page-links {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem var(--space-m);
  padding-block: var(--space-s);
  border-bottom: var(--rule);
}
.faq-nav a,
.page-links a {
  padding-block: 0.25rem;
  color: var(--ink);
  font-size: 0.9375rem;
  text-decoration-line: underline;
  text-underline-offset: 0.3em;
}
.faq-nav a:hover, .page-links a:hover { color: var(--green); }

/* Document layout: sticky side navigation + article (faq, whitepaper). The columns are the .split
   tracks, so the article starts on the same vertical line as section bodies and footer links. */
.content-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 2.1fr);
  gap: var(--space-xl) clamp(2rem, 5vw, 4.5rem);
  padding-block: var(--space-xl) var(--section-pad);
}
/* Opens with an ink rule like every list. Also valid on the .faq-nav hook element: these
   declarations come later and replace the link bar's display, padding and rule. */
.side-nav {
  align-self: start;
  position: sticky;
  top: var(--space-l);
  display: block;
  max-width: var(--row-label);
  max-height: calc(100vh - 4rem);
  overflow-y: auto;
  padding-block: 0;
  border-top: var(--rule-strong);
  border-bottom: 0;
}
.side-nav .eyebrow { margin-bottom: var(--space-xs); }
.side-nav a {
  display: block;
  padding-block: var(--space-2xs);
  border-bottom: var(--rule);
  color: var(--ink);
  font-size: var(--text-sm);
  line-height: 1.4;
  text-decoration: none;
}
.side-nav a:hover, .side-nav a[aria-current="true"] { color: var(--green); }
/* Full focus rings in the scrolling nav. A scroll box clips at its padding box, and the links fill
   it, so the 3px ring at 3px offset lost its sides and the outer edges of the first and last link.
   The box reaches 6px (ring + offset) past the link column on both sides and at the bottom, and the
   6px top padding comes out of the first link's own padding. Link boxes, text and hairlines stay
   where they were; the ink rule stays a border (links scrolled up are still clipped under it),
   drawn over the link column only (in forced colours the plain border, see section 23). */
@media (min-width: 56.25rem) {
  .side-nav {
    max-width: calc(var(--row-label) + 12px);
    margin-inline: -6px;
    margin-bottom: -6px;
    padding: 6px;
    scroll-padding-block: 6px;   /* a link focused at the scroll edge scrolls in with its ring */
    border-image: linear-gradient(to right, transparent 6px, var(--ink) 6px, var(--ink) calc(100% - 6px), transparent calc(100% - 6px)) 1 0 0;
  }
  .side-nav > a:first-child { padding-top: calc(var(--space-2xs) - 6px); }
}
.article { min-width: 0; max-width: 56rem; }
.article > section + section { margin-top: var(--space-xl); padding-top: var(--space-l); border-top: var(--rule); }
/* Blocks inside each article section (.prose spaces only its direct children). Text keeps the
   measure; tables and code use the full column. */
.article > section > * + * { margin-top: 1em; }
.article > section > h2 + * { margin-top: var(--space-m); }
.article > section > h3 + * { margin-top: 0.75em; }
.article > section > * + h3 { margin-top: 1.75em; }
.article > section > :is(p, ul, ol, h3) { max-width: var(--measure); }
.article > section > :is(.table-scroll, .table-wrap, pre),
.article > section > :is(.table-scroll, .table-wrap, pre) + :not(h3) { margin-top: var(--space-m); }
@media (max-width: 56.24rem) {
  .content-layout { grid-template-columns: minmax(0, 1fr); gap: var(--space-l); }
  .side-nav { position: static; max-width: none; max-height: none; overflow: visible; display: flex; flex-wrap: wrap; gap: var(--space-2xs) var(--space-m); padding-block: 0 var(--space-s); border-top: 0; border-bottom: var(--rule); }
  .side-nav .eyebrow { flex-basis: 100%; }
  /* Light underlines (--line-ui, 3.5:1) so the wrapped links read as a list, not a paragraph. */
  .side-nav a { border-bottom: 0; padding-block: 0.375rem; font-size: 0.9375rem; text-decoration-line: underline; text-decoration-color: var(--line-ui); text-underline-offset: 0.3em; }
  .side-nav a:is(:hover, [aria-current="true"]) { text-decoration-color: currentColor; }
}

/* 21 Footer ============================================================================== */
/* Same tracks and column gap as .split, so the links start on the section body line. */
.site-footer__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 2.1fr);
  gap: var(--space-l) clamp(2rem, 5vw, 4.5rem);
  padding-block: clamp(2rem, 1.6rem + 1.5vw, 3rem) clamp(2.5rem, 2rem + 2vw, 3.5rem);
  border-top: var(--rule-strong);
}
.site-footer__wordmark {
  display: block;
  font-size: 1.5rem;
  font-weight: 700;
  line-height: 1;
  letter-spacing: -0.015em;
}
.site-footer__copy {
  margin-top: var(--space-s);
  max-width: 22rem;
  color: var(--muted);
  font-size: var(--text-sm);
}
/* A page's own footer note may contain links (buy, downloads, whitepaper). */
.site-footer__copy a { color: var(--ink); }
.site-footer__copy a:hover { color: var(--green); }
/* Three groups, each a <div class="footer-links__group">: site pages | tools | social.
   No group headings (they would be new copy); the columns carry the grouping. */
.footer-links {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--space-s) var(--space-m);
  align-content: start;
}
.footer-links__group { min-width: 0; }
.footer-links a {
  display: block;
  padding-block: 0.3125rem;
  color: var(--ink);
  font-size: 0.9375rem;
  line-height: 1.45;
  text-decoration: none;
}
.footer-links a:hover { color: var(--green); text-decoration-line: underline; }
/* Stacks a little later than .split: below 960px the 1fr copy column is under ~270px and
   balanced translated copy breaks after a typed hyphen ("peer-/to-peer" in es, pt). */
@media (max-width: 59.99rem) {
  .site-footer__inner { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 47.99rem) {
  .footer-links { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .footer-links__group--social {
    grid-column: 1 / -1;
    display: flex;
    flex-wrap: wrap;
    column-gap: var(--space-m);
    padding-top: var(--space-2xs);
    border-top: var(--rule);
  }
}

/* 22 Utilities =========================================================================== */
.visually-hidden {
  position: absolute !important;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}
.nowrap { white-space: nowrap; }
/* A phrase in a heading that should not break inside ("(no account, no custody)", "Bitcoin Cash
   (BCH)"): it moves to the next line whole where it fits, and wraps inside itself only where it is
   wider than the column (320px), so it never overflows. */
.keep { display: inline-block; }
.tabular { font-variant-numeric: tabular-nums; }

/* 23 Motion, forced colours, print ======================================================= */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  .arrow:hover::after, .arrow-ext:hover::after, .directory__link:hover::after { transform: none; }
}

@media (forced-colors: active) {
  .arrow::after, .arrow-ext::after, .directory__link::after { forced-color-adjust: none; background-color: LinkText; }
  .btn { border: 1px solid ButtonText; }
  .status-mark::before, .stat--live .stat__label::before, .market__signal { forced-color-adjust: none; background: CanvasText; }
  .side-nav { border-image: none; }
}

@media print {
  .notice, .menu-toggle, .site-nav, .skip-link { display: none !important; }
  body { background: #fff; font-size: 11pt; }
  .container { width: 100%; }
  .faq-a { display: block !important; }
  .split, .split--even { grid-template-columns: minmax(0, 1fr); }
}

/* -----------------------------------------------------------------------------------------------
   Exchange marks (exchange update, 2026-09-15)
   The exchange's official icon beside its name, set as real text in the exchange's own lettering:
   NonKYC, Biconomy, NestEx. The icon is decorative (alt="").
     <a class="exchange-name" href="https://www.biconomy.com/exchange/BCH2_USDT">
       <img class="exchange-logo" src="/assets/editorial/exchanges/biconomy.png" width="24" height="24" alt="">Biconomy</a>
   Inside a .btn the icon sits before the label; it scales with the text (1.25em).
   ----------------------------------------------------------------------------------------------- */
.exchange-logo {
  display: inline-block;
  flex: none;
  width: 1.25em;
  height: 1.25em;
  margin-inline-end: 0.5em;
  vertical-align: -0.25em;
  object-fit: contain;
}
.exchange-name { display: inline-flex; align-items: center; gap: 0.5em; }
.exchange-name .exchange-logo,
.btn .exchange-logo { margin-inline-end: 0; vertical-align: 0; }
