/* 00-fonts-and-naming.css — the site-wide NAMING convention (read it before
   adding any class, id, data-* or custom property), then the self-hosted
   @font-face rules: Jost and Space Mono. The css/style/ files are
   linked one after another in filename order, so a later file wins a tie. */

/* STstudio — v4 */

/* NAMING — one convention for every class, id, data-* attribute and custom
   property on the site (css/, js/, index.html, scripts/). Type sizes have their
   own rules at the top of css/tokens.css.

   1. Whole English words, lowercase, single hyphens. The only short forms:
      nav, btn, num, prev, lang, url, 3d, sr-only. No prefixes like ac-, cf-, wt-.
   2. A part is block-part: archive-card → archive-card-title, contact-form →
      contact-form-label. At most two words after the block; past that, the part
      is a block of its own.
   3. A variant fixed in the markup or by a generator is base--variant, written
      next to the base: work-table-row work-table-row--header, reveal--delay-1.
      One hyphen = part, two hyphens = variant.
   4. A state JS adds or removes is is-<adjective> or has-<noun> (is-active,
      is-open, is-revealed, body.is-menu-open). CSS writes a state together with
      its component (.detail-panel.is-open), never alone. Generators never write
      is-*.
   5. Name what a thing is, not its tag, place, look or history: project-title,
      not project-h1; header-actions, not right. Never a lone everyday word
      (right, dark, title, year) — a text search can't find it.
   6. A name used on one page only starts with that page's slug: op- for /op/,
      legal- for /privacy/. A component on two or more pages gets a plain name.
   7. ids only for URL anchors (#about, #work, #contact — outside links use them,
      never rename), <label for> targets, and elements JS gets by id. An id
      repeats its class. CSS doesn't style ids; #contact is the one exception.
   8. data-* carries data or JS behaviour, in whole words (data-category,
      data-sort-direction). A data-sort value equals the data-* it sorts by
      (data-sort="discipline" ↔ data-discipline). Nothing writes an attribute
      nothing reads.
   9. Custom properties are whole words (--bg, --bg-raised, --required). Type
      is --text-<role>; spacing is a rhythm token (--section-space,
      --block-space, --item-space, …) or an --sp-<n> step — all in
      css/tokens.css, never a raw length. A property used by one component
      starts with that component's name.
   10. Edit sources, never output: work/*.html, op/index.html,
      editorial-web/index.html and privacy/index.html come from
      scripts/gen-*.js (the work pages from scripts/data/projects/ and
      scripts/templates/) — change the source, then run node
      scripts/gen-all.js.
   11. When markup or JS goes, its CSS goes in the same commit — including the
      Korean-override lists and the @media/@container copies.
   12. Reserved: nothing starting wf- (Adobe Fonts sets wf-loading/wf-active on
      <html>). On /privacy/, no id equal to a short link the page resolves
      itself (cookies, analytics, contact-form): its script sends those to the
      ko-/en- section in the reader's language, and a real id would win. */

/* Two Latin families, both self-hosted: Jost (geometric, Futura-lineage) for
   display type — headings, hero, titles — and Space Mono for UI and labels.
   There is no serif: the site went all-gothic on 17 Sep 2026, Korean included
   (210 MGothic from the Adobe Fonts kit, loaded in <head>). Both are served from /fonts
   (SIL OFL 1.1), not from Google: fetching them from fonts.googleapis.com
   hands every visitor's IP address to Google before they have agreed to
   anything, which EU courts have held to breach the GDPR (LG München I,
   3 O 17493/20). Latin + Latin Extended only — Hangul is 210 MGothic.
   Copyright notices and OFL text: /fonts/OFL-Jost.txt and
   /fonts/OFL-Space-Mono.txt. */
@font-face {
  font-family: 'Jost';
  src: url('../../fonts/jost-italic-latin-ext.woff2') format('woff2');
  font-weight: 300 700;   /* variable font: one file per style covers the range */
  font-style: italic;
  font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Jost';
  src: url('../../fonts/jost-italic-latin.woff2') format('woff2');
  font-weight: 300 700;   /* variable font: one file per style covers the range */
  font-style: italic;
  font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Jost';
  src: url('../../fonts/jost-latin-ext.woff2') format('woff2');
  font-weight: 300 700;   /* variable font: one file per style covers the range */
  font-style: normal;
  font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Jost';
  src: url('../../fonts/jost-latin.woff2') format('woff2');
  font-weight: 300 700;   /* variable font: one file per style covers the range */
  font-style: normal;
  font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Space Mono';
  src: url('../../fonts/space-mono-400-italic-latin-ext.woff2') format('woff2');
  font-weight: 400;
  font-style: italic;
  font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Space Mono';
  src: url('../../fonts/space-mono-400-italic-latin.woff2') format('woff2');
  font-weight: 400;
  font-style: italic;
  font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Space Mono';
  src: url('../../fonts/space-mono-700-italic-latin-ext.woff2') format('woff2');
  font-weight: 700;
  font-style: italic;
  font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Space Mono';
  src: url('../../fonts/space-mono-700-italic-latin.woff2') format('woff2');
  font-weight: 700;
  font-style: italic;
  font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Space Mono';
  src: url('../../fonts/space-mono-400-latin-ext.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Space Mono';
  src: url('../../fonts/space-mono-400-latin.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Space Mono';
  src: url('../../fonts/space-mono-700-latin-ext.woff2') format('woff2');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Space Mono';
  src: url('../../fonts/space-mono-700-latin.woff2') format('woff2');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
