From 315fcca10a826d8aa1cbdffc3ef5b5eb5a1e2f9d Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Thu, 24 Sep 2026 10:49:04 -0700 Subject: [PATCH] fix(web): web colors come from theme tokens (#13371) Co-authored-by: Claude Opus 5.5 (1M context) --- apps/web/src/components/ChatMarkdown.tsx | 2 +- apps/web/src/components/Icons.tsx | 85 +++++++++++++++++++ apps/web/src/components/LegacySidebar.tsx | 2 +- apps/web/src/components/QuitHoldOverlay.tsx | 2 +- apps/web/src/components/Sidebar.tsx | 18 ++-- .../ThreadNotificationCoordinator.tsx | 17 +--- apps/web/src/components/ThreadSearchMatch.tsx | 2 +- apps/web/src/components/chat/ChatComposer.tsx | 2 +- .../components/chat/ContextWindowMeter.tsx | 2 +- .../src/components/chat/MessagesTimeline.tsx | 26 +----- apps/web/src/components/chat/ModelListRow.tsx | 2 +- .../chat/TerminalContextInlineChip.tsx | 2 +- .../cloud/ConnectCliAuthSurface.tsx | 2 +- .../components/device/DeviceStreamView.tsx | 4 +- .../preview/ThreadPreviewMiniPlayer.tsx | 6 +- .../pullRequest/PullRequestCodeTab.tsx | 8 +- .../pullRequest/PullRequestDetailPanel.tsx | 2 +- .../PullRequestReviewAnnotation.tsx | 2 +- .../pullRequest/PullRequestSummaryTab.tsx | 2 +- .../settings/AddProviderInstanceDialog.tsx | 2 +- .../settings/ConnectionsSettings.tsx | 2 +- .../settings/DiagnosticsSettings.tsx | 10 +-- .../settings/ResourceTelemetryDiagnostics.tsx | 48 +++++------ .../settings/SnapShotSetupDialog.tsx | 77 ++--------------- .../sidebar/DesktopUpdateStatusIcon.tsx | 2 +- apps/web/src/components/usage/UsagePage.tsx | 2 +- apps/web/src/routes/_chat.pull-requests.tsx | 2 +- vite.config.ts | 12 +++ 28 files changed, 173 insertions(+), 172 deletions(-) diff --git a/apps/web/src/components/ChatMarkdown.tsx b/apps/web/src/components/ChatMarkdown.tsx index 56d46c010891e77de07897bf98db82f109a0c8ec..8a174852ece262ba5736ac8f09566acbfe256e15 100644 --- a/apps/web/src/components/ChatMarkdown.tsx +++ b/apps/web/src/components/ChatMarkdown.tsx @@ -308,7 +308,7 @@ function CodexArtifactTemplateCard(props: {
- + diff --git a/apps/web/src/components/Icons.tsx b/apps/web/src/components/Icons.tsx index e4d41d53c3a8978c541d03e9ffa9c9a90e03dae2..23b10a36676e7fd6d2e5add3f642376015186026 100644 --- a/apps/web/src/components/Icons.tsx +++ b/apps/web/src/components/Icons.tsx @@ -781,3 +781,88 @@ export const ForgejoIcon: Icon = (props) => ( ); + +// macOS System Settings > Privacy & Security pane marks, so the SnapShot setup +// step points at the same icon the user is about to look for. +export const MacScreenRecordingIcon: Icon = (props) => { + const gradientId = useId(); + return ( + + ); +}; + +export const MacAccessibilityIcon: Icon = (props) => { + const gradientId = useId(); + return ( + + ); +}; + +// Codex's Computer Use app mark, shown on computer-use rows in the work log. +export const ComputerUseAppIcon: Icon = (props) => { + const gradientId = `${useId().replaceAll(":", "")}-computer-use-app-gradient`; + return ( + + ); +}; diff --git a/apps/web/src/components/LegacySidebar.tsx b/apps/web/src/components/LegacySidebar.tsx index 82c5af7de136ad50cd4c68d216aa2f15978a19dc..e49ff602a5aab7d9996cc7266da995b24a509bee 100644 --- a/apps/web/src/components/LegacySidebar.tsx +++ b/apps/web/src/components/LegacySidebar.tsx @@ -806,7 +806,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowP
) : null} {thread.session?.lastError ? ( -
+
Error occurred
@@ -529,8 +529,8 @@ function SortableThreadRow(props: { // Unsent work shares one look: the new-thread draft rows and thread rows // with unsent composer text both use this tint and pen so they read alike. -const draftSurfaceClassName = "bg-amber-400/[0.04] hover:bg-amber-400/[0.08]"; -const draftPenClassName = "size-3 shrink-0 text-amber-600 dark:text-amber-300/80"; +const draftSurfaceClassName = "bg-warning/4 hover:bg-warning/8"; +const draftPenClassName = "size-3 shrink-0 text-warning-foreground"; // Structural list items — the section headers and the // empty-section placeholders — take part in the sortable list so they shift @@ -647,7 +647,7 @@ function SidebarSectionHeader(props: { const snoozed = props.marker === "snoozed-header"; const className = cn( "flex h-full w-full items-center gap-2 px-2 text-left text-xs font-medium", - snoozed ? "text-blue-600 dark:text-blue-400" : "text-sidebar-muted-foreground/60", + snoozed ? "text-info-foreground" : "text-sidebar-muted-foreground/60", props.dragging && "text-sidebar-foreground/80", props.isDropTarget && "text-primary", ); @@ -658,7 +658,7 @@ function SidebarSectionHeader(props: { aria-hidden className={cn( "h-px min-w-2 flex-1", - snoozed ? "bg-blue-500/20 dark:bg-blue-400/15" : "bg-sidebar-border/60", + snoozed ? "bg-info/20" : "bg-sidebar-border/60", props.dragging && "bg-sidebar-foreground/25", props.isDropTarget && "bg-primary/50", )} @@ -1143,7 +1143,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: { ? { label: "Approval", icon: "approval" as const, - className: "text-amber-700 dark:text-amber-300", + className: "text-warning-foreground", } : status === "input" ? { @@ -1161,7 +1161,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: { ? { label: "Woke", icon: "woke" as const, - className: "text-amber-700 dark:text-amber-300", + className: "text-warning-foreground", } : isUnread ? { @@ -1629,7 +1629,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: { {variantAction === "unsnooze" && props.snoozeWakeLabelText !== null ? ( // Snoozed rows show when they come BACK, not when they were // last touched — the return ticket is the row's whole story. - + {props.snoozeWakeLabelText} ) : isWoke ? ( @@ -1642,7 +1642,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: { type="button" aria-label="Dismiss Woke notification" onClick={handleAcknowledgeWokeClick} - className="inline-flex cursor-pointer items-center gap-1 rounded-sm text-xs font-medium text-amber-700 outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring dark:text-amber-300" + className="inline-flex cursor-pointer items-center gap-1 rounded-sm text-xs font-medium text-warning-foreground outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring" > Woke diff --git a/apps/web/src/components/ThreadNotificationCoordinator.tsx b/apps/web/src/components/ThreadNotificationCoordinator.tsx index 1401965e90c70fea35861197696bd27784bdc612..c4494f866ccb832fae757157966e91b0d72494cb 100644 --- a/apps/web/src/components/ThreadNotificationCoordinator.tsx +++ b/apps/web/src/components/ThreadNotificationCoordinator.tsx @@ -164,22 +164,13 @@ function EnvironmentNotifications({ hideCopyButton: true, leadingIcon: kind === "completion" ? ( - + ) : status === "approval" ? ( - + ) : status === "failed" ? ( - + ) : ( - + ), }, actionProps: { diff --git a/apps/web/src/components/ThreadSearchMatch.tsx b/apps/web/src/components/ThreadSearchMatch.tsx index db2e286ae28d514b2fa6bd29138897b077c74946..a79ab85439876c44a05f1f6943cd9a563d403b73 100644 --- a/apps/web/src/components/ThreadSearchMatch.tsx +++ b/apps/web/src/components/ThreadSearchMatch.tsx @@ -57,7 +57,7 @@ export function ThreadSearchMatchExcerpt(props: { const isUser = props.match.source === "user"; return ( - + {isUser ? "You:" : "Agent:"} {" "} diff --git a/apps/web/src/components/chat/ChatComposer.tsx b/apps/web/src/components/chat/ChatComposer.tsx index 15440c577ef3de8007b207d2e70d838a4afcc9d8..c5d1d01dad60ff986fd233a5a6d9f8e801fb666a 100644 --- a/apps/web/src/components/chat/ChatComposer.tsx +++ b/apps/web/src/components/chat/ChatComposer.tsx @@ -6559,7 +6559,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) diff --git a/apps/web/src/components/chat/ContextWindowMeter.tsx b/apps/web/src/components/chat/ContextWindowMeter.tsx index 8f6b09954d3ab3f499769166f68329c0b1c4ccc7..43d5fb061d4e7d7c7ddfe85e7cdf86e6f6fe2658 100644 --- a/apps/web/src/components/chat/ContextWindowMeter.tsx +++ b/apps/web/src/components/chat/ContextWindowMeter.tsx @@ -63,7 +63,7 @@ export function ContextWindowMeter(props: { cy="12" r={radius} fill="none" - stroke="color-mix(in oklab, var(--color-muted-foreground) 24%, transparent)" + className="stroke-muted-foreground/24" strokeWidth="3" /> - - - - - - - - - - - - ); -} - function ToolActivityIconView(props: { icon: ToolActivityIcon | undefined; fallbackName: WorkEntryIconName; diff --git a/apps/web/src/components/chat/ModelListRow.tsx b/apps/web/src/components/chat/ModelListRow.tsx index 7206d8b795279ca34cd7ef43cec9390737cfbb02..7e8bdeb24ce82ec657929f8761c7422feda3242f 100644 --- a/apps/web/src/components/chat/ModelListRow.tsx +++ b/apps/web/src/components/chat/ModelListRow.tsx @@ -117,7 +117,7 @@ export const ModelListRow = memo(function ModelListRow(props: { diff --git a/apps/web/src/components/chat/TerminalContextInlineChip.tsx b/apps/web/src/components/chat/TerminalContextInlineChip.tsx index 8ec06221c6492efbee9037123db9f0f223629f2c..faf5ae3dccbcafa16d449a5afe33a819f98568cb 100644 --- a/apps/web/src/components/chat/TerminalContextInlineChip.tsx +++ b/apps/web/src/components/chat/TerminalContextInlineChip.tsx @@ -26,7 +26,7 @@ export function TerminalContextInlineChip(props: TerminalContextInlineChipProps) >
- + {terminalLabel} diff --git a/apps/web/src/components/cloud/ConnectCliAuthSurface.tsx b/apps/web/src/components/cloud/ConnectCliAuthSurface.tsx index afe0dbc31c5eeea7e7e6a54fcee479d17f68d57b..408d2bbe36e095e32997a282c1ce118825a2e9b6 100644 --- a/apps/web/src/components/cloud/ConnectCliAuthSurface.tsx +++ b/apps/web/src/components/cloud/ConnectCliAuthSurface.tsx @@ -23,7 +23,7 @@ function ConnectCliAuthMessage({ return ( <> {eyebrow ? ( -

+

{eyebrow}

) : null} diff --git a/apps/web/src/components/device/DeviceStreamView.tsx b/apps/web/src/components/device/DeviceStreamView.tsx index 3e2cd54e3c269f32e97e62a3b783e51dc04cb630..0a4cfb97b1bfcfbb81aba64ab68cfe5c21a5d156 100644 --- a/apps/web/src/components/device/DeviceStreamView.tsx +++ b/apps/web/src/components/device/DeviceStreamView.tsx @@ -395,7 +395,7 @@ export function DeviceStreamView(props: { {axElements.map((element) => (
{element.label ? ( - + {element.label} ) : null} diff --git a/apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx b/apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx index 3e42c39715ee7704b5d1d1fcd7eab019b9acd515..0538495da7c4c536778ab89a194cf29842e75cd8 100644 --- a/apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx +++ b/apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx @@ -462,7 +462,9 @@ function MiniPlayerShell({
@@ -475,7 +477,7 @@ function MiniPlayerShell({ > {recording ? ( - + ) : null} diff --git a/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx b/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx index 997f2d46f836d45bd8398cbecddf7b933b9f210e..1139b412bde571534a181df61b2d65aa67296134 100644 --- a/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx +++ b/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx @@ -852,7 +852,7 @@ function PullRequestCodeTab({ /> {stale ? ( - }> + }> Changed @@ -1157,7 +1157,7 @@ function PullRequestCodeTab({ }> @@ -1171,7 +1171,7 @@ function PullRequestCodeTab({ }> @@ -1187,7 +1187,7 @@ function PullRequestCodeTab({ }> diff --git a/apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx b/apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx index de2ee18f9d9978dd44db893a420db8b9e8190c1c..e8507ae3cfe669ea829943faa99b63ceac0b142b 100644 --- a/apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx +++ b/apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx @@ -379,7 +379,7 @@ function PullRequestBaseFreshnessWarning({ type="button" aria-label={summary} className={cn( - "inline-flex min-w-0 shrink-0 cursor-help items-center gap-1 rounded-sm text-amber-600 outline-none focus-visible:ring-2 focus-visible:ring-ring dark:text-amber-400/90", + "inline-flex min-w-0 shrink-0 cursor-help items-center gap-1 rounded-sm text-warning-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring", className, )} /> diff --git a/apps/web/src/components/pullRequest/PullRequestReviewAnnotation.tsx b/apps/web/src/components/pullRequest/PullRequestReviewAnnotation.tsx index 11acd48a4c105df8be4799e9794fe0b06d5d5e9b..1ba8ccba3780709db94e93d6856e0b1999346d0b 100644 --- a/apps/web/src/components/pullRequest/PullRequestReviewAnnotation.tsx +++ b/apps/web/src/components/pullRequest/PullRequestReviewAnnotation.tsx @@ -220,7 +220,7 @@ export function ReviewThreadCard({ >
{thread.isResolved ? ( - + ) : ( )} diff --git a/apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx b/apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx index 33b9a42c6ce061641f5f80d3193f8e58496e89de..100a0f5737b998bdecbf4526fa853235ffb1fc2d 100644 --- a/apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx +++ b/apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx @@ -943,7 +943,7 @@ export function PullRequestSummaryTab({ ) : ( <> {detail.commentsTruncated ? ( -

+

This conversation is longer than this page reads in one go. The most recent{" "} {detail.comments.length} are here; open it on the host to read the rest.

diff --git a/apps/web/src/components/settings/AddProviderInstanceDialog.tsx b/apps/web/src/components/settings/AddProviderInstanceDialog.tsx index f912f5f68d652e0fde6d33dad28762bdb8fbb41c..806a887822fcded149fe4c6fd8bd9a5dc4e9d967 100644 --- a/apps/web/src/components/settings/AddProviderInstanceDialog.tsx +++ b/apps/web/src/components/settings/AddProviderInstanceDialog.tsx @@ -259,7 +259,7 @@ export function AddProviderInstanceDialog({ diff --git a/apps/web/src/components/settings/ConnectionsSettings.tsx b/apps/web/src/components/settings/ConnectionsSettings.tsx index defd65cbf6b913d26173d4086b200542db3bb9d1..6455831ccb046100e5a2b8269a18b3347169b811 100644 --- a/apps/web/src/components/settings/ConnectionsSettings.tsx +++ b/apps/web/src/components/settings/ConnectionsSettings.tsx @@ -756,7 +756,7 @@ const PairingLinkListRow = memo(function PairingLinkListRow({

{primaryLabel}

diff --git a/apps/web/src/components/settings/DiagnosticsSettings.tsx b/apps/web/src/components/settings/DiagnosticsSettings.tsx index 15ad85bbb1a76a048785d6fc3479f67f52841d64..17555540145a7de8a89efaad4c405be4972b4ef8 100644 --- a/apps/web/src/components/settings/DiagnosticsSettings.tsx +++ b/apps/web/src/components/settings/DiagnosticsSettings.tsx @@ -116,7 +116,7 @@ function StatBlock({
@@ -287,7 +287,7 @@ function ProcessNameCell({ ) : (
@@ -1063,17 +1061,17 @@ export function ResourceTelemetryDiagnostics({
@@ -1186,7 +1184,7 @@ export function ResourceTelemetryDiagnostics({ value={String(snapshot.health.inaccessibleProcessCount)} valueClassName={ snapshot.health.inaccessibleProcessCount > 0 - ? "text-amber-600 dark:text-amber-300" + ? "text-warning-foreground" : undefined } /> diff --git a/apps/web/src/components/settings/SnapShotSetupDialog.tsx b/apps/web/src/components/settings/SnapShotSetupDialog.tsx index f0adbcc40cf18dd815bf523766014a2282c985dc..c5ba97cedd978dd372bb120139eecdbfd8109b21 100644 --- a/apps/web/src/components/settings/SnapShotSetupDialog.tsx +++ b/apps/web/src/components/settings/SnapShotSetupDialog.tsx @@ -5,7 +5,8 @@ import { type DesktopSnapShotSetupAction, type DesktopSnapShotState, } from "@t3tools/contracts"; -import { useId, useState, type ReactNode } from "react"; +import { useState, type ReactNode } from "react"; +import { MacAccessibilityIcon, MacScreenRecordingIcon } from "../Icons"; import { CaptureShortcutConfig } from "./CaptureShortcutConfig"; import { Button } from "../ui/button"; import { Dialog, DialogDescription } from "../ui/dialog"; @@ -61,72 +62,6 @@ const GNOME_ACCESS_COPY = { }, }; -function ScreenRecordingIcon() { - const gradientId = useId(); - return ( - - ); -} - -function AccessibilityPermissionIcon() { - const gradientId = useId(); - return ( - - ); -} - export function SnapShotSetupDialog({ state, initialStep, @@ -333,7 +268,9 @@ export function SnapShotSetupDialog({ permissions={[ { id: "screenRecording", - icon: , + icon: ( + + ), title: "Screen Recording", description: "Capture the window you're using.", granted: macPermissions.screenRecording, @@ -341,7 +278,9 @@ export function SnapShotSetupDialog({ }, { id: "accessibility", - icon: , + icon: ( + + ), title: "Accessibility", description: includeAccessibility ? "Include text and controls from the captured app." diff --git a/apps/web/src/components/sidebar/DesktopUpdateStatusIcon.tsx b/apps/web/src/components/sidebar/DesktopUpdateStatusIcon.tsx index 833559e1cc2778b342cd66916841bc30c9afa1f1..04ee884bbf6c2a9cd7088b6d5c0651ad2dd98ac3 100644 --- a/apps/web/src/components/sidebar/DesktopUpdateStatusIcon.tsx +++ b/apps/web/src/components/sidebar/DesktopUpdateStatusIcon.tsx @@ -67,7 +67,7 @@ function DesktopUpdateDownloadingIcon({ percent }: { readonly percent: number | cy="16" r={DOWNLOAD_PROGRESS_RADIUS} fill="none" - stroke="color-mix(in srgb, currentColor 22%, transparent)" + className="stroke-current/22" strokeWidth="1.5" /> ) : showUsageStatus && hasIssue ? ( ) : ( diff --git a/apps/web/src/routes/_chat.pull-requests.tsx b/apps/web/src/routes/_chat.pull-requests.tsx index 7b3d4d4418dd64f8e6f3ca6422a1d3f7110eacaa..87439e8a4bc9c6e619476f84126388b454953577 100644 --- a/apps/web/src/routes/_chat.pull-requests.tsx +++ b/apps/web/src/routes/_chat.pull-requests.tsx @@ -1819,7 +1819,7 @@ function PullRequestsRouteView() { )} {listQuery.error && shownCount > 0 ? ( -
+
{listQuery.error} Showing the last pull requests loaded.