Skip to content

Commit 536e643

Browse files
Fungraphicjarnodevries-byteJarno de VriesFungraphiqueAurora release bot
authored
feat: SciFi theme — full dark/light palette with Tailwind v4 token remaps (#320)
* Upload SciFi theme screenshot * fix: stabilize workspace swarm process spawning (#302) Co-authored-by: Jarno de Vries <jarno@match-day.nl> * feat(theme): add SciFi theme (dark + light variants) (#303) * feat(theme): add SciFi theme (dark + light variants) - Add scifi-theme.css with neon accents, glow effects, gradient backgrounds - Register SciFi in theme.ts with dark/light color schemes - Add SciFi option in settings UI - Import scifi-theme.css in styles.css * docs: add SciFi theme screenshot --------- Co-authored-by: Fungraphique <fungraphique@jarvis.local> * fix(chat): cross-session response contamination + /new opens previous chat (#297, #300) Two related session-routing bugs that landed responses (or new-chat clicks) into the wrong session. #297 — cross-session response contamination When the user navigated to a new chat while a previous chat was still streaming, the previous chat's response chunks would land in the **new** chat. Three fixes: * useStreamingMessage now bumps a streamGenerationRef on every startStreaming call. The fetch-reader loop captures that token at start and re-checks it on every reader.read() and between events in the same batch. If the token has changed (because the user started a different stream), the loop cancels the reader and exits without dispatching anything. This closes the brief race between abortController.abort() and the underlying fetch reader actually stopping, during which buffered chunks were silently writing into activeSessionKeyRef.current (which had already been switched to the new session). * chat-screen now cancels the in-flight stream on session-key change via a useEffect keyed on (activeCanonicalKey, activeFriendlyId, isNewChat). Previously nothing cancelled the stream on navigation \u2014 only the user clicking the explicit Stop button (handleStop) called cancelStreaming(). #300 — /new slash command opens last chat instead of new session /new was calling navigate({ to: '/chat' }), but the /chat index route unconditionally redirects to localStorage('claude-last-session'), so /new always landed in whichever chat was last active. Fixed at three entry points so all 'new chat' actions go through the explicit 'new' sentinel: * /new in chat-screen.handleUiSlashCommand * /new in command-palette.runSlashCommand * 'New Chat' quick-action tile in the search modal The 'Chat' nav link in the sidebar still goes to /chat (= last session) \u2014 that's the correct behaviour for a screen-level nav target. Only 'new' actions are routed to the new sentinel. Closes #297, #300 * fix(terminal): keep PTY alive across SSE disconnects + auto-reattach (#298) The browser terminal periodically 'reset back to prompt' during normal use because any transient SSE disconnect (network blip, browser tab suspension, HMR reload, dev-server restart) tore down the user's PTY and dropped them into a fresh shell. Root cause: terminal-stream's request.signal abort handler called session.close(), which SIGTERM'd the underlying Python PTY helper. There was also no auto-reconnect on the client \u2014 a single dropped read terminated the loop, called /api/terminal-close, cleared the tab's sessionId, and left the user with an idle tab. Fix in three parts: 1) terminal-sessions: TerminalSession gains markDetached() and markAttached(). markDetached() starts a TTL timer (default 5 min, override via HERMES_TERMINAL_DETACH_TTL_MS) that reaps the PTY only if no client reattaches in time. The map keeps the session live in the meantime. 2) terminal-stream: accepts an optional sessionId in the POST body. If the id matches a still-alive session, the route reattaches to it instead of spawning a fresh PTY. The 'session' event payload now includes a 'reattach' flag. On SSE abort, we just detach listeners and call session.markDetached() \u2014 the PTY stays running. 3) terminal-workspace: passes sessionId on every connect, so reconnect reattaches automatically. When the read loop ends and the tab still has a sessionId, we attempt a single quick reattach with a '[reconnecting...]' nudge to the user instead of tearing the tab down. /api/terminal-close is no longer called on stream end \u2014 the server-side TTL handles abandoned sessions. Fixes #298 * fix(scifi-theme): remap amber tokens to cyan/teal — no more pale yellow in SciFi Amber colors (used for warnings/alerts in usage meter, agent thinking, inspector badges, etc.) were not remapped in the SciFi theme, causing: - Pale yellow bg-amber-100 with light text → unreadable menu items - Jarring yellow accents breaking the cyberpunk aesthetic - Trigger pill and selection states with impossible contrast Remap all --color-amber-* tokens: - Dark theme: amber → cyan/teal gradient (#041418 → #ccfaff) - Light theme: amber → teal gradient (#e8f4f6 → #0a1628) This replaces the previous .bg-amber-100 !important hack which broke the usage meter bar by forcing dark text on already-dark remapped primary-50 backgrounds. * fix(scifi-theme): tweak amber remap contrast values Brighten the amber→cyan tokens slightly so bg-amber-100 is visible on --theme-panel (#0d1b2a) and text colors have good contrast on the darker backgrounds. * fix(theme): SciFi — visible usage pill + selected menu item colors - Brightened amber-100 to #0c3245 (was #0a2633, too dark on #060b18 bg) - Brightened amber-50/200/300/400/500/600/700 gradient for better contrast - Added !important overrides for .bg-amber-100 to force background and text color, overriding MenuItem inline styles that were blocking the selected menu item appearance in SciFi dark theme * fix(scifi-theme): add yellow, neutral, and white overrides for dark mode - Add --color-yellow-* remap to teal-warm tones (was missing entirely) - Add --color-neutral-* remap to dark slate/navy tones - Add .bg-white override to theme-card for dialog backgrounds - Add .bg-amber-100 color override for MenuItem selected state (MenuItem uses inline style color:var(--theme-text) which overwrites Tailwind text-amber-800, now overridden with !important) - Add scifi-light remaps for yellow, red, emerald, neutral tokens - Fixes: pale yellow/white backgrounds in usage meter menu, View Details dialog, status badges, progress bars, and tab pills in SciFi dark mode * fix: replace bg-white with bg-primary-50 in usage-details-modal for theme compatibility - All bg-white/bg-white/N in usage-details-modal replaced with bg-primary-50/N which is properly remapped by the SciFi theme (--theme-card/panel) - Active tab pill: bg-white → bg-primary-100, text-primary-900 → text-primary-800 - Set as Default button: bg-white → bg-primary-50, hover:bg-primary-50 → hover:bg-primary-100 - Removed aggressive bg-white !important overrides from scifi-theme.css that broke borders, switches, and other elements using white elsewhere * fix(scifi-theme): rewrite theme following nous pattern - Replace hex values with var(--theme-*) references (same as nous theme) - Remove broken red/emerald/yellow/neutral remaps that caused border/bg issues - Add !important on dark-mode primary/accent remaps (needed for Tailwind v4 oklch) - Move @import scifi-theme.css to END of styles.css (after .system dark rules) - Keep essential .bg-amber-100 overrides for menu selected state - Result: 238 lines (was 350+), clean structure matching nous theme pattern Root cause: Tailwind v4 uses oklch color-mix internally for utility classes. Simple --color-amber-100: #0f3547 overrides don't work because .border-primary-200 resolves via color-mix, not via the CSS custom property. Using var(--theme-*) with !important ensures proper resolution. * fix(scifi-theme): add !important to all dark mode token remaps Tailwind v4 defines color tokens as oklch in @layer theme, which has higher specificity than plain [data-theme] selectors. Without !important, the remaps were ignored and components displayed native Tailwind colors (white, amber, neutral-gray) instead of the SciFi palette. Also remap --color-white to #0d1b2a so bg-white becomes dark navy in SciFi dark mode (fixes chat-controls popover white background). * feat(scifi): active tab indicator — cyan accent glow on Session/Providers tabs * fix(scifi-theme): review fixes - 9 corrections * fix: restore tab selector without role=tablist (component doesn't use it) * fix(scifi): tab selector uses .bg-primary-50 > button instead of [role=tablist] The usage-details-modal tabs don't use role=tablist ARIA attribute, so [role=tablist] selector never matched. The tab container has bg-primary-50 and direct child buttons with bg-primary-100 when active. --------- Co-authored-by: jarnodevries-byte <jarnodevries@gmail.com> Co-authored-by: Jarno de Vries <jarno@match-day.nl> Co-authored-by: Fungraphique <fungraphique@jarvis.local> Co-authored-by: Aurora release bot <release@outsourc-e.com>
1 parent 274e9a2 commit 536e643

4 files changed

Lines changed: 258 additions & 34 deletions

File tree

screenshots/SciFi.png

443 KB
Loading

src/components/usage-meter/usage-details-modal.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ export function UsageDetailsModal({
335335
onClick={() => setActiveTab(tab)}
336336
className={`rounded-full px-3 py-1 font-medium transition ${
337337
activeTab === tab
338-
? 'bg-white text-primary-900 shadow-sm'
338+
? 'bg-primary-100 text-primary-800 shadow-sm'
339339
: 'text-primary-600 hover:text-primary-800'
340340
}`}
341341
>
@@ -354,23 +354,23 @@ export function UsageDetailsModal({
354354
) : null}
355355

356356
<div className="grid gap-3 md:grid-cols-3">
357-
<div className="rounded-2xl border border-primary-200 bg-white/60 p-3">
357+
<div className="rounded-2xl border border-primary-200 bg-primary-50/60 p-3">
358358
<div className="text-xs uppercase tracking-wide text-primary-500">
359359
Input Tokens
360360
</div>
361361
<div className="text-xl font-semibold text-primary-900">
362362
{formatTokens(usage.inputTokens)}
363363
</div>
364364
</div>
365-
<div className="rounded-2xl border border-primary-200 bg-white/60 p-3">
365+
<div className="rounded-2xl border border-primary-200 bg-primary-50/60 p-3">
366366
<div className="text-xs uppercase tracking-wide text-primary-500">
367367
Output Tokens
368368
</div>
369369
<div className="text-xl font-semibold text-primary-900">
370370
{formatTokens(usage.outputTokens)}
371371
</div>
372372
</div>
373-
<div className="rounded-2xl border border-primary-200 bg-white/60 p-3">
373+
<div className="rounded-2xl border border-primary-200 bg-primary-50/60 p-3">
374374
<div className="text-xs uppercase tracking-wide text-primary-500">
375375
Daily Cost
376376
</div>
@@ -380,7 +380,7 @@ export function UsageDetailsModal({
380380
</div>
381381
</div>
382382

383-
<div className="rounded-2xl border border-primary-200 bg-white/70 p-4">
383+
<div className="rounded-2xl border border-primary-200 bg-primary-50/70 p-4">
384384
<div className="mb-3 text-sm font-semibold text-primary-900">
385385
Cost per model
386386
</div>
@@ -393,7 +393,7 @@ export function UsageDetailsModal({
393393
usage.models.map((model) => (
394394
<div
395395
key={model.model}
396-
className="flex flex-wrap items-center justify-between gap-2 rounded-xl border border-primary-100 bg-white px-3 py-2 text-sm"
396+
className="flex flex-wrap items-center justify-between gap-2 rounded-xl border border-primary-100 bg-primary-50 px-3 py-2 text-sm"
397397
>
398398
<div className="font-medium text-primary-800">
399399
{formatModelName(model.model)}
@@ -411,7 +411,7 @@ export function UsageDetailsModal({
411411
</div>
412412
</div>
413413

414-
<div className="rounded-2xl border border-primary-200 bg-white/70 p-4">
414+
<div className="rounded-2xl border border-primary-200 bg-primary-50/70 p-4">
415415
<div className="mb-3 text-sm font-semibold text-primary-900">
416416
Session history
417417
</div>
@@ -424,7 +424,7 @@ export function UsageDetailsModal({
424424
usage.sessions.map((session) => (
425425
<div
426426
key={session.id}
427-
className="flex flex-wrap items-center justify-between gap-2 rounded-xl border border-primary-100 bg-white px-3 py-2 text-sm"
427+
className="flex flex-wrap items-center justify-between gap-2 rounded-xl border border-primary-100 bg-primary-50 px-3 py-2 text-sm"
428428
>
429429
<div>
430430
<div className="font-medium text-primary-800">
@@ -485,7 +485,7 @@ export function UsageDetailsModal({
485485

486486
<div className="grid gap-3">
487487
{providerUsage.length === 0 ? (
488-
<div className="rounded-2xl border border-primary-200 bg-white/70 p-6 text-center">
488+
<div className="rounded-2xl border border-primary-200 bg-primary-50/70 p-6 text-center">
489489
<div className="text-sm font-medium text-primary-700">
490490
No providers connected. Add a provider in Settings to start chatting.
491491
</div>
@@ -503,7 +503,7 @@ export function UsageDetailsModal({
503503
className={`rounded-2xl border p-4 ${
504504
isDefault
505505
? 'border-primary-300 bg-primary-50/50'
506-
: 'border-primary-200 bg-white/70'
506+
: 'border-primary-200 bg-primary-50/70'
507507
}`}
508508
>
509509
<div className="flex items-center justify-between gap-2">
@@ -561,7 +561,7 @@ export function UsageDetailsModal({
561561
onClick={() =>
562562
handleSetDefault(provider.provider)
563563
}
564-
className="rounded-lg border border-primary-200 bg-white px-3 py-1.5 text-xs font-medium text-primary-700 transition hover:bg-primary-50"
564+
className="rounded-lg border border-primary-200 bg-primary-50 px-3 py-1.5 text-xs font-medium text-primary-700 transition hover:bg-primary-100"
565565
>
566566
Set as Default
567567
</button>

src/scifi-theme.css

Lines changed: 240 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
/* ════════════════════════════════════════════════════════════════════
2-
SciFi Theme — inspired by cyberpunk HUD aesthetic
3-
Dark: deep navy #060b18 background, cyan neon #00f0ff accent
4-
Light: cold steel #eef1f5, deep navy text, cyan accent
5-
═══════════════════════════════════════════════════════════════════ */
2+
SciFi Theme — inspired by cyberpunk HUD aesthetic
3+
Dark: deep navy #060b18 background, cyan neon #00f0ff accent
4+
Light: cold steel #eef1f5, deep navy text, cyan accent
5+
═══════════════════════════════════════════════════════════════════ */
66

77
/* ── SciFi Dark ─────────────────────────────────────────────────────── */
88
[data-theme='scifi'] {
9+
color-scheme: dark !important;
10+
911
--theme-bg: #060b18;
1012
--theme-sidebar: #0a1628;
1113
--theme-panel: #0d1b2a;
@@ -53,6 +55,8 @@
5355

5456
/* ── SciFi Light ────────────────────────────────────────────────────── */
5557
[data-theme='scifi-light'] {
58+
color-scheme: light !important;
59+
5660
--theme-bg: #eef1f5;
5761
--theme-sidebar: #e4e9ef;
5862
--theme-panel: #e8ecf2;
@@ -118,28 +122,27 @@
118122

119123
/* ── SciFi Tailwind primary token remaps — dark ─────────────────────── */
120124
[data-theme='scifi'] {
121-
--color-primary-50: var(--theme-panel);
122-
--color-primary-100: var(--theme-card);
123-
--color-primary-200: var(--theme-border);
124-
--color-primary-300: var(--theme-border-subtle);
125-
--color-primary-400: var(--theme-muted);
126-
--color-primary-500: var(--theme-muted);
127-
--color-primary-600: var(--theme-muted);
128-
--color-primary-700: var(--theme-text);
129-
--color-primary-800: var(--theme-text);
130-
--color-primary-900: var(--theme-text);
131-
--color-primary-950: var(--theme-text);
132-
--color-surface: var(--theme-bg);
133-
--color-surface-deep: var(--theme-bg);
134-
--color-ink: var(--theme-text);
135-
--color-accent-400: var(--theme-accent-secondary);
136-
--color-accent-500: var(--theme-accent);
137-
--color-accent-600: var(--theme-accent);
125+
--color-primary-50: var(--theme-panel) !important;
126+
--color-primary-100: var(--theme-card) !important;
127+
--color-primary-200: var(--theme-border-subtle) !important;
128+
--color-primary-300: var(--theme-border) !important;
129+
--color-primary-400: var(--theme-muted) !important;
130+
--color-primary-500: var(--theme-muted) !important;
131+
--color-primary-600: var(--theme-muted) !important;
132+
--color-primary-700: var(--theme-text) !important;
133+
--color-primary-800: var(--theme-text) !important;
134+
--color-primary-900: var(--theme-text) !important;
135+
--color-primary-950: var(--theme-text) !important;
136+
--color-surface: var(--theme-bg) !important;
137+
--color-surface-deep: var(--theme-bg) !important;
138+
--color-ink: var(--theme-text) !important;
139+
--color-accent-400: var(--theme-accent-secondary) !important;
140+
--color-accent-500: var(--theme-accent) !important;
141+
--color-accent-600: var(--theme-accent) !important;
138142
}
139143

140144
/* ── SciFi Tailwind primary token remaps — light ────────────────────── */
141145
[data-theme='scifi-light'] {
142-
color-scheme: light !important;
143146
--color-primary-50: var(--theme-card) !important;
144147
--color-primary-100: var(--theme-card2) !important;
145148
--color-primary-200: var(--theme-border) !important;
@@ -157,6 +160,7 @@
157160
--color-accent-400: var(--theme-accent-secondary) !important;
158161
--color-accent-500: var(--theme-accent) !important;
159162
--color-accent-600: var(--theme-accent) !important;
163+
--color-white: var(--theme-card) !important;
160164
}
161165

162166
/* ── SciFi dark: cyan glow on focus rings ───────────────────────────── */
@@ -175,3 +179,217 @@
175179
[data-theme='scifi'] button:hover {
176180
text-shadow: 0 0 8px rgba(0, 240, 255, 0.3);
177181
}
182+
183+
/* ── SciFi dark: amber → teal remap ────────────────────────────────── */
184+
/* Amber is used for warning/alert tones (usage meter, badges, etc.).
185+
In SciFi dark, pale yellow breaks the cyberpunk aesthetic and creates
186+
unreadable combos (light text on pale bg). Remap all amber tokens to
187+
cyan/teal variants that fit the theme.
188+
bg-amber-100 used for selected menu items must be visible on dark bg
189+
with good contrast for text-amber-800 labels. */
190+
[data-theme='scifi'] {
191+
--color-amber-50: #071e2b !important;
192+
--color-amber-100: #0f3547 !important;
193+
--color-amber-200: #164d66 !important;
194+
--color-amber-300: #1e6e8a !important;
195+
--color-amber-400: #2690b3 !important;
196+
--color-amber-500: #00bcd4 !important;
197+
--color-amber-600: #00d4e8 !important;
198+
--color-amber-700: #33e0f2 !important;
199+
--color-amber-800: #ccf7ff !important;
200+
--color-amber-900: #e0fbff !important;
201+
--color-amber-950: #ebfcff !important;
202+
}
203+
204+
/* ── SciFi dark: red → crimson remap ──────────────────────────────── */
205+
/* Red tones for danger/error states. Keep them red but darker to fit
206+
the dark HUD aesthetic. bg-red-100 must be visible on --theme-panel. */
207+
[data-theme='scifi'] {
208+
--color-red-50: #1a0a0a !important;
209+
--color-red-100: #3d1111 !important;
210+
--color-red-200: #5c1a1a !important;
211+
--color-red-300: #8a2525 !important;
212+
--color-red-400: #b83030 !important;
213+
--color-red-500: #ef4444 !important;
214+
--color-red-600: #f87171 !important;
215+
--color-red-700: #fca5a5 !important;
216+
--color-red-800: #fee2e2 !important;
217+
--color-red-900: #fef2f2 !important;
218+
--color-red-950: #fff5f5 !important;
219+
}
220+
221+
/* ── SciFi dark: emerald → neon-green remap ─────────────────────── */
222+
/* Emerald/green for success states. Fit the cyberpunk palette. */
223+
[data-theme='scifi'] {
224+
--color-emerald-50: #0a1a14 !important;
225+
--color-emerald-100: #0f3326 !important;
226+
--color-emerald-200: #15523a !important;
227+
--color-emerald-300: #1c7a52 !important;
228+
--color-emerald-400: #23a86b !important;
229+
--color-emerald-500: #64ffda !important;
230+
--color-emerald-600: #7cffd8 !important;
231+
--color-emerald-700: #a3ffe0 !important;
232+
--color-emerald-800: #ccfff0 !important;
233+
--color-emerald-900: #e0fff6 !important;
234+
--color-emerald-950: #ebfff8 !important;
235+
}
236+
237+
/* ── SciFi dark: yellow → amber-warm remap ─────────────────────────── */
238+
/* Yellow is used for mid-range progress bars and warning indicators.
239+
Remap to warm amber/orange tones to differentiate from amber (teal)
240+
while staying within the cyberpunk palette. */
241+
[data-theme='scifi'] {
242+
--color-yellow-50: #1a150a !important;
243+
--color-yellow-100: #2e2510 !important;
244+
--color-yellow-200: #4a3a18 !important;
245+
--color-yellow-300: #6b5520 !important;
246+
--color-yellow-400: #8a7028 !important;
247+
--color-yellow-500: #d4930a !important;
248+
--color-yellow-600: #e5a020 !important;
249+
--color-yellow-700: #f0b840 !important;
250+
--color-yellow-800: #fad480 !important;
251+
--color-yellow-900: #fde8b0 !important;
252+
--color-yellow-950: #fef3d8 !important;
253+
}
254+
255+
/* ── SciFi dark: neutral → dark slate remap ──────────────────────── */
256+
/* Neutral is used for secondary badges and subtle UI elements.
257+
Remap to dark navy/slate tones that blend with the HUD.
258+
!important required because Tailwind v4 defines these as oklch in @layer theme. */
259+
[data-theme='scifi'] {
260+
--color-neutral-50: #e8f4f8 !important;
261+
--color-neutral-100: #d0e8ef !important;
262+
--color-neutral-200: #a8cdd9 !important;
263+
--color-neutral-300: #7ab4cc !important;
264+
--color-neutral-400: #4d94b3 !important;
265+
--color-neutral-500: #2a6d8a !important;
266+
--color-neutral-600: #1e5a73 !important;
267+
--color-neutral-700: #16475c !important;
268+
--color-neutral-800: #0f3547 !important;
269+
--color-neutral-900: #0a2035 !important;
270+
--color-neutral-950: #060e18 !important;
271+
/* ── white → dark background in SciFi dark ── */
272+
/* Components like chat-controls popover use bg-white / dark:bg-neutral-900.
273+
In SciFi dark, white must become the panel background color. */
274+
--color-white: #0d1b2a !important;
275+
}
276+
277+
/* ── SciFi dark: selected menu items — force bg/text on inline-styled MenuItem ─ */
278+
/* MenuItem sets color: var(--theme-text) and background via onMouseEnter/Leave
279+
inline styles, which override Tailwind classes like bg-amber-100 text-amber-800.
280+
In SciFi dark, selected items need a visible teal background with bright text. */
281+
[data-theme='scifi'] .bg-amber-100 {
282+
background-color: var(--color-amber-100) !important;
283+
color: var(--color-amber-800) !important;
284+
}
285+
[data-theme='scifi'] .bg-amber-100 .text-amber-800 {
286+
color: var(--color-amber-800) !important;
287+
}
288+
[data-theme='scifi'] .bg-amber-100 .text-amber-600 {
289+
color: var(--color-amber-600) !important;
290+
}
291+
[data-theme='scifi'] .bg-amber-100 .text-primary-600 {
292+
color: var(--color-amber-600) !important;
293+
}
294+
[data-theme='scifi'] .bg-amber-100 .text-primary-300 {
295+
color: var(--color-amber-700) !important;
296+
}
297+
298+
/* ── SciFi dark: active tab indicator in Usage Details dialog ──── */
299+
/* Tabs "Session / Providers" use bg-primary-100 for the active tab
300+
inside a bg-primary-50 container. In SciFi dark, primary-50 (#0d1b2a)
301+
and primary-100 (#112240) are too similar — the active tab is invisible.
302+
Target .bg-primary-50 > button to scope to tab containers only. */
303+
[data-theme='scifi'] .bg-primary-50 > button.bg-primary-100 {
304+
background-color: rgba(0, 240, 255, 0.15) !important;
305+
color: var(--theme-accent) !important;
306+
box-shadow: 0 0 8px rgba(0, 240, 255, 0.2) !important;
307+
text-shadow: 0 0 6px rgba(0, 240, 255, 0.3) !important;
308+
}
309+
310+
/* ── SciFi light: amber → teal remap ──────────────────────────────── */
311+
/* Same rationale: replace yellow/amber with teal to match the cold
312+
steel + cyan accent palette of scifi-light. */
313+
[data-theme='scifi-light'] {
314+
--color-amber-50: #e8f4f6 !important;
315+
--color-amber-100: #d0e8ec !important;
316+
--color-amber-200: #b0d8e0 !important;
317+
--color-amber-300: #80c4d0 !important;
318+
--color-amber-400: #4da8b8 !important;
319+
--color-amber-500: #0097a7 !important;
320+
--color-amber-600: #00838f !important;
321+
--color-amber-700: #006974 !important;
322+
--color-amber-800: #004d57 !important;
323+
--color-amber-900: #003a42 !important;
324+
--color-amber-950: #002930 !important;
325+
--color-yellow-50: #f5f0e0 !important;
326+
--color-yellow-100: #ebe0c0 !important;
327+
--color-yellow-200: #d8c890 !important;
328+
--color-yellow-300: #c4a860 !important;
329+
--color-yellow-400: #a88a30 !important;
330+
--color-yellow-500: #8a7020 !important;
331+
--color-yellow-600: #6b5518 !important;
332+
--color-yellow-700: #4a3a10 !important;
333+
--color-yellow-800: #2e2510 !important;
334+
--color-yellow-900: #1a150a !important;
335+
--color-yellow-950: #100d08 !important;
336+
--color-red-50: #fde8e8 !important;
337+
--color-red-100: #fbd0d0 !important;
338+
--color-red-200: #f5a8a8 !important;
339+
--color-red-300: #ef8080 !important;
340+
--color-red-400: #e05050 !important;
341+
--color-red-500: #c62828 !important;
342+
--color-red-600: #b71c1c !important;
343+
--color-red-700: #8e1515 !important;
344+
--color-red-800: #6b1010 !important;
345+
--color-red-900: #4a0a0a !important;
346+
--color-red-950: #300606 !important;
347+
--color-emerald-50: #e8f5ee !important;
348+
--color-emerald-100: #d0ebda !important;
349+
--color-emerald-200: #b0d8be !important;
350+
--color-emerald-300: #80c498 !important;
351+
--color-emerald-400: #4da870 !important;
352+
--color-emerald-500: #2e7d52 !important;
353+
--color-emerald-600: #256b45 !important;
354+
--color-emerald-700: #1a5a37 !important;
355+
--color-emerald-800: #0f4428 !important;
356+
--color-emerald-900: #0a3018 !important;
357+
--color-emerald-950: #061f10 !important;
358+
--color-neutral-50: #f4f6f9 !important;
359+
--color-neutral-100: #e4e9ef !important;
360+
--color-neutral-200: #c4cdd8 !important;
361+
--color-neutral-300: #a0b0c0 !important;
362+
--color-neutral-400: #7088a0 !important;
363+
--color-neutral-500: #5a6a7e !important;
364+
--color-neutral-600: #4a5a6e !important;
365+
--color-neutral-700: #3a4a5e !important;
366+
--color-neutral-800: #2a3a4e !important;
367+
--color-neutral-900: #1a2a3e !important;
368+
--color-neutral-950: #0a1628 !important;
369+
}
370+
371+
/* ── SciFi light: selected menu items — force bg/text on inline-styled MenuItem ─ */
372+
[data-theme='scifi-light'] .bg-amber-100 {
373+
background-color: var(--color-amber-100) !important;
374+
color: var(--color-amber-800) !important;
375+
}
376+
[data-theme='scifi-light'] .bg-amber-100 .text-amber-800 {
377+
color: var(--color-amber-800) !important;
378+
}
379+
[data-theme='scifi-light'] .bg-amber-100 .text-amber-600 {
380+
color: var(--color-amber-600) !important;
381+
}
382+
[data-theme='scifi-light'] .bg-amber-100 .text-primary-600 {
383+
color: var(--color-amber-600) !important;
384+
}
385+
[data-theme='scifi-light'] .bg-amber-100 .text-primary-300 {
386+
color: var(--color-amber-700) !important;
387+
}
388+
389+
/* ── SciFi light: active tab indicator ──────────────────────────── */
390+
[data-theme='scifi-light'] .bg-primary-50 > button.bg-primary-100 {
391+
background-color: rgba(0, 151, 167, 0.15) !important;
392+
color: var(--theme-accent) !important;
393+
box-shadow: 0 0 6px rgba(0, 151, 167, 0.2) !important;
394+
text-shadow: none !important;
395+
}

0 commit comments

Comments
 (0)