# Context: the design system (as it actually is) Read this before touching CSS. Everything here was extracted from the current files, not assumed. ## There is no single palette. There are three. The same semantic names carry different values depending on which stylesheet loaded them: | Token | `styles.css`, `rules/styles.css` | `chapters.css`, `skills-review/styles.css` | `hands-on/*/styles.css` | | ---------- | -------------------------------- | ------------------------------------------ | ----------------------- | | `--paper` | `#f5f4f1` | `#f6f3ed` | `#f4f3ef` | | `--ink` | `#172f42` | `#122534` | `#173044` | | `--muted` | `#697b89` | `#65717a` | `#687d8c` | | `--line` | `#d8dee2` | `#d0d5d2` | `#d5dde1` | | `--blue` | `#527f9f` | `#215675` | `#5683a1` | | `--gold` | `#efc76b` | `#ebbf58` | `#efc86d` | | `--accent` | `#7c78a8` | — | — | | `--deep` | `#102536` | — | — | | `--red` | — | `#a7483f` (chapters only) | — | | `--violet` | — | `#6b668f` (review desk only) | — | Most deltas are a few units per channel — drift, not intent. `--blue` is the exception: `#527f9f` vs `#215675` is a visible difference and may be deliberate. **Decision required before any component work** (task 02). Options: - **Canonicalize** to one palette. Recommended. The sub-perceptual deltas collapse; only `--blue` needs a human's eye on a before/after screenshot. - **Keep three named surfaces** (`--surface-guide`, `--surface-chapter`, `--surface-lab`) if the drift turns out to be intentional per section. Do not "just pick one" silently in the middle of another task. This is its own reviewed change with visual diffs attached. ## The typography — fixed 2026-09-05 `styles.css` line 1 used to read: ```css @font-face { font-family: Manrope; src: url('https://fonts.googleapis.com/css2?family=DM+Mono&family=Manrope:wght@400;600;700;800&display=swap'); } ``` `src:` in an `@font-face` must point at a font binary. That URL returns a CSS stylesheet, so no browser could load a face from it. For the whole life of the site, every `font-family:Manrope,Arial,sans-serif` rendered as **Arial** and every `font:… 'DM Mono',monospace` rendered as the **generic monospace** face — `'DM Mono'` was never declared as a family at all. **This was escalated and the human chose the real fonts.** Manrope and DM Mono are now self-hosted in `public/fonts/`, latin and latin-ext subsets only, under the SIL Open Font License. One `fonts.css` serves both trees: Astro links it from `BaseLayout.astro`, the legacy root `styles.css` `@import`s it. Self-hosted rather than linked from Google because `scripts/audit-ui.mjs` rejects any external ``/`