Skip to content

Commit 5c65a9a

Browse files
committed
feat: add new Velvet Circuit theme and enhance terminal UI components
- Introduced a new "Velvet Circuit" theme with a distinct color palette for both dark and light modes. - Added shell mode controller buttons with hover and active states for improved user interaction. - Updated chat header and terminal panel components with refined styling, including adjustments to font sizes for better readability. - Enhanced the Gateway Terminal with a new help section for user guidance.
1 parent 31a85d7 commit 5c65a9a

4 files changed

Lines changed: 278 additions & 11 deletions

File tree

app/globals.css

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3070,6 +3070,45 @@ p {
30703070
inset 0 1px 0 rgba(255, 255, 255, 0.08);
30713071
}
30723072

3073+
.shell-mode-controller-btn,
3074+
.shell-view-controller-btn {
3075+
display: inline-flex;
3076+
align-items: center;
3077+
gap: 0.5rem;
3078+
height: 2rem;
3079+
border: 0;
3080+
border-radius: 16px;
3081+
padding: 0 0.8rem;
3082+
background: transparent;
3083+
color: var(--text-secondary);
3084+
font-size: 0.75rem;
3085+
font-weight: 600;
3086+
letter-spacing: -0.01em;
3087+
cursor: pointer;
3088+
transition:
3089+
color 180ms ease,
3090+
background 180ms ease,
3091+
transform 180ms ease,
3092+
box-shadow 180ms ease;
3093+
}
3094+
3095+
.shell-mode-controller-btn:hover,
3096+
.shell-view-controller-btn:hover {
3097+
color: var(--text-primary);
3098+
background: color-mix(in srgb, var(--text-primary) 5%, transparent);
3099+
}
3100+
3101+
.shell-mode-controller-btn--active,
3102+
.shell-view-controller-btn--active {
3103+
color: var(--text-primary);
3104+
background:
3105+
radial-gradient(circle at 18% 18%, rgba(255, 255, 255, 0.08), transparent 38%),
3106+
color-mix(in srgb, var(--brand) 11%, var(--bg));
3107+
box-shadow:
3108+
inset 0 0 0 1px color-mix(in srgb, var(--brand) 16%, transparent),
3109+
0 8px 18px -16px color-mix(in srgb, var(--brand) 35%, rgba(0, 0, 0, 0.4));
3110+
}
3111+
30733112
[data-theme='supreme'] .folder-tab-strip {
30743113
align-items: center;
30753114
gap: 2px;
@@ -5050,6 +5089,213 @@ p {
50505089
color: #15803d;
50515090
}
50525091

5092+
/* ══════════════════════════════════════════════════════════════════
5093+
Theme: Velvet Circuit — cyber-noir shell with orchid neon + sapphire bloom
5094+
══════════════════════════════════════════════════════════════════ */
5095+
.dark[data-theme='velvet-circuit'] {
5096+
--bg: #090814;
5097+
--bg-elevated: #121022;
5098+
--bg-subtle: #1a1630;
5099+
--bg-secondary: #0e0c1c;
5100+
--bg-tertiary: #221d3d;
5101+
--sidebar-bg: #0b0918;
5102+
--foreground: #f3ecff;
5103+
--subtle: #9d8fba;
5104+
--font-sans: 'IBM Plex Sans', Inter, system-ui, sans-serif;
5105+
--font-mono: 'IBM Plex Mono', 'JetBrains Mono', monospace;
5106+
5107+
--brand: #ff4fd8;
5108+
--brand-hover: #ff82e7;
5109+
--brand-muted: rgba(255, 79, 216, 0.12);
5110+
5111+
--success: #6ef3c5;
5112+
--warning: #ffc857;
5113+
--error: #ff6b8a;
5114+
--info: #64d7ff;
5115+
5116+
--text-primary: #f4efff;
5117+
--text-secondary: #c3b5e7;
5118+
--text-tertiary: #9d8fba;
5119+
--text-disabled: #70678d;
5120+
5121+
--border: #241f3b;
5122+
--border-hover: #332a54;
5123+
--border-focus: #ff4fd8;
5124+
5125+
--color-additions: #6ef3c5;
5126+
--color-deletions: #ff6b8a;
5127+
--on-additions: #090814;
5128+
--on-deletions: #ffffff;
5129+
5130+
--glass-bg: rgba(9, 8, 20, 0.9);
5131+
--glass-bg-hover: var(--bg-subtle);
5132+
--glass-bg-elevated: var(--bg-subtle);
5133+
--glass-border: var(--border);
5134+
--glass-border-hover: rgba(255, 79, 216, 0.22);
5135+
--glass-shadow: rgba(6, 4, 14, 0.9);
5136+
--brand-glow: rgba(255, 79, 216, 0.18);
5137+
--brand-glow-subtle: rgba(100, 215, 255, 0.08);
5138+
--brand-deep: #b32aa3;
5139+
--brand-chat: #3b1742;
5140+
--brand-contrast: #090814;
5141+
5142+
--shadow-2xs: 0 1px 2px rgba(6, 4, 14, 0.6);
5143+
--shadow-xs: 0 2px 4px rgba(6, 4, 14, 0.72);
5144+
--shadow-sm: 0 1px 3px rgba(6, 4, 14, 0.62);
5145+
--shadow: 0 2px 8px rgba(6, 4, 14, 0.76), 0 0 12px rgba(255, 79, 216, 0.05);
5146+
--shadow-md: 0 6px 18px rgba(6, 4, 14, 0.78);
5147+
--shadow-lg: 0 12px 32px rgba(6, 4, 14, 0.84), 0 0 26px rgba(100, 215, 255, 0.06);
5148+
--shadow-xl: 0 20px 52px rgba(6, 4, 14, 0.88), 0 0 34px rgba(255, 79, 216, 0.08);
5149+
--shadow-2xl: 0 28px 72px rgba(6, 4, 14, 0.92), 0 0 52px rgba(100, 215, 255, 0.1);
5150+
5151+
--kn-claw: var(--brand);
5152+
--vscode-text: var(--text-primary);
5153+
--vscode-subtle: var(--text-tertiary);
5154+
--vscode-muted: var(--text-secondary);
5155+
5156+
--overlay: rgba(7, 6, 16, 0.68);
5157+
--logo-filter: hue-rotate(298deg) saturate(1.25) brightness(1.2);
5158+
5159+
--scrollbar-thumb: #2a2444;
5160+
--scrollbar-thumb-hover: #3a3160;
5161+
--header-glass-bg: rgba(10, 9, 24, 0.92);
5162+
--shimmer-from: #100e1f;
5163+
--shimmer-via: #1a1630;
5164+
5165+
--radius-sm: 12px;
5166+
--radius-md: 16px;
5167+
--radius-lg: 24px;
5168+
5169+
--color-stage-review: #64d7ff;
5170+
--color-stage-review-bg: rgba(100, 215, 255, 0.1);
5171+
--color-stage-review-border: rgba(100, 215, 255, 0.28);
5172+
--color-stage-prepare: #ffc857;
5173+
--color-stage-prepare-bg: rgba(255, 200, 87, 0.1);
5174+
--color-stage-prepare-border: rgba(255, 200, 87, 0.28);
5175+
--color-stage-merge: #6ef3c5;
5176+
--color-stage-merge-bg: rgba(110, 243, 197, 0.1);
5177+
--color-stage-merge-border: rgba(110, 243, 197, 0.28);
5178+
--color-prereq-met: #6ef3c5;
5179+
--color-prereq-unmet: #ffc857;
5180+
--color-conflict: #ff6b8a;
5181+
--color-stale: #ffc857;
5182+
--color-merged: #c89cff;
5183+
--color-merged-muted: rgba(200, 156, 255, 0.12);
5184+
--color-merged-border: rgba(200, 156, 255, 0.3);
5185+
--color-closed: #ff6b8a;
5186+
--color-action-default: var(--text-secondary);
5187+
--color-ai: #ff4fd8;
5188+
--color-ai-muted: rgba(255, 79, 216, 0.12);
5189+
--color-ai-border: rgba(255, 79, 216, 0.24);
5190+
--color-ai-hover: #ff82e7;
5191+
--color-ai-hover-bg: rgba(255, 79, 216, 0.08);
5192+
}
5193+
5194+
[data-theme='velvet-circuit']:not(.dark) {
5195+
--bg: #fff7fd;
5196+
--bg-elevated: #ffffff;
5197+
--bg-subtle: #f8edf8;
5198+
--bg-secondary: #fdf2fb;
5199+
--bg-tertiary: #f1e3f3;
5200+
--sidebar-bg: #fbf0f9;
5201+
--foreground: #2d1931;
5202+
--subtle: #987e9c;
5203+
--font-sans: 'IBM Plex Sans', Inter, system-ui, sans-serif;
5204+
--font-mono: 'IBM Plex Mono', 'JetBrains Mono', monospace;
5205+
5206+
--brand: #d83fb4;
5207+
--brand-hover: #bf2e9d;
5208+
--brand-muted: rgba(216, 63, 180, 0.1);
5209+
5210+
--success: #0f9f7b;
5211+
--warning: #b7791f;
5212+
--error: #d6456d;
5213+
--info: #288cc7;
5214+
5215+
--text-primary: #2d1931;
5216+
--text-secondary: #6d4e76;
5217+
--text-tertiary: #987e9c;
5218+
--text-disabled: #a996ac;
5219+
5220+
--border: #ead8ea;
5221+
--border-hover: #dbc2dc;
5222+
--border-focus: #d83fb4;
5223+
5224+
--color-additions: #0f9f7b;
5225+
--color-deletions: #d6456d;
5226+
--on-additions: #ffffff;
5227+
--on-deletions: #ffffff;
5228+
5229+
--glass-bg: rgba(255, 247, 253, 0.92);
5230+
--glass-bg-hover: var(--bg-subtle);
5231+
--glass-bg-elevated: #ffffff;
5232+
--glass-border: var(--border);
5233+
--glass-border-hover: rgba(216, 63, 180, 0.18);
5234+
--glass-shadow: rgba(45, 25, 49, 0.08);
5235+
--brand-glow: rgba(216, 63, 180, 0.12);
5236+
--brand-glow-subtle: rgba(40, 140, 199, 0.05);
5237+
--brand-deep: #a52b87;
5238+
--brand-chat: #ffe1f5;
5239+
--brand-contrast: #ffffff;
5240+
5241+
--shadow-2xs: 0 1px 2px rgba(45, 25, 49, 0.04);
5242+
--shadow-xs: 0 1px 3px rgba(45, 25, 49, 0.06);
5243+
--shadow-sm: 0 1px 2px rgba(45, 25, 49, 0.06);
5244+
--shadow: 0 2px 6px rgba(45, 25, 49, 0.08);
5245+
--shadow-md: 0 4px 12px rgba(45, 25, 49, 0.08);
5246+
--shadow-lg: 0 10px 24px rgba(45, 25, 49, 0.1);
5247+
--shadow-xl: 0 18px 42px rgba(45, 25, 49, 0.12);
5248+
--shadow-2xl: 0 26px 58px rgba(45, 25, 49, 0.14);
5249+
5250+
--kn-claw: var(--brand);
5251+
--vscode-text: var(--text-primary);
5252+
--vscode-subtle: var(--text-tertiary);
5253+
--vscode-muted: var(--text-secondary);
5254+
5255+
--overlay: rgba(255, 247, 253, 0.56);
5256+
--logo-filter: hue-rotate(314deg) saturate(1.15) brightness(0.86);
5257+
5258+
--scrollbar-thumb: #d7bfd8;
5259+
--scrollbar-thumb-hover: #cba6cc;
5260+
--header-glass-bg: rgba(255, 247, 253, 0.95);
5261+
--shimmer-from: var(--bg-elevated);
5262+
--shimmer-via: var(--bg-subtle);
5263+
5264+
--radius-sm: 12px;
5265+
--radius-md: 16px;
5266+
--radius-lg: 24px;
5267+
5268+
--color-stage-review: #288cc7;
5269+
--color-stage-review-bg: rgba(40, 140, 199, 0.08);
5270+
--color-stage-review-border: rgba(40, 140, 199, 0.24);
5271+
--color-stage-prepare: #b7791f;
5272+
--color-stage-prepare-bg: rgba(183, 121, 31, 0.08);
5273+
--color-stage-prepare-border: rgba(183, 121, 31, 0.24);
5274+
--color-stage-merge: #0f9f7b;
5275+
--color-stage-merge-bg: rgba(15, 159, 123, 0.08);
5276+
--color-stage-merge-border: rgba(15, 159, 123, 0.24);
5277+
--color-prereq-met: #0f9f7b;
5278+
--color-prereq-unmet: #b7791f;
5279+
--color-conflict: #d6456d;
5280+
--color-stale: #b7791f;
5281+
--color-merged: #8e56d8;
5282+
--color-merged-muted: rgba(142, 86, 216, 0.08);
5283+
--color-merged-border: rgba(142, 86, 216, 0.24);
5284+
--color-closed: #d6456d;
5285+
--color-action-default: var(--text-secondary);
5286+
--color-ai: #d83fb4;
5287+
--color-ai-muted: rgba(216, 63, 180, 0.08);
5288+
--color-ai-border: rgba(216, 63, 180, 0.2);
5289+
--color-ai-hover: #bf2e9d;
5290+
--color-ai-hover-bg: rgba(216, 63, 180, 0.08);
5291+
}
5292+
5293+
[data-theme='velvet-circuit']:not(.dark) .prose-chat code,
5294+
[data-theme='velvet-circuit']:not(.dark) .md-preview code {
5295+
background: #f4ddf0;
5296+
color: #a52b87;
5297+
}
5298+
50535299
/* ══════════════════════════════════════════════════════════════════
50545300
Theme: PrettyPink — Light pink (#F5A9B8), light blue (#5BCEFA), white
50555301
══════════════════════════════════════════════════════════════════ */

components/chat-header.tsx

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export function ChatHeader({
8888
<div className="ml-2 flex shrink-0 items-center gap-1.5">
8989
{/* Model badge */}
9090
{modelName && (
91-
<span className="inline-flex items-center gap-1 whitespace-nowrap rounded-md border border-[var(--border)] bg-[var(--bg-subtle)] px-2 py-0.5 text-[9px] font-mono text-[var(--text-tertiary)]">
91+
<span className="inline-flex items-center gap-1 whitespace-nowrap rounded-md border border-[var(--border)] bg-[var(--bg-subtle)] px-2 py-0.5 text-[10px] font-mono text-[var(--text-tertiary)]">
9292
<Icon icon="lucide:sparkles" width={9} height={9} className="text-[var(--brand)]" />
9393
<span className="max-w-[90px] truncate">
9494
{modelName
@@ -99,22 +99,31 @@ export function ChatHeader({
9999
</span>
100100
)}
101101
{isStreaming && activityCount > 0 && (
102-
<span className="inline-flex items-center gap-1 whitespace-nowrap rounded-md border border-[var(--border)] bg-[var(--bg-subtle)] px-1.5 py-0.5 text-[9px] text-[var(--text-disabled)]">
102+
<span className="inline-flex items-center gap-1 whitespace-nowrap rounded-md border border-[var(--border)] bg-[var(--bg-subtle)] px-1.5 py-0.5 text-[10px] text-[var(--text-disabled)]">
103103
<Icon icon="lucide:activity" width={9} height={9} className="text-[var(--brand)]" />
104104
{activityCount} ops
105-
{filesChanged > 0 && (
106-
<span className="text-amber-400">· {filesChanged} files</span>
107-
)}
105+
{filesChanged > 0 && <span className="text-amber-400">· {filesChanged} files</span>}
108106
</span>
109107
)}
110108
{/* Context token count */}
111109
{contextTokens > 0 && (
112-
<span className={`inline-flex items-center gap-1 whitespace-nowrap text-[9px] tabular-nums ${
113-
contextPct > 80 ? 'text-amber-400' : contextPct > 95 ? 'text-red-400' : 'text-[var(--text-disabled)]'
114-
}`}>
110+
<span
111+
className={`inline-flex items-center gap-1 whitespace-nowrap text-[9px] tabular-nums ${
112+
contextPct > 80
113+
? 'text-amber-400'
114+
: contextPct > 95
115+
? 'text-red-400'
116+
: 'text-[var(--text-disabled)]'
117+
}`}
118+
>
115119
<Icon icon="lucide:database" width={9} height={9} />
116120
{contextTokens >= 1000 ? `${(contextTokens / 1000).toFixed(0)}K` : contextTokens}
117-
<span className="text-[8px]">/{maxContextTokens >= 1000 ? `${(maxContextTokens / 1000).toFixed(0)}K` : maxContextTokens}</span>
121+
<span className="text-[9px]">
122+
/
123+
{maxContextTokens >= 1000
124+
? `${(maxContextTokens / 1000).toFixed(0)}K`
125+
: maxContextTokens}
126+
</span>
118127
</span>
119128
)}
120129
<span className="whitespace-nowrap text-[11px] text-[var(--text-disabled)]">

components/gateway-terminal.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,6 +929,18 @@ export function GatewayTerminal() {
929929
{sending && <span className="text-[var(--brand)]">Running…</span>}
930930
</div>
931931
</div>
932+
<div className="flex flex-wrap items-center gap-2 border-t border-[color-mix(in_srgb,var(--border)_60%,transparent)] px-4 py-2 text-[11px] text-[var(--text-secondary)]">
933+
<span className="rounded-full border border-[var(--border)] bg-[color-mix(in_srgb,var(--bg-elevated)_72%,transparent)] px-2.5 py-1 font-medium">
934+
/help
935+
</span>
936+
<span className="rounded-full border border-[var(--border)] bg-[color-mix(in_srgb,var(--bg-elevated)_72%,transparent)] px-2.5 py-1 font-medium">
937+
/agents
938+
</span>
939+
<span className="rounded-full border border-[var(--border)] bg-[color-mix(in_srgb,var(--bg-elevated)_72%,transparent)] px-2.5 py-1 font-medium">
940+
ask a shell question
941+
</span>
942+
<span className="ml-auto text-[var(--text-disabled)]">Click anywhere to type</span>
943+
</div>
932944
</div>
933945
{/* Output */}
934946
<div

components/terminal-panel.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ function TerminalPane({
584584

585585
<div className="flex shrink-0 items-center gap-1.5">
586586
<button
587-
onClick={() => emit('focus-terminal')}
587+
onClick={() => session.xterm?.focus()}
588588
className="inline-flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[color-mix(in_srgb,var(--bg-elevated)_78%,transparent)] px-2.5 py-1.5 text-[11px] font-medium text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[color-mix(in_srgb,var(--brand)_24%,var(--border))] hover:bg-[var(--bg-subtle)] transition-colors shrink-0"
589589
title="Focus terminal"
590590
>
@@ -716,7 +716,7 @@ function TerminalPane({
716716
</div>
717717
<div className="flex items-center gap-2 whitespace-nowrap">
718718
<span>⌘J toggle</span>
719-
<span>⌘⌥4 focus</span>
719+
<span>Drag edge to resize</span>
720720
</div>
721721
</div>
722722
</div>

0 commit comments

Comments
 (0)