{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://overa.example/contracts/client-theme-v1.schema.json",
  "title": "Overa client colour configuration",
  "description": "Bounded colour overrides. Contrast validation also applies after Overa, tenant and integration precedence is resolved. Outcome meanings and rendering geometry are not configurable.",
  "type": "object",
  "additionalProperties": false,
  "required": ["schemaVersion", "tokens"],
  "properties": {
    "schemaVersion": { "const": "overa-client-theme-v1" },
    "tokens": { "$ref": "#/$defs/Tokens" }
  },
  "$defs": {
    "Colour": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$",
      "minLength": 7,
      "maxLength": 7
    },
    "Tokens": {
      "type": "object",
      "additionalProperties": false,
      "maxProperties": 21,
      "properties": {
        "accent": { "$ref": "#/$defs/Colour" },
        "accentInk": { "$ref": "#/$defs/Colour" },
        "surface": { "$ref": "#/$defs/Colour" },
        "raisedSurface": { "$ref": "#/$defs/Colour" },
        "text": { "$ref": "#/$defs/Colour" },
        "mutedText": { "$ref": "#/$defs/Colour" },
        "border": { "$ref": "#/$defs/Colour" },
        "focus": { "$ref": "#/$defs/Colour" },
        "selection": { "$ref": "#/$defs/Colour" },
        "labelFill": { "$ref": "#/$defs/Colour" },
        "labelOutline": { "$ref": "#/$defs/Colour" },
        "labelPlate": { "$ref": "#/$defs/Colour" },
        "labelPlateBorder": { "$ref": "#/$defs/Colour" },
        "labelAccent": { "$ref": "#/$defs/Colour" },
        "selectedFill": { "$ref": "#/$defs/Colour" },
        "selectedInk": { "$ref": "#/$defs/Colour" },
        "selectedAccent": { "$ref": "#/$defs/Colour" },
        "destination": { "$ref": "#/$defs/Colour" },
        "zonePrimary": { "$ref": "#/$defs/Colour" },
        "zoneSecondary": { "$ref": "#/$defs/Colour" },
        "zoneOverlap": { "$ref": "#/$defs/Colour" }
      }
    }
  }
}
