{
  "$schema": "https://branding.groupgpt.tech/tokens.json",
  "brand": "GroupGPT",
  "tagline": "The social AI",
  "canonical": "https://branding.groupgpt.tech",
  "character": "monochrome grayscale, dark-first, lux not crunchy",
  "hardRule": "No hue accent anywhere. Only --error-red and E2EE green are sanctioned colors. --purple-* tokens are legacy aliases resolving to black/graphite/grey; read values, never token names.",
  "upstream": {
    "vaultNote": "GGPT/GroupGPT Branding.md",
    "liveTokens": ["ggpt-cortex/src/index.css", "ggpt-cortex/src/App.css"],
    "finalArbiter": "the running app — screenshot before styling"
  },
  "color": {
    "core": {
      "--rich-black":  { "value": "#0F1218", "usage": "Base background" },
      "--accent":      { "value": "#1a1a1a", "usage": "Filled buttons, active states, focus, text selection" },
      "--accent-soft": { "value": "#525252", "usage": "Links, icons, hover text" },
      "--text-main":   { "value": "#ffffff", "usage": "Primary text" },
      "--text-muted":  { "value": "rgba(255,255,255,0.55)", "usage": "Secondary text" },
      "--text-dim":    { "value": "rgba(255,255,255,0.4)", "usage": "Placeholder, tertiary text" }
    },
    "state": {
      "--error-red":   { "value": "#ff4444", "usage": "Error states only", "sanctionedHue": true },
      "--e2ee-green":  { "value": "#10b981", "usage": "Encryption badge only", "sanctionedHue": true }
    },
    "surfaces": {
      "--bg-gradient":    { "value": "linear-gradient(180deg,#161616 0%,#5c5c5c 28%,#9a9a9a 55%,#a0a0a0 100%)", "usage": "World chat canvas" },
      "--glass-bg":       { "value": "rgba(0,0,0,0.05)", "usage": "Glass panel fill" },
      "--glass-bg-hover": { "value": "rgba(0,0,0,0.09)", "usage": "Glass panel hover fill" },
      "--surface-dark":   { "value": "rgba(15,18,24,0.8)", "usage": "Dark overlay surfaces" },
      "--input-frost":    { "value": "rgba(225,225,225,0.45)", "usage": "Frosted light composer on dark chat" },
      "scrollbarThumb":   { "value": "rgba(120,120,120,0.2)", "usage": "6px thumb, transparent track" }
    },
    "neuron": {
      "--neuron-left":  { "value": "#dcdcdc", "usage": "Left hemisphere, silver" },
      "--neuron-right": { "value": "#8d8d8d", "usage": "Right hemisphere, graphite" }
    },
    "legacyAliases": {
      "_warning": "NOT purple. Backwards-compatibility names only — never reintroduce a hue behind these.",
      "--purple-mid":    { "value": "#1a1a1a", "mapsTo": "--accent" },
      "--purple-light":  { "value": "#525252", "mapsTo": "--accent-soft", "note": "#2a2a2a in some scopes" },
      "--purple-border": { "value": "rgba(0,0,0,0.14)", "mapsTo": "surface borders" },
      "--purple-glow":   { "value": "0 0 0 3px rgba(0,0,0,0.12)", "mapsTo": "focus ring" }
    }
  },
  "typography": {
    "primary": {
      "family": "League Spartan",
      "weights": [400, 500, 600, 700, 800],
      "fallbacks": ["Geneva", "Verdana", "sans-serif"],
      "import": "https://fonts.googleapis.com/css2?family=League+Spartan:wght@400;500;600;700;800&display=swap",
      "usage": "All UI and body copy",
      "baseLineHeight": 1.6,
      "headlineTracking": "-0.02em to -0.035em at weights 700-800"
    },
    "secondary": {
      "family": "Italiana",
      "weights": [400],
      "import": "https://fonts.googleapis.com/css2?family=Italiana&display=swap",
      "usage": "Display lines, eyebrows, small caps-style labels only. Never body copy or UI labels."
    },
    "rendering": {
      "font-synthesis": "none",
      "-webkit-font-smoothing": "antialiased",
      "text-rendering": "optimizeLegibility"
    },
    "constraint": "Two typefaces only. Never introduce a third family."
  },
  "logo": {
    "class": "app-logo--branded",
    "master": "/assets/logo.png",
    "masterDimensions": "1080x1080 RGBA",
    "shape": "circle, border-radius 50%, object-fit cover, always 1:1",
    "sizes": { "desktop": "105x105px", "mobile": "68px", "narrowMobile": "53px" },
    "border": "4px solid, color set dynamically per room",
    "outline": "3px white at 12% opacity",
    "shadow": "0 4px 24px rgba(0,0,0,0.35)",
    "loginVariant": "login-logo.png — tune login branding there, never via the shared asset",
    "dont": ["square it", "recolor/gradient/tint the mark", "add a bespoke chip or badge behind it", "stretch off 1:1"]
  },
  "shape": {
    "--radius-sm": "8px",
    "--radius-md": "12px",
    "--radius-lg": "20px",
    "avatars": "50% (circle)"
  },
  "layout": {
    "--sidebar-width": "320px",
    "--header-height": "70px",
    "chatColumnMax": "1080px",
    "chatColumnNote": "messages and input share the same vertical lane",
    "sendButton": "44x44px circle, filled --accent",
    "scrollbar": "6px wide, transparent track",
    "minBodyWidth": "320px"
  },
  "designLanguage": {
    "monochrome": "Greyscale only: black -> graphite -> silver -> white. No hue.",
    "glassMorphism": "backdrop-filter blur(10-20px) + rgba(0,0,0,0.05-0.09) fill + rgba(0,0,0,0.14) hairline border",
    "darkFirst": "color-scheme: dark; light surfaces used for the input area only",
    "inputBar": "frosted light rgba(225,225,225,0.45) on dark chat, dark ink text",
    "textSelection": "solid --accent background with white text, everywhere",
    "messageBubbles": "human = light cards; Cortez/bot personas = inverted dark cards with light text. Nested cards inside a bot bubble must be re-tinted for the dark ground.",
    "icons": "inherit color from the surrounding button; no bespoke chips or badges behind a single icon",
    "motion": "card-flip for world<->private switch; otherwise subtle 0.2s ease. No bounce, no spring."
  },
  "copyVoice": {
    "register": "plain language, no hype, no exclamation marks",
    "errors": "say what to do next, not what broke internally",
    "disambiguation": "state distinctions explicitly when two things are easy to confuse"
  },
  "agentRules": [
    "No hue, ever — only --error-red #ff4444 and E2EE green #10b981 are exempt. Convey state with weight, contrast, or inversion.",
    "Never infer a color from a token name; --purple-* resolves to black and grey.",
    "Verify in the running app — the canvas is a grey vertical gradient with frosted light-glass panels and dark ink text, not dark-on-dark. Screenshot before styling.",
    "Use tokens, not literals — a raw hex in a component is a bug unless deliberately added to the token layer.",
    "Two typefaces only: League Spartan everywhere, Italiana 400 for display.",
    "Glass over flat — new panels get backdrop-filter blur, a translucent fill, and a hairline border.",
    "No one-off treatments — a bespoke chip or badge nothing else has is a signal to remove the exception, not add it.",
    "Keep the composer in the message lane — chat column max 1080px, shared by the input.",
    "Motion stays quiet at 0.2s ease; the world/private card-flip is the only expressive transition.",
    "When docs and code disagree, the rendered app wins — then fix the docs."
  ]
}
