Skip to content

Commit 9d3c892

Browse files
committed
feat: implement Codex theme and update UI components — added new theme with dark and light modes, refactored status bar and toggle components for improved styling and functionality
1 parent c359245 commit 9d3c892

7 files changed

Lines changed: 450 additions & 215 deletions

File tree

app/globals.css

Lines changed: 262 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2998,85 +2998,73 @@ p {
29982998
position: relative;
29992999
border-top: 1px solid var(--shell-status-border);
30003000
background: var(--shell-status-bg);
3001-
backdrop-filter: blur(16px) saturate(135%);
3002-
-webkit-backdrop-filter: blur(16px) saturate(135%);
3003-
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.03);
3001+
backdrop-filter: blur(10px) saturate(120%);
3002+
-webkit-backdrop-filter: blur(10px) saturate(120%);
30043003
}
30053004

3006-
.shell-status-chip {
3005+
.shell-status-item {
30073006
display: inline-flex;
30083007
align-items: center;
3009-
gap: 0.45rem;
3010-
min-height: 22px;
3011-
padding: 0 0.65rem;
3012-
border: 1px solid var(--shell-chip-border);
3013-
border-radius: 999px;
3014-
background: color-mix(in srgb, var(--shell-chip-bg) 92%, transparent);
3015-
color: var(--text-secondary);
3016-
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.03);
3008+
gap: 0.3rem;
3009+
padding: 0 0.3rem;
3010+
border-radius: 4px;
3011+
background: transparent;
3012+
color: var(--text-tertiary);
3013+
transition:
3014+
color 140ms ease,
3015+
background 140ms ease;
30173016
}
30183017

