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": "nightowl-light",
"name": "Night Owl",
"description": "Night Owl",
"version": "1.0.0",
"variant": "light",
"tags": [ "light", "palette" ]
},
"colors": {
"primary": {
"base": "#4876D6",
"hover": "#6C91DD",
"active": "#4168BA",
"foreground": "#FBFBFB",
"muted": "#4876D680",
"emphasis": "#6C91DD"
},
"surface": {
"background": "#FBFBFB",
"foreground": "#403F53",
"muted": "#F0F0F0",
"mutedForeground": "#555a5a",
"elevated": "#FFFFFF",
"elevatedForeground": "#403F53",
"overlay": "#1A1A1A20",
"subtle": "#F0F0F0"
},
"interactive": {
"border": "#D9D9D9",
"borderHover": "#CCCCCC",
"borderFocus": "#4876D6",
"selection": "#706e6e22",
"selectionForeground": "#1A1A1A",
"focus": "#4876D6",
"focusRing": "#4876D640",
"cursor": "#1A1A1A",
"hover": "#706e6e16",
"active": "#706e6e22"
},
"status": {
"error": "#DE3D3B",
"errorForeground": "#FBFBFB",
"errorBackground": "#DE3D3B20",
"errorBorder": "#DE3D3B50",
"warning": "#C96765",
"warningForeground": "#FBFBFB",
"warningBackground": "#C9676520",
"warningBorder": "#C9676550",
"success": "#2AA298",
"successForeground": "#FBFBFB",
"successBackground": "#2AA29820",
"successBorder": "#2AA29850",
"info": "#4876D6",
"infoForeground": "#FBFBFB",
"infoBackground": "#4876D620",
"infoBorder": "#4876D650"
},
"syntax": {
"base": {
"background": "#F0F0F0",
"foreground": "#403F53",
"comment": "#7A8181",
"keyword": "#4876D6",
"string": "#C96765",
"number": "#AA0982",
"function": "#4876D6",
"variable": "#403F53",
"type": "#994CC3",
"operator": "#AA0982"
},
"tokens": {
"boolean": "#994CC3",
"class": "#4876D6",
"className": "#4876D6",
"commentDoc": "#BBBEBE",
"constant": "#2AA298",
"decorator": "#994CC3",
"enum": "#4876D6",
"exception": "#AA0982",
"functionCall": "#4876D6",
"interface": "#994CC3",
"jsxTag": "#4876D6",
"key": "#4876D6",
"keywordImport": "#AA0982",
"label": "#AA0982",
"macro": "#4876D6",
"method": "#2AA298",
"module": "#AA0982",
"namespace": "#994CC3",
"parameter": "#403F53",
"preprocessor": "#AA0982",
"punctuation": "#7A8181",
"regex": "#C96765",
"storageModifier": "#4876D6",
"stringEscape": "#1A1A1A",
"struct": "#4876D6",
"tag": "#4876D6",
"tagAttribute": "#994CC3",
"tagAttributeValue": "#C96765",
"typeParameter": "#994CC3",
"url": "#2AA298",
"variableGlobal": "#4876D6",
"variableLocal": "#FFFFFF",
"variableOther": "#2AA298",
"variableProperty": "#2AA298"
},
"highlights": {
"diffAdded": "#2AA298",
"diffAddedBackground": "#EAF8F6",
"diffModified": "#4876D6",
"diffModifiedBackground": "#E8F0FC",
"diffRemoved": "#DE3D3B",
"diffRemovedBackground": "#FBE9E9",
"lineNumber": "#4876D6",
"lineNumberActive": "#1A1A1A"
}
},
"markdown": {
"heading1": "#403F53",
"heading2": "#403F53",
"heading3": "#403F53",
"heading4": "#403F53",
"link": "#2AA298",
"linkHover": "#4876D6",
"inlineCode": "#2AA298",
"inlineCodeBackground": "#F0F0F0",
"blockquote": "#7A8181",
"blockquoteBorder": "#D9D9D9",
"listMarker": "#4876D699"
},
"chat": {
"userMessage": "#403F53",
"userMessageBackground": "#F0F0F0",
"assistantMessage": "#403F53",
"assistantMessageBackground": "#FBFBFB",
"timestamp": "#7A8181",
"divider": "#D9D9D9"
},
"tools": {
"background": "#F0F0F080",
"border": "#D9D9D980",
"headerHover": "#FFFFFF",
"icon": "#7A8181",
"title": "#403F53",
"description": "#7A8181",
"edit": {
"added": "#2AA298",
"addedBackground": "#2AA29825",
"removed": "#DE3D3B",
"removedBackground": "#DE3D3B25",
"lineNumber": "#4876D6"
}
}
},
"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"
}
}
}