/*
  Icons — every icon in the system, one Nerd Font.

  This sheet replaces Font Awesome. The glyphs come from **Symbols Nerd Font**
  (public/nerdfonts/SymbolsNerdFont-Regular.ttf), a single icon-only font that
  bundles many patched icon sets. GUI bodies and the describe() metadata name a
  glyph with two classes: the base `nf` (which selects the font) and one
  `nf-<set>-<name>` class (which supplies the glyph via ::before content):

      <i class="nf nf-md-message-text"></i>

  The set is chosen per glyph, the way any Nerd Font setup works — whichever
  set has the right picture, since they all live in this one font:

    - `nf-md-*`  Material Design Icons — the whole UI (message, close, cog,
                 folder, save, magnify, the window buttons, the language logos…).
    - `nf-fa-*`  the Font Awesome subset that Symbols also carries, used ONLY
                 for glyphs Material Design Icons dropped for trademark reasons
                 (React, Wikipedia).

  Adding a glyph: pick the codepoint from the set's own table (or a Nerd Font
  cheat sheet), confirm the font has it, and add one rule below. Every
  codepoint here is verified present in the bundled font.

  A class with NO rule here paints NOTHING — no error, no console line, just an
  empty box, because `nf` only selects the font and the glyph comes from the rule's
  ::before content. That invisibility is the one failure mode of this system, and it
  shipped a lot: `.nf-md-delete` (the Browser's delete-row action), `.nf-md-power`
  (the sidebar's app launch/close control), `.nf-md-play`, `.nf-md-palette`,
  `.nf-md-history`, `.nf-md-folder-open`, `.nf-md-alert-circle-outline`, and the
  scaffold's `nf-md-star` / `nf-md-apps` (so every runtime-created type) were all
  clickable-and-blank. `tests/icon-coverage-check.mjs` now fails the build on any
  `nf-*` class named anywhere in src/ with no rule here, and on any rule whose
  codepoint the bundled font does not encode (a codepoint copied from a newer icon
  set renders tofu). Prefer a class already below: a defined glyph beats a
  semantically-nicer undefined one, which is why the row actions use
  `nf-md-monitor`/`nf-md-trash-can`, the sidebar power uses `nf-md-power-plug`,
  and the scaffold default is `nf-md-puzzle` — the same glyph `registry.iconOf`
  falls back to.

  Linked from public/index.html among the SYSTEM sheets (it owns an @font-face,
  so it must load with them, before any sheet paints markup that uses an icon).
*/

@font-face {
  font-family: "Symbols Nerd Font";
  font-style: normal;
  font-weight: 400;
  font-display: block;
  src: url("/nerdfonts/SymbolsNerdFont-Regular.ttf") format("truetype");
}

/* Base every icon carries. It selects the font and pins the metrics so a glyph
   sits on the text baseline like the character it is — the same box Font
   Awesome gave an <i>, so nothing downstream shifts. Font-size is inherited:
   an icon is the size of the text around it. */
