{
  "$description": "afrigov core tokens. Country-neutral. Country packs in tokens/packs/ override the colour.primary group and add official colours. Format follows the W3C Design Tokens Community Group draft. Values become CSS custom properties prefixed --ag-.",
  "color": {
    "$type": "color",
    "ink": { "$value": "#1b1b1b", "$description": "Body text. 16:1 on paper." },
    "ink-muted": { "$value": "#505050", "$description": "Secondary text, hints. 8:1 on paper." },
    "ink-inverse": { "$value": "#ffffff", "$description": "Text on dark or primary backgrounds." },
    "paper": { "$value": "#ffffff", "$description": "Page background." },
    "paper-alt": { "$value": "#f3f3f3", "$description": "Alternate background for stripes and panels." },
    "paper-dark": { "$value": "#1b1b1b", "$description": "Footer and inverse panels." },
    "border": { "$value": "#c9c9c9", "$description": "Decorative borders and dividers." },
    "border-strong": { "$value": "#767676", "$description": "Form control borders. 4.5:1 on paper." },
    "primary": {
      "$value": "#1f4e79",
      "$description": "Country-neutral default. Packs override this. Must be 4.5:1 on paper."
    },
    "primary-hover": { "$value": "#163a5b" },
    "on-primary": { "$value": "#ffffff", "$description": "Text on primary. Build verifies 4.5:1." },
    "primary-tint": { "$value": "#e8eef5", "$description": "Very light primary for selected rows and panels." },
    "accent": {
      "$value": "#1f4e79",
      "$description": "Second brand colour. Packs override. Decorative, or a background with on-accent text."
    },
    "on-accent": {
      "$value": "#ffffff",
      "$description": "Text on accent. Ink or white, whichever reads better. Build verifies 4.5:1."
    },
    "link": { "$value": "{color.primary}" },
    "link-hover": { "$value": "{color.primary-hover}" },
    "link-visited": { "$value": "#5b2a86" },
    "focus": {
      "$value": "#ffbf47",
      "$description": "Focus ring. Always paired with an ink outer ring so it survives any background."
    },
    "success": { "$value": "#00703c" },
    "success-tint": { "$value": "#e6f2ec" },
    "warning": { "$value": "#8a5700" },
    "warning-tint": { "$value": "#fdf3e1" },
    "error": { "$value": "#b00020" },
    "error-tint": { "$value": "#fbe9ec" },
    "info": { "$value": "#1d70b8" },
    "info-tint": { "$value": "#e8f1f8" }
  },
  "font": {
    "family-sans": {
      "$type": "fontFamily",
      "$value": ["system-ui", "Noto Sans", "Roboto", "Segoe UI", "Helvetica Neue", "Arial", "sans-serif"],
      "$description": "System fonts only, zero network cost. Noto Sans is named early because it covers the Latin Extended ranges that Yoruba, Hausa, Igbo, Wolof and Fula need."
    },
    "family-mono": {
      "$type": "fontFamily",
      "$value": ["ui-monospace", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "monospace"]
    },
    "size-xs": {
      "$type": "dimension",
      "$value": "0.875rem",
      "$description": "14px. Smallest size allowed for running text."
    },
    "size-sm": { "$type": "dimension", "$value": "1rem", "$description": "16px. Body text minimum." },
    "size-md": {
      "$type": "dimension",
      "$value": "1.125rem",
      "$description": "18px. Lead paragraphs, and body text under data-ag-density=large."
    },
    "size-lg": { "$type": "dimension", "$value": "1.25rem" },
    "size-xl": { "$type": "dimension", "$value": "1.5rem" },
    "size-2xl": { "$type": "dimension", "$value": "2rem" },
    "size-3xl": { "$type": "dimension", "$value": "2.5rem" },
    "size-4xl": { "$type": "dimension", "$value": "3rem" },
    "weight-normal": { "$type": "fontWeight", "$value": 400 },
    "weight-bold": { "$type": "fontWeight", "$value": 700 },
    "leading-tight": { "$type": "number", "$value": 1.2 },
    "leading-base": {
      "$type": "number",
      "$value": 1.55,
      "$description": "Generous for diacritics and low-literacy readers."
    },
    "leading-loose": { "$type": "number", "$value": 1.75 }
  },
  "space": {
    "$type": "dimension",
    "1": { "$value": "0.25rem" },
    "2": { "$value": "0.5rem" },
    "3": { "$value": "0.75rem" },
    "4": { "$value": "1rem" },
    "5": { "$value": "1.5rem" },
    "6": { "$value": "2rem" },
    "7": { "$value": "3rem" },
    "8": { "$value": "4rem" }
  },
  "size": {
    "$type": "dimension",
    "target": { "$value": "3rem", "$description": "48px minimum touch target." },
    "measure": { "$value": "65ch", "$description": "Maximum line length for running text." },
    "container": { "$value": "72rem" },
    "control-border": { "$value": "2px" },
    "radius": { "$value": "0.25rem", "$description": "Buttons and small controls." },
    "radius-field": { "$value": "0rem", "$description": "Text fields, selects and the search box. Square by default." },
    "radius-surface": {
      "$value": "0rem",
      "$description": "Cards, panels, alerts and empty states. Square by default."
    },
    "focus-ring": { "$value": "3px" }
  },
  "breakpoint": {
    "$type": "dimension",
    "sm": { "$value": "40em", "$description": "640px" },
    "md": { "$value": "48em", "$description": "768px" },
    "lg": { "$value": "64em", "$description": "1024px" }
  }
}
