From 21079391c72d1eeaa3c40f1cc5eb3e78abf0a846 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Tue, 22 Sep 2026 21:33:02 -0700 Subject: [PATCH] refactor(web): field controls stop restyling Input, Select, Combobox and Command (#13206) Co-authored-by: Claude Opus 5.5 (1M context) --- apps/web/src/browser/BrowserDeviceToolbar.tsx | 19 ++++---- .../BranchToolbarBranchSelector.tsx | 7 +-- .../BranchToolbarEnvModeSelector.tsx | 2 +- .../BranchToolbarEnvironmentSelector.tsx | 2 +- apps/web/src/components/CommandPalette.tsx | 2 +- .../src/components/CommandPaletteContent.tsx | 2 +- .../src/components/CommandPaletteResults.tsx | 3 +- .../web/src/components/CustomSnoozeDialog.tsx | 1 - apps/web/src/components/DiffPanel.tsx | 3 +- apps/web/src/components/LegacySidebar.tsx | 9 ++-- apps/web/src/components/Sidebar.tsx | 1 - .../components/chat/ComposerCommandMenu.tsx | 1 - .../components/preview/PreviewChromeRow.tsx | 45 +++++++++---------- .../search/ProjectContentSearchDialog.tsx | 6 ++- .../settings/AddProviderInstanceDialog.tsx | 2 - .../settings/ConnectionsSettings.tsx | 5 +-- .../settings/KeybindingsSettings.tsx | 35 +++++++-------- .../settings/ProjectFaviconPickerDialog.tsx | 2 +- .../settings/ProviderAccentColorPicker.tsx | 3 +- .../settings/ProviderSettingsForm.tsx | 1 - .../components/settings/StorageSettings.tsx | 2 +- .../components/settings/ThemeColorPicker.tsx | 5 +-- apps/web/src/components/ui/autocomplete.tsx | 2 +- scripts/lint-restyle-ceiling.ts | 2 +- 24 files changed, 72 insertions(+), 90 deletions(-) diff --git a/apps/web/src/browser/BrowserDeviceToolbar.tsx b/apps/web/src/browser/BrowserDeviceToolbar.tsx index cf78e5095a385e087869f2dc0ea62bd264fac15c..f84e18d8466987ede3ffdeba746fbd7516037121 100644 --- a/apps/web/src/browser/BrowserDeviceToolbar.tsx +++ b/apps/web/src/browser/BrowserDeviceToolbar.tsx @@ -189,10 +189,7 @@ export function BrowserDeviceToolbar({ = 440 ? "w-36" : "w-24", - )} + className={cn("shrink-0 justify-between", width >= 440 ? "w-36" : "w-24")} aria-label="Browser device preset" > @@ -227,7 +224,8 @@ export function BrowserDeviceToolbar({ nativeInput type="number" inputMode="numeric" - size="sm" + size="compact" + font="mono" min={PREVIEW_VIEWPORT_MIN_DIMENSION} max={PREVIEW_VIEWPORT_MAX_DIMENSION} value={presentedSize.width} @@ -245,8 +243,8 @@ export function BrowserDeviceToolbar({ aria-label="Viewport width" aria-invalid={!customValid} className={cn( - "h-6 rounded-md text-center tabular-nums [&_[data-slot=input]]:h-full [&_[data-slot=input]]:px-1 [&_[data-slot=input]]:text-xs [&_[data-slot=input]]:leading-none [&_[data-slot=input]::-webkit-inner-spin-button]:appearance-none [&_[data-slot=input]]:[appearance:textfield]", - width >= 360 ? "w-14" : "w-11", + "text-center [&_[data-slot=input]::-webkit-inner-spin-button]:appearance-none [&_[data-slot=input]]:[appearance:textfield]", + width >= 360 ? "w-14" : "w-13", )} /> Ă— @@ -254,7 +252,8 @@ export function BrowserDeviceToolbar({ nativeInput type="number" inputMode="numeric" - size="sm" + size="compact" + font="mono" min={PREVIEW_VIEWPORT_MIN_DIMENSION} max={PREVIEW_VIEWPORT_MAX_DIMENSION} value={presentedSize.height} @@ -272,8 +271,8 @@ export function BrowserDeviceToolbar({ aria-label="Viewport height" aria-invalid={!customValid} className={cn( - "h-6 rounded-md text-center tabular-nums [&_[data-slot=input]]:h-full [&_[data-slot=input]]:px-1 [&_[data-slot=input]]:text-xs [&_[data-slot=input]]:leading-none [&_[data-slot=input]::-webkit-inner-spin-button]:appearance-none [&_[data-slot=input]]:[appearance:textfield]", - width >= 360 ? "w-14" : "w-11", + "text-center [&_[data-slot=input]::-webkit-inner-spin-button]:appearance-none [&_[data-slot=input]]:[appearance:textfield]", + width >= 360 ? "w-14" : "w-13", )} /> diff --git a/apps/web/src/components/BranchToolbarBranchSelector.tsx b/apps/web/src/components/BranchToolbarBranchSelector.tsx index 9ca02389b192b78dd544024ad0e33cf86726e29b..b0596811f664163e3be5d39ac11da39e71bf54f8 100644 --- a/apps/web/src/components/BranchToolbarBranchSelector.tsx +++ b/apps/web/src/components/BranchToolbarBranchSelector.tsx @@ -704,7 +704,6 @@ export function BranchToolbarBranchSelector({ key={itemValue} index={index} value={itemValue} - className="pe-2" onClick={() => selectPickerItem(itemValue)} >
@@ -726,7 +725,6 @@ export function BranchToolbarBranchSelector({ key={itemValue} index={index} value={itemValue} - className="pe-1.5" onClick={() => selectPickerItem(itemValue)} > Create new ref "{newRefName}" @@ -754,7 +752,6 @@ export function BranchToolbarBranchSelector({ key={itemValue} index={index} value={itemValue} - className="pe-1.5" onClick={() => selectPickerItem(itemValue)} onContextMenu={(event) => handleBranchContextMenu(event, itemValue)} > @@ -809,10 +806,10 @@ export function BranchToolbarBranchSelector({ onContextMenu={(event) => handleBranchContextMenu(event, resolvedActiveBranch)} > } + render={} // No press-scale: the popup aligns live to this trigger, so a // momentary 0.97 shrink would drag the open popup ~3px sideways. - className="min-w-0 max-w-full font-normal text-muted-foreground/70 text-xs! hover:text-foreground/80 active:scale-100" + className="min-w-0 max-w-full active:scale-100" disabled={isInitialBranchesLoadPending || isBranchActionPending} > diff --git a/apps/web/src/components/BranchToolbarEnvModeSelector.tsx b/apps/web/src/components/BranchToolbarEnvModeSelector.tsx index 0ec794b2970c646663ca33ede648dcfe6215065a..1b8b81cfcd74d2fafa81fd48e2acbf8c91a851b9 100644 --- a/apps/web/src/components/BranchToolbarEnvModeSelector.tsx +++ b/apps/web/src/components/BranchToolbarEnvModeSelector.tsx @@ -110,7 +110,7 @@ export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSe {children} - +
diff --git a/apps/web/src/components/CommandPaletteResults.tsx b/apps/web/src/components/CommandPaletteResults.tsx index b9cb0c6269c8142a97d1a32a17fe773dd15d1e6f..b94707f5eca6782e9a92c90c18bfa06ed39cefc6 100644 --- a/apps/web/src/components/CommandPaletteResults.tsx +++ b/apps/web/src/components/CommandPaletteResults.tsx @@ -41,7 +41,7 @@ export function CommandPaletteResults(props: CommandPaletteResultsProps) { {props.groups.map((group) => ( - {group.label} + {group.label} {(item) => item.disabled ? ( @@ -109,7 +109,6 @@ function CommandPaletteResultRow(props: { { event.preventDefault(); }} diff --git a/apps/web/src/components/CustomSnoozeDialog.tsx b/apps/web/src/components/CustomSnoozeDialog.tsx index f944d6af604260981c4daec4288a147ecf4379ca..4cd3be8a096e3165fb1ffd10e3dcc9b464aef9b1 100644 --- a/apps/web/src/components/CustomSnoozeDialog.tsx +++ b/apps/web/src/components/CustomSnoozeDialog.tsx @@ -169,7 +169,6 @@ function CustomSnoozeDialog() { ) : (
} + className="min-w-0 max-w-48" aria-label={`Change comparison target. Currently ${selectedGitSource.baseRef}`} > {selectedGitSource.baseRef} diff --git a/apps/web/src/components/LegacySidebar.tsx b/apps/web/src/components/LegacySidebar.tsx index fc8bf99a8098963dd70287953b299966ff188aec..2373ed90cf6ae52b01ac9afbaab565a30ece5565 100644 --- a/apps/web/src/components/LegacySidebar.tsx +++ b/apps/web/src/components/LegacySidebar.tsx @@ -2784,7 +2784,7 @@ function ProjectSortMenu({
- + { event.stopPropagation(); @@ -2807,7 +2806,7 @@ function ProjectSortMenu({ /> diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 2e18d089412978136b6e37ad95861d8958db6492..1df381470e8d532baced9f2d5206ed2515b3f895 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -4483,7 +4483,6 @@ export default function Sidebar() { key={item.value} hideIndicator value={item} - className="font-medium" onContextMenu={(event) => { if (project) handleProjectSettings(event, project); }} diff --git a/apps/web/src/components/chat/ComposerCommandMenu.tsx b/apps/web/src/components/chat/ComposerCommandMenu.tsx index 7c23a6059d3dd7296d22d17631b9eb4a355e04c1..4f0cabf8b4b412150c95a6707efee90bf6b79b31 100644 --- a/apps/web/src/components/chat/ComposerCommandMenu.tsx +++ b/apps/web/src/components/chat/ComposerCommandMenu.tsx @@ -162,7 +162,6 @@ const ComposerCommandMenuItem = memo(function ComposerCommandMenuItem(props: { value={props.item.id} data-composer-item-id={props.item.id} active={props.isActive} - className="gap-3 rounded-lg px-3 py-2!" onMouseMove={() => { if (!props.isActive) props.onHighlight(props.item.id); }} diff --git a/apps/web/src/components/preview/PreviewChromeRow.tsx b/apps/web/src/components/preview/PreviewChromeRow.tsx index 7ca0c496a04b6aa9eb425c1013205dfd74d5395e..0fd12aecb8bf86a8c36f089fd9775467dfad7cff 100644 --- a/apps/web/src/components/preview/PreviewChromeRow.tsx +++ b/apps/web/src/components/preview/PreviewChromeRow.tsx @@ -181,11 +181,6 @@ export function PreviewChromeRow({ setDraft(event.target.value)} onFocus={() => { setDraft(url); @@ -213,26 +208,26 @@ export function PreviewChromeRow({ /> {onOpenInBrowser && !inputFocused ? ( - - - - } - > - - - Open in system browser - + + {/* Revealed on hover so a resting address bar reads as plain text. */} + + + + } + > + + + Open in system browser + + ) : null} diff --git a/apps/web/src/components/search/ProjectContentSearchDialog.tsx b/apps/web/src/components/search/ProjectContentSearchDialog.tsx index f8707dbf68f3044c164fcbef4cbcca138f5be487..3c83c1f371542e36e6bb09f33e2bc6ee5048e923 100644 --- a/apps/web/src/components/search/ProjectContentSearchDialog.tsx +++ b/apps/web/src/components/search/ProjectContentSearchDialog.tsx @@ -89,11 +89,13 @@ function EmptyContentSearchDialog() { footerActionLabel="Open file" inputProps={{ disabled: true, placeholder: "Search project contents…" }} mode="none" - panelClassName="flex min-h-0 flex-1 items-center justify-center px-6 text-center text-sm text-muted-foreground" + panelClassName="flex min-h-0 flex-1 items-center justify-center" testId="project-content-search" value="" > - Open a project to search its files. +

+ Open a project to search its files. +

); } diff --git a/apps/web/src/components/settings/AddProviderInstanceDialog.tsx b/apps/web/src/components/settings/AddProviderInstanceDialog.tsx index 65eb8ad7699b7df3b72fe89e87a519c76300f0ca..0e92071e1161497e6e9148a0c46d8b44106d0e09 100644 --- a/apps/web/src/components/settings/AddProviderInstanceDialog.tsx +++ b/apps/web/src/components/settings/AddProviderInstanceDialog.tsx @@ -306,7 +306,6 @@ export function AddProviderInstanceDialog({
) : null} -
+ {parseError ? (
@@ -858,7 +857,7 @@ function KeybindingKeyControl({ placeholder={isRecording ? "Press shortcut" : "Unassigned"} size="sm" font="mono" - className={cn("w-44", isRecording && "border-primary/70 bg-primary/5")} + className="w-44" onFocus={() => setDraft({ isRecording: true })} onBlur={() => setDraft({ isRecording: false })} onChange={(event) => setDraft({ keyDraft: event.currentTarget.value })} @@ -1168,7 +1167,7 @@ function NewKeybindingKeyInput({ placeholder={draft.isRecording ? "Press shortcut" : "Unassigned"} size="sm" font="mono" - className={cn(draft.isRecording && "border-primary/70 bg-primary/5", className)} + className={className} onFocus={() => draft.setDraft({ isRecording: true })} onBlur={() => draft.setDraft({ isRecording: false })} onChange={(event) => draft.setDraft({ keyDraft: event.currentTarget.value })} diff --git a/apps/web/src/components/settings/ProjectFaviconPickerDialog.tsx b/apps/web/src/components/settings/ProjectFaviconPickerDialog.tsx index aa4d291851c7aa77d75385db7e18db899248ff50..a0971db3ac25a817e8a53f7e3460597df6201dfa 100644 --- a/apps/web/src/components/settings/ProjectFaviconPickerDialog.tsx +++ b/apps/web/src/components/settings/ProjectFaviconPickerDialog.tsx @@ -71,7 +71,7 @@ export function ProjectFaviconPickerDialog(props: { {props.open ? ( props.onOpenChange(false)} > { const nextColor = event.currentTarget.value; @@ -57,7 +57,6 @@ function ProviderCustomColorPanel(props: { }} onBlur={() => setHexDraft(null)} font="mono" - className="text-xs" aria-label="Custom hex accent color" spellCheck={false} /> diff --git a/apps/web/src/components/settings/ProviderSettingsForm.tsx b/apps/web/src/components/settings/ProviderSettingsForm.tsx index d0c366831bb02643845a824949c46641970235cd..d49c05c9660fd6db94f8cb84e88d44af6b720057 100644 --- a/apps/web/src/components/settings/ProviderSettingsForm.tsx +++ b/apps/web/src/components/settings/ProviderSettingsForm.tsx @@ -388,7 +388,6 @@ function ProviderSettingsFieldRow({ ) : (
diff --git a/apps/web/src/components/ui/autocomplete.tsx b/apps/web/src/components/ui/autocomplete.tsx index 8a951337f261412873ac0c4337cd15b0fff4d222..8251d8c24b7c6690a66f66a7354db270fcbaae61 100644 --- a/apps/web/src/components/ui/autocomplete.tsx +++ b/apps/web/src/components/ui/autocomplete.tsx @@ -125,7 +125,7 @@ function AutocompleteItem({ className, children, ...props }: AutocompletePrimiti return (