{
  "$comment": "Canonical ScreenRig brand palette. Source of truth: brand/style-guide.md. Consumers vendor this file rather than transcribing hexes; a hand-copied hex drifts and nothing detects it. Marketing owns this file. Do not edit it in a consumer repo. brand/check-tokens.py enforces that tokens.css agrees with this file and that brand/tokens.manifest.json pins both.",
  "brandVersion": "screenrig.brand/v1",
  "lineage": {
    "values": "screenRIG palette",
    "method": "Homeplane panel system"
  },
  "ground": {
    "ground": "#2A3547",
    "surface": "#3D4B5F",
    "well": "#202A38"
  },
  "ink": {
    "fg": "#D3D8E0",
    "fgBright": "#FFFFFF",
    "fgMuted": "#9CA3AF"
  },
  "brand": {
    "amber": "#F8B334",
    "blue": "#3F70B7"
  },
  "level": {
    "$comment": "Base hues are ground-only. The lighter card surface puts ember and steel under the 3:1 UI floor, so cards use onSurface. See brand/toast-level-colours.md. This block is the part backend/packages/chrome vendors.",
    "error": { "onGround": "#E6664D", "onSurface": "#EA7D68" },
    "alert": { "onGround": "#DF7F2A", "onSurface": "#E4924A" },
    "info": { "onGround": "#6B9BBC", "onSurface": "#81AAC6" }
  },
  "success": {
    "$comment": "Not a brand accent. Use only for a genuine success state.",
    "green": "#3FAE6A"
  },
  "line": {
    "$comment": "Alpha fractions of ink.fg composited over the ground. Never a picked grey. The three weights are deliberately different: hair is meant to be seen, rule to be felt, track is the unfilled half of a reading. Far keeps all three distinctions at greater strength — the near weights measure 1.42:1 and 1.28:1 against the ground and vanish at distance.",
    "near": { "hair": 0.14, "rule": 0.1, "track": 0.12 },
    "far": { "hair": 0.35, "rule": 0.25, "track": 0.3 }
  },
  "selection": {
    "$comment": "A lift in brightness, not a colour: ink.fg at this alpha over the ground.",
    "fill": 0.18
  },
  "focus": {
    "$comment": "Always visible. On a far surface the ring is the cursor rather than an accent, because D-pad input has no hover — pair it with a non-colour cue.",
    "colour": "#F8B334",
    "near": { "width": "2px", "offset": "2px" },
    "far": { "width": "4px", "offset": "4px" }
  },
  "radius": {
    "control": "2px",
    "card": "4px"
  },
  "gap": {
    "$comment": "Pick from this scale rather than inventing values.",
    "tight": "0.15rem",
    "list": "0.35rem",
    "section": "0.6rem",
    "major": "1rem"
  },
  "type": {
    "family": "Agave Nerd Font",
    "fallback": "ui-monospace, monospace",
    "near": {
      "$comment": "Desk reading distance: site, docs, tools.",
      "pageHeading": "20px",
      "sectionHeading": "15px",
      "body": "13px",
      "caption": "11px",
      "lineHeight": 1.45
    },
    "far": {
      "$comment": "1080p panel read across a room, D-pad input. Roughly 2x near. 20px is an absolute floor; nothing renders below it. Guidance, not a vendored contract — each surface applies it, and each player theme asserts the floor in a local test.",
      "pageHeading": "40px",
      "sectionHeading": "30px",
      "body": "26px",
      "caption": "20px",
      "floor": "20px",
      "lineHeight": 1.45
    }
  },
  "overlay": {
    "$comment": "Error states reach a viewer-visible screen as partial, thin, iconic overlays (decided 2026-08-17). The overlay carries the level colour; the surface underneath never does. It sits over arbitrary customer content, so no contrast ratio against the ground applies to it — it brings its own opaque ground plate. Marks take the BASE level hues, not the card variants, because the plate is ground.",
    "plate": "#2A3547",
    "plateOpacity": 1,
    "markContrastOnPlate": { "error": 3.75, "alert": 4.24, "info": 4.14 },
    "textOnPlate": "#D3D8E0",
    "rejected": {
      "$comment": "Measured. White on a level-filled band is the instinct and the worst option.",
      "whiteOnErrorFill": 3.3,
      "whiteOnAlertFill": 2.91,
      "groundOnErrorFill": 3.75,
      "groundOnAlertFill": 4.24
    }
  },
  "safeArea": {
    "$comment": "Far surfaces only. Overscan and bezel cropping are real on signage hardware. Asserted per player theme alongside the type floor.",
    "fraction": 0.05,
    "at1080p": { "horizontal": "96px", "vertical": "54px" }
  },
  "contrast": {
    "$comment": "Measured WCAG 2.1 ratios, not assumed. Two entries are failures kept deliberately so a consumer cannot rediscover them as bugs.",
    "fgOnGround": 8.64,
    "fgOnSurface": 6.19,
    "fgBrightOnGround": 12.36,
    "fgBrightOnSurface": 8.86,
    "fgMutedOnGround": 4.87,
    "fgMutedOnSurface": 3.49,
    "amberOnGround": 6.76,
    "amberOnSurface": 4.85,
    "blueOnGround": 2.48,
    "blueOnSurface": 1.78,
    "whiteOnBlue": 4.98
  },
  "rules": {
    "blueIsFillOnly": "brand.blue never carries text, a link, a border, or an icon stroke on any ScreenRig ground. White on blue is the only place it touches type.",
    "fgMutedIsGroundOnly": "ink.fgMuted fails on surface. Secondary text inside a card lifts to ink.fg.",
    "levelBaseIsGroundOnly": "level.*.onGround fails or barely passes on surface. Cards use level.*.onSurface.",
    "colourNamesState": "Colour never decorates. More than one or two lit values on a screen is wrong.",
    "colourIsNeverAlone": "Two states in the same place and shape must differ by more than hue.",
    "colourNamesAudience": "The level colours get attention from someone who can act. A persistent surface stays ground and ink whatever the underlying severity; the level colour lives in an overlay on top of it. Toasts and thin iconic overlays may carry a level. The surface beneath may not.",
    "focusIsTheCursorOnFarSurfaces": "No hover exists on D-pad. The focus ring needs increased thickness plus a non-colour cue.",
    "coherenceNotPixelIdentity": "Colour is pinned so every player agrees on it. Geometry and type are applied per surface, so the standard across players is coherence rather than pixel identity."
  }
}
