feat: introduced a token-based theming system across the UI

* feat: added themes system

* feat: smart sidebar auto-hide for files/diff tabs + lower files sidebar threshold

* feat: added Checkbox component and update theming

- Add reusable Checkbox component for toggles across UI
- Replace several inputs with Checkbox in settings and commands panels
- Add DiffIcon and apply surface/border theming to key UI areas

* feat: Add convert-vscode-theme.cjs to convert VS Code themes to OpenChamber format

* refactor: remove unused permission logic from ChatInput

- Remove unused permission rules parsing logic from ChatInput
- Memoize renderTheme in DiffWorkerProvider to avoid unnecessary recalculations
- Remove forceOpaque helper in vscode theme adapter

* fix: guard VSCode theme loading in MarkdownRenderer

* feat: add custom user themes loading and reload

- Load user themes from ~/.config/openchamber/themes at runtime
- Expose /api/config/themes to fetch custom themes
- Allow theme reloading from Settings → Theme → Reload themes in the UI
This commit is contained in:
Bohdan Triapitsyn
2026-02-01 18:29:34 +02:00
committed by GitHub
parent 5bb2c56bc0
commit ddedc02687
147 changed files with 9853 additions and 2435 deletions
@@ -0,0 +1,176 @@
{
"metadata": {
"id": "ayu-dark",
"name": "Ayu",
"description": "Ayu",
"version": "1.0.0",
"variant": "dark",
"tags": [ "dark", "palette" ]
},
"colors": {
"primary": {
"base": "#3FB7E3",
"hover": "#389FC5",
"active": "#5BC1E7",
"foreground": "#0F1419",
"muted": "#3FB7E380",
"emphasis": "#389FC5"
},
"surface": {
"background": "#0F1419",
"foreground": "#D6DAE0",
"muted": "#18222C",
"mutedForeground": "#A3ADBA",
"elevated": "#17202a",
"elevatedForeground": "#D6DAE0",
"overlay": "#FBFBFD20",
"subtle": "#1e252d"
},
"interactive": {
"border": "#2B3440",
"borderHover": "#323C49",
"borderFocus": "#56647C",
"selection": "#c7c7df1d",
"selectionForeground": "#FBFBFD",
"focus": "#3FB7E3",
"focusRing": "#3FB7E340",
"cursor": "#FBFBFD",
"hover": "#b6b6cc1d",
"active": "#b8b8ce1d"
},
"status": {
"error": "#F58572",
"errorForeground": "#0F1419",
"errorBackground": "#F5857220",
"errorBorder": "#F5857250",
"warning": "#E4A75C",
"warningForeground": "#0F1419",
"warningBackground": "#E4A75C20",
"warningBorder": "#E4A75C50",
"success": "#78D05C",
"successForeground": "#0F1419",
"successBackground": "#78D05C20",
"successBorder": "#78D05C50",
"info": "#66C6F1",
"infoForeground": "#0F1419",
"infoBackground": "#66C6F120",
"infoBorder": "#66C6F150"
},
"syntax": {
"base": {
"background": "#18222C",
"foreground": "#D6DAE0",
"comment": "#A3ADBA",
"keyword": "#3FB7E3",
"string": "#B1C74A",
"number": "#F2856F",
"function": "#3FB7E3",
"variable": "#D6DAE0",
"type": "#E4A75C",
"operator": "#F2856F"
},
"tokens": {
"boolean": "#E4A75C",
"class": "#3FB7E3",
"className": "#3FB7E3",
"commentDoc": "#8D96A2",
"constant": "#66C6F1",
"decorator": "#E4A75C",
"enum": "#3FB7E3",
"exception": "#F2856F",
"functionCall": "#3FB7E3",
"interface": "#E4A75C",
"jsxTag": "#3FB7E3",
"key": "#3FB7E3",
"keywordImport": "#F2856F",
"label": "#F2856F",
"macro": "#66C6F1",
"method": "#78D05C",
"module": "#F2856F",
"namespace": "#E4A75C",
"parameter": "#D6DAE0",
"preprocessor": "#F2856F",
"punctuation": "#A3ADBA",
"regex": "#B1C74A",
"storageModifier": "#66C6F1",
"stringEscape": "#FBFBFD",
"struct": "#3FB7E3",
"tag": "#3FB7E3",
"tagAttribute": "#E4A75C",
"tagAttributeValue": "#B1C74A",
"typeParameter": "#E4A75C",
"url": "#66C6F1",
"variableGlobal": "#3FB7E3",
"variableLocal": "#0B1015",
"variableOther": "#78D05C",
"variableProperty": "#66C6F1"
},
"highlights": {
"diffAdded": "#78D05C",
"diffAddedBackground": "#132F27",
"diffModified": "#66C6F1",
"diffModifiedBackground": "#1B2632",
"diffRemoved": "#F58572",
"diffRemovedBackground": "#361D20",
"lineNumber": "#415063",
"lineNumberActive": "#FBFBFD"
}
},
"markdown": {
"heading1": "#D6DAE0",
"heading2": "#D6DAE0",
"heading3": "#D6DAE0",
"heading4": "#D6DAE0",
"link": "#66C6F1",
"linkHover": "#3FB7E3",
"inlineCode": "#B1C74A",
"inlineCodeBackground": "#161d23",
"blockquote": "#E4A75C",
"blockquoteBorder": "#2B3440",
"listMarker": "#3FB7E399"
},
"chat": {
"userMessage": "#D6DAE0",
"userMessageBackground": "#1d2935",
"assistantMessage": "#D6DAE0",
"assistantMessageBackground": "#0F1419",
"timestamp": "#A3ADBA",
"divider": "#2B3440"
},
"tools": {
"background": "#18222C80",
"border": "#414e5f80",
"headerHover": "#080C10",
"icon": "#A3ADBA",
"title": "#D6DAE0",
"description": "#A3ADBA",
"edit": {
"added": "#78D05C",
"addedBackground": "#78D05C25",
"removed": "#F58572",
"removedBackground": "#F5857225",
"lineNumber": "#415063"
}
}
},
"config": {
"fonts": {
"sans": "\"IBM Plex Mono\", monospace",
"mono": "\"IBM Plex Mono\", monospace",
"heading": "\"IBM Plex Mono\", monospace"
},
"radius": {
"none": "0",
"sm": "0.125rem",
"md": "0.375rem",
"lg": "0.5rem",
"xl": "0.75rem",
"full": "9999px"
},
"transitions": {
"fast": "150ms ease",
"normal": "250ms ease",
"slow": "350ms ease"
}
}
}