/* ETLYON RAG Console — register contract, v2
   Separate design law for the CONSOLE surface.
   This file exists so the marketing brand system (Playfair Display, editorial
   accents, generous whitespace) can never reskin the tool into a brochure.

   Register: ETLYON + black. State-of-the-art operational console.
   Reference class: Linear's craft at Grafana's density.
   Dark is the default; light is the toggle. The top bar is dark in both.

   RULES THIS FILE ENCODES
   1. Two type sizes per view. Hierarchy by weight and colour, never by more sizes.
   2. Monospace ONLY for hashes, artifact keys, IDs, paths, byte sizes, code, Q-tags.
      Filenames, failure reasons, statuses, timestamps and counts are SANS with
      font-variant-numeric: tabular-nums.
   3. Borders at region boundaries only. Rows separate by background delta and hover.
   4. One small non-numeric signal per row (stage chip, completion bar) so the eye
      scans shapes before it reads digits.
   5. Row height 30px. No serif anywhere. No radius above 2px. No shadows except
      the two overlay surfaces (slide-over, command palette).
   6. Colour means exactly one thing each: accent = links and active state,
      danger = failure, ok = healthy. Never overlap.
   7. Micro-visualisation inside rows is allowed. Dashboards are Gate 7.
   8. Every view states its data age and offers a manual refresh. Silent
      staleness is how operators stop believing screens.
   9. Loading is a designed state: skeleton rows, never spinners, never layout
      jump. Slide-over shells open instantly and fill in.
  10. Keyboard-complete. Visible focus ring, 2px accent. Esc closes overlays.
  11. Show the artifact, do not merely link to it. The bundle is markdown —
      render it inline, with the open-in-Nextcloud link beside it.
  12. Corrections are new generations, never edits. Every generation is kept and
      addressable. A diff is the only honest way to show one replacing another,
      and a removal that was not replaced is called out, not left to the eye.
  13. Two gate vocabularies, never mixed. GATE n = built later, shipped visible
      and disabled. OPERATOR DECISION = the designer has no authority here;
      the question stays on screen until the operator answers it.
  14. Every text colour clears 4.5:1 against the surface it sits on. There is no
      decorative grey in this file — exactly one grey exists, and it is the
      search placeholder. Hierarchy is carried by weight, case and space.
*/

:root {
  /* dark — default */
  --c-chrome:    #0E0F10;   /* top bar, dark in both themes */
  --c-bg:        #121314;   /* app background. never #000 — halation */
  --c-raised:    #191A1C;   /* tables, panels, rail */
  --c-hover:     #1E2022;   /* row hover, inputs */
  --c-line:      #33363A;   /* hairline — REGION BOUNDARIES ONLY */
  --c-t1:        #F5F3ED;   /* primary text */
  --c-t2:        #E0DED7;   /* secondary — near-white, 13:1 */
  --c-t3:        #CBC8C0;   /* tertiary — near-white, 11:1. NOT grey.
                               t3 carries every section label, column header and
                               footnote in the console. There is exactly ONE grey
                               permitted on this surface: the search placeholder.
                               Everything else is legible or it does not ship.
                               Because t2 and t3 now sit within 8% of each other,
                               COLOUR NO LONGER CARRIES HIERARCHY. Weight (600 vs
                               400), case (uppercase micro labels) and space
                               (18px above a section label, 7px below) do. If a
                               screen reads flat, add space — never dim text. */
  --c-acc:       #3E9483;   /* ETLYON green lifted ~18L for dark */
  --c-acc-dim:   #2C6B5F;
  --c-ok:        #5FA97C;
  --c-bad:       #E5484D;   /* never #C8102E on dark — it vibrates */
  --c-bad-wash:  #2A1517;
  --c-warn:      #D9A441;
  --c-track:     #33363A;   /* failure-bar track */
  --c-gate:      #6E6A62;   /* gated affordance border, and "not yet observable" */
  --c-placeholder: #B5B2AA; /* the one permitted recession: search placeholder.
                               Still light enough to read at a glance — a placeholder
                               nobody can read is a blank box. */
  --c-ok-wash:   #14201A;   /* diff addition */

  /* type — RATIOS, NOT PIXELS. Every size is rem against the browser's own base,
     which the console must never override: the operator works at a raised zoom
     and a hardcoded base silently cancels it. There is no html{font-size} rule
     in the reference implementation, and adding one is a contract breach.
     DEV-102 (Alain 2026-08-18): enlarge live type to larger standards so the
     felt canvas size matches Design. At a default 16px base the ramp renders
     13 / 14 / 15 / 16 / 17 / 18 / 20 / 28 px (--t-nano … --t-stat); at a 20px
     base it scales with the reader. Two sizes still carry most views
     (--t-body / --t-label); --t-stat is the one live-ops hero figure size.
     Nothing hardcodes a px font size — if you need a size that is not here,
     add it here first. */
  --f-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --f-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
  --t-read:  1.1875rem; /* rendered artifact heading — the only prose size */
  --t-body:  1.125rem;  /* default: table cells, panel body. THE BASE. */
  --t-sm:    1.0625rem; /* mono runs, secondary rows */
  --t-xs:    1rem;      /* mono code blocks, tight nested rows */
  --t-label: 0.9375rem; /* metadata, toolbars, footnotes */
  --t-micro: 0.875rem;  /* uppercase column and section labels */
  --t-nano:  0.8125rem; /* gate tags */
  --t-glyph: 1.25rem;   /* the close × */
  --t-chrome: 1.25rem;  /* top bar only: wordmark, search, the chat link. */
  --t-stat:  1.75rem;   /* live-ops hero: journey position / rate, gauges */

  --row: 2.5rem;          /* comfortable — density toggle drops to 2.125rem.
                             Rows are rem too: a row that does not grow with its
                             text clips it at a raised base. */
}

[data-density="compact"] { --row: 2.125rem; }

[data-theme="light"] {
  --c-chrome:    #1A1A1A;
  --c-bg:        #F7F6F3;
  --c-raised:    #FFFFFF;
  --c-hover:     #EEF5F2;
  --c-line:      #D0D8E0;
  --c-t1:        #1A1A1A;
  --c-t2:        #3A3A3A;
  --c-t3:        #55595F;
  --c-acc:       #1F5E55;
  --c-acc-dim:   #B8D4CD;
  --c-ok:        #2F7A5A;
  --c-bad:       #C8102E;
  --c-bad-wash:  #FDF6F7;
  --c-warn:      #A86B1A;
  --c-track:     #E4E8EC;
  --c-gate:      #9AA4AE;
  --c-ok-wash:   #F1F7F3;
  --c-placeholder: #5F666D;
}
