{
  "$description": "Design tokens of the Theis Lab identity: the single source for colours, type, space, shape, motion and layout. pnpm gen turns it into src/styles/tokens.css and src/styles/fonts.css; the wiki copies this file. See brand/README.md.",
  "color": {
    "$description": "Every colour has a light (paper) and a dark (night) value. Text colours meet WCAG 2.2 AA on bg, surface and sunken; the pairs are listed under contrast and checked by pnpm gen.",
    "bg": { "light": "#FAF9F6", "dark": "#07090D", "use": "page background; the hero canvas is cleared to it" },
    "surface": { "light": "#FFFFFF", "dark": "#0D1016", "use": "raised areas: dialogs, cards, the sticky header" },
    "sunken": { "light": "#F1EFEA", "dark": "#040508", "use": "code blocks, wells, the footer" },
    "ink": { "light": "#0E1218", "dark": "#EDEFF3", "use": "primary text" },
    "ink-muted": { "light": "#48515E", "dark": "#A7AFBC", "use": "secondary text, ledes" },
    "ink-subtle": { "light": "#636C78", "dark": "#7F8898", "use": "metadata, captions, placeholders" },
    "line": { "light": "#E2E0D9", "dark": "#1C212A", "use": "hairline rules between blocks" },
    "line-strong": { "light": "#C6C3BA", "dark": "#2C333F", "use": "emphasised rules, panel tops" },
    "line-control": {
      "light": "#868379",
      "dark": "#5E6676",
      "use": "outline of inputs and controls (3:1 against their background)"
    },
    "accent": {
      "light": "#D9381E",
      "dark": "#FF6A4D",
      "use": "graphics and large marks; never a large background fill"
    },
    "accent-ink": { "light": "#B42E17", "dark": "#FF8A70", "use": "accent text and links in an active state" },
    "accent-soft": { "light": "#FBE9E4", "dark": "#2A1410", "use": "tint behind an accent element, text selection" },
    "focus": { "light": "#2F5BEA", "dark": "#8FB0FF", "use": "keyboard focus outline" },
    "stem": { "light": "#1B2330", "dark": "#E9EDF5", "use": "progenitor cells in the hero; neutral data" },
    "data-1": { "light": "#2F5BEA", "dark": "#6F9BFF", "use": "categorical data and fates, blue" },
    "data-2": { "light": "#6D43E0", "dark": "#9E84FF", "use": "categorical data and fates, violet" },
    "data-3": { "light": "#B833C4", "dark": "#DB7BEA", "use": "categorical data and fates, magenta" },
    "data-4": { "light": "#D6336C", "dark": "#FF7A9C", "use": "categorical data and fates, rose" },
    "data-5": { "light": "#E8590C", "dark": "#FF8F5E", "use": "categorical data and fates, orange" },
    "data-6": { "light": "#B7791F", "dark": "#FFC65C", "use": "categorical data and fates, amber" },
    "data-7": { "light": "#0B8F7A", "dark": "#56DCC6", "use": "categorical data and fates, teal" },
    "data-8": { "light": "#3D7EA6", "dark": "#7CC4F0", "use": "categorical data and fates, steel" },
    "ramp-1": { "light": "#1F2F86", "dark": "#2B3A8F", "use": "sequential scale (pseudotime), start" },
    "ramp-2": { "light": "#5B34B8", "dark": "#6A4BC4", "use": "sequential scale" },
    "ramp-3": { "light": "#B02C9E", "dark": "#C255B8", "use": "sequential scale" },
    "ramp-4": { "light": "#E0523A", "dark": "#FF7A6B", "use": "sequential scale" },
    "ramp-5": { "light": "#C98A12", "dark": "#FFD27A", "use": "sequential scale, end" }
  },
  "contrast": {
    "$description": "Pairs checked by pnpm gen in both modes. text: WCAG 2.2 AA 4.5:1 for body text. ui: 3:1 for focus rings, control outlines and graphic marks (WCAG 1.4.11).",
    "text": [
      ["ink", "bg"],
      ["ink", "surface"],
      ["ink", "sunken"],
      ["ink", "accent-soft"],
      ["ink-muted", "bg"],
      ["ink-muted", "surface"],
      ["ink-muted", "sunken"],
      ["ink-subtle", "bg"],
      ["ink-subtle", "surface"],
      ["ink-subtle", "sunken"],
      ["accent-ink", "bg"],
      ["accent-ink", "surface"],
      ["accent-ink", "sunken"],
      ["accent-ink", "accent-soft"],
      ["bg", "ink"],
      ["focus", "bg"]
    ],
    "ui": [
      ["focus", "bg"],
      ["focus", "surface"],
      ["focus", "sunken"],
      ["line-control", "bg"],
      ["line-control", "surface"],
      ["line-control", "sunken"],
      ["accent", "bg"],
      ["accent", "surface"],
      ["data-1", "bg"],
      ["data-2", "bg"],
      ["data-3", "bg"],
      ["data-4", "bg"],
      ["data-5", "bg"],
      ["data-6", "bg"],
      ["data-7", "bg"],
      ["data-8", "bg"]
    ]
  },
  "font": {
    "$description": "Self-hosted variable fonts copied from the Fontsource packages named in source (see brand/README.md). Each family has a metric-adjusted fallback face so the swap does not move the layout; the overrides were measured against the named local font.",
    "families": {
      "serif": {
        "name": "Newsreader",
        "source": "@fontsource-variable/newsreader",
        "weights": "200 800",
        "stack": ["Newsreader", "Newsreader fallback", "Times New Roman", "serif"],
        "fallback": {
          "local": "Times New Roman",
          "size-adjust": "105.45%",
          "ascent-override": "69.70%",
          "descent-override": "25.13%",
          "line-gap-override": "0%"
        }
      },
      "sans": {
        "name": "Geist",
        "source": "@fontsource-variable/geist",
        "weights": "100 900",
        "stack": ["Geist", "Geist fallback", "Arial", "system-ui", "sans-serif"],
        "fallback": {
          "local": "Arial",
          "size-adjust": "105.53%",
          "ascent-override": "95.23%",
          "descent-override": "27.95%",
          "line-gap-override": "0%"
        }
      },
      "mono": {
        "name": "Geist Mono",
        "source": "@fontsource-variable/geist-mono",
        "weights": "100 900",
        "stack": ["Geist Mono", "Geist Mono fallback", "Courier New", "ui-monospace", "monospace"],
        "fallback": {
          "local": "Courier New",
          "size-adjust": "100%",
          "ascent-override": "100.52%",
          "descent-override": "29.50%",
          "line-gap-override": "0%"
        }
      }
    },
    "subsets": {
      "latin": "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",
      "latin-ext": "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"
    },
    "faces": [
      {
        "family": "serif",
        "style": "normal",
        "subset": "latin",
        "file": "newsreader-latin-wght-normal.woff2",
        "preload": true
      },
      { "family": "serif", "style": "normal", "subset": "latin-ext", "file": "newsreader-latin-ext-wght-normal.woff2" },
      { "family": "serif", "style": "italic", "subset": "latin", "file": "newsreader-latin-wght-italic.woff2" },
      {
        "family": "sans",
        "style": "normal",
        "subset": "latin",
        "file": "geist-latin-wght-normal.woff2",
        "preload": true
      },
      { "family": "sans", "style": "normal", "subset": "latin-ext", "file": "geist-latin-ext-wght-normal.woff2" },
      { "family": "mono", "style": "normal", "subset": "latin", "file": "geist-mono-latin-wght-normal.woff2" },
      { "family": "mono", "style": "normal", "subset": "latin-ext", "file": "geist-mono-latin-ext-wght-normal.woff2" }
    ]
  },
  "type": {
    "$description": "Type scale. Each step sets family, size, line height, weight and tracking; fluid sizes use clamp. Emitted as --type-<step>-<property> and as the utility class .type-<step>.",
    "display-1": {
      "family": "serif",
      "size": "clamp(2.75rem, 1.2rem + 6.2vw, 6.5rem)",
      "leading": "0.98",
      "weight": "320",
      "tracking": "-0.03em"
    },
    "display-2": {
      "family": "serif",
      "size": "clamp(2.25rem, 1.5rem + 3vw, 4rem)",
      "leading": "1.04",
      "weight": "340",
      "tracking": "-0.025em"
    },
    "h2": {
      "family": "serif",
      "size": "clamp(1.6rem, 1.2rem + 1.4vw, 2.25rem)",
      "leading": "1.12",
      "weight": "380",
      "tracking": "-0.015em"
    },
    "h3": { "family": "serif", "size": "1.25rem", "leading": "1.3", "weight": "450", "tracking": "-0.005em" },
    "lead": { "family": "serif", "size": "1.25rem", "leading": "1.5", "weight": "380", "tracking": "0em" },
    "body": { "family": "sans", "size": "1rem", "leading": "1.6", "weight": "400", "tracking": "0em" },
    "prose": { "family": "serif", "size": "1.1875rem", "leading": "1.62", "weight": "400", "tracking": "0em" },
    "small": { "family": "sans", "size": "0.875rem", "leading": "1.5", "weight": "400", "tracking": "0em" },
    "micro": {
      "family": "mono",
      "size": "0.75rem",
      "leading": "1.4",
      "weight": "450",
      "tracking": "0.08em",
      "transform": "uppercase"
    },
    "plate": {
      "family": "serif",
      "size": "clamp(2.5rem, 1rem + 3.8vw, 4.75rem)",
      "leading": "0.98",
      "weight": "320",
      "tracking": "-0.03em"
    },
    "cover": {
      "family": "serif",
      "size": "clamp(2rem, 0.8rem + 2.4vw, 3.25rem)",
      "leading": "1",
      "weight": "330",
      "tracking": "-0.025em"
    },
    "plate-name": { "family": "serif", "size": "0.9375rem", "leading": "1.25", "weight": "400", "tracking": "0em" },
    "numeral": {
      "family": "serif",
      "size": "clamp(2.5rem, 1.6rem + 3vw, 4.25rem)",
      "leading": "1",
      "weight": "300",
      "tracking": "-0.03em"
    }
  },
  "space": {
    "$description": "Spacing on a 4 px base, in rem so it follows the reader's font size.",
    "1": "0.25rem",
    "2": "0.5rem",
    "3": "0.75rem",
    "4": "1rem",
    "5": "1.5rem",
    "6": "2rem",
    "7": "3rem",
    "8": "4rem",
    "9": "6rem",
    "10": "8rem",
    "11": "12rem"
  },
  "weight": {
    "$description": "Font weights outside the type steps, for emphasis inside a step.",
    "regular": "400",
    "medium": "500",
    "strong": "620"
  },
  "tracking": {
    "$description": "Letter spacing outside the type steps.",
    "tight": "-0.01em"
  },
  "opacity": {
    "$description": "Opacity of dimmed and disabled elements.",
    "dim": "0.35",
    "disabled": "0.45"
  },
  "radius": {
    "control": "2px",
    "media": "6px",
    "round": "50%"
  },
  "size": {
    "$description": "Fixed measures used by components.",
    "hairline": "1px",
    "focus-width": "2px",
    "focus-offset": "2px",
    "touch": "2.75rem",
    "icon": "1.125rem",
    "dot": "0.5rem",
    "dot-sm": "0.375rem",
    "icon-sm": "0.875rem",
    "target": "1.5rem",
    "underline-offset": "0.22em",
    "underline-offset-wide": "0.45em",
    "code": "0.9em",
    "mark": "1.6em",
    "avatar-sm": "2.5rem",
    "avatar-md": "4rem",
    "avatar-lg": "8rem",
    "rise": "12px",
    "blur": "12px",
    "halo": "0.2rem",
    "halo-stroke": "0.2rem",
    "card-min": "17rem",
    "stat-min": "10rem",
    "person-min": "13rem",
    "registration": "1.25rem",
    "mark-number": "1.375rem",
    "lineage": "3px",
    "target-bar": "2rem",
    "menu-row": "2.75rem",
    "dial": "1.75rem"
  },
  "motion": {
    "fast": "120ms",
    "base": "240ms",
    "slow": "600ms",
    "sheet": "160ms",
    "ease": "cubic-bezier(0.2, 0.8, 0.2, 1)"
  },
  "layout": {
    "page-max": "90rem",
    "gutter": "clamp(1rem, 4vw, 3rem)",
    "columns": "12",
    "column-gap": "clamp(1rem, 2vw, 2rem)",
    "measure": "68ch",
    "measure-narrow": "44ch",
    "header-height": "3.5rem",
    "header-height-narrow": "3rem",
    "bar-brand": "9rem",
    "bar-tools": "11rem",
    "bar-gap": "1rem",
    "sheet-max": "40rem",
    "dialog-max": "40rem",
    "headline": "14ch",
    "headline-wide": "20ch",
    "label-wide": "16ch",
    "date": "7.5rem",
    "kind": "5.5rem",
    "label": "22ch",
    "plate-min": "34rem",
    "numeral": "3.5rem",
    "plate-headline": "24ch",
    "plate-name": "13rem",
    "plate-names": "3.5rem",
    "circuit-max": "72rem",
    "circuit-height": "12rem",
    "cover-base": "6rem",
    "cover-stage-narrow": "46svh"
  },
  "z": {
    "header": "20",
    "banner": "30",
    "sheet": "40"
  }
}
