From b59b7d0af9536a2d61ddfcf8d33420b890b2faca Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 2 Sep 2026 15:56:28 -0700 Subject: [PATCH] fix(web): unify control sizing across settings pages (#9281) Co-authored-by: Claude Code --- .../BranchToolbarBranchSelector.tsx | 2 +- .../web/src/components/ServerUpdateAction.tsx | 6 ++- .../settings/AddProviderInstanceDialog.tsx | 13 ++--- .../settings/ConnectionsSettings.tsx | 9 ++-- .../settings/DiagnosticsSettings.tsx | 8 +-- .../components/settings/FontFamilyPicker.tsx | 8 ++- .../settings/IntegrationsSettings.tsx | 16 ++++-- .../settings/KeybindingsSettings.tsx | 30 ++++++------ .../settings/ProjectSettingsPanel.tsx | 17 ++++--- .../settings/ProviderInstanceCard.tsx | 11 +++-- .../settings/ProviderModelsSection.tsx | 9 ++-- .../settings/ProviderSettingsForm.tsx | 4 +- .../settings/ProviderSettingsPanel.tsx | 6 +-- .../components/settings/SettingsPanels.tsx | 49 +++++++++++++------ .../settings/SharedSettingsMismatchAlert.tsx | 2 +- .../settings/SourceControlSettings.tsx | 14 ++---- .../settings/SourceControlWritingSettings.tsx | 15 ++++-- .../components/settings/ThemeEditorPanel.tsx | 2 + .../components/settings/settingsLayout.tsx | 14 ++++++ apps/web/src/components/ui/switch.tsx | 12 ++++- 20 files changed, 154 insertions(+), 93 deletions(-) diff --git a/apps/web/src/components/BranchToolbarBranchSelector.tsx b/apps/web/src/components/BranchToolbarBranchSelector.tsx index 5fcad2f741dbf2382a7ae5b338c4f29adfade285..42b94b538086e7f541fb01b5defca3b90289322f 100644 --- a/apps/web/src/components/BranchToolbarBranchSelector.tsx +++ b/apps/web/src/components/BranchToolbarBranchSelector.tsx @@ -850,7 +850,7 @@ export function BranchToolbarBranchSelector({ onStartFromOriginChange(Boolean(checked))} /> diff --git a/apps/web/src/components/ServerUpdateAction.tsx b/apps/web/src/components/ServerUpdateAction.tsx index 4647eb541566abf19ff07e877f4df3787c669980..71b974416dd3dbc3856bb8e21bc7195c95959da5 100644 --- a/apps/web/src/components/ServerUpdateAction.tsx +++ b/apps/web/src/components/ServerUpdateAction.tsx @@ -83,6 +83,7 @@ export function ServerUpdateAction({ targetVersion, label = "Update", variant = "outline", + size = "xs", }: { readonly environmentId: EnvironmentId; readonly serverLabel: string; @@ -95,6 +96,7 @@ export function ServerUpdateAction({ readonly targetVersion: string; readonly label?: string; readonly variant?: ComponentProps["variant"]; + readonly size?: ComponentProps["size"]; }) { const isDesktopAppUpdate = selfUpdate === "desktop-managed"; const continueThreadsAfterServerUpdate = useClientSettings( @@ -185,14 +187,14 @@ export function ServerUpdateAction({ if (selfUpdate === null) { const command = manualServerUpdateCommand(targetVersion); return ( - ); } return ( - ); diff --git a/apps/web/src/components/settings/AddProviderInstanceDialog.tsx b/apps/web/src/components/settings/AddProviderInstanceDialog.tsx index 158908b5e9428a84db3de7ce4aeef1858d319acc..9671755f8bea19e7f0ed17e7d1763a27c9bcfc1b 100644 --- a/apps/web/src/components/settings/AddProviderInstanceDialog.tsx +++ b/apps/web/src/components/settings/AddProviderInstanceDialog.tsx @@ -380,9 +380,9 @@ export function AddProviderInstanceDialog({ {accentColor ? ( {wizardStep < ADD_PROVIDER_WIZARD_STEPS.length - 1 ? ( - + ) : ( - + )} diff --git a/apps/web/src/components/settings/ConnectionsSettings.tsx b/apps/web/src/components/settings/ConnectionsSettings.tsx index b33a81b7b7a46ff61be2ff7c5afd5e99c71e2fe1..b487fbb8bd19cf17cb0ef5841e6215d068d6af0d 100644 --- a/apps/web/src/components/settings/ConnectionsSettings.tsx +++ b/apps/web/src/components/settings/ConnectionsSettings.tsx @@ -785,7 +785,7 @@ const PairingLinkListRow = memo(function PairingLinkListRow({ Done {canCopyToClipboard ? ( - ) : null} @@ -2784,7 +2784,7 @@ export function ConnectionsSettings() { status={{desktopWslError}} control={ } /> @@ -1129,13 +1129,13 @@ export function DiagnosticsSettingsPanel() { - + } /> diff --git a/apps/web/src/components/settings/FontFamilyPicker.tsx b/apps/web/src/components/settings/FontFamilyPicker.tsx index 6cc28567cb2e322ae14ddb81d3da90915630b5fc..3fa5087e9daedd9405005fbda1592153b865a050 100644 --- a/apps/web/src/components/settings/FontFamilyPicker.tsx +++ b/apps/web/src/components/settings/FontFamilyPicker.tsx @@ -11,6 +11,7 @@ import { ComboboxPopup, ComboboxTrigger, } from "../ui/combobox"; +import { selectTriggerVariants } from "../ui/select"; const DEFAULT_FONT_VALUE = "__default__"; @@ -203,14 +204,11 @@ export function FontFamilyPicker({ void listRef.current?.scrollIndexIntoView?.({ index: eventDetails.index, animated: false }); }} > - + {selectedFamily.length === 0 ? defaultFamily : selectedFamily} - +
diff --git a/apps/web/src/components/settings/IntegrationsSettings.tsx b/apps/web/src/components/settings/IntegrationsSettings.tsx index af08091a520ad3fd37ba12d77834cb24dac6f4e3..62a17b9368e65b9e1a32d2939f9479fb174ee71a 100644 --- a/apps/web/src/components/settings/IntegrationsSettings.tsx +++ b/apps/web/src/components/settings/IntegrationsSettings.tsx @@ -354,7 +354,7 @@ function BrowserZoomSetting({ disabled }: { readonly disabled: boolean }) { if (next !== undefined) updateSettings({ browserDefaultZoomFactor: next }); }} > - + {zoomLabel(zoomFactor)} @@ -396,7 +396,11 @@ function BrowserAppearanceSetting({ disabled }: { readonly disabled: boolean }) } }} > - + {APPEARANCE_LABELS[appearance]} @@ -441,7 +445,11 @@ function BrowserRecordingFrameRateSetting({ disabled }: { readonly disabled: boo } }} > - + {frameRate} fps @@ -706,7 +714,7 @@ function BrowserProfilesSetting({ disabled }: { readonly disabled: boolean }) { render={ } /> @@ -168,7 +168,7 @@ function ExpandableHeaderSearch({ placeholder="Search keybindings" aria-label="Search keybindings" className="w-44 [&_[data-slot=input]]:pl-7" - size="compact" + size="sm" />
); @@ -850,7 +850,7 @@ function KeybindingKeyControl({ <> {isDirty ? ( @@ -1514,12 +1514,12 @@ export function KeybindingsSettingsPanel() { render={ } /> @@ -1530,13 +1530,13 @@ export function KeybindingsSettingsPanel() { render={ } /> diff --git a/apps/web/src/components/settings/ProjectSettingsPanel.tsx b/apps/web/src/components/settings/ProjectSettingsPanel.tsx index 5d63f5fd458495f3eac1a5a26a97ef8a83d94132..1f0aba37586c7bf2941b40cf35691bbbc75e952b 100644 --- a/apps/web/src/components/settings/ProjectSettingsPanel.tsx +++ b/apps/web/src/components/settings/ProjectSettingsPanel.tsx @@ -106,6 +106,7 @@ import { } from "../WorkspaceBreadcrumb"; import { WorkspacePageHeader } from "../WorkspacePageHeader"; import { + SETTINGS_PICKER_TRIGGER_CLASSNAME, SettingResetButton, SettingsPageContainer, SettingsRow, @@ -803,6 +804,7 @@ function ProjectDetail({ group }: { group: SidebarProjectSnapshot }) { control={ - diff --git a/apps/web/src/components/settings/ProviderSettingsForm.tsx b/apps/web/src/components/settings/ProviderSettingsForm.tsx index 988ac9160412280f82e64692744b182bc6c4725e..02f40fd6d5c979b28593fbe6ba2e7a30dd9ed15c 100644 --- a/apps/web/src/components/settings/ProviderSettingsForm.tsx +++ b/apps/web/src/components/settings/ProviderSettingsForm.tsx @@ -219,7 +219,7 @@ function ProviderSettingsFieldRow({ )}
{field.control === "switch" ? ( - + @@ -245,6 +245,7 @@ function ProviderSettingsFieldRow({ void refreshProviders()} @@ -892,12 +892,12 @@ export function EnvironmentProviderSettings({ setIsAddInstanceDialogOpen(true)} aria-label="Add provider" > - + } /> diff --git a/apps/web/src/components/settings/SettingsPanels.tsx b/apps/web/src/components/settings/SettingsPanels.tsx index 2fdc985a84d8e6ac74523f0360265d41a989b08e..3c5f6d7037a68ddbef40d795d982395131772e25 100644 --- a/apps/web/src/components/settings/SettingsPanels.tsx +++ b/apps/web/src/components/settings/SettingsPanels.tsx @@ -146,6 +146,7 @@ import { } from "./SettingsPanels.logic"; import { PolicyTooltip, + SETTINGS_PICKER_TRIGGER_CLASSNAME, SettingResetButton, SettingsPageContainer, SettingsRow, @@ -391,7 +392,7 @@ function AboutVersionSection() { - + {HOSTED_APP_CHANNEL_LABEL} @@ -805,7 +807,11 @@ function BackgroundActivityAdvancedDialog({ } }} > - + {BACKGROUND_ACTIVITY_PROFILE_LABELS[activeProfile]} @@ -1194,7 +1200,11 @@ export function AppearanceSettingsPanel() { } }} > - + {ENVIRONMENT_IDENTIFICATION_LABELS[settings.environmentIdentificationMode]} @@ -1701,6 +1711,7 @@ function FontFamilySettingsRow({ /> ) : ( - + {size.value} px @@ -1806,6 +1817,7 @@ function AutoSettleDaysInput({ return ( - + {TIMESTAMP_FORMAT_LABELS[settings.timestampFormat]} @@ -2358,7 +2370,11 @@ export function GeneralSettingsPanel() { } }} > - + {BACKGROUND_ACTIVITY_PROFILE_OPTION_LABELS[backgroundActivityProfileOption]} @@ -2432,7 +2448,7 @@ export function GeneralSettingsPanel() { } }} > - + {settings.defaultThreadEnvMode === "worktree" ? "New worktree" : "Local"} @@ -2500,6 +2516,7 @@ export function GeneralSettingsPanel() { } control={ updateSettings({ addProjectBaseDirectory: next })} @@ -2611,7 +2628,11 @@ export function GeneralSettingsPanel() { } }} > - + {QUIT_CONFIRMATION_MODE_LABELS[settings.confirmQuit]} @@ -2652,7 +2673,7 @@ export function GeneralSettingsPanel() { instanceEntries={textGenerationModelInstanceEntries} modelOptionsByInstance={textGenerationModelOptionsByInstance} triggerVariant="outline" - triggerClassName="min-w-0 max-w-none shrink-0 text-foreground/90 hover:text-foreground" + triggerClassName={SETTINGS_PICKER_TRIGGER_CLASSNAME} onInstanceModelChange={(instanceId, model) => { updateSettings({ textGenerationModelSelection: resolveAppModelSelectionState( @@ -2681,7 +2702,7 @@ export function GeneralSettingsPanel() { allowPromptInjectedEffort={false} planModeEnabled={settings.planModeEnabled} triggerVariant="outline" - triggerClassName="min-w-0 max-w-none shrink-0 text-foreground/90 hover:text-foreground" + triggerClassName={SETTINGS_PICKER_TRIGGER_CLASSNAME} onModelOptionsChange={(nextOptions) => { updateSettings({ textGenerationModelSelection: resolveAppModelSelectionState( @@ -2716,7 +2737,7 @@ export function GeneralSettingsPanel() { {...searchableSetting("diagnostics")} description={diagnosticsDescription} control={ - } @@ -2924,8 +2945,8 @@ export function ArchivedThreadsPanel() { diff --git a/apps/web/src/components/settings/SourceControlSettings.tsx b/apps/web/src/components/settings/SourceControlSettings.tsx index 51f3e7bfa932c274264c95374a04db802d068714..480ff26cc7f79379dcd5f0977031ea46ee913513 100644 --- a/apps/web/src/components/settings/SourceControlSettings.tsx +++ b/apps/web/src/components/settings/SourceControlSettings.tsx @@ -312,7 +312,7 @@ function DiscoveryItemRow({
{hasDetails ? ( @@ -533,13 +527,13 @@ export function SourceControlSettingsPanel() { - + } /> diff --git a/apps/web/src/components/settings/SourceControlWritingSettings.tsx b/apps/web/src/components/settings/SourceControlWritingSettings.tsx index 33da931b9db5aac54291520db4eabd827d9de7bc..47d0324c7f930f013b54713d6400e5cd3a05f4b6 100644 --- a/apps/web/src/components/settings/SourceControlWritingSettings.tsx +++ b/apps/web/src/components/settings/SourceControlWritingSettings.tsx @@ -20,7 +20,12 @@ import { ProviderModelPicker } from "../chat/ProviderModelPicker"; import { Select, SelectItem, SelectPopup, SelectTrigger, SelectValue } from "../ui/select"; import { Switch } from "../ui/switch"; import { Textarea } from "../ui/textarea"; -import { SettingResetButton, SettingsRow, SettingsSection } from "./settingsLayout"; +import { + SETTINGS_PICKER_TRIGGER_CLASSNAME, + SettingResetButton, + SettingsRow, + SettingsSection, +} from "./settingsLayout"; import { searchableSetting } from "./settingsSearch"; const MODE_OPTIONS: Record = @@ -105,7 +110,11 @@ export function SourceControlWritingSettingsSection() { }); }} > - + {MODE_OPTIONS[style.mode].label} @@ -185,7 +194,7 @@ export function SourceControlWritingSettingsSection() { instanceEntries={instanceEntries} modelOptionsByInstance={modelOptionsByInstance} triggerVariant="outline" - triggerClassName="min-w-0 max-w-none shrink-0 text-foreground/90 hover:text-foreground" + triggerClassName={SETTINGS_PICKER_TRIGGER_CLASSNAME} triggerAriaLabel="Source control writer model" onInstanceModelChange={(instanceId, model) => { updateSettings({ diff --git a/apps/web/src/components/settings/ThemeEditorPanel.tsx b/apps/web/src/components/settings/ThemeEditorPanel.tsx index 9ac264cd00d3e6bfdee1676d2357e49b0b5e00b5..4e85bc8806e86476ee797037cf9a897b625c7978 100644 --- a/apps/web/src/components/settings/ThemeEditorPanel.tsx +++ b/apps/web/src/components/settings/ThemeEditorPanel.tsx @@ -928,6 +928,7 @@ export function ThemeEditorPanel({ Theme name { setName(event.currentTarget.value); // Most save failures are name collisions; retyping is the fix, so @@ -949,6 +950,7 @@ export function ThemeEditorPanel({