| author | |
| committer | |
| log | 315fcca10a826d8aa1cbdffc3ef5b5eb5a1e2f9d |
| tree | 76aa7388fe5aa248af8f42146799f7ac0225f30c |
| parent | 80fc23ac32cd8fe5011a94420cff1f469367f1fc |
| signature | Signed by PGP key B5690EEEBB952194 |
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>28 files changed, 173 insertions(+), 172 deletions(-)
apps/web/src/components/ChatMarkdown.tsx+1-1| ... | ... | @@ -308,7 +308,7 @@ function CodexArtifactTemplateCard(props: { |
| 308 | 308 | <div className="flex min-w-0 flex-1 items-center gap-3"> |
| 309 | 309 | <span className="relative flex size-9 shrink-0 items-center justify-center rounded-lg border border-border/70 bg-background text-muted-foreground shadow-xs"> |
| 310 | 310 | <Icon aria-hidden className="size-5" /> |
| 311 | <span className="absolute -right-1 -bottom-1 flex size-4 items-center justify-center rounded-full border border-background bg-fuchsia-500 text-white shadow-xs"> | |
| 311 | <span className="absolute -right-1 -bottom-1 flex size-4 items-center justify-center rounded-full border border-background bg-primary text-primary-foreground shadow-xs"> | |
| 312 | 312 | <SparklesIcon aria-hidden className="size-2.5" /> |
| 313 | 313 | </span> |
| 314 | 314 | </span> |
apps/web/src/components/Icons.tsx+85| ... | ... | @@ -781,3 +781,88 @@ export const ForgejoIcon: Icon = (props) => ( |
| 781 | 781 | </g> |
| 782 | 782 | </svg> |
| 783 | 783 | ); |
| 784 | ||
| 785 | // macOS System Settings > Privacy & Security pane marks, so the SnapShot setup | |
| 786 | // step points at the same icon the user is about to look for. | |
| 787 | export const MacScreenRecordingIcon: Icon = (props) => { | |
| 788 | const gradientId = useId(); | |
| 789 | return ( | |
| 790 | <svg viewBox="0 0 32 32" aria-hidden="true" {...props}> | |
| 791 | <defs> | |
| 792 | <linearGradient id={gradientId} x2="0" y2="1"> | |
| 793 | <stop stopColor="#ff6972" /> | |
| 794 | <stop offset="1" stopColor="#ff2938" /> | |
| 795 | </linearGradient> | |
| 796 | </defs> | |
| 797 | <rect | |
| 798 | x="0.5" | |
| 799 | y="0.5" | |
| 800 | width="31" | |
| 801 | height="31" | |
| 802 | rx="7" | |
| 803 | fill={`url(#${gradientId})`} | |
| 804 | stroke="#ffffff40" | |
| 805 | /> | |
| 806 | <circle cx="16" cy="16" r="10" fill="none" stroke="#fff" strokeWidth="2" /> | |
| 807 | <circle cx="16" cy="16" r="4.5" fill="#fff" /> | |
| 808 | </svg> | |
| 809 | ); | |
| 810 | }; | |
| 811 | ||
| 812 | export const MacAccessibilityIcon: Icon = (props) => { | |
| 813 | const gradientId = useId(); | |
| 814 | return ( | |
| 815 | <svg viewBox="0 0 32 32" aria-hidden="true" {...props}> | |
| 816 | <defs> | |
| 817 | <linearGradient id={gradientId} x2="0" y2="1"> | |
| 818 | <stop stopColor="#48b6ff" /> | |
| 819 | <stop offset="1" stopColor="#0085ff" /> | |
| 820 | </linearGradient> | |
| 821 | </defs> | |
| 822 | <rect | |
| 823 | x="0.5" | |
| 824 | y="0.5" | |
| 825 | width="31" | |
| 826 | height="31" | |
| 827 | rx="7" | |
| 828 | fill={`url(#${gradientId})`} | |
| 829 | stroke="#ffffff40" | |
| 830 | /> | |
| 831 | <circle cx="16" cy="16" r="10" fill="none" stroke="#fff" strokeWidth="1.75" /> | |
| 832 | <circle cx="16" cy="10" r="1.6" fill="#fff" /> | |
| 833 | <path | |
| 834 | d="m10 13 6 1 6-1M16 14v4m0 0-2.5 6m2.5-6 2.5 6" | |
| 835 | fill="none" | |
| 836 | stroke="#fff" | |
| 837 | strokeWidth="1.6" | |
| 838 | strokeLinecap="round" | |
| 839 | strokeLinejoin="round" | |
| 840 | /> | |
| 841 | </svg> | |
| 842 | ); | |
| 843 | }; | |
| 844 | ||
| 845 | // Codex's Computer Use app mark, shown on computer-use rows in the work log. | |
| 846 | export const ComputerUseAppIcon: Icon = (props) => { | |
| 847 | const gradientId = `${useId().replaceAll(":", "")}-computer-use-app-gradient`; | |
| 848 | return ( | |
| 849 | <svg viewBox="0 0 24 24" aria-hidden="true" {...props}> | |
| 850 | <defs> | |
| 851 | <linearGradient id={gradientId} x1="2" y1="2" x2="22" y2="22"> | |
| 852 | <stop offset="0" stopColor="#00dff0" /> | |
| 853 | <stop offset="0.42" stopColor="#3b9cff" /> | |
| 854 | <stop offset="0.72" stopColor="#b044f5" /> | |
| 855 | <stop offset="1" stopColor="#ff78b6" /> | |
| 856 | </linearGradient> | |
| 857 | </defs> | |
| 858 | <rect x="1" y="1" width="22" height="22" rx="5" fill={`url(#${gradientId})`} /> | |
| 859 | <path | |
| 860 | d="m7.2 6.2 10.5 4.1-4.2 2.1-2 4.7z" | |
| 861 | fill="white" | |
| 862 | stroke="#315cff" | |
| 863 | strokeWidth="1.1" | |
| 864 | strokeLinejoin="round" | |
| 865 | /> | |
| 866 | </svg> | |
| 867 | ); | |
| 868 | }; |
apps/web/src/components/LegacySidebar.tsx+1-1| ... | ... | @@ -806,7 +806,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowP |
| 806 | 806 | <button |
| 807 | 807 | type="button" |
| 808 | 808 | aria-label={`Open localhost:${discoveredPorts[0]?.port ?? ""}`} |
| 809 | className="inline-flex cursor-pointer items-center justify-center text-emerald-600 outline-hidden focus-visible:ring-1 focus-visible:ring-ring dark:text-emerald-400" | |
| 809 | className="inline-flex cursor-pointer items-center justify-center text-success-foreground outline-hidden focus-visible:ring-1 focus-visible:ring-ring" | |
| 810 | 810 | onClick={handleOpenDiscoveredPort} |
| 811 | 811 | /> |
| 812 | 812 | } |
apps/web/src/components/QuitHoldOverlay.tsx+1-1| ... | ... | @@ -48,7 +48,7 @@ export function QuitHoldOverlay() { |
| 48 | 48 | role="status" |
| 49 | 49 | className="pointer-events-none fixed inset-x-0 top-[22%] z-100 flex justify-center" |
| 50 | 50 | > |
| 51 | <div className="rounded-full bg-neutral-700/95 px-8 py-4 text-2xl font-bold text-white shadow-xl"> | |
| 51 | <div className="rounded-full bg-foreground/95 px-8 py-4 text-2xl font-bold text-background shadow-xl"> | |
| 52 | 52 | {message} |
| 53 | 53 | </div> |
| 54 | 54 | </div> |
apps/web/src/components/Sidebar.tsx+9-9| ... | ... | @@ -414,7 +414,7 @@ function SidebarThreadTooltip({ |
| 414 | 414 | </div> |
| 415 | 415 | ) : null} |
| 416 | 416 | {thread.session?.lastError ? ( |
| 417 | <div className="flex min-w-0 items-center gap-2 text-red-600 dark:text-red-400"> | |
| 417 | <div className="flex min-w-0 items-center gap-2 text-destructive-foreground"> | |
| 418 | 418 | <CircleAlertIcon className="size-3 shrink-0 stroke-current" /> |
| 419 | 419 | <div className="min-w-0 truncate">Error occurred</div> |
| 420 | 420 | </div> |
| ... | ... | @@ -529,8 +529,8 @@ function SortableThreadRow(props: { |
| 529 | 529 | |
| 530 | 530 | // Unsent work shares one look: the new-thread draft rows and thread rows |
| 531 | 531 | // with unsent composer text both use this tint and pen so they read alike. |
| 532 | const draftSurfaceClassName = "bg-amber-400/[0.04] hover:bg-amber-400/[0.08]"; | |
| 533 | const draftPenClassName = "size-3 shrink-0 text-amber-600 dark:text-amber-300/80"; | |
| 532 | const draftSurfaceClassName = "bg-warning/4 hover:bg-warning/8"; | |
| 533 | const draftPenClassName = "size-3 shrink-0 text-warning-foreground"; | |
| 534 | 534 | |
| 535 | 535 | // Structural list items — the section headers and the |
| 536 | 536 | // empty-section placeholders — take part in the sortable list so they shift |
| ... | ... | @@ -647,7 +647,7 @@ function SidebarSectionHeader(props: { |
| 647 | 647 | const snoozed = props.marker === "snoozed-header"; |
| 648 | 648 | const className = cn( |
| 649 | 649 | "flex h-full w-full items-center gap-2 px-2 text-left text-xs font-medium", |
| 650 | snoozed ? "text-blue-600 dark:text-blue-400" : "text-sidebar-muted-foreground/60", | |
| 650 | snoozed ? "text-info-foreground" : "text-sidebar-muted-foreground/60", | |
| 651 | 651 | props.dragging && "text-sidebar-foreground/80", |
| 652 | 652 | props.isDropTarget && "text-primary", |
| 653 | 653 | ); |
| ... | ... | @@ -658,7 +658,7 @@ function SidebarSectionHeader(props: { |
| 658 | 658 | aria-hidden |
| 659 | 659 | className={cn( |
| 660 | 660 | "h-px min-w-2 flex-1", |
| 661 | snoozed ? "bg-blue-500/20 dark:bg-blue-400/15" : "bg-sidebar-border/60", | |
| 661 | snoozed ? "bg-info/20" : "bg-sidebar-border/60", | |
| 662 | 662 | props.dragging && "bg-sidebar-foreground/25", |
| 663 | 663 | props.isDropTarget && "bg-primary/50", |
| 664 | 664 | )} |
| ... | ... | @@ -1143,7 +1143,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: { |
| 1143 | 1143 | ? { |
| 1144 | 1144 | label: "Approval", |
| 1145 | 1145 | icon: "approval" as const, |
| 1146 | className: "text-amber-700 dark:text-amber-300", | |
| 1146 | className: "text-warning-foreground", | |
| 1147 | 1147 | } |
| 1148 | 1148 | : status === "input" |
| 1149 | 1149 | ? { |
| ... | ... | @@ -1161,7 +1161,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: { |
| 1161 | 1161 | ? { |
| 1162 | 1162 | label: "Woke", |
| 1163 | 1163 | icon: "woke" as const, |
| 1164 | className: "text-amber-700 dark:text-amber-300", | |
| 1164 | className: "text-warning-foreground", | |
| 1165 | 1165 | } |
| 1166 | 1166 | : isUnread |
| 1167 | 1167 | ? { |
| ... | ... | @@ -1629,7 +1629,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: { |
| 1629 | 1629 | {variantAction === "unsnooze" && props.snoozeWakeLabelText !== null ? ( |
| 1630 | 1630 | // Snoozed rows show when they come BACK, not when they were |
| 1631 | 1631 | // last touched — the return ticket is the row's whole story. |
| 1632 | <span className="text-xs text-blue-600 tabular-nums dark:text-blue-400"> | |
| 1632 | <span className="text-xs text-info-foreground tabular-nums"> | |
| 1633 | 1633 | {props.snoozeWakeLabelText} |
| 1634 | 1634 | </span> |
| 1635 | 1635 | ) : isWoke ? ( |
| ... | ... | @@ -1642,7 +1642,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: { |
| 1642 | 1642 | type="button" |
| 1643 | 1643 | aria-label="Dismiss Woke notification" |
| 1644 | 1644 | onClick={handleAcknowledgeWokeClick} |
| 1645 | 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" | |
| 1645 | 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" | |
| 1646 | 1646 | > |
| 1647 | 1647 | <AlarmClockIcon aria-hidden className="size-3" /> |
| 1648 | 1648 | <span role="status">Woke</span> |
apps/web/src/components/ThreadNotificationCoordinator.tsx+4-13| ... | ... | @@ -164,22 +164,13 @@ function EnvironmentNotifications({ |
| 164 | 164 | hideCopyButton: true, |
| 165 | 165 | leadingIcon: |
| 166 | 166 | kind === "completion" ? ( |
| 167 | <CircleCheckIcon | |
| 168 | aria-hidden | |
| 169 | className="size-4 text-emerald-700 dark:text-emerald-300" | |
| 170 | /> | |
| 167 | <CircleCheckIcon aria-hidden className="size-4 text-success-foreground" /> | |
| 171 | 168 | ) : status === "approval" ? ( |
| 172 | <ShieldQuestionIcon | |
| 173 | aria-hidden | |
| 174 | className="size-4 text-amber-700 dark:text-amber-300" | |
| 175 | /> | |
| 169 | <ShieldQuestionIcon aria-hidden className="size-4 text-warning-foreground" /> | |
| 176 | 170 | ) : status === "failed" ? ( |
| 177 | <CircleAlertIcon aria-hidden className="size-4 text-red-700 dark:text-red-300" /> | |
| 171 | <CircleAlertIcon aria-hidden className="size-4 text-destructive-foreground" /> | |
| 178 | 172 | ) : ( |
| 179 | <MessageCircleQuestionIcon | |
| 180 | aria-hidden | |
| 181 | className="size-4 text-indigo-600 dark:text-indigo-300" | |
| 182 | /> | |
| 173 | <MessageCircleQuestionIcon aria-hidden className="size-4 text-info-foreground" /> | |
| 183 | 174 | ), |
| 184 | 175 | }, |
| 185 | 176 | actionProps: { |
apps/web/src/components/ThreadSearchMatch.tsx+1-1| ... | ... | @@ -57,7 +57,7 @@ export function ThreadSearchMatchExcerpt(props: { |
| 57 | 57 | const isUser = props.match.source === "user"; |
| 58 | 58 | return ( |
| 59 | 59 | <span className="truncate text-xs text-muted-foreground/85"> |
| 60 | <span className={isUser ? "text-blue-400" : "text-emerald-400"}> | |
| 60 | <span className={isUser ? "text-info-foreground" : "text-success-foreground"}> | |
| 61 | 61 | {isUser ? "You:" : "Agent:"} |
| 62 | 62 | </span>{" "} |
| 63 | 63 | <HighlightedSearchText text={props.match.snippet} query={props.match.query} /> |
apps/web/src/components/chat/ChatComposer.tsx+1-1| ... | ... | @@ -6559,7 +6559,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) |
| 6559 | 6559 | <span |
| 6560 | 6560 | role="img" |
| 6561 | 6561 | aria-label="Draft attachment may not persist" |
| 6562 | className="absolute left-1 top-1 inline-flex items-center justify-center rounded bg-background/85 p-0.5 text-amber-600" | |
| 6562 | className="absolute left-1 top-1 inline-flex items-center justify-center rounded bg-background/85 p-0.5 text-warning-foreground" | |
| 6563 | 6563 | > |
| 6564 | 6564 | <CircleAlertIcon className="size-3" /> |
| 6565 | 6565 | </span> |
apps/web/src/components/chat/ContextWindowMeter.tsx+1-1| ... | ... | @@ -63,7 +63,7 @@ export function ContextWindowMeter(props: { |
| 63 | 63 | cy="12" |
| 64 | 64 | r={radius} |
| 65 | 65 | fill="none" |
| 66 | stroke="color-mix(in oklab, var(--color-muted-foreground) 24%, transparent)" | |
| 66 | className="stroke-muted-foreground/24" | |
| 67 | 67 | strokeWidth="3" |
| 68 | 68 | /> |
| 69 | 69 | <circle |
apps/web/src/components/chat/MessagesTimeline.tsx+1-25| ... | ... | @@ -63,7 +63,6 @@ import { |
| 63 | 63 | use, |
| 64 | 64 | useCallback, |
| 65 | 65 | useEffect, |
| 66 | useId, | |
| 67 | 66 | useLayoutEffect, |
| 68 | 67 | useMemo, |
| 69 | 68 | useRef, |
| ... | ... | @@ -256,6 +255,7 @@ import { |
| 256 | 255 | type ReviewCommentContext, |
| 257 | 256 | } from "../../reviewCommentContext"; |
| 258 | 257 | import { PullRequestGlyph } from "~/components/pullRequest/pullRequestIcons"; |
| 258 | import { ComputerUseAppIcon } from "~/components/Icons"; | |
| 259 | 259 | |
| 260 | 260 | // --------------------------------------------------------------------------- |
| 261 | 261 | // Context — shared state consumed by every row component via Context. |
| ... | ... | @@ -4146,30 +4146,6 @@ function BrowserAppIcon({ className }: { className: string }) { |
| 4146 | 4146 | ); |
| 4147 | 4147 | } |
| 4148 | 4148 | |
| 4149 | function ComputerUseAppIcon({ className }: { className: string }) { | |
| 4150 | const gradientId = `${useId().replaceAll(":", "")}-computer-use-app-gradient`; | |
| 4151 | return ( | |
| 4152 | <svg viewBox="0 0 24 24" className={className} aria-hidden> | |
| 4153 | <defs> | |
| 4154 | <linearGradient id={gradientId} x1="2" y1="2" x2="22" y2="22"> | |
| 4155 | <stop offset="0" stopColor="#00dff0" /> | |
| 4156 | <stop offset="0.42" stopColor="#3b9cff" /> | |
| 4157 | <stop offset="0.72" stopColor="#b044f5" /> | |
| 4158 | <stop offset="1" stopColor="#ff78b6" /> | |
| 4159 | </linearGradient> | |
| 4160 | </defs> | |
| 4161 | <rect x="1" y="1" width="22" height="22" rx="5" fill={`url(#${gradientId})`} /> | |
| 4162 | <path | |
| 4163 | d="m7.2 6.2 10.5 4.1-4.2 2.1-2 4.7z" | |
| 4164 | fill="white" | |
| 4165 | stroke="#315cff" | |
| 4166 | strokeWidth="1.1" | |
| 4167 | strokeLinejoin="round" | |
| 4168 | /> | |
| 4169 | </svg> | |
| 4170 | ); | |
| 4171 | } | |
| 4172 | ||
| 4173 | 4149 | function ToolActivityIconView(props: { |
| 4174 | 4150 | icon: ToolActivityIcon | undefined; |
| 4175 | 4151 | fallbackName: WorkEntryIconName; |
apps/web/src/components/chat/ModelListRow.tsx+1-1| ... | ... | @@ -117,7 +117,7 @@ export const ModelListRow = memo(function ModelListRow(props: { |
| 117 | 117 | <StarIcon |
| 118 | 118 | className={cn( |
| 119 | 119 | "size-3.5 sm:size-3", |
| 120 | props.isFavorite && "fill-current text-yellow-500", | |
| 120 | props.isFavorite && "fill-current text-warning", | |
| 121 | 121 | )} |
| 122 | 122 | /> |
| 123 | 123 | </Button> |
apps/web/src/components/chat/TerminalContextInlineChip.tsx+1-1| ... | ... | @@ -26,7 +26,7 @@ export function TerminalContextInlineChip(props: TerminalContextInlineChipProps) |
| 26 | 26 | > |
| 27 | 27 | <div className="overflow-hidden rounded-md border border-border/70 bg-background/80"> |
| 28 | 28 | <div className="flex items-center gap-2 border-b border-border/70 px-3 py-2"> |
| 29 | <TerminalIcon className="size-4 shrink-0 text-emerald-500" aria-hidden /> | |
| 29 | <TerminalIcon className="size-4 shrink-0 text-success" aria-hidden /> | |
| 30 | 30 | <span className="min-w-0 truncate text-sm font-medium text-foreground"> |
| 31 | 31 | {terminalLabel} |
| 32 | 32 | </span> |
apps/web/src/components/cloud/ConnectCliAuthSurface.tsx+1-1| ... | ... | @@ -23,7 +23,7 @@ function ConnectCliAuthMessage({ |
| 23 | 23 | return ( |
| 24 | 24 | <> |
| 25 | 25 | {eyebrow ? ( |
| 26 | <p className="text-[10px] font-semibold tracking-[0.18em] text-blue-600 uppercase dark:text-blue-400"> | |
| 26 | <p className="text-[10px] font-semibold tracking-[0.18em] text-primary uppercase"> | |
| 27 | 27 | {eyebrow} |
| 28 | 28 | </p> |
| 29 | 29 | ) : null} |
apps/web/src/components/device/DeviceStreamView.tsx+2-2| ... | ... | @@ -395,7 +395,7 @@ export function DeviceStreamView(props: { |
| 395 | 395 | {axElements.map((element) => ( |
| 396 | 396 | <div |
| 397 | 397 | key={element.id} |
| 398 | className="absolute border border-sky-400/80 bg-sky-400/10" | |
| 398 | className="absolute border border-info/80 bg-info/10" | |
| 399 | 399 | style={{ |
| 400 | 400 | left: `${element.x * 100}%`, |
| 401 | 401 | top: `${element.y * 100}%`, |
| ... | ... | @@ -404,7 +404,7 @@ export function DeviceStreamView(props: { |
| 404 | 404 | }} |
| 405 | 405 | > |
| 406 | 406 | {element.label ? ( |
| 407 | <span className="absolute -top-3.5 left-0 max-w-full truncate rounded-sm bg-sky-500 px-1 text-[9px] leading-3.5 text-white"> | |
| 407 | <span className="absolute -top-3.5 left-0 max-w-full truncate rounded-sm bg-info px-1 text-[9px] leading-3.5 text-white"> | |
| 408 | 408 | {element.label} |
| 409 | 409 | </span> |
| 410 | 410 | ) : null} |
apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx+4-2| ... | ... | @@ -462,7 +462,9 @@ function MiniPlayerShell({ |
| 462 | 462 | <span |
| 463 | 463 | className={cn( |
| 464 | 464 | "block size-2 rounded-full shadow-sm ring-1 ring-background/70", |
| 465 | recording ? "bg-red-500 motion-safe:animate-status-pulse" : "bg-foreground/25", | |
| 465 | recording | |
| 466 | ? "bg-destructive motion-safe:animate-status-pulse" | |
| 467 | : "bg-foreground/25", | |
| 466 | 468 | )} |
| 467 | 469 | /> |
| 468 | 470 | </div> |
| ... | ... | @@ -475,7 +477,7 @@ function MiniPlayerShell({ |
| 475 | 477 | > |
| 476 | 478 | {recording ? ( |
| 477 | 479 | <span aria-hidden className="flex size-6 shrink-0 items-center justify-center"> |
| 478 | <span className="size-2 rounded-full bg-red-500 motion-safe:animate-status-pulse" /> | |
| 480 | <span className="size-2 rounded-full bg-destructive motion-safe:animate-status-pulse" /> | |
| 479 | 481 | </span> |
| 480 | 482 | ) : null} |
| 481 | 483 | <Tooltip> |
apps/web/src/components/pullRequest/PullRequestCodeTab.tsx+4-4| ... | ... | @@ -852,7 +852,7 @@ function PullRequestCodeTab({ |
| 852 | 852 | /> |
| 853 | 853 | {stale ? ( |
| 854 | 854 | <Tooltip> |
| 855 | <TooltipTrigger render={<span className="text-amber-600 dark:text-amber-500" />}> | |
| 855 | <TooltipTrigger render={<span className="text-warning-foreground" />}> | |
| 856 | 856 | Changed |
| 857 | 857 | </TooltipTrigger> |
| 858 | 858 | <TooltipPopup side="bottom"> |
| ... | ... | @@ -1157,7 +1157,7 @@ function PullRequestCodeTab({ |
| 1157 | 1157 | <TooltipTrigger render={<span className="flex shrink-0 items-center" />}> |
| 1158 | 1158 | <TriangleAlertIcon |
| 1159 | 1159 | aria-label="Your ticks could not be read" |
| 1160 | className="size-3.5 text-amber-600 dark:text-amber-500" | |
| 1160 | className="size-3.5 text-warning-foreground" | |
| 1161 | 1161 | /> |
| 1162 | 1162 | </TooltipTrigger> |
| 1163 | 1163 | <TooltipPopup side="bottom"> |
| ... | ... | @@ -1171,7 +1171,7 @@ function PullRequestCodeTab({ |
| 1171 | 1171 | <TooltipTrigger render={<span className="flex shrink-0 items-center" />}> |
| 1172 | 1172 | <TriangleAlertIcon |
| 1173 | 1173 | aria-label="This count covers only part of the change" |
| 1174 | className="size-3.5 text-amber-600 dark:text-amber-500" | |
| 1174 | className="size-3.5 text-warning-foreground" | |
| 1175 | 1175 | /> |
| 1176 | 1176 | </TooltipTrigger> |
| 1177 | 1177 | <TooltipPopup side="bottom"> |
| ... | ... | @@ -1187,7 +1187,7 @@ function PullRequestCodeTab({ |
| 1187 | 1187 | <TooltipTrigger render={<span className="flex shrink-0 items-center" />}> |
| 1188 | 1188 | <TriangleAlertIcon |
| 1189 | 1189 | aria-label="Some of this diff was not shown" |
| 1190 | className="size-3.5 text-amber-600 dark:text-amber-500" | |
| 1190 | className="size-3.5 text-warning-foreground" | |
| 1191 | 1191 | /> |
| 1192 | 1192 | </TooltipTrigger> |
| 1193 | 1193 | <TooltipPopup side="bottom"> |
apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx+1-1| ... | ... | @@ -379,7 +379,7 @@ function PullRequestBaseFreshnessWarning({ |
| 379 | 379 | type="button" |
| 380 | 380 | aria-label={summary} |
| 381 | 381 | className={cn( |
| 382 | "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", | |
| 382 | "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", | |
| 383 | 383 | className, |
| 384 | 384 | )} |
| 385 | 385 | /> |
apps/web/src/components/pullRequest/PullRequestReviewAnnotation.tsx+1-1| ... | ... | @@ -220,7 +220,7 @@ export function ReviewThreadCard({ |
| 220 | 220 | > |
| 221 | 221 | <div className="flex items-center gap-2 text-xs text-muted-foreground"> |
| 222 | 222 | {thread.isResolved ? ( |
| 223 | <CheckCircle2Icon className="size-3.5 text-emerald-600 dark:text-emerald-500" /> | |
| 223 | <CheckCircle2Icon className="size-3.5 text-success-foreground" /> | |
| 224 | 224 | ) : ( |
| 225 | 225 | <CircleIcon className="size-3.5" /> |
| 226 | 226 | )} |
apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx+1-1| ... | ... | @@ -943,7 +943,7 @@ export function PullRequestSummaryTab({ |
| 943 | 943 | ) : ( |
| 944 | 944 | <> |
| 945 | 945 | {detail.commentsTruncated ? ( |
| 946 | <p className="mb-2 rounded-md border border-amber-500/30 bg-amber-500/5 px-2 py-1.5 text-xs"> | |
| 946 | <p className="mb-2 rounded-md border border-warning/30 bg-warning-surface px-2 py-1.5 text-xs"> | |
| 947 | 947 | This conversation is longer than this page reads in one go. The most recent{" "} |
| 948 | 948 | {detail.comments.length} are here; open it on the host to read the rest. |
| 949 | 949 | </p> |
apps/web/src/components/settings/AddProviderInstanceDialog.tsx+1-1| ... | ... | @@ -259,7 +259,7 @@ export function AddProviderInstanceDialog({ |
| 259 | 259 | <RadioPrimitive.Root |
| 260 | 260 | key={option.value} |
| 261 | 261 | value={option.value} |
| 262 | className="relative flex cursor-pointer items-center gap-3 rounded-lg bg-card px-3 py-3 text-left text-muted-foreground outline-none ring-1 ring-black/5 hover:bg-zinc-50 focus-visible:ring-2 focus-visible:ring-ring data-checked:bg-primary/8 data-checked:text-foreground data-checked:ring-2 data-checked:ring-primary data-checked:hover:bg-primary/8 dark:bg-white/3 dark:ring-white/5 dark:hover:bg-white/5 dark:data-checked:bg-primary/15 dark:data-checked:ring-primary dark:data-checked:hover:bg-primary/15" | |
| 262 | className="relative flex cursor-pointer items-center gap-3 rounded-lg bg-card px-3 py-3 text-left text-muted-foreground outline-none ring-1 ring-black/5 hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring data-checked:bg-primary/8 data-checked:text-foreground data-checked:ring-2 data-checked:ring-primary data-checked:hover:bg-primary/8 dark:bg-white/3 dark:ring-white/5 dark:hover:bg-white/5 dark:data-checked:bg-primary/15 dark:data-checked:ring-primary dark:data-checked:hover:bg-primary/15" | |
| 263 | 263 | > |
| 264 | 264 | <IconComponent className="size-4 shrink-0" aria-hidden /> |
| 265 | 265 | <span className="min-w-0 flex-1 truncate text-sm font-medium text-foreground"> |
apps/web/src/components/settings/ConnectionsSettings.tsx+1-1| ... | ... | @@ -756,7 +756,7 @@ const PairingLinkListRow = memo(function PairingLinkListRow({ |
| 756 | 756 | <div className="flex min-h-5 items-center gap-1.5"> |
| 757 | 757 | <ConnectionStatusDot |
| 758 | 758 | tooltipText={`Link created at ${formatAccessTimestamp(pairingLink.createdAt)}`} |
| 759 | dotClassName="bg-amber-400" | |
| 759 | dotClassName="bg-warning" | |
| 760 | 760 | /> |
| 761 | 761 | <h3 className="text-sm font-medium text-foreground">{primaryLabel}</h3> |
| 762 | 762 | </div> |
apps/web/src/components/settings/DiagnosticsSettings.tsx+4-6| ... | ... | @@ -116,7 +116,7 @@ function StatBlock({ |
| 116 | 116 | <div |
| 117 | 117 | className={cn( |
| 118 | 118 | "mt-1 truncate font-mono text-lg font-semibold tabular-nums text-foreground", |
| 119 | tone === "warning" && "text-amber-600 dark:text-amber-400", | |
| 119 | tone === "warning" && "text-warning-foreground", | |
| 120 | 120 | tone === "danger" && "text-destructive", |
| 121 | 121 | )} |
| 122 | 122 | > |
| ... | ... | @@ -287,7 +287,7 @@ function ProcessNameCell({ |
| 287 | 287 | ) : ( |
| 288 | 288 | <span className="size-5 shrink-0" aria-hidden="true" /> |
| 289 | 289 | )} |
| 290 | <span className="size-1.5 shrink-0 rounded-full bg-emerald-500/80" /> | |
| 290 | <span className="size-1.5 shrink-0 rounded-full bg-success/80" /> | |
| 291 | 291 | <Tooltip> |
| 292 | 292 | <TooltipTrigger |
| 293 | 293 | render={<span className="min-w-0 truncate font-medium text-foreground">{name}</span>} |
| ... | ... | @@ -465,7 +465,7 @@ function ResourceHistoryProcessNameCell({ |
| 465 | 465 | <span |
| 466 | 466 | className={cn( |
| 467 | 467 | "size-1.5 shrink-0 rounded-full", |
| 468 | process.isServerRoot ? "bg-amber-500/90" : "bg-emerald-500/80", | |
| 468 | process.isServerRoot ? "bg-warning/90" : "bg-success/80", | |
| 469 | 469 | )} |
| 470 | 470 | /> |
| 471 | 471 | <Tooltip> |
| ... | ... | @@ -1100,9 +1100,7 @@ export function DiagnosticsSettingsPanel() { |
| 1100 | 1100 | <div |
| 1101 | 1101 | className={cn( |
| 1102 | 1102 | "flex items-start gap-2", |
| 1103 | traceDiagnosticsPartialFailure | |
| 1104 | ? "text-amber-600 dark:text-amber-400" | |
| 1105 | : "text-destructive", | |
| 1103 | traceDiagnosticsPartialFailure ? "text-warning-foreground" : "text-destructive", | |
| 1106 | 1104 | )} |
| 1107 | 1105 | > |
| 1108 | 1106 | <AlertTriangleIcon className="mt-0.5 size-3.5 shrink-0" /> |
apps/web/src/components/settings/ResourceTelemetryDiagnostics.tsx+23-25| ... | ... | @@ -142,10 +142,10 @@ function categoryLabel(category: ResourceTelemetryProcessCategory): string { |
| 142 | 142 | } |
| 143 | 143 | |
| 144 | 144 | function categoryDotClass(category: ResourceTelemetryProcessCategory): string { |
| 145 | if (category === "resource-monitor") return "bg-amber-500"; | |
| 146 | if (category.startsWith("electron-")) return "bg-sky-500"; | |
| 145 | if (category === "resource-monitor") return "bg-warning"; | |
| 146 | if (category.startsWith("electron-")) return "bg-info"; | |
| 147 | 147 | if (category === "server") return "bg-violet-500"; |
| 148 | return "bg-emerald-500"; | |
| 148 | return "bg-success"; | |
| 149 | 149 | } |
| 150 | 150 | |
| 151 | 151 | function ioSemanticsLabel(semantics: ResourceTelemetryIoSemantics): string { |
| ... | ... | @@ -196,10 +196,8 @@ function SourceStatusBadge({ |
| 196 | 196 | className={cn( |
| 197 | 197 | "inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[10px] font-semibold uppercase tracking-[0.08em]", |
| 198 | 198 | tone === "neutral" && "border-border/70 bg-muted/45 text-muted-foreground", |
| 199 | tone === "default" && | |
| 200 | "border-emerald-500/25 bg-emerald-500/10 text-emerald-700 dark:text-emerald-300", | |
| 201 | tone === "warning" && | |
| 202 | "border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300", | |
| 199 | tone === "default" && "border-success/25 bg-success/10 text-success-foreground", | |
| 200 | tone === "warning" && "border-warning/30 bg-warning/10 text-warning-foreground", | |
| 203 | 201 | tone === "danger" && "border-destructive/30 bg-destructive/10 text-destructive", |
| 204 | 202 | )} |
| 205 | 203 | > |
| ... | ... | @@ -207,8 +205,8 @@ function SourceStatusBadge({ |
| 207 | 205 | className={cn( |
| 208 | 206 | "size-1.5 rounded-full", |
| 209 | 207 | tone === "neutral" && "bg-muted-foreground/55", |
| 210 | tone === "default" && "bg-emerald-500", | |
| 211 | tone === "warning" && "bg-amber-500", | |
| 208 | tone === "default" && "bg-success", | |
| 209 | tone === "warning" && "bg-warning", | |
| 212 | 210 | tone === "danger" && "bg-destructive", |
| 213 | 211 | )} |
| 214 | 212 | /> |
| ... | ... | @@ -258,7 +256,7 @@ function IconStat({ |
| 258 | 256 | <div |
| 259 | 257 | className={cn( |
| 260 | 258 | "mt-2.5 truncate font-mono text-2xl font-semibold tracking-[-0.05em] tabular-nums text-foreground", |
| 261 | tone === "warning" && "text-amber-600 dark:text-amber-300", | |
| 259 | tone === "warning" && "text-warning-foreground", | |
| 262 | 260 | tone === "danger" && "text-destructive", |
| 263 | 261 | )} |
| 264 | 262 | > |
| ... | ... | @@ -412,10 +410,10 @@ function ResourceHistoryChart({ |
| 412 | 410 | <span className="h-1.5 w-3 rounded-full bg-foreground/70" /> CPU average |
| 413 | 411 | </span> |
| 414 | 412 | <span className="inline-flex items-center gap-1.5"> |
| 415 | <span className="h-1.5 w-3 rounded-full bg-sky-500/70" /> I/O reads | |
| 413 | <span className="h-1.5 w-3 rounded-full bg-info/70" /> I/O reads | |
| 416 | 414 | </span> |
| 417 | 415 | <span className="inline-flex items-center gap-1.5"> |
| 418 | <span className="h-1.5 w-3 rounded-full bg-amber-500/80" /> I/O writes | |
| 416 | <span className="h-1.5 w-3 rounded-full bg-warning/80" /> I/O writes | |
| 419 | 417 | </span> |
| 420 | 418 | </div> |
| 421 | 419 | <div className="flex h-32 items-end gap-1 overflow-hidden rounded-lg border border-border/40 bg-muted/8 px-2 pt-3 pb-2"> |
| ... | ... | @@ -445,11 +443,11 @@ function ResourceHistoryChart({ |
| 445 | 443 | style={{ height: `${cpuHeight}%` }} |
| 446 | 444 | /> |
| 447 | 445 | <span |
| 448 | className="block rounded-t-sm bg-sky-500/70" | |
| 446 | className="block rounded-t-sm bg-info/70" | |
| 449 | 447 | style={{ height: `${readHeight}%` }} |
| 450 | 448 | /> |
| 451 | 449 | <span |
| 452 | className="block rounded-t-sm bg-amber-500/80" | |
| 450 | className="block rounded-t-sm bg-warning/80" | |
| 453 | 451 | style={{ height: `${writeHeight}%` }} |
| 454 | 452 | /> |
| 455 | 453 | </div> |
| ... | ... | @@ -632,10 +630,10 @@ function ProcessTable({ |
| 632 | 630 | <td className="px-3 py-2 text-right font-mono tabular-nums"> |
| 633 | 631 | {formatBytes(process.residentBytes)} |
| 634 | 632 | </td> |
| 635 | <td className="px-3 py-2 text-right font-mono tabular-nums text-sky-700 dark:text-sky-300"> | |
| 633 | <td className="px-3 py-2 text-right font-mono tabular-nums text-info-foreground"> | |
| 636 | 634 | {formatRate(process.ioReadBytesPerSecond)} |
| 637 | 635 | </td> |
| 638 | <td className="px-3 py-2 text-right font-mono tabular-nums text-amber-700 dark:text-amber-300"> | |
| 636 | <td className="px-3 py-2 text-right font-mono tabular-nums text-warning-foreground"> | |
| 639 | 637 | {formatRate(process.ioWriteBytesPerSecond)} |
| 640 | 638 | </td> |
| 641 | 639 | <td className="px-3 py-2 text-right font-mono tabular-nums text-muted-foreground"> |
| ... | ... | @@ -740,10 +738,10 @@ function HistoryProcessTable({ |
| 740 | 738 | <td className="px-3 py-2 text-right font-mono tabular-nums"> |
| 741 | 739 | {formatBytes(process.peakRssBytes)} |
| 742 | 740 | </td> |
| 743 | <td className="px-3 py-2 text-right font-mono tabular-nums text-sky-700 dark:text-sky-300"> | |
| 741 | <td className="px-3 py-2 text-right font-mono tabular-nums text-info-foreground"> | |
| 744 | 742 | {formatBytes(process.ioReadBytes)} |
| 745 | 743 | </td> |
| 746 | <td className="px-3 py-2 text-right font-mono tabular-nums text-amber-700 dark:text-amber-300"> | |
| 744 | <td className="px-3 py-2 text-right font-mono tabular-nums text-warning-foreground"> | |
| 747 | 745 | {formatBytes(process.ioWriteBytes)} |
| 748 | 746 | </td> |
| 749 | 747 | <td className="px-3 py-2 text-right font-mono tabular-nums text-muted-foreground"> |
| ... | ... | @@ -797,10 +795,10 @@ function AttributionTable({ entries }: { entries: ReadonlyArray<ResourceAttribut |
| 797 | 795 | {entry.component} |
| 798 | 796 | </td> |
| 799 | 797 | <td className="truncate px-3 py-2 text-muted-foreground">{entry.operation}</td> |
| 800 | <td className="px-3 py-2 text-right font-mono tabular-nums text-sky-700 dark:text-sky-300"> | |
| 798 | <td className="px-3 py-2 text-right font-mono tabular-nums text-info-foreground"> | |
| 801 | 799 | {formatBytes(entry.logicalReadBytes)} |
| 802 | 800 | </td> |
| 803 | <td className="px-3 py-2 text-right font-mono tabular-nums text-amber-700 dark:text-amber-300"> | |
| 801 | <td className="px-3 py-2 text-right font-mono tabular-nums text-warning-foreground"> | |
| 804 | 802 | {formatBytes(entry.logicalWriteBytes)} |
| 805 | 803 | </td> |
| 806 | 804 | <td className="px-3 py-2 text-right font-mono tabular-nums">{entry.count}</td> |
| ... | ... | @@ -997,7 +995,7 @@ export function ResourceTelemetryDiagnostics({ |
| 997 | 995 | </p> |
| 998 | 996 | </div> |
| 999 | 997 | <div className="flex items-center gap-2 text-[10px] text-muted-foreground/65"> |
| 1000 | <span className="size-1.5 rounded-full bg-emerald-500" /> | |
| 998 | <span className="size-1.5 rounded-full bg-success" /> | |
| 1001 | 999 | Sampling every {snapshot ? formatSampleInterval(snapshot.sampleIntervalMs) : "..."} |
| 1002 | 1000 | </div> |
| 1003 | 1001 | </div> |
| ... | ... | @@ -1063,17 +1061,17 @@ export function ResourceTelemetryDiagnostics({ |
| 1063 | 1061 | <div className="grid border-t border-border/60 bg-muted/10 md:grid-cols-3"> |
| 1064 | 1062 | <AggregateCard |
| 1065 | 1063 | label="Backend + agents" |
| 1066 | accentClass="bg-emerald-500/80" | |
| 1064 | accentClass="bg-success/80" | |
| 1067 | 1065 | aggregate={snapshot.groups.backend} |
| 1068 | 1066 | /> |
| 1069 | 1067 | <AggregateCard |
| 1070 | 1068 | label="Desktop" |
| 1071 | accentClass="bg-sky-500/80" | |
| 1069 | accentClass="bg-info/80" | |
| 1072 | 1070 | aggregate={snapshot.groups.electron} |
| 1073 | 1071 | /> |
| 1074 | 1072 | <AggregateCard |
| 1075 | 1073 | label="Monitor overhead" |
| 1076 | accentClass="bg-amber-500/80" | |
| 1074 | accentClass="bg-warning/80" | |
| 1077 | 1075 | aggregate={snapshot.groups.monitor} |
| 1078 | 1076 | /> |
| 1079 | 1077 | </div> |
| ... | ... | @@ -1186,7 +1184,7 @@ export function ResourceTelemetryDiagnostics({ |
| 1186 | 1184 | value={String(snapshot.health.inaccessibleProcessCount)} |
| 1187 | 1185 | valueClassName={ |
| 1188 | 1186 | snapshot.health.inaccessibleProcessCount > 0 |
| 1189 | ? "text-amber-600 dark:text-amber-300" | |
| 1187 | ? "text-warning-foreground" | |
| 1190 | 1188 | : undefined |
| 1191 | 1189 | } |
| 1192 | 1190 | /> |
apps/web/src/components/settings/SnapShotSetupDialog.tsx+8-69| ... | ... | @@ -5,7 +5,8 @@ import { |
| 5 | 5 | type DesktopSnapShotSetupAction, |
| 6 | 6 | type DesktopSnapShotState, |
| 7 | 7 | } from "@t3tools/contracts"; |
| 8 | import { useId, useState, type ReactNode } from "react"; | |
| 8 | import { useState, type ReactNode } from "react"; | |
| 9 | import { MacAccessibilityIcon, MacScreenRecordingIcon } from "../Icons"; | |
| 9 | 10 | import { CaptureShortcutConfig } from "./CaptureShortcutConfig"; |
| 10 | 11 | import { Button } from "../ui/button"; |
| 11 | 12 | import { Dialog, DialogDescription } from "../ui/dialog"; |
| ... | ... | @@ -61,72 +62,6 @@ const GNOME_ACCESS_COPY = { |
| 61 | 62 | }, |
| 62 | 63 | }; |
| 63 | 64 | |
| 64 | function ScreenRecordingIcon() { | |
| 65 | const gradientId = useId(); | |
| 66 | return ( | |
| 67 | <svg | |
| 68 | viewBox="0 0 32 32" | |
| 69 | className="size-8 shrink-0 drop-shadow-[0_1px_1px_#0005]" | |
| 70 | aria-hidden="true" | |
| 71 | > | |
| 72 | <defs> | |
| 73 | <linearGradient id={gradientId} x2="0" y2="1"> | |
| 74 | <stop stopColor="#ff6972" /> | |
| 75 | <stop offset="1" stopColor="#ff2938" /> | |
| 76 | </linearGradient> | |
| 77 | </defs> | |
| 78 | <rect | |
| 79 | x="0.5" | |
| 80 | y="0.5" | |
| 81 | width="31" | |
| 82 | height="31" | |
| 83 | rx="7" | |
| 84 | fill={`url(#${gradientId})`} | |
| 85 | stroke="#ffffff40" | |
| 86 | /> | |
| 87 | <circle cx="16" cy="16" r="10" fill="none" stroke="#fff" strokeWidth="2" /> | |
| 88 | <circle cx="16" cy="16" r="4.5" fill="#fff" /> | |
| 89 | </svg> | |
| 90 | ); | |
| 91 | } | |
| 92 | ||
| 93 | function AccessibilityPermissionIcon() { | |
| 94 | const gradientId = useId(); | |
| 95 | return ( | |
| 96 | <svg | |
| 97 | viewBox="0 0 32 32" | |
| 98 | className="size-8 shrink-0 drop-shadow-[0_1px_1px_#0005]" | |
| 99 | aria-hidden="true" | |
| 100 | > | |
| 101 | <defs> | |
| 102 | <linearGradient id={gradientId} x2="0" y2="1"> | |
| 103 | <stop stopColor="#48b6ff" /> | |
| 104 | <stop offset="1" stopColor="#0085ff" /> | |
| 105 | </linearGradient> | |
| 106 | </defs> | |
| 107 | <rect | |
| 108 | x="0.5" | |
| 109 | y="0.5" | |
| 110 | width="31" | |
| 111 | height="31" | |
| 112 | rx="7" | |
| 113 | fill={`url(#${gradientId})`} | |
| 114 | stroke="#ffffff40" | |
| 115 | /> | |
| 116 | <circle cx="16" cy="16" r="10" fill="none" stroke="#fff" strokeWidth="1.75" /> | |
| 117 | <circle cx="16" cy="10" r="1.6" fill="#fff" /> | |
| 118 | <path | |
| 119 | d="m10 13 6 1 6-1M16 14v4m0 0-2.5 6m2.5-6 2.5 6" | |
| 120 | fill="none" | |
| 121 | stroke="#fff" | |
| 122 | strokeWidth="1.6" | |
| 123 | strokeLinecap="round" | |
| 124 | strokeLinejoin="round" | |
| 125 | /> | |
| 126 | </svg> | |
| 127 | ); | |
| 128 | } | |
| 129 | ||
| 130 | 65 | export function SnapShotSetupDialog({ |
| 131 | 66 | state, |
| 132 | 67 | initialStep, |
| ... | ... | @@ -333,7 +268,9 @@ export function SnapShotSetupDialog({ |
| 333 | 268 | permissions={[ |
| 334 | 269 | { |
| 335 | 270 | id: "screenRecording", |
| 336 | icon: <ScreenRecordingIcon />, | |
| 271 | icon: ( | |
| 272 | <MacScreenRecordingIcon className="size-8 shrink-0 drop-shadow-[0_1px_1px_#0005]" /> | |
| 273 | ), | |
| 337 | 274 | title: "Screen Recording", |
| 338 | 275 | description: "Capture the window you're using.", |
| 339 | 276 | granted: macPermissions.screenRecording, |
| ... | ... | @@ -341,7 +278,9 @@ export function SnapShotSetupDialog({ |
| 341 | 278 | }, |
| 342 | 279 | { |
| 343 | 280 | id: "accessibility", |
| 344 | icon: <AccessibilityPermissionIcon />, | |
| 281 | icon: ( | |
| 282 | <MacAccessibilityIcon className="size-8 shrink-0 drop-shadow-[0_1px_1px_#0005]" /> | |
| 283 | ), | |
| 345 | 284 | title: "Accessibility", |
| 346 | 285 | description: includeAccessibility |
| 347 | 286 | ? "Include text and controls from the captured app." |
apps/web/src/components/sidebar/DesktopUpdateStatusIcon.tsx+1-1| ... | ... | @@ -67,7 +67,7 @@ function DesktopUpdateDownloadingIcon({ percent }: { readonly percent: number | |
| 67 | 67 | cy="16" |
| 68 | 68 | r={DOWNLOAD_PROGRESS_RADIUS} |
| 69 | 69 | fill="none" |
| 70 | stroke="color-mix(in srgb, currentColor 22%, transparent)" | |
| 70 | className="stroke-current/22" | |
| 71 | 71 | strokeWidth="1.5" |
| 72 | 72 | /> |
| 73 | 73 | <circle |
apps/web/src/components/usage/UsagePage.tsx+1-1| ... | ... | @@ -753,7 +753,7 @@ function UsageEnvironmentFilter({ |
| 753 | 753 | </> |
| 754 | 754 | ) : showUsageStatus && hasIssue ? ( |
| 755 | 755 | <CircleAlertIcon |
| 756 | className="size-3.5 text-amber-600 dark:text-amber-400" | |
| 756 | className="size-3.5 text-warning-foreground" | |
| 757 | 757 | aria-label="Some environments could not report usage" |
| 758 | 758 | /> |
| 759 | 759 | ) : ( |
apps/web/src/routes/_chat.pull-requests.tsx+1-1| ... | ... | @@ -1819,7 +1819,7 @@ function PullRequestsRouteView() { |
| 1819 | 1819 | )} |
| 1820 | 1820 | |
| 1821 | 1821 | {listQuery.error && shownCount > 0 ? ( |
| 1822 | <div className="flex items-center justify-between gap-3 rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-xs"> | |
| 1822 | <div className="flex items-center justify-between gap-3 rounded-lg border border-warning/30 bg-warning-surface px-3 py-2 text-xs"> | |
| 1823 | 1823 | <span>{listQuery.error} Showing the last pull requests loaded.</span> |
| 1824 | 1824 | <Button size="xs" variant="outline" onClick={() => listQuery.refresh()}> |
| 1825 | 1825 | Retry |
vite.config.ts+12| ... | ... | @@ -203,6 +203,18 @@ export default defineConfig({ |
| 203 | 203 | files: ["apps/web/src/**"], |
| 204 | 204 | rules: { "shadcn/no-unknown-classes": "error" }, |
| 205 | 205 | }, |
| 206 | { | |
| 207 | // Colors come from theme tokens so status tones follow custom themes. components/ui | |
| 208 | // has no findings and stays covered too. | |
| 209 | files: ["apps/web/src/**"], | |
| 210 | rules: { "shadcn/no-raw-colors": "error" }, | |
| 211 | }, | |
| 212 | { | |
| 213 | // Third-party marks (brand logos, the macOS permission panes, Codex's Computer Use | |
| 214 | // mark) must keep their exact colors, so the files that hold them are exempt. | |
| 215 | files: ["apps/web/src/components/Icons.tsx", "apps/web/src/components/JetBrainsIcons.tsx"], | |
| 216 | rules: { "shadcn/no-raw-colors": "off" }, | |
| 217 | }, | |
| 206 | 218 | { |
| 207 | 219 | // components/ui exports own their look. App code picks a variant or size instead |
| 208 | 220 | // of restyling with className; layout classes (width, flex, margin, position) stay |