fix: WCAG-compliant theme token system (retargeted from #370)#551
fix: WCAG-compliant theme token system (retargeted from #370)#551openasocket wants to merge 194 commits intoRunMaestro:0.16.0-RCfrom
Conversation
Introduce maestro:// URL scheme support for navigating to agents, tabs, and groups from external apps and OS notification clicks. - Add deep-links module with URL parsing, protocol registration, single-instance locking, and cross-platform event handling - Wire notification click handlers to navigate to the originating agent/tab via deep link dispatch - Thread sessionId/tabId context through notification preload bridge - Add onDeepLink listener in renderer with routing to existing navigation handlers - Register maestro:// protocol in electron-builder config - Add 18 tests covering URL parsing and notification click wiring
- URI-encode sessionId/tabId when constructing deep link URLs in notification click handler to prevent malformed URLs with special chars - Add process.exit(0) after app.quit() so secondary instances exit immediately without running further module-level setup - Use useRef for sessions in deep link effect to avoid tearing down and re-registering the IPC listener on every sessions change - Guard against navigating to non-existent session IDs in deep link handler to prevent invalid UI state - Add cross-reference comment in global.d.ts linking to canonical ParsedDeepLink type (can't import in ambient declaration file) - Add test for URI-encoding round-trip in notification click handler
- Add shared deep-link-urls.ts with buildSessionDeepLink(),
buildGroupDeepLink(), and buildFocusDeepLink() utilities
- Add {{AGENT_DEEP_LINK}}, {{TAB_DEEP_LINK}}, {{GROUP_DEEP_LINK}}
template variables available in system prompts, custom AI commands,
and Auto Run documents
- Wire activeTabId and groupId into TemplateContext at all call sites
(agentStore, useInputProcessing, useRemoteHandlers,
useDocumentProcessor, useMergeTransferHandlers, batch-processor)
- Refactor notifications.ts to use shared buildSessionDeepLink()
- Add sessionId/tabId to notifyToast callers where context is available
(merge, transfer, summarize, PR creation)
- Add docs/deep-links.md documentation page with URL format, usage
examples, template variables, and platform behavior
- Add 8 tests for URL builders, 6 tests for template variable
substitution including URI encoding
…e activity indicators Broadcast new history entries via IPC when they are added, subscribe in the UnifiedHistoryTab with RAF batching and deduplication, and extend the HistoryStatsBar with spinning Active agent count and Queued message count indicators derived from the Zustand session store.
…orrect types - Replace unstable sessionNameMap Zustand selector (new Map per render) with a stable ref + subscribe pattern to avoid streaming effect re-subscription - Dedupe within batch before merging; compute setTotalEntries and setHistoryStats from deduplicated entries only (not raw batch) - Clear pendingEntriesRef on cleanup to prevent stale replay after resubscribe - Use HistoryEntry (not UnifiedHistoryEntry) in preload callback type since the wire payload lacks sourceSessionId - Use canonical UsageStats interface in global.d.ts (fixes pre-existing cacheReadTokens/cacheWriteTokens field name mismatch)
…URL registry support - Add `symphony: boolean` (default true) to EncoreFeatureFlags - Gate Symphony modal, menu item, keyboard shortcut (⇧⌘Y), and command palette entry - Add `symphonyRegistryUrls` setting for user-configured additional registry URLs - Replace single `fetchRegistry()` with `fetchRegistries()` that fetches default + custom URLs in parallel - Merge repositories by slug (default registry wins on conflicts), isolated per-URL error handling - Add Symphony toggle + Registry Sources UI in Settings > Encore tab - Update tests for new symphony flag across all encore feature assertions
- Redact registry URLs before logging to prevent credential leakage - Skip registry cache when custom source URLs are configured (stale cache fix) - Runtime-validate symphonyRegistryUrls from settings store - Reset modal-open flags when Encore Feature toggles are disabled - Normalize registry URLs before duplicate/default checks - Add aria-label to icon-only registry URL remove button - Expose setSymphonyRegistryUrls in getSettingsActions() - Validate persisted symphonyRegistryUrls with Array.isArray guard
…r, and Encore feature flag - Register maestroCue as an Encore Feature flag (EncoreFeatureFlags, DEFAULT_ENCORE_FEATURES) - Create src/main/cue/cue-types.ts with CueEventType, CueSubscription, CueSettings, CueConfig, CueEvent, CueRunStatus, CueRunResult, CueSessionStatus, and related constants - Add 'CUE' to HistoryEntryType across shared types, global.d.ts, preload, IPC handlers, and hooks - Add cueTriggerName, cueEventType, cueSourceSession optional fields to HistoryEntry - Add 'cue' log level to MainLogLevel, LOG_LEVEL_PRIORITY, logger switch/case, and LogViewer with teal color (#06b6d4), always-enabled filter, and agent name pill - Add 10 Cue-specific template variables (CUE_EVENT_TYPE, CUE_TRIGGER_NAME, etc.) with cueOnly flag - Extend TemplateContext with cue? field and substituteTemplateVariables with Cue replacements - Update TEMPLATE_VARIABLES_GENERAL filter to exclude cueOnly variables
…ovider Implements the three core modules for the Cue event-driven automation engine: - cue-yaml-loader.ts: Discovers and parses maestro-cue.yaml files with js-yaml, validates config structure, watches for file changes via chokidar with 1-second debounce - cue-file-watcher.ts: Wraps chokidar for file.changed subscriptions with per-file debouncing (5s default), constructs CueEvent instances with full file metadata payloads - cue-engine.ts: Main coordinator class with dependency injection, manages time.interval timers (fires immediately then on interval), file watchers, agent.completed listeners with fan-in tracking, activity log ring buffer (max 500), and run lifecycle management Added js-yaml and @types/js-yaml dependencies. 57 tests across 3 test files.
…story recording Implements the Cue executor module that spawns background agent processes when Cue triggers fire, following the same spawn pattern as Auto Run's process:spawn IPC handler. Key exports: - executeCuePrompt(): Full 10-step pipeline (prompt resolution, template substitution, agent arg building, SSH wrapping, process spawn with stdout/stderr capture, timeout enforcement with SIGTERM→SIGKILL) - stopCueRun(): Graceful process termination by runId - recordCueHistoryEntry(): Constructs HistoryEntry with type 'CUE' and all Cue-specific fields (trigger name, event type, source session) - getActiveProcesses(): Monitor running Cue processes Test coverage: 31 tests in cue-executor.test.ts covering execution paths, SSH remote, timeout escalation, history entry construction, and edge cases. Full suite: 21,635 tests passing across 512 files, zero regressions.
…zation for Maestro Cue
Add CUE entry support across all History components: - HistoryFilterToggle: CUE filter button with teal (#06b6d4) color and Zap icon - HistoryEntryItem: CUE pill, success/failure badges, and trigger metadata subtitle - HistoryPanel & UnifiedHistoryTab: CUE included in default activeFilters - HistoryDetailModal: CUE pill color, icon, success/failure indicator, trigger metadata display - Comprehensive test coverage for all CUE rendering paths (205 new/updated tests pass)
…nd activity log Add the Maestro Cue dashboard modal with full Encore Feature gating: - CueModal component with sessions table, active runs list, and activity log - useCue hook for state management, event subscriptions, and 10s polling - Settings toggle in Encore tab, command palette entry, keyboard shortcut (Cmd+Shift+U) - SessionList hamburger menu entry, modal store integration, lazy loading - 30 tests covering hook behavior and modal rendering
Add CueYamlEditor component for creating and editing maestro-cue.yaml files. Features split-view layout with AI assist (left panel for description + clipboard copy) and YAML editor (right panel with line numbers, debounced validation, Tab indentation). Integrates into CueModal via Edit YAML button on each session row.
…yaml Task 1: CueHelpModal component with 7 content sections (What is Maestro Cue, Getting Started, Event Types, Template Variables, Multi-Agent Orchestration, Timeouts & Failure Handling, AI YAML Editor). Wired to CueModal ? button. Registered with layer stack at MODAL_PRIORITIES.CUE_HELP (465). Task 2: useCueAutoDiscovery hook that calls cue:refreshSession when sessions are created/restored/removed, gated by encoreFeatures.maestroCue. Full scan on feature enable, engine disable on feature off. Tests: 38 CueHelpModal tests + 10 useCueAutoDiscovery tests, all passing. Lint clean. No existing test regressions (21,778 tests pass).
… session bridging Implement agent completion event chaining in the Cue engine: - Fan-out: subscriptions dispatch prompts to multiple target sessions simultaneously - Fan-in: subscriptions wait for all source sessions to complete before firing, with timeout handling (break clears tracker, continue fires with partial data) - Session bridging: user session completions trigger Cue subscriptions via exit listener - Add AgentCompletionData type for rich completion event payloads - Add hasCompletionSubscribers() optimization to skip unneeded notifications - Wire getCueEngine/isCueEnabled into ProcessListenerDependencies
…ure gated) Add teal Zap icon next to session names in the Left Bar for sessions with active Maestro Cue subscriptions. The indicator is gated behind the maestroCue Encore Feature flag and shows a tooltip with the subscription count on hover. - Add cueSubscriptionCount prop to SessionItem with Zap icon rendering - Add lightweight Cue status fetching in SessionListInner via cue:getStatus IPC, refreshed on cue:activityUpdate events - Add cue namespace to global test setup mock - 6 unit tests + 3 integration tests; all 21,815 tests pass; lint clean
Add Maestro Cue entries across all developer documentation: - CLAUDE.md: Key Files table (4 entries), Architecture tree (cue/ dir), Standardized Vernacular (Cue + Cue Modal terms) - CLAUDE-PATTERNS.md: Encore Feature section lists maestroCue as second reference implementation alongside directorNotes - CLAUDE-IPC.md: cue namespace in Automation section, full Cue API reference with all endpoints and event documentation
…t journal - Add cue-db.ts: SQLite-backed event journal (cue_events table) and single-row heartbeat table (cue_heartbeat) using better-sqlite3 with WAL mode - Add cue-reconciler.ts: time event catch-up logic that fires exactly one reconciliation event per missed subscription (no flooding), with payload.reconciled and payload.missedCount metadata - Update cue-engine.ts: heartbeat writer (30s interval), sleep detection (2-minute gap threshold), database pruning (7 days), and clean shutdown - Update CueHelpModal: new "Sleep & Recovery" section with Moon icon - Update CueModal: amber "catch-up" badge on reconciled activity log entries - Tests: 41 new tests across cue-db (17), cue-reconciler (11), cue-sleep-wake (13)
Add filter field to CueSubscription for narrowing when subscriptions fire. Supports exact match, negation (!), numeric comparison (>/</>=/<=), glob patterns (picomatch), and boolean matching with AND logic. Filter checks integrated at all three dispatch points (file.changed, time.interval, agent.completed). Includes help modal docs, AI prompt updates, and 80 new tests (43 filter engine + 37 YAML loader).
… awareness Add pattern presets (Scheduled Task, File Enrichment, Reactive, Research Swarm, Sequential Chain, Debate) to the YAML editor as clickable cards. Enhance the AI system prompt with pattern recognition guidance. Add a Coordination Patterns section with ASCII flow diagrams to the help modal.
Add github.pull_request and github.issue event types to CueEventType union. Add repo and poll_minutes fields to CueSubscription interface. Add cue_github_seen SQLite table with 5 CRUD functions for tracking seen GitHub items (isGitHubItemSeen, markGitHubItemSeen, hasAnyGitHubSeen, pruneGitHubSeen, clearGitHubSeenForSubscription). Create cue-github-poller.ts module that polls GitHub CLI for new PRs/issues, seeds existing items on first run, and fires CueEvents for new items. Comprehensive test suite with 17 test cases covering all polling behaviors. All 264 Cue tests pass, lint clean.
…ge) to Cue patterns
Add GitHub Pull Request and GitHub Issue event type blocks with descriptions, YAML configuration examples, and seven new GitHub template variables (CUE_GH_*) to the Cue Help Modal documentation.
Navigates to the nearest terminal tab in the unified tab order from the current position. If already on a terminal tab, stays there.
- Document Graph controls now auto-close other dropdowns for cleaner UX 🧭 - Session bookmarks hide automatically when filtering unread agents only 🔖 - Unread tab filter now keeps busy tabs visible for better awareness ⏳ - Tab keyboard shortcuts now work across AI, terminal, and file modes ⌨️ - Unread-only navigation now treats busy tabs as navigable targets 🧠
When showUnreadAgentsOnly is active, agent cycling (Cmd+[/]) now only visits unread or busy agents instead of all visible agents. The currently active agent is always included so you don't get stuck. Claude ID: 21220442-55d4-4a7c-ba6c-34d278946cf4 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
…ssions 🧩 - OS notifications are kept alive to prevent lost click events 🛡️ - Notification lifecycle cleanup now runs on close and click reliably 🧹 - Agent drawer auto-focuses the search box when opened for faster picking 🎯 - Tab Bar tooltips now reflect user-configured shortcut bindings dynamically ⌨️ - Unread-only session filtering preserves your active session visibility 🧭 - Unread filter now considers unread/busy worktree children, not just parents 🌿 - Worktrees auto-expand while filtering unread so nothing important is hidden 🔎 - Right panel focus ring clears correctly when focus leaves the panel 🎛️ - Focus ring styling no longer bumps z-index, reducing visual layering glitches 🪟
…olish - Tab naming: resolve early from partial output (2s interval) instead of waiting for full process exit; bump timeout 30s → 45s for cold starts - Cue pipeline: prefer subscription name match over stale agent_id when resolving target sessions; fall back to name-based lookup when agent_id is absent - Auto Run: return empty content with notFound flag for missing files instead of throwing, avoiding errors on deleted/renamed documents - LogViewer: add per-entry copy button with clipboard support - AutoRunDocumentSelector: use file icons from theme, move task percentage badge to right-aligned position - Web server: avoid returning stale logs from wrong tab during new tab creation race
Match the tab filter icon pattern where the accent dot is always visible rather than conditional on hasUnreadAgents. Removed the now-unused hasUnreadAgents prop and memo.
…Now for Cue pipelines - Edge-based prompts: each trigger→agent edge can carry its own prompt, enabling multiple triggers to feed the same agent with different instructions - Custom trigger labels: user-defined names (e.g. "Morning Check") displayed on trigger nodes and serialized as subscription labels in YAML - Run Now button: manually trigger any subscription from the Cue dashboard, bypassing event conditions via synthetic event dispatch - Visual polish: pulsing animation on active nodes, larger arrowheads on selected edges, disabled drawer buttons when viewing all pipelines - YAML round-trip: yamlToPipeline deserializes edge prompts and trigger labels; pipelineToYaml generates unique prompt file paths for multi-trigger agents - Tests: 4 new test cases covering edge prompts, custom labels, multi-trigger serialization, and unique prompt file path generation Claude ID: 3ce19e17-50c0-47ff-bc36-f979900ec700 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Defer splash dismissal until UI has painted with loaded data, preventing the unresponsive gap after the loading screen clears. Progress stages now follow an orchestra warm-up sequence: tuning instruments → reading the score → seating the musicians → warming up the ensemble → the concertmaster rises → maestro takes the podium → curtain up. Claude ID: fc0c8654-1a8f-4a20-a734-fd60d0e73aa3 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Adds a chevron toggle in the drawer header that expands the node configuration panel from 200px to 80% viewport height. When expanded, textareas switch from fixed rows to flex-fill layout, responsively splitting available space among input/output prompts and per-edge trigger prompts. Includes smooth height transition animation. Claude ID: fc0c8654-1a8f-4a20-a734-fd60d0e73aa3 Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Worktree and wizard sessions now start with only an AI tab. Users can launch terminal tabs on demand. Removes unnecessary createTerminalTab calls and imports from worktreeSession.ts and useWizardHandlers.ts. Claude ID: c57f388f-2e03-48f6-b055-bfb0510fd774 Maestro ID: 373c50f0-14a3-45b7-833f-ccc086211379
The worktree children filter in SessionList was hiding the active session when it had no unread tabs and wasn't busy. Added activeSessionId exemption so the user's current worktree always appears in the left bar.
…pdate tests - Fix DEFAULT_SHORTCUTS.maestroCue → openCue in CueHelpModal (runtime crash) - Remove orphaned auto-scroll toggle JSX and state refs in TerminalOutput - Remove orphaned CueYamlEditor import/state in CueModal (replaced by pipeline editor) - Remove orphaned stats/WakaTime settings and effects in EncoreTab - Remove duplicate filterUnreadAgents branch in useMainKeyboardHandler - Add missing imports in DocumentGenerationView (MermaidRenderer, useClickOutside, etc.) - Prefix unused readOnlyMode param in agent-spawner - Remove unnecessary eslint-disable comment in MainPanel - Update CueModal test: YAML editor assertion → stub no-throw check - Update keyboard handler test: Cmd+T in terminal mode correctly blocked (AI mode only)
SSH Group Chat participants crashed immediately (exit code 1) because large prompts were embedded in bash -c CLI args via buildSshCommand(), where ProcessManager couldn't detect --input-format stream-json flags to enable stdin delivery. Switched to buildSshCommandWithStdin() for large prompts, matching the proven pattern in process:spawn IPC handler. Also added missing SSH wrapping to spawnModeratorSynthesis().
Added a useEffect in App.tsx that tracks inputMode transitions via a ref. When switching from terminal back to AI mode (via tab click, Cmd+J, or any other path), the input textarea is automatically focused so the user can immediately start typing. Claude ID: 3ce1f013-9673-40ec-ac0c-5cf1eaca0198 Maestro ID: 373c50f0-14a3-45b7-833f-ccc086211379
- Session cleanup now kills AI, legacy terminal, and tab PTYs reliably 🔥 - Terminal tabs get proper per-tab process IDs via `getTerminalSessionId` 🧩 - Closing sessions now iterates all `terminalTabs` to terminate each PTY ✅ - Deleting sessions also shuts down every terminal tab process cleanly 🧹 - Improved test coverage for multi-tab PTY termination on close 🧪 - More resilient error handling around terminal-tab process kills 🛡️ - Sentry captures tab-kill failures with session and tab context 🕵️ - Clearer lifecycle comments and intent: “kill all processes” upfront 📝
Cmd+0 was previously consumed by font size reset, blocking the goToLastTab shortcut. Now Cmd+0 goes to the last tab (consistent with Cmd+1-9 tab navigation) and Cmd+Shift+0 resets font size. Font size reset is now customizable in Settings → Shortcuts (moved from FIXED_SHORTCUTS to DEFAULT_SHORTCUTS).
- Splash screen now waits for initial file tree readiness before dismissing 🎬 - Added `initialFileTreeReady` gate to session store initialization flow 🧱 - New splash progress stage highlights file indexing at 80% 🗂️ - UI rendering stage bumped to 90% once file tree finishes loading 📈 - File tree manager signals readiness exactly once on success or error 🔔 - Session restoration unblocks splash immediately when no sessions exist 🧹 - Session-load failures now mark file tree ready to prevent startup hangs 🧯 - App initialization reacts to settings, sessions, and file tree readiness 🔄 - Improved startup messaging: “Indexing the score...” during file discovery 🎻 - Updated tests to cover new three-gate splash behavior and progress ✅
The scroll-into-view logic used full container bounds but didn't subtract the widths of the sticky left (search/filter) and right (+) elements, causing the active tab's close button to be hidden behind them when jumping to a tab or after auto-rename.
Session rows and process rows now show a hover-visible ExternalLink button that navigates to the agent (session) or specific tab and closes the modal. Group chat processes get a similar button that navigates to the group chat.
Show a confirmation modal when closing AI tabs that have draft text or staged images. Applies to single tab close (Cmd+W, click X), and bulk operations (close all, close other, close left, close right).
… retarget Resolved 13 merge conflicts from squash-merging the theme integration branch onto 0.16.0-RC. Core WCAG-compliant theme token system preserved (ThemeColors expanded to 30 required fields with sectioned CustomThemeBuilder). Fixed 4 test expectations where tests expected theme tokens but components retained RC's hardcoded color values (LogViewer info/warn/error levels, PromptComposerModal backdrop). All 563 test files pass (23018 tests). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Greptile SummaryThis PR retargets PR #370 onto the Key changes and issues:
Confidence Score: 3/5
Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
TT["ThemeColors interface\n(30 color tokens + ANSI palette)"]
TT --> BG["Core Backgrounds\nbgMain · bgSidebar · bgActivity · border"]
TT --> TYP["Typography\ntextMain · textDim"]
TT --> ACC["Accent\naccent · accentDim · accentText · accentForeground"]
TT --> STA["Status Colors\nsuccess · warning · error · info"]
TT --> SFG["Status Foregrounds\nsuccessForeground · warningForeground · errorForeground"]
TT --> SDM["Status Dims\nsuccessDim · warningDim · errorDim · infoDim"]
TT --> GIT["Git Diff\ndiffAddition · diffAdditionBg · diffDeletion · diffDeletionBg"]
TT --> OVR["Overlays & Interactive\noverlay · overlayHeavy · hoverBg · activeBg · shadow"]
TT --> THEMES["16 Built-in Themes\n+ DEFAULT_CUSTOM_THEME_COLORS"]
THEMES --> CTH["CustomThemeBuilder\n8 sectioned groups"]
THEMES --> CSP["cssCustomProperties.ts\n→ 30 CSS vars + --maestro-mode"]
CSP --> TP["ThemeProvider\napplies vars to :root"]
THEMES --> MC["markdownConfig.ts\ngenerateDiffViewStyles"]
THEMES --> COMPS["Components\nGitDiffViewer · TerminalOutput\nTabBar · LogViewer · App …"]
SS["settingsStore.ts\nloadAllSettings migration\nmerge saved + DEFAULT_CUSTOM_THEME_COLORS"]
SS --> CTH
|
| accentDim: 'rgba(58, 122, 144, 0.1)', | ||
| accentText: '#2b77ae', | ||
| accentForeground: '#1a1a1a', | ||
| success: '#5d7c00', | ||
| warning: '#946a2c', | ||
| error: '#b45555', | ||
| success: '#86b300', | ||
| warning: '#f2ae49', | ||
| error: '#f07171', | ||
| info: '#399ee6', |
There was a problem hiding this comment.
WCAG contrast failure in Ayu Light errorForeground
This PR specifically aims to establish WCAG-compliant tokens, but the Ayu Light theme sets errorForeground: '#ffffff' (white) on error: '#f07171' (a light salmon/coral red). The estimated contrast ratio is ≈ 2.79:1, which fails both WCAG AA (4.5:1 for small text) and WCAG AA for large text (3:1).
By contrast, successForeground and warningForeground for the same theme correctly use '#1a1a1a', which achieves ≈ 5.8:1 against the same light background palette. The errorForeground should be '#1a1a1a' (or similar dark value) to remain consistent and accessible.
| accentDim: 'rgba(58, 122, 144, 0.1)', | |
| accentText: '#2b77ae', | |
| accentForeground: '#1a1a1a', | |
| success: '#5d7c00', | |
| warning: '#946a2c', | |
| error: '#b45555', | |
| success: '#86b300', | |
| warning: '#f2ae49', | |
| error: '#f07171', | |
| info: '#399ee6', | |
| successForeground: '#1a1a1a', | |
| warningForeground: '#1a1a1a', | |
| errorForeground: '#1a1a1a', |
| accentText: string; | ||
| /** Text color for use ON accent backgrounds (contrasting color) */ | ||
| accentForeground: string; | ||
|
|
||
| // --- Status colors --- | ||
| /** Success state color (green tones) */ | ||
| success: string; | ||
| /** Warning state color (yellow/orange tones) */ | ||
| warning: string; | ||
| /** Error state color (red tones) */ | ||
| error: string; | ||
| /** Info state color (blue tones) */ | ||
| info: string; | ||
|
|
||
| // --- Status foregrounds (text ON status backgrounds) --- | ||
| /** Text color for use ON success backgrounds */ | ||
| successForeground: string; | ||
| /** Text color for use ON warning backgrounds */ | ||
| warningForeground: string; | ||
| /** Text color for use ON error backgrounds */ | ||
| errorForeground: string; | ||
|
|
||
| // --- Status dim backgrounds (subtle badges/tags) --- | ||
| /** Dimmed success background for badges and tags */ | ||
| successDim: string; | ||
| /** Dimmed warning background for badges and tags */ | ||
| warningDim: string; | ||
| /** Dimmed error background for badges and tags */ | ||
| errorDim: string; | ||
| /** Dimmed info background for badges and tags */ | ||
| infoDim: string; | ||
|
|
||
| // --- Git diff colors --- | ||
| /** Color for added lines/files in diffs */ | ||
| diffAddition: string; | ||
| /** Background for added lines/files in diffs */ | ||
| diffAdditionBg: string; | ||
| /** Color for deleted lines/files in diffs */ | ||
| diffDeletion: string; | ||
| /** Background for deleted lines/files in diffs */ | ||
| diffDeletionBg: string; | ||
|
|
||
| // --- Overlay and interactive states --- | ||
| /** Modal/overlay backdrop color */ | ||
| overlay: string; | ||
| /** Heavy overlay for wizard/fullscreen modals */ | ||
| overlayHeavy: string; | ||
| /** Subtle hover state background */ | ||
| hoverBg: string; | ||
| /** Selected/active state background */ | ||
| activeBg: string; | ||
| /** Standard elevation shadow color */ | ||
| shadow: string; | ||
|
|
||
| /** |
There was a problem hiding this comment.
Missing infoForeground token breaks symmetry
The PR adds info as a status color alongside success, warning, and error, and it adds successForeground, warningForeground, and errorForeground — but there is no corresponding infoForeground. Every other status color gets a foreground token for text placed on top of it. If a component ever renders text on an info-colored badge background, there is no standardized accessible foreground to reach for, which reintroduces the hardcoded-color problem this PR is designed to solve.
Consider adding infoForeground to ThemeColors, to all theme objects, and to the STATUS_FOREGROUNDS section in CustomThemeBuilder for consistency.
Summary
fix/theme-integration) frommainto0.16.0-RCConflict Resolution
Resolved 13 merge conflicts via squash-merge approach:
theme-types.ts,themes.ts,CustomThemeBuilder.tsx): PR's expanded token system preservedTest Plan
npx tsc --noEmit)Supersedes #370.
🤖 Generated with Claude Code