.nf {
  font-family: "Symbols Nerd Font", "Symbols Nerd Font Mono", monospace;
  font-style: normal;
  font-weight: 400;
  font-variant: normal;
  line-height: 1;
  display: inline-block;
  text-rendering: auto;
  speak: none;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

/* The spinner. Reuses the one shared `spin` keyframe in theme.css (every sheet
   loads after it). Applied to a glyph that is already a spinner — nf-md-loading. */
.nf-spin {
  animation: spin 1s linear infinite;
}

/* ── Material Design Icons ─────────────────────────────────────────────────── */
.nf-md-message-text::before { content: "\f0369"; }
.nf-md-check-circle::before { content: "\f05e0"; }
.nf-md-circle-outline::before { content: "\f0766"; }
.nf-md-tools::before { content: "\f1064"; }
.nf-md-information::before { content: "\f02fc"; }
.nf-md-close::before { content: "\f0156"; }
.nf-md-pencil::before { content: "\f03eb"; }
.nf-md-content-copy::before { content: "\f018f"; }
.nf-md-refresh::before { content: "\f0450"; }
.nf-md-code-tags::before { content: "\f0174"; }
.nf-md-arrow-down::before { content: "\f0045"; }
.nf-md-speedometer::before { content: "\f04c5"; }
.nf-md-window-close::before { content: "\f05ad"; }
.nf-md-window-maximize::before { content: "\f05af"; }
.nf-md-window-minimize::before { content: "\f05b0"; }
.nf-md-window-restore::before { content: "\f05b2"; }
.nf-md-open-in-new::before { content: "\f01c5"; }
.nf-md-monitor::before { content: "\f0379"; }
.nf-md-plus::before { content: "\f0415"; }
.nf-md-magnify::before { content: "\f0349"; }
.nf-md-web::before { content: "\f059f"; }
.nf-md-image::before { content: "\f02e9"; }
.nf-md-video::before { content: "\f0567"; }
.nf-md-newspaper::before { content: "\f0395"; }
.nf-md-book-open::before { content: "\f00bd"; }
.nf-md-cog::before { content: "\f0493"; }
.nf-md-arrow-left::before { content: "\f004d"; }
.nf-md-arrow-up::before { content: "\f005d"; }
.nf-md-chevron-triple-right::before { content: "\f0dbb"; }
.nf-md-chevron-triple-left::before { content: "\f0dba"; }
.nf-md-chevron-triple-down::before { content: "\f0db9"; }
.nf-md-square-outline::before { content: "\f0763"; }
.nf-md-check::before { content: "\f012c"; }
.nf-md-trash-can::before { content: "\f0a79"; }
.nf-md-puzzle::before { content: "\f0431"; }
.nf-md-file-plus::before { content: "\f0752"; }
.nf-md-file-tree::before { content: "\f0645"; }
.nf-md-chevron-down::before { content: "\f0140"; }
.nf-md-chevron-right::before { content: "\f0142"; }
.nf-md-loading::before { content: "\f0772"; }
.nf-md-folder::before { content: "\f024b"; }
.nf-md-calculator::before { content: "\f00ec"; }
.nf-md-clock-outline::before { content: "\f0150"; }
.nf-md-bell::before { content: "\f009a"; }
.nf-md-bell-outline::before { content: "\f009b"; }
.nf-md-bell-off::before { content: "\f009c"; }
.nf-md-power-plug::before { content: "\f06a5"; }
.nf-md-chip::before { content: "\f061a"; }
.nf-md-flash::before { content: "\f0241"; }
.nf-md-console::before { content: "\f018d"; }
.nf-md-note-text-outline::before { content: "\f11d7"; }
.nf-md-format-list-bulleted::before { content: "\f0279"; }
.nf-md-timer::before { content: "\f13ab"; }
.nf-md-file-document-outline::before { content: "\f09ee"; }
.nf-md-content-save::before { content: "\f0193"; }
.nf-md-content-save-edit::before { content: "\f0cfb"; }
.nf-md-language-javascript::before { content: "\f031e"; }
.nf-md-language-python::before { content: "\f0320"; }
.nf-md-language-ruby::before { content: "\f0d2d"; }
.nf-md-language-go::before { content: "\f07d3"; }
.nf-md-language-css3::before { content: "\f031c"; }
.nf-md-language-html5::before { content: "\f031d"; }
.nf-md-language-markdown::before { content: "\f0354"; }
.nf-md-language-rust::before { content: "\f1617"; }

/* ── Chat (Thought / Tool / Error / status lamp) — codepoints read from the
   bundled font, not a cheat sheet. The lamp circle is filled; CSS colours it. ── */
.nf-md-thought-bubble::before { content: "\f07f6"; }
.nf-md-alert::before { content: "\f0026"; }
.nf-md-circle::before { content: "\f0765"; }

/* ── Font Awesome subset (only where Material Design Icons has no glyph) ────── */
.nf-fa-react::before { content: "\f41b"; }
.nf-fa-wikipedia-w::before { content: "\f266"; }