3019-
.shell-status-chip--compact {
3020-
padding: 0 0.45rem;
3018+
.shell-status-item:hover {
3019+
color: var(--text-secondary);
3020+
background: var(--shell-chip-hover);
30213021
}
30223022

3023-
.shell-status-chip--compact > * {
3023+
.shell-status-item > * {
30243024
display: flex;
30253025
align-items: center;
30263026
}
30273027

3028-
.shell-status-chip--attention {
3028+
.shell-status-item--attention {
30293029
color: var(--warning);
3030-
border-color: color-mix(in srgb, var(--warning) 25%, var(--shell-chip-border));
3031-
background: color-mix(in srgb, var(--warning) 10%, var(--shell-chip-bg));
30323030
}
30333031

3034-
.shell-status-chip--signal,
3035-
.shell-status-chip--connection {
3036-
padding-inline: 0.5rem;
3032+
.shell-status-item--attention:hover {
3033+
background: color-mix(in srgb, var(--warning) 8%, transparent);
30373034
}
30383035

3039-
.shell-status-path {
3040-
padding: 0 0.2rem;
3041-
}
3042-
3043-
.shell-status-brand {
3044-
color: var(--text-disabled);
3045-
font-weight: 700;
3046-
letter-spacing: 0.04em;
3047-
text-transform: uppercase;
3048-
font-size: 10px;
3036+
.shell-status-separator {
3037+
width: 1px;
3038+
height: 12px;
3039+
background: var(--shell-chip-border);
3040+
opacity: 0.5;
3041+
flex-shrink: 0;
30493042
}
30503043

30513044
.shell-status-icon-btn {
30523045
display: inline-flex;
30533046
align-items: center;
30543047
justify-content: center;
3055-
width: 24px;
3056-
height: 24px;
3057-
border-radius: 999px;
3058-
border: 1px solid transparent;
3048+
width: 22px;
3049+
height: 22px;
3050+
border-radius: 4px;
3051+
border: none;
30593052
background: transparent;
30603053
color: var(--text-disabled);
30613054
cursor: pointer;
30623055
transition:
3063-
color 180ms ease,
3064-
border-color 180ms ease,
3065-
background 180ms ease,
3066-
transform 180ms ease;
3056+
color 140ms ease,
3057+
background 140ms ease;
30673058
}
30683059

30693060
.shell-status-icon-btn:hover {
30703061
color: var(--text-primary);
3071-
border-color: var(--shell-chip-border);
30723062
background: var(--shell-chip-hover);
3073-
transform: translateY(-0.5px);
30743063
}
30753064

30763065
.shell-status-icon-btn--active {
30773066
color: var(--brand);
3078-
border-color: color-mix(in srgb, var(--brand) 24%, var(--shell-chip-border));
3079-
background: color-mix(in srgb, var(--brand) 9%, var(--shell-chip-bg));
3067+
background: color-mix(in srgb, var(--brand) 8%, transparent);
30803068
}
30813069

30823070
.shell-sidebar {
@@ -5845,3 +5833,234 @@ p {
58455833
grid-template-columns: 1fr;
58465834
}
58475835
}
5836+
5837+
/* ══════════════════════════════════════════════════════════════════
5838+
Theme: Codex — black and charcoal with quiet contrast
5839+
══════════════════════════════════════════════════════════════════ */
5840+
5841+
/* ── Codex Dark ──────────────────────────────────────────────── */
5842+
.dark[data-theme='codex'] {
5843+
--bg: #090909;
5844+
--bg-elevated: #111111;
5845+
--bg-subtle: #171717;
5846+
--bg-secondary: #0d0d0d;
5847+
--bg-tertiary: #1d1d1d;
5848+
--sidebar-bg: #0b0b0b;
5849+
--foreground: #ededed;
5850+
--subtle: #7d7d7d;
5851+
--font-sans: 'IBM Plex Sans', Inter, system-ui, sans-serif;
5852+
--font-mono: 'IBM Plex Mono', 'JetBrains Mono', monospace;
5853+
5854+
--brand: #cfcfcf;
5855+
--brand-hover: #e3e3e3;
5856+
--brand-muted: rgba(207, 207, 207, 0.12);
5857+
5858+
--success: #22c55e;
5859+
--warning: #f59e0b;
5860+
--error: #ef4444;
5861+
--info: #94a3b8;
5862+
5863+
--text-primary: #ededed;
5864+
--text-secondary: #b1b1b1;
5865+
--text-tertiary: #7d7d7d;
5866+
--text-disabled: #646464;
5867+
5868+
--syntax-comment: #666666;
5869+
--syntax-keyword: #d4d4d4;
5870+
--syntax-string: #c7d2fe;
5871+
--syntax-string-escape: #e2e8f0;
5872+
--syntax-number: #f5f5f5;
5873+
--syntax-regexp: #d4d4d4;
5874+
--syntax-type: #cbd5e1;
5875+
--syntax-function: #f1f5f9;
5876+
--syntax-variable: #ededed;
5877+
--syntax-variable-predefined: #cfcfcf;
5878+
--syntax-constant: #e5e7eb;
5879+
--syntax-tag: #d4d4d4;
5880+
--syntax-attribute-name: #cbd5e1;
5881+
--syntax-attribute-value: #f1f5f9;
5882+
--syntax-delimiter: #8a8a8a;
5883+
--syntax-operator: #9a9a9a;
5884+
5885+
--border: #252525;
5886+
--border-hover: #343434;
5887+
--border-focus: #cfcfcf;
5888+
5889+
--glass-bg: rgba(9, 9, 9, 0.94);
5890+
--glass-bg-hover: var(--bg-subtle);
5891+
--glass-bg-elevated: var(--bg-subtle);
5892+
--glass-border: var(--border);
5893+
--glass-border-hover: rgba(255, 255, 255, 0.12);
5894+
--glass-shadow: rgba(0, 0, 0, 0.72);
5895+
--brand-glow: rgba(255, 255, 255, 0.08);
5896+
--brand-glow-subtle: rgba(255, 255, 255, 0.03);
5897+
--brand-deep: #8f8f8f;
5898+
--brand-chat: #1d1d1d;
5899+
--brand-contrast: #090909;
5900+
5901+
--shadow-2xs: 0 1px 2px rgba(0, 0, 0, 0.45);
5902+
--shadow-xs: 0 2px 4px rgba(0, 0, 0, 0.55);
5903+
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.55);
5904+
--shadow: 0 2px 8px rgba(0, 0, 0, 0.6);
5905+
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.62);
5906+
--shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.72);
5907+
--shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.8);
5908+
--shadow-2xl: 0 24px 64px rgba(0, 0, 0, 0.86);
5909+
5910+
--kn-claw: var(--brand);
5911+
--vscode-text: var(--text-primary);
5912+
--vscode-subtle: var(--text-tertiary);
5913+
--vscode-muted: var(--text-secondary);
5914+
5915+
--overlay: rgba(0, 0, 0, 0.58);
5916+
--logo-filter: grayscale(0.2) brightness(1.05);
5917+
5918+
--scrollbar-thumb: #313131;
5919+
--scrollbar-thumb-hover: #434343;
5920+
--header-glass-bg: rgba(9, 9, 9, 0.94);
5921+
--shimmer-from: var(--bg-elevated);
5922+
--shimmer-via: var(--bg-subtle);
5923+
5924+
--radius-sm: 10px;
5925+
--radius-md: 14px;
5926+
--radius-lg: 20px;
5927+
}
5928+
5929+
/* ── Codex Light ─────────────────────────────────────────────── */
5930+
[data-theme='codex']:not(.dark) {
5931+
--bg: #f7f7f7;
5932+
--bg-elevated: #ffffff;
5933+
--bg-subtle: #f1f1f1;
5934+
--bg-secondary: #f4f4f4;
5935+
--bg-tertiary: #e8e8e8;
5936+
--sidebar-bg: #f3f3f3;
5937+
--foreground: #171717;
5938+
--subtle: #8a8a8a;
5939+
--font-sans: 'IBM Plex Sans', Inter, system-ui, sans-serif;
5940+
--font-mono: 'IBM Plex Mono', 'JetBrains Mono', monospace;
5941+
5942+
--brand: #2b2b2b;
5943+
--brand-hover: #111111;
5944+
--brand-muted: rgba(43, 43, 43, 0.08);
5945+
5946+
--success: #16a34a;
5947+
--warning: #b45309;
5948+
--error: #dc2626;
5949+
--info: #475569;
5950+
5951+
--text-primary: #171717;
5952+
--text-secondary: #4b4b4b;
5953+
--text-tertiary: #8a8a8a;
5954+
--text-disabled: #9a9a9a;
5955+
5956+
--border: #e1e1e1;
5957+
--border-hover: #cacaca;
5958+
--border-focus: #2b2b2b;
5959+
5960+
--glass-bg: rgba(247, 247, 247, 0.94);
5961+
--glass-bg-hover: var(--bg-subtle);
5962+
--glass-bg-elevated: #ffffff;
5963+
--glass-border: var(--border);
5964+
--glass-border-hover: rgba(23, 23, 23, 0.12);
5965+
--glass-shadow: rgba(0, 0, 0, 0.06);
5966+
--brand-glow: rgba(23, 23, 23, 0.06);
5967+
--brand-glow-subtle: rgba(23, 23, 23, 0.03);
5968+
--brand-deep: #111111;
5969+
--brand-chat: #ececec;
5970+
--brand-contrast: #ffffff;
5971+
5972+
--shadow-2xs: 0 1px 2px rgba(0, 0, 0, 0.04);
5973+
--shadow-xs: 0 1px 3px rgba(0, 0, 0, 0.06);
5974+
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);
5975+
--shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
5976+
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08);
5977+
--shadow-lg: 0 8px 20px rgba(0, 0, 0, 0.1);
5978+
--shadow-xl: 0 16px 40px rgba(0, 0, 0, 0.12);
5979+
--shadow-2xl: 0 24px 56px rgba(0, 0, 0, 0.14);
5980+
5981+
--kn-claw: var(--brand);
5982+
--vscode-text: var(--text-primary);
5983+
--vscode-subtle: var(--text-tertiary);
5984+
--vscode-muted: var(--text-secondary);
5985+
5986+
--overlay: rgba(247, 247, 247, 0.55);
5987+
--logo-filter: grayscale(0.2) brightness(0.9);
5988+
5989+
--scrollbar-thumb: #c5c5c5;
5990+
--scrollbar-thumb-hover: #aaaaaa;
5991+
--header-glass-bg: rgba(247, 247, 247, 0.94);
5992+
--shimmer-from: var(--bg-elevated);
5993+
--shimmer-via: var(--bg-subtle);
5994+
5995+
--radius-sm: 10px;
5996+
--radius-md: 14px;
5997+
--radius-lg: 20px;
5998+
}
5999+
6000+
/* ── Codex semantic tokens ───────────────────────────────────── */
6001+
.dark[data-theme='codex'] {
6002+
--color-additions: #22c55e;
6003+
--color-deletions: #ef4444;
6004+
--on-additions: #090909;
6005+
--on-deletions: #ffffff;
6006+
--color-stage-review: #cbd5e1;
6007+
--color-stage-review-bg: rgba(203, 213, 225, 0.1);
6008+
--color-stage-review-border: rgba(203, 213, 225, 0.24);
6009+
--color-stage-prepare: #f59e0b;
6010+
--color-stage-prepare-bg: rgba(245, 158, 11, 0.1);
6011+
--color-stage-prepare-border: rgba(245, 158, 11, 0.24);
6012+
--color-stage-merge: #22c55e;
6013+
--color-stage-merge-bg: rgba(34, 197, 94, 0.1);
6014+
--color-stage-merge-border: rgba(34, 197, 94, 0.24);
6015+
--color-prereq-met: #22c55e;
6016+
--color-prereq-unmet: #f59e0b;
6017+
--color-conflict: #ef4444;
6018+
--color-stale: #f59e0b;
6019+
--color-merged: #d4d4d8;
6020+
--color-merged-muted: rgba(212, 212, 216, 0.12);
6021+
--color-merged-border: rgba(212, 212, 216, 0.24);
6022+
--color-closed: #ef4444;
6023+
--color-action-default: var(--text-secondary);
6024+
--color-ai: #d4d4d8;
6025+
--color-ai-muted: rgba(212, 212, 216, 0.1);
6026+
--color-ai-border: rgba(212, 212, 216, 0.22);
6027+
--color-ai-hover: #ededed;
6028+
--color-ai-hover-bg: rgba(255, 255, 255, 0.06);
6029+
}
6030+
6031+
[data-theme='codex']:not(.dark) {
6032+
--color-additions: #16a34a;
6033+
--color-deletions: #dc2626;
6034+
--on-additions: #ffffff;
6035+
--on-deletions: #ffffff;
6036+
--color-stage-review: #475569;
6037+
--color-stage-review-bg: rgba(71, 85, 105, 0.08);
6038+
--color-stage-review-border: rgba(71, 85, 105, 0.22);
6039+
--color-stage-prepare: #b45309;
6040+
--color-stage-prepare-bg: rgba(180, 83, 9, 0.08);
6041+
--color-stage-prepare-border: rgba(180, 83, 9, 0.22);
6042+
--color-stage-merge: #16a34a;
6043+
--color-stage-merge-bg: rgba(22, 163, 74, 0.08);
6044+
--color-stage-merge-border: rgba(22, 163, 74, 0.22);
6045+
--color-prereq-met: #16a34a;
6046+
--color-prereq-unmet: #b45309;
6047+
--color-conflict: #dc2626;
6048+
--color-stale: #b45309;
6049+
--color-merged: #3f3f46;
6050+
--color-merged-muted: rgba(63, 63, 70, 0.08);
6051+
--color-merged-border: rgba(63, 63, 70, 0.22);
6052+
--color-closed: #dc2626;
6053+
--color-action-default: var(--text-secondary);
6054+
--color-ai: #2b2b2b;
6055+
--color-ai-muted: rgba(43, 43, 43, 0.08);
6056+
--color-ai-border: rgba(43, 43, 43, 0.2);
6057+
--color-ai-hover: #111111;
6058+
--color-ai-hover-bg: rgba(17, 17, 17, 0.05);
6059+
}
6060+
6061+
.dark[data-theme='codex'] body {
6062+
background:
6063+
radial-gradient(circle at top left, rgba(255, 255, 255, 0.03), transparent 24%),
6064+
radial-gradient(circle at top right, rgba(255, 255, 255, 0.02), transparent 18%),
6065+
linear-gradient(180deg, #050505 0%, #0a0a0a 100%);
6066+
}

components/caffeinate-toggle.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,27 +61,30 @@ export function CaffeinateToggle({ compact = false }: { compact?: boolean }) {
6161
onClick={toggle}
6262
title={isActive ? 'Allow sleep (caffeinate off)' : 'Prevent sleep (caffeinate on)'}
6363
>
64-
<Icon icon={isActive ? 'lucide:coffee' : 'lucide:moon'} width={14} />
64+
<Icon icon={isActive ? 'lucide:coffee' : 'lucide:moon'} width={12} />
6565

6666
<style jsx>{`
6767
.caffeinate-compact {
68-
background: none;
69-
border: 1px solid var(--border);
70-
color: var(--text-muted);
68+
background: transparent;
69+
border: none;
70+
color: var(--text-disabled);
7171
cursor: pointer;
72-
padding: 5px 8px;
73-
border-radius: 6px;
72+
padding: 3px;
73+
border-radius: 4px;
7474
display: flex;
7575
align-items: center;
76-
transition: all 0.15s;
76+
transition:
77+
color 140ms ease,
78+
background 140ms ease;
7779
}
7880
.caffeinate-compact:hover {
7981
color: var(--text-secondary);
80-
border-color: var(--text-muted);
82+
background: var(--shell-chip-hover);
8183
}
8284
.caffeinate-compact--active {
8385
color: #f59e0b;
84-
border-color: rgba(245, 158, 11, 0.3);
86+
}
87+
.caffeinate-compact--active:hover {
8588
background: rgba(245, 158, 11, 0.08);
8689
}
8790
`}</style>

0 commit comments

Comments
 (0)