summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/theme/desktop-theme.schema.json
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-28 05:12:32 -0600
committerAdam <[email protected]>2025-12-28 05:12:36 -0600
commit4a9ff9412e8daedc36319bd2ee8ca62d5aa52be7 (patch)
treead035366cdebc87d4eea75475201af3d11bd64ed /packages/ui/src/theme/desktop-theme.schema.json
parentd6db6ff198c4513ca5511ae49b03d4277bc21718 (diff)
downloadopencode-4a9ff9412e8daedc36319bd2ee8ca62d5aa52be7.tar.gz
opencode-4a9ff9412e8daedc36319bd2ee8ca62d5aa52be7.zip
feat(desktop): themes
Diffstat (limited to 'packages/ui/src/theme/desktop-theme.schema.json')
-rw-r--r--packages/ui/src/theme/desktop-theme.schema.json104
1 files changed, 104 insertions, 0 deletions
diff --git a/packages/ui/src/theme/desktop-theme.schema.json b/packages/ui/src/theme/desktop-theme.schema.json
new file mode 100644
index 000000000..b60a8f37c
--- /dev/null
+++ b/packages/ui/src/theme/desktop-theme.schema.json
@@ -0,0 +1,104 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://opencode.ai/desktop-theme.json",
+ "title": "OpenCode Desktop Theme",
+ "description": "A theme definition for the OpenCode desktop application",
+ "type": "object",
+ "required": ["name", "id", "light", "dark"],
+ "properties": {
+ "$schema": {
+ "type": "string",
+ "description": "JSON Schema reference"
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable theme name"
+ },
+ "id": {
+ "type": "string",
+ "description": "Unique theme identifier (slug)",
+ "pattern": "^[a-z0-9-]+$"
+ },
+ "light": {
+ "$ref": "#/definitions/ThemeVariant",
+ "description": "Light mode color variant"
+ },
+ "dark": {
+ "$ref": "#/definitions/ThemeVariant",
+ "description": "Dark mode color variant"
+ }
+ },
+ "definitions": {
+ "HexColor": {
+ "type": "string",
+ "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
+ "description": "A hex color value like #fff, #ffff, #ffffff, or #ffffffff"
+ },
+ "ColorValue": {
+ "type": "string",
+ "pattern": "^(#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})|var\(--[a-z0-9-]+\))$",
+ "description": "Either a hex color value (#rgb/#rgba/#rrggbb/#rrggbbaa) or a CSS variable reference"
+ },
+ "ThemeSeedColors": {
+ "type": "object",
+ "description": "The minimum set of colors needed to generate a theme",
+ "required": ["neutral", "primary", "success", "warning", "error", "info", "interactive", "diffAdd", "diffDelete"],
+ "properties": {
+ "neutral": {
+ "$ref": "#/definitions/HexColor",
+ "description": "Base neutral color for generating the gray scale"
+ },
+ "primary": {
+ "$ref": "#/definitions/HexColor",
+ "description": "Primary brand/accent color"
+ },
+ "success": {
+ "$ref": "#/definitions/HexColor",
+ "description": "Success state color (typically green)"
+ },
+ "warning": {
+ "$ref": "#/definitions/HexColor",
+ "description": "Warning state color (typically yellow/orange)"
+ },
+ "error": {
+ "$ref": "#/definitions/HexColor",
+ "description": "Error/critical state color (typically red)"
+ },
+ "info": {
+ "$ref": "#/definitions/HexColor",
+ "description": "Informational state color (typically purple/blue)"
+ },
+ "interactive": {
+ "$ref": "#/definitions/HexColor",
+ "description": "Interactive element color (links, buttons)"
+ },
+ "diffAdd": {
+ "$ref": "#/definitions/HexColor",
+ "description": "Color for diff additions"
+ },
+ "diffDelete": {
+ "$ref": "#/definitions/HexColor",
+ "description": "Color for diff deletions"
+ }
+ }
+ },
+ "ThemeVariant": {
+ "type": "object",
+ "description": "A theme variant (light or dark) with seed colors and optional overrides",
+ "required": ["seeds"],
+ "properties": {
+ "seeds": {
+ "$ref": "#/definitions/ThemeSeedColors",
+ "description": "Seed colors used to generate the full palette"
+ },
+ "overrides": {
+ "type": "object",
+ "description": "Optional direct overrides for any CSS variable (without -- prefix)",
+ "additionalProperties": {
+ "$ref": "#/definitions/ColorValue"
+ }
+ }
+ }
+ }
+ }
+}