{
  "$schema": "https://design-tokens.github.io/community-group/format/",
  "$description": "PurpletGo brand tokens: the one source the marketing site, the app and the brand page read from. Edit here; never retype a value elsewhere.",
  "name": "PurpletGo",
  "color": {
    "brand": {
      "$description": "The violet ramp. 600 is the brand violet, #5f31dd: the logo tile, primary buttons, the headline accent. 50 to 200 tint surfaces; 700 to 900 are text on light and the deep end of gradients.",
      "50": "#f4f0ff",
      "100": "#ece5ff",
      "200": "#ded2fe",
      "300": "#c5b1fc",
      "400": "#a284f5",
      "500": "#815aed",
      "600": "#5f31dd",
      "700": "#4d22c3",
      "800": "#401e9f",
      "900": "#361c7d"
    },
    "ink": {
      "$description": "Text on light surfaces. Default for headings and body, muted for secondary copy, faint for labels and captions. Never pure black.",
      "default": "#12101c",
      "muted": "#565273",
      "faint": "#6e6a88"
    },
    "surface": {
      "$description": "Light surfaces. The page is white; tinted bands and the app's ground use brand-50 at low alpha, never a flat grey.",
      "page": "#ffffff",
      "ground": "#f9f8fc",
      "sunk": "#f1eff5",
      "rule": "#e4e0eb"
    },
    "night": {
      "$description": "The dark surfaces: the station sign, the departure board, the app's dark theme. Violet-black, never neutral black.",
      "sign": "#2a2150",
      "frame": "#1f1838",
      "deep": "#16112b",
      "app": "#130f1a"
    },
    "status": {
      "$description": "One hue per meaning. A fill carries white text; the ink variant is for text on a light ground. Revocation and danger share crimson so that nothing else is ever red.",
      "success": {
        "fill": "#14714c",
        "ink": "#0f5a3c",
        "soft": "#e3f5ec"
      },
      "warning": {
        "fill": "#f59e0b",
        "ink": "#9a5b0b",
        "soft": "#fbf0dc"
      },
      "info": {
        "fill": "#0ea5e9",
        "ink": "#0b5f82",
        "soft": "#e2f3fb"
      },
      "danger": {
        "fill": "#d9344f",
        "ink": "#a71b2e",
        "soft": "#fde8ec"
      }
    },
    "accent": {
      "$description": "Colours that belong to the station world only: the brass of the train and the headlamp. Never used in the interface.",
      "brass": "#e2b45e",
      "brassDark": "#c99a45",
      "lamp": "#fde68a",
      "buffer": "#e5485f"
    }
  },
  "typography": {
    "family": {
      "sans": "Plus Jakarta Sans",
      "mono": "JetBrains Mono",
      "fallbackSans": "system-ui, -apple-system, 'Segoe UI', sans-serif",
      "fallbackMono": "ui-monospace, 'SF Mono', Menlo, monospace"
    },
    "weight": {
      "regular": 400,
      "medium": 500,
      "semibold": 600,
      "bold": 700,
      "extrabold": 800
    },
    "style": {
      "$description": "Named styles. Size in px, line height unitless, tracking in em.",
      "display": {
        "size": 48,
        "lineHeight": 1.06,
        "tracking": -0.035,
        "weight": 800
      },
      "h1": {
        "size": 40,
        "lineHeight": 1.08,
        "tracking": -0.03,
        "weight": 800
      },
      "h2": {
        "size": 30,
        "lineHeight": 1.15,
        "tracking": -0.02,
        "weight": 800
      },
      "h3": {
        "size": 20,
        "lineHeight": 1.3,
        "tracking": -0.01,
        "weight": 700
      },
      "lede": {
        "size": 18,
        "lineHeight": 1.6,
        "tracking": 0,
        "weight": 400
      },
      "body": {
        "size": 15,
        "lineHeight": 1.6,
        "tracking": 0,
        "weight": 400
      },
      "small": {
        "size": 13,
        "lineHeight": 1.5,
        "tracking": 0,
        "weight": 400
      },
      "eyebrow": {
        "size": 11,
        "lineHeight": 1.2,
        "tracking": 0.14,
        "weight": 600,
        "transform": "uppercase"
      },
      "sign": {
        "size": 13,
        "lineHeight": 1.2,
        "tracking": 0.22,
        "weight": 800,
        "transform": "uppercase"
      }
    }
  },
  "radius": {
    "$description": "In px. Controls use 12; cards 16 to 24; the logo tile is 7 on a 24 grid, which is 29 percent of its side.",
    "control": 12,
    "card": 16,
    "panel": 24,
    "pill": 999,
    "logoTileRatio": 0.29
  },
  "shadow": {
    "$description": "Layered and tinted toward the violet, never neutral black: a tight contact shadow under a wide ambient one.",
    "card": "0 1px 2px rgba(54,28,125,0.08), 0 4px 12px -4px rgba(54,28,125,0.11), 0 12px 32px -12px rgba(54,28,125,0.10)",
    "lift": "0 2px 4px rgba(54,28,125,0.05), 0 10px 24px -8px rgba(54,28,125,0.10), 0 24px 48px -20px rgba(54,28,125,0.18)",
    "button": "0 1px 2px rgba(54,28,125,0.16), 0 4px 12px -2px rgba(95,49,221,0.34)"
  },
  "logo": {
    "$description": "The mark is a door frame with an exit arrow on a violet tile. Everything about the lockup is a ratio of the tile's side T: the wordmark is Plus Jakarta Sans 800 at 0.6 T with tracking -0.02em, the gap between tile and wordmark is 0.3 T, clear space is 0.5 T on every side. The SVG draws the tile's corners (0.29 T); never round it again with CSS. Minimum size is 16 px for the tile, 24 px with the wordmark.",
    "tile": "#5f31dd",
    "glyph": "#ffffff",
    "wordmarkRatio": 0.6,
    "gapRatio": 0.3,
    "wordmarkWeight": 800,
    "wordmarkTracking": -0.02,
    "clearSpaceRatio": 0.5,
    "cornerRatio": 0.29,
    "minTilePx": 16,
    "minLockupPx": 24
  },
  "voice": {
    "$description": "How PurpletGo writes.",
    "rules": [
      "Say what the system did, not what the tool did. A system is revoked only when the vendor confirms it.",
      "Name failures plainly. A 403 is a 403, in the log, until it is resolved.",
      "Sentence case everywhere, including buttons and menu labels. Product names and acronyms keep their capitals.",
      "Hyphens, never em dashes.",
      "No certifications are claimed. The product produces evidence for audits; it does not hold the certificate.",
      "Sample data is labelled as a sample and uses a fictional name.",
      "Plans are Starter, Team and Enterprise, written with a capital. Features not on every plan say which plan has them."
    ]
  },
  "world": {
    "$description": "The station world: the one picture that belongs to PurpletGo. A departure is a train leaving; each connected system is a wagon coupled to it; the station sign reads DEPARTURE; the board on the platform shows each system reporting back.",
    "objects": [
      "locomotive",
      "carriage",
      "wagon",
      "station sign",
      "departure board",
      "railway line",
      "platform"
    ],
    "palette": {
      "sign": "#2a2150",
      "frame": "#1f1838",
      "coach": "#5f31dd",
      "cab": "#4d22c3",
      "roof": "#ded2fe",
      "post": "#c5b1fc",
      "rail": "#b9a6f6",
      "sleeper": "#e3d9fd",
      "bed": "#f4f0ff",
      "brass": "#e2b45e",
      "glass": "#fcd34d"
    }
  }
}
