Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
1704104
fix(web): 130+ UI consistency fixes
0x00-sys Aug 11, 2026
8842819
fix(web): apply reduced-motion overrides after the animations they di…
0x00-sys Aug 11, 2026
2967c9d
fix(web): animate autocomplete and combobox popup exit
0x00-sys Aug 12, 2026
2735e76
fix(web): order changed-files header classes after asserted prefix
0x00-sys Aug 12, 2026
6c3088f
fix(web): equalize changed-files header button sizes
0x00-sys Aug 12, 2026
e156f01
fix(web): drop undersized refresh icon override in shared clerk profi…
0x00-sys Aug 12, 2026
688e4cb
fix(web): derive folder collapse-all button from actual directory state
0x00-sys Aug 13, 2026
d1d1d05
fix(web): hide folder collapse-all button when the diff has no folders
0x00-sys Aug 13, 2026
1ff8b38
Merge remote-tracking branch 'upstream/main' into fix/web-ui-consistency
0x00-sys Aug 13, 2026
c6fdc12
docs: document web UI conventions
0x00-sys Aug 14, 2026
8437d08
Merge remote-tracking branch 'upstream/main' into fix/web-ui-consistency
0x00-sys Aug 14, 2026
d250618
docs: remove unrelated UI conventions
0x00-sys Aug 14, 2026
f9cf6c4
Merge remote-tracking branch 'upstream/main' into fix/web-ui-consistency
0x00-sys Aug 15, 2026
518548d
fix(web): address UI consistency review
0x00-sys Aug 15, 2026
251a1dc
fix(web): address follow-up UI review
0x00-sys Aug 15, 2026
4a6ca15
fix(web): complete UI consistency review
0x00-sys Aug 15, 2026
fdbce62
fix(web): align shared UI primitives
0x00-sys Aug 15, 2026
f631c20
fix(web): tighten UI ownership contracts
0x00-sys Aug 15, 2026
c8e2853
Merge remote-tracking branch 'upstream/main' into fix/web-ui-consistency
0x00-sys Aug 17, 2026
41247f8
fix(web): add missing pointer cursors to interactive controls
0x00-sys Aug 17, 2026
44f6b64
fix(web): read folder expansion overrides as own properties
0x00-sys Aug 17, 2026
e2f873d
fix(web): drop dead combobox popup variants in the diff panel
0x00-sys Aug 17, 2026
1db0502
refactor(web): give shared UI treatments a single owner
0x00-sys Aug 17, 2026
3b5517a
docs(web): record why bordered select triggers use the double chevron
0x00-sys Aug 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/web/src/browser/BrowserDeviceToolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ export function BrowserDeviceToolbar({
}}
>
{width >= 560 ? (
<span className="mr-0.5 shrink-0 text-[11px] font-medium text-muted-foreground">
<span className="mr-0.5 shrink-0 text-xs font-medium text-muted-foreground">
Dimensions
</span>
) : null}
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/browser/BrowserViewportResizeHandles.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ interface Props {
type HandleKind = "horizontal" | "vertical" | "corner";

const EDGE_BUTTON_CLASS =
"group absolute z-20 touch-none border-0 bg-transparent p-0 outline-none before:absolute before:-inset-1 before:content-[''] focus-visible:bg-foreground/[0.04]";
"group absolute z-20 touch-none border-0 bg-transparent p-0 outline-none before:absolute before:-inset-1 before:content-[''] focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring";
const EDGE_GRIP_CLASS =
"pointer-events-none absolute left-1/2 top-1/2 flex -translate-x-1/2 -translate-y-1/2 items-center justify-center text-muted-foreground/55 transition-colors duration-150 group-hover:text-foreground/85 group-focus-visible:text-foreground group-active:text-foreground";

Expand Down
6 changes: 3 additions & 3 deletions apps/web/src/components/AgentsPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ function PhaseSection({
onClick={() => setOpen((value) => !value)}
aria-expanded={open}
className={cn(
"mt-2 flex w-full items-center gap-1.5 rounded-sm px-1.5 text-left text-[.65rem] font-medium uppercase tracking-wider hover:bg-accent/40",
"mt-2 flex w-full cursor-pointer items-center gap-1.5 rounded-sm px-1.5 text-left text-[.65rem] font-medium uppercase tracking-wider hover:bg-accent/40",
phase.state === "done"
? "text-success-foreground"
: phase.state === "running"
Expand Down Expand Up @@ -408,7 +408,7 @@ function ExpandedWorkflowSection({
type="button"
onClick={() => setScriptOpen((value) => !value)}
className={cn(
"rounded-sm border border-border/60 px-1 font-mono normal-case hover:text-foreground",
"cursor-pointer rounded-sm border border-border/60 px-1 font-mono normal-case hover:text-foreground",
scriptOpen && "text-foreground",
)}
aria-expanded={scriptOpen}
Expand Down Expand Up @@ -478,7 +478,7 @@ function CollapsedWorkflowSection({
<button
type="button"
onClick={onExpand}
className="flex w-full items-center gap-2 rounded-md px-1.5 py-1 text-left hover:bg-accent/40"
className="flex w-full cursor-pointer items-center gap-2 rounded-md px-1.5 py-1 text-left hover:bg-accent/40"
aria-expanded={false}
>
<StatusDot status={failed > 0 ? "failed" : group.workflow.status} />
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/BranchToolbarBranchSelector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -738,7 +738,7 @@ export function BranchToolbarBranchSelector({
aria-label={branchPrTooltip}
onClick={(event) => openPrLink(event, branchPrStatus.url)}
className={cn(
"inline-flex shrink-0 items-center gap-0.5 rounded px-1 py-0.5 text-[11px] font-medium tabular-nums transition-colors hover:bg-muted/60",
"inline-flex shrink-0 cursor-pointer items-center gap-0.5 rounded px-1 py-0.5 text-[11px] font-medium tabular-nums transition-colors hover:bg-muted/60",
branchPrStatus.colorClass,
)}
/>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/ChatMarkdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -553,7 +553,7 @@ function MarkdownDetails({
data-markdown-details-open={isOpen ? "true" : "false"}
>
<CollapsibleTrigger
className="flex w-full items-center gap-2 py-2 text-left text-sm font-medium text-foreground data-panel-open:[&_svg]:rotate-90"
className="flex w-full items-center gap-2 rounded-sm py-2 text-left text-sm font-medium text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-panel-open:[&_svg]:rotate-90"
data-markdown-details-summary=""
>
<ChevronRightIcon
Expand Down
7 changes: 5 additions & 2 deletions apps/web/src/components/ChatView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2148,7 +2148,10 @@ function ChatViewContent(props: ChatViewProps) {
<Tooltip>
<TooltipTrigger
render={
<button type="button" className="cursor-help rounded-sm text-left">
<button
type="button"
className="cursor-help rounded-sm text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background"
>
Server update available
</button>
}
Expand Down Expand Up @@ -4580,7 +4583,7 @@ function ChatViewContent(props: ChatViewProps) {
</Tooltip>
</span>
),
className: "dark:shadow-none",

actions: (
<Button
size="xs"
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/CommandPalette.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2411,7 +2411,7 @@ function OpenCommandPaletteDialog(props: {
startAddon: (
<button
type="button"
className="flex cursor-pointer items-center"
className="flex cursor-pointer items-center rounded-sm text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background"
aria-label="Back"
onClick={popView}
>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/CommandPaletteResults.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ export function CommandPaletteResults(props: CommandPaletteResultsProps) {
<CommandList>
{props.groups.map((group) => (
<CommandGroup items={group.items} key={group.value}>
<CommandGroupLabel className="ps-[9px]">{group.label}</CommandGroupLabel>
<CommandGroupLabel className="ps-2">{group.label}</CommandGroupLabel>
<CommandCollection>
{(item) =>
item.disabled ? (
Expand Down
6 changes: 3 additions & 3 deletions apps/web/src/components/DiffPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,7 @@ export default function DiffPanel({
<div className="flex min-w-0 flex-1 items-center gap-3 [-webkit-app-region:no-drag]">
<DropdownMenu>
<DropdownMenuTrigger
className="inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-accent px-2 text-xs font-medium text-accent-foreground outline-none transition-colors hover:bg-accent/80 focus-visible:ring-2 focus-visible:ring-ring"
className="inline-flex h-6 max-w-full cursor-pointer items-center gap-1 rounded-md bg-accent px-2 text-xs font-medium text-accent-foreground outline-none transition-colors hover:bg-accent/80 focus-visible:ring-2 focus-visible:ring-ring"
aria-label={`Diff scope: ${selectedScopeLabel}`}
>
<span className="truncate">{selectedScopeLabel}</span>
Expand Down Expand Up @@ -609,15 +609,15 @@ export default function DiffPanel({
}}
>
<ComboboxTrigger
className="inline-flex min-w-0 max-w-48 items-center gap-1 overflow-hidden rounded-md px-1.5 py-1 outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring"
className="inline-flex min-w-0 max-w-48 cursor-pointer items-center gap-1 overflow-hidden rounded-md px-1.5 py-1 outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring"
aria-label={`Change comparison target. Currently ${selectedGitSource.baseRef}`}
>
<span className="min-w-0 truncate">{selectedGitSource.baseRef}</span>
<ChevronDownIcon className="size-3.5 shrink-0 opacity-70" />
</ComboboxTrigger>
<ComboboxPopup
align="start"
className="w-72 min-w-0 max-w-[calc(100vw-1rem)] overflow-hidden [&>[data-slot=combobox-popup]]:min-w-0 [&>[data-slot=combobox-popup]]:overflow-hidden"
className="w-72 min-w-0 max-w-[calc(100vw-1rem)] overflow-hidden"
>
<div className="min-w-0 shrink-0 px-3 pt-2.5">
<div className="relative -translate-y-px border-b border-border/70 pb-1.5 transition-colors focus-within:border-ring">
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/components/DiffPanelShell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ export function DiffPanelHeaderSkeleton() {

function DiffFileHeaderSkeleton({ titleClassName }: { titleClassName: string }) {
return (
<div className="flex h-8 items-center gap-2 px-2 pr-3">
<div className="flex h-8 items-center gap-2 pl-2 pr-3">
<div className="flex size-5 shrink-0 items-center justify-center">
<Skeleton className="size-2.5 rounded-[2px]" />
</div>
Expand Down Expand Up @@ -94,7 +94,7 @@ export function DiffPanelLoadingState(props: { label: string }) {
aria-label={props.label}
>
<DiffFileHeaderSkeleton titleClassName="w-1/2 max-w-64" />
<div className="flex h-6 items-center gap-2 px-2 pr-3">
<div className="flex h-6 items-center gap-2 pl-2 pr-3">
<div className="h-px flex-1 bg-border/40" />
<Skeleton className="h-2.5 w-24 rounded-full" />
<div className="h-px flex-1 bg-border/40" />
Expand Down
10 changes: 5 additions & 5 deletions apps/web/src/components/GitActionsControl.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,7 @@ function PublishRepositoryDialog(props: PublishRepositoryDialogProps) {
: isComplete
? "border-border bg-background dark:border-transparent dark:bg-white/[0.05]"
: "border-border bg-muted/40 dark:border-transparent dark:bg-white/[0.025]",
!isClickable && "cursor-default",
isClickable ? "cursor-pointer" : "cursor-default",
)}
>
<span
Expand Down Expand Up @@ -635,7 +635,7 @@ function PublishRepositoryDialog(props: PublishRepositoryDialogProps) {
return (
<div
key={option.value}
className="relative flex cursor-not-allowed items-center gap-3 rounded-lg border border-border bg-background px-3 py-3 text-left opacity-55 dark:border-transparent dark:bg-white/[0.035]"
className="relative flex cursor-not-allowed items-center gap-3 rounded-lg border border-border bg-background px-3 py-3 text-left opacity-64 dark:border-transparent dark:bg-white/[0.035]"
>
<option.Icon
className="size-5 shrink-0 text-muted-foreground"
Expand Down Expand Up @@ -791,7 +791,7 @@ function PublishRepositoryDialog(props: PublishRepositoryDialogProps) {
type="button"
onClick={() => setPublishAdvancedOpen((prev) => !prev)}
aria-expanded={publishAdvancedOpen}
className="flex items-center gap-1 text-xs font-medium text-muted-foreground transition-colors hover:text-foreground"
className="flex cursor-pointer items-center gap-1 text-xs font-medium text-muted-foreground transition-colors hover:text-foreground"
>
<ChevronDownIcon
className={cn(
Expand Down Expand Up @@ -836,7 +836,7 @@ function PublishRepositoryDialog(props: PublishRepositoryDialogProps) {
key={value}
value={value}
className={cn(
"rounded-md border px-3 py-1.5 text-center text-sm font-medium outline-none transition",
"cursor-pointer rounded-md border px-3 py-1.5 text-center text-sm font-medium outline-none transition-[color,background-color,border-color,box-shadow] data-disabled:cursor-not-allowed data-disabled:opacity-64",
"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background",
isSelected
? "border-primary bg-background ring-2 ring-primary/35 text-foreground dark:border-transparent dark:bg-primary/10 dark:ring-1 dark:ring-primary/30"
Expand Down Expand Up @@ -1924,7 +1924,7 @@ export default function GitActionsControl({
)}
<button
type="button"
className="flex min-w-0 flex-1 items-center justify-between gap-3 text-left"
className="flex min-w-0 flex-1 cursor-pointer items-center justify-between gap-3 text-left"
onClick={() => openChangedFileInEditor(file.path)}
>
<StartTruncatedPath
Expand Down
13 changes: 4 additions & 9 deletions apps/web/src/components/LegacySidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ const PROJECT_GROUPING_MODE_LABELS: Record<SidebarProjectGroupingMode, string> =
separate: "Keep separate",
};
const SIDEBAR_ICON_ACTION_BUTTON_CLASS =
"inline-flex h-6 min-w-6 cursor-pointer items-center justify-center rounded-md px-[calc(--spacing(1)-1px)] text-icon-muted hover:text-foreground focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring";
"inline-flex h-6 min-w-6 cursor-pointer items-center justify-center rounded-md px-[calc(--spacing(1)-1px)] text-icon-muted transition-colors hover:text-foreground focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring";

function SidebarThreadDetailPrewarmer({ threadRef }: { readonly threadRef: ScopedThreadRef }) {
useEnvironmentThread(threadRef.environmentId, threadRef.threadId);
Expand Down Expand Up @@ -751,7 +751,7 @@ export const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThr
<button
type="button"
aria-label={`Open localhost:${discoveredPorts[0]?.port ?? ""}`}
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"
className="inline-flex cursor-pointer items-center justify-center rounded-sm text-emerald-600 outline-hidden focus-visible:ring-1 focus-visible:ring-ring dark:text-emerald-400"
onClick={handleOpenDiscoveredPort}
/>
}
Expand Down Expand Up @@ -2632,7 +2632,7 @@ function ProjectSortMenu({
<Tooltip>
<TooltipTrigger
render={
<MenuTrigger className="inline-flex h-6 min-w-6 cursor-pointer items-center justify-center rounded-md px-[calc(--spacing(1)-1px)] text-icon-muted transition-colors hover:bg-accent hover:text-foreground" />
<MenuTrigger className="inline-flex h-6 min-w-6 cursor-pointer items-center justify-center rounded-md px-[calc(--spacing(1)-1px)] text-icon-muted transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring" />
}
>
<ArrowUpDownIcon className="size-3.5" />
Expand Down Expand Up @@ -2866,12 +2866,7 @@ const SidebarProjectsContent = memo(function SidebarProjectsContent(
<SidebarMenu>
<SidebarMenuItem>
<CommandDialogTrigger
render={
<SidebarMenuButton
className="focus-visible:ring-0"
data-testid="command-palette-trigger"
/>
}
render={<SidebarMenuButton data-testid="command-palette-trigger" />}
>
<SearchIcon />
<span className="flex-1 truncate">Search</span>
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/components/RightPanelTabs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ function RightPanelEmptyState(props: {
)
}
className={cn(
"relative flex w-full cursor-pointer flex-col items-start p-4 text-left transition hover:border-border hover:bg-accent/60",
"relative flex w-full cursor-pointer flex-col items-start p-4 text-left transition-colors hover:border-border hover:bg-accent/60",
cardShellClass,
isHighlighted(action) && highlightedCardClass,
)}
Expand All @@ -384,7 +384,7 @@ function RightPanelEmptyState(props: {
<div
key={action.label}
className={cn(
"relative flex w-full flex-col items-start p-4 opacity-40",
"relative flex w-full flex-col items-start p-4 opacity-64",
cardShellClass,
)}
>
Expand Down
Loading
Loading