feat(theme): add OpenChamber hybrid theme and make it the default

- Add OpenChamber brand theme (dark+light): Vitesse syntax over OpenCode-deep neutrals with Flexoki accents, harmonized in OKLCH

- Add scripts/harmonize-theme.mjs: align accent saturation/lightness and boost syntax chroma via OKLCH

- Set default theme to OpenChamber (was Flexoki)

- Rename fields-of-the-shire off the openchamber-* id; keep it as a normal preset

- Remove OpenCode and OC-2 ports and all disabled theme JSON definitions

- Make panel/header/sidebar borders opaque and theme-driven; global default border now uses --border instead of hardcoded rgba
This commit is contained in:
Bohdan Triapitsyn
2026-07-30 17:43:39 +03:00
parent 74e7fe0707
commit 83a66d0a6d
65 changed files with 727 additions and 8686 deletions
@@ -367,7 +367,7 @@ const EditorTreeColumn: React.FC<{ visible: boolean }> = ({ visible }) => {
<div
ref={columnRef}
className={cn(
'relative h-full flex-shrink-0 overflow-hidden border-l border-border/40 bg-background will-change-[width] motion-reduce:transition-none',
'relative h-full flex-shrink-0 overflow-hidden border-l border-border bg-background will-change-[width] motion-reduce:transition-none',
!visible && 'border-l-0',
)}
style={{
@@ -1248,7 +1248,7 @@ const PreviewPane: React.FC<PreviewPaneProps> = ({ rawUrl, onNavigate }) => {
return (
<div className="absolute inset-0 flex flex-col">
<div className="flex items-center gap-1 border-b border-border/40 bg-[var(--surface-background)] px-2 py-1">
<div className="flex items-center gap-1 border-b border-border bg-[var(--surface-background)] px-2 py-1">
<div className="min-w-0 flex-1 truncate typography-micro text-muted-foreground" title={headerSrc || rawUrl}>
{headerSrc || rawUrl || t('contextPanel.preview.empty')}
</div>
@@ -1877,7 +1877,7 @@ const IframeBrowserPane: React.FC<DesktopBrowserPaneProps> = ({ initialUrl, dire
return (
<div className="absolute inset-0 flex flex-col bg-background">
<div className="flex items-center gap-1 border-b border-border/40 bg-[var(--surface-background)] px-2 py-1">
<div className="flex items-center gap-1 border-b border-border bg-[var(--surface-background)] px-2 py-1">
<Button type="button" variant="ghost" size="sm" className="h-7 w-7 p-0" disabled={historyIndex <= 0} onClick={() => goToHistory(historyIndex - 1)}>
<Icon name="arrow-left" className="h-3.5 w-3.5" />
</Button>
@@ -2167,7 +2167,7 @@ const DesktopBrowserPane: React.FC<DesktopBrowserPaneProps> = ({ initialUrl, dir
return (
<div className="absolute inset-0 flex flex-col bg-background">
<div className="flex items-center gap-1 border-b border-border/40 bg-[var(--surface-background)] px-2 py-1">
<div className="flex items-center gap-1 border-b border-border bg-[var(--surface-background)] px-2 py-1">
<Button type="button" variant="ghost" size="sm" className="h-7 w-7 p-0" onClick={() => { try { webviewRef.current?.goBack?.(); } catch { /* webview not ready */ } }}>
<Icon name="arrow-left" className="h-3.5 w-3.5" />
</Button>
@@ -2730,7 +2730,7 @@ export const ContextPanel: React.FC = () => {
const isFileTabActive = activeTab?.mode === 'file';
const header = (
<header className="flex h-10 items-stretch border-b border-border/40">
<header className="flex h-10 items-stretch border-b border-border">
{isMultiInstanceMode ? (
<SortableTabsStrip
items={tabItems}
@@ -2854,11 +2854,11 @@ export const ContextPanel: React.FC = () => {
content box only while collapsed, shifting the header controls by
1px between the collapsed and expanded states. */}
{isOpen && !isExpanded && (
<div aria-hidden="true" className="absolute left-0 top-0 z-40 h-full w-px bg-border/40" />
<div aria-hidden="true" className="absolute left-0 top-0 z-40 h-full w-px bg-border" />
)}
{/* Divider between the panel and the icon rail on its right. */}
{isOpen && (
<div aria-hidden="true" className="absolute right-0 top-0 z-40 h-full w-px bg-border/40" />
<div aria-hidden="true" className="absolute right-0 top-0 z-40 h-full w-px bg-border" />
)}
{!isExpanded && (
<div
@@ -414,7 +414,7 @@ export const MainLayout: React.FC = () => {
<Sidebar
isOpen={isSidebarOpen}
isMobile={isMobile}
className="border-border/50"
className="border-border"
topBar={<SidebarTopBar />}
>
<SessionSidebar isVisible={isSidebarOpen} />
@@ -422,7 +422,7 @@ export const MainLayout: React.FC = () => {
<div className="relative flex flex-1 min-w-0 flex-col overflow-hidden bg-background" data-page-scroll-lock="true">
<Header />
<div className="relative flex flex-1 min-h-0 overflow-hidden bg-background" data-page-scroll-lock="true">
<div className="relative flex flex-1 min-w-0 flex-col overflow-hidden border-t border-border/50 bg-background" data-page-scroll-lock="true">
<div className="relative flex flex-1 min-w-0 flex-col overflow-hidden border-t border-border bg-background" data-page-scroll-lock="true">
<div className="flex flex-1 min-h-0 overflow-hidden" data-page-scroll-lock="true">
<div className="relative flex flex-1 min-h-0 min-w-0 overflow-hidden" data-page-scroll-lock="true">
<main className="flex-1 overflow-hidden bg-background relative" data-page-scroll-lock="true">
@@ -456,7 +456,7 @@ export const MainLayout: React.FC = () => {
</div>
</div>
</div>
<div className="border-t border-border/50" data-page-scroll-lock="true">
<div className="border-t border-border" data-page-scroll-lock="true">
<ErrorBoundary><ContextPanelRail /></ErrorBoundary>
</div>
</div>
@@ -126,7 +126,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ isOpen, isMobile, children, cl
<aside
ref={sidebarRef}
className={cn(
'relative flex h-full overflow-hidden border-r border-border/40 will-change-[width] motion-reduce:transition-none',
'relative flex h-full overflow-hidden border-r border-border will-change-[width] motion-reduce:transition-none',
'bg-sidebar oc-vibrancy-surface',
isOpen && 'shadow-[inset_-2px_0_10px_-2px_rgb(0_0_0_/_0.06)]',
!isOpen && 'border-r-0',