Files
Juan DenisandClaude Opus 4.8 c20a9f14f2 feat(themes): backend model, API, and registry pipeline (plan 60 Phase 2-3)
Themes are data, not code — so the backend is a simple validated-JSON store,
no zips/checksums/permissions.

- Theme model + migration 078_themes
- theme_tokens.py: server-side mirror of the token whitelist + validators
  (the gate: a malicious/malformed theme never reaches the DB)
- theme_service: bundled-seed loading, import/list/delete, panel default,
  pre-auth public/active
- /api/v1/themes: /installed, /import (admin), DELETE (admin), /default
  get+set (admin), unauthenticated /public/active for login/setup, plus
  /registry + /registry/<slug>/install
- theme_registry_service: offline-tolerant registry fetch (TTL + last-good +
  bundled fallback), mirrors the extension registry pattern
- bundled seed themes synced to app/data/themes + themes_index.json
- 18 proving tests (server-side validation sanitizes url()/;/} smuggling,
  admin gate, panel-default → public/active, offline fallback, install flow)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 00:24:00 -04:00

47 lines
1.4 KiB
JSON

{
"schema_version": 1,
"slug": "gruvbox",
"name": "Gruvbox",
"author": "serverkit",
"version": "1.0.0",
"description": "A warm retro terminal palette with earthy browns and an orange accent.",
"base": "dark",
"builtin": true,
"tokens": {
"dark": {
"--bg-body": "#1d2021",
"--bg-sidebar": "#1b1e1f",
"--surface": "#282828",
"--surface-2": "#3c3836",
"--surface-3": "#504945",
"--surface-hover": "#32302f",
"--border": "#504945",
"--border-soft": "#3c3836",
"--border-strong": "#665c54",
"--text": "#ebdbb2",
"--text-dim": "#d5c4a1",
"--text-faint": "#a89984",
"--text-ghost": "#7c6f64",
"--green": "#b8bb26",
"--green-bg": "rgba(184,187,38,0.14)",
"--amber": "#fabd2f",
"--amber-bg": "rgba(250,189,47,0.14)",
"--red": "#fb4934",
"--red-bg": "rgba(251,73,52,0.14)",
"--cyan": "#83a598",
"--cyan-bg": "rgba(131,165,152,0.14)",
"--violet": "#d3869b",
"--violet-bg": "rgba(211,134,155,0.14)",
"--scrollbar-track": "#282828",
"--scrollbar-thumb": "#504945",
"--scrollbar-thumb-hover": "#665c54",
"--bg-code": "#1d2021",
"--text-code": "#ebdbb2",
"--grid-color": "rgba(235,219,178,0.03)",
"--mono": "\"IBM Plex Mono\", ui-monospace, \"SF Mono\", Menlo, monospace"
}
},
"accent": "#fe8019",
"preview": ["#1d2021", "#282828", "#fe8019", "#ebdbb2"]
}