From 7a7a84b6ad3545473fcaaa763bd8763a824a55a7 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Wed, 22 Oct 2025 23:15:20 -0400 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=A4=96=20Centralize=20Tailwind=20colo?= =?UTF-8?q?r=20usage=20with=20CSS=20variables?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace hardcoded hex colors and arbitrary Tailwind values with semantic CSS variables throughout the codebase. This improves maintainability and makes it easier to update the color scheme consistently. Changes: - Extended @theme in globals.css with 40+ new semantic color variables - Replaced 157 instances of text-[#...], bg-[#...], border-[#...] - Replaced rgba() arbitrary values with named color variables - Replaced var() usages with direct Tailwind classes - Applied to both components and Storybook stories New color categories added: - Text variants (muted-light, muted-dark, placeholder, subtle, etc.) - Border variants (border-medium, border-darker, border-light, etc.) - Background variants (bg-dark, bg-darker, modal-bg, etc.) - Accent variants (accent-hover, accent-dark, accent-light, etc.) - Status colors (danger-light, danger-soft, warning, success-light, etc.) - Toast/notification backgrounds with opacity - Semi-transparent overlays (danger-overlay, warning-overlay, etc.) - Code syntax highlighting (code-type, code-keyword, etc.) - Review/diff backgrounds (review-bg-blue, review-bg-info, etc.) All colors are now centralized in src/styles/globals.css and use Tailwind v4's @theme directive for automatic class generation. _Generated with `cmux`_ --- src/components/AIView.tsx | 16 ++-- src/components/ChatInputToast.tsx | 12 +-- src/components/CommandPalette.stories.tsx | 6 +- src/components/CommandPalette.tsx | 14 +-- src/components/CommandSuggestions.tsx | 10 +-- src/components/Context1MCheckbox.tsx | 2 +- src/components/DirectorySelectModal.tsx | 2 +- src/components/ErrorBoundary.tsx | 4 +- src/components/GitStatusIndicatorView.tsx | 22 ++--- src/components/ImageAttachments.tsx | 2 +- src/components/KebabMenu.tsx | 8 +- src/components/LeftSidebar.tsx | 6 +- .../Messages/ChatBarrier/RetryBarrier.tsx | 2 +- .../Messages/HistoryHiddenMessage.tsx | 2 +- src/components/Messages/MessageWindow.tsx | 2 +- src/components/Messages/TerminalOutput.tsx | 2 +- src/components/Messages/UserMessage.tsx | 2 +- src/components/Modal.tsx | 11 ++- src/components/ModelSelector.tsx | 12 +-- src/components/NewWorkspaceModal.tsx | 10 +-- src/components/ProjectSidebar.tsx | 28 +++--- src/components/RightSidebar.tsx | 2 +- .../RightSidebar/CodeReview/FileTree.tsx | 10 +-- .../RightSidebar/CodeReview/HunkViewer.tsx | 17 ++-- .../CodeReview/ReviewControls.tsx | 6 +- .../RightSidebar/CodeReview/ReviewPanel.tsx | 18 ++-- .../CodeReview/UntrackedStatus.tsx | 14 +-- .../RightSidebar/ConsumerBreakdown.tsx | 2 +- src/components/RightSidebar/CostsTab.tsx | 12 +-- src/components/RightSidebar/TokenMeter.tsx | 2 +- src/components/SecretsModal.tsx | 8 +- src/components/StatusIndicator.stories.tsx | 26 +++--- src/components/StatusIndicator.tsx | 2 +- src/components/ThinkingSlider.stories.tsx | 22 ++--- src/components/ThinkingSlider.tsx | 4 +- src/components/TipsCarousel.stories.tsx | 20 ++--- src/components/TitleBar.tsx | 2 +- src/components/ToggleGroup.stories.tsx | 10 +-- src/components/Tooltip.stories.tsx | 18 ++-- src/components/Tooltip.tsx | 4 +- src/components/VimTextArea.tsx | 12 +-- src/components/WorkspaceListItem.tsx | 4 +- src/components/shared/DiffRenderer.tsx | 4 +- src/components/tools/BashToolCall.tsx | 4 +- src/components/tools/FileEditToolCall.tsx | 4 +- src/components/tools/FileReadToolCall.tsx | 6 +- .../tools/shared/ToolPrimitives.tsx | 2 +- src/styles/globals.css | 87 +++++++++++++++++-- 48 files changed, 286 insertions(+), 211 deletions(-) diff --git a/src/components/AIView.tsx b/src/components/AIView.tsx index 721b68704..161c87139 100644 --- a/src/components/AIView.tsx +++ b/src/components/AIView.tsx @@ -245,12 +245,12 @@ const AIViewInner: React.FC = ({ return (
-
+

Loading workspace...

@@ -286,12 +286,12 @@ const AIViewInner: React.FC = ({ return (
-
+

Loading workspace...

@@ -302,12 +302,12 @@ const AIViewInner: React.FC = ({ return (
-
+

No Workspace Selected

Select a workspace from the sidebar to view and interact with Claude @@ -320,7 +320,7 @@ const AIViewInner: React.FC = ({ return (

= ({ className="h-full overflow-y-auto p-[15px] whitespace-pre-wrap break-words leading-[1.5]" > {mergedMessages.length === 0 ? ( -
+

No Messages Yet

Send a message below to begin

diff --git a/src/components/ChatInputToast.tsx b/src/components/ChatInputToast.tsx index e7d53fbea..5960311f8 100644 --- a/src/components/ChatInputToast.tsx +++ b/src/components/ChatInputToast.tsx @@ -3,8 +3,8 @@ import React, { useEffect, useCallback } from "react"; import { cn } from "@/lib/utils"; const toastTypeStyles: Record<"success" | "error", string> = { - success: "bg-[#0e639c20] border border-[#0e639c] text-[#3794ff]", - error: "bg-[#f1483620] border border-[#f14836] text-[#f14836]", + success: "bg-toast-success-bg border border-accent-dark text-toast-success-text", + error: "bg-toast-error-bg border border-toast-error-border text-toast-error-text", }; export interface Toast { @@ -22,7 +22,7 @@ interface ChatInputToastProps { } export const SolutionLabel: React.FC<{ children: ReactNode }> = ({ children }) => ( -
{children}
+
{children}
); export const ChatInputToast: React.FC = ({ toast, onDismiss }) => { @@ -65,15 +65,15 @@ export const ChatInputToast: React.FC = ({ toast, onDismiss
{toast.title &&
{toast.title}
} -
{toast.message}
+
{toast.message}
{toast.solution && ( -
+
{toast.solution}
)} diff --git a/src/components/CommandPalette.stories.tsx b/src/components/CommandPalette.stories.tsx index 33d45d8d8..a72b30186 100644 --- a/src/components/CommandPalette.stories.tsx +++ b/src/components/CommandPalette.stories.tsx @@ -132,7 +132,7 @@ const PaletteDemo: React.FC<{ autoOpen?: boolean }> = ({ autoOpen = true }) => { <> @@ -174,8 +174,8 @@ type Story = StoryObj; export const Default: Story = { render: () => ( -
-
+
+
Command Palette

diff --git a/src/components/CommandPalette.tsx b/src/components/CommandPalette.tsx index 75514c051..658db4715 100644 --- a/src/components/CommandPalette.tsx +++ b/src/components/CommandPalette.tsx @@ -364,12 +364,12 @@ export const CommandPalette: React.FC = ({ getSlashContext }} > e.stopPropagation()} shouldFilter={shouldUseCmdkFilter} > = ({ getSlashContext {group.items.map((item) => ( { if ("prompt" in item && item.prompt) { addRecent(item.id); @@ -435,12 +435,12 @@ export const CommandPalette: React.FC = ({ getSlashContext {"subtitle" in item && item.subtitle && ( <>
- {item.subtitle} + {item.subtitle} )}
{"shortcutHint" in item && item.shortcutHint && ( - + {item.shortcutHint} )} @@ -449,7 +449,7 @@ export const CommandPalette: React.FC = ({ getSlashContext ))} {!hasAnyItems && ( -
{emptyText ?? "No results"}
+
{emptyText ?? "No results"}
)} diff --git a/src/components/CommandSuggestions.tsx b/src/components/CommandSuggestions.tsx index f2f985beb..a6d7696b3 100644 --- a/src/components/CommandSuggestions.tsx +++ b/src/components/CommandSuggestions.tsx @@ -104,19 +104,19 @@ export const CommandSuggestions: React.FC = ({ role="option" aria-selected={index === selectedIndex} className={cn( - "px-2.5 py-1.5 cursor-pointer transition-colors duration-150 flex items-center justify-between gap-3 hover:bg-[#094771]", - index === selectedIndex ? "bg-[#094771]" : "bg-transparent" + "px-2.5 py-1.5 cursor-pointer transition-colors duration-150 flex items-center justify-between gap-3 hover:bg-accent-darker", + index === selectedIndex ? "bg-accent-darker" : "bg-transparent" )} > -
+
{suggestion.display}
-
+
{suggestion.description}
))} -
+
Tab to complete • ↑↓ to navigate • Esc to dismiss
diff --git a/src/components/Context1MCheckbox.tsx b/src/components/Context1MCheckbox.tsx index bf58a4f02..246a458ac 100644 --- a/src/components/Context1MCheckbox.tsx +++ b/src/components/Context1MCheckbox.tsx @@ -22,7 +22,7 @@ export const Context1MCheckbox: React.FC = ({ modelStrin type="checkbox" checked={use1M} onChange={(e) => setUse1M(e.target.checked)} - className="cursor-pointer w-[11px] h-[11px] m-0 appearance-none border border-border-light rounded-sm bg-bg-dark relative hover:border-accent checked:bg-accent checked:border-accent checked:after:content-[''] checked:after:absolute checked:after:left-[3px] checked:after:top-0 checked:after:w-[3px] checked:after:h-[6px] checked:after:border-solid checked:after:border-white checked:after:border-r-[1.5px] checked:after:border-b-[1.5px] checked:after:rotate-45" + className="cursor-pointer w-[11px] h-[11px] m-0 appearance-none border border-border-light rounded-sm bg-dark relative hover:border-accent checked:bg-accent checked:border-accent checked:after:content-[''] checked:after:absolute checked:after:left-[3px] checked:after:top-0 checked:after:w-[3px] checked:after:h-[6px] checked:after:border-solid checked:after:border-white checked:after:border-r-[1.5px] checked:after:border-b-[1.5px] checked:after:rotate-45" /> 1M Context diff --git a/src/components/DirectorySelectModal.tsx b/src/components/DirectorySelectModal.tsx index 4f227f229..d65657e91 100644 --- a/src/components/DirectorySelectModal.tsx +++ b/src/components/DirectorySelectModal.tsx @@ -82,7 +82,7 @@ export const DirectorySelectModal: React.FC = () => { onKeyDown={handleKeyDown} placeholder="/home/user/projects/my-project" autoFocus - className="w-full px-3 py-2 bg-modal-bg border border-[#444] rounded text-white text-sm font-mono mb-5 focus:outline-none focus:border-accent placeholder:text-muted" + className="w-full px-3 py-2 bg-modal-bg border border-border-medium rounded text-white text-sm font-mono mb-5 focus:outline-none focus:border-accent placeholder:text-muted" /> {error &&
{error}
} diff --git a/src/components/ErrorBoundary.tsx b/src/components/ErrorBoundary.tsx index 8d3f18725..fcce56530 100644 --- a/src/components/ErrorBoundary.tsx +++ b/src/components/ErrorBoundary.tsx @@ -42,7 +42,7 @@ export class ErrorBoundary extends Component { } return ( -
+

Something went wrong{this.props.workspaceInfo && ` in ${this.props.workspaceInfo}`}

@@ -59,7 +59,7 @@ export class ErrorBoundary extends Component { )} diff --git a/src/components/GitStatusIndicatorView.tsx b/src/components/GitStatusIndicatorView.tsx index 367278e98..bfcbd743b 100644 --- a/src/components/GitStatusIndicatorView.tsx +++ b/src/components/GitStatusIndicatorView.tsx @@ -62,7 +62,7 @@ export const GitStatusIndicatorView: React.FC = ({ if (!gitStatus) { return (