Repository navigation
UI Consistency: 1 issue found
apps/web/src/components/settings/KeybindingsSettings.tsx — WhenClauseControl now renders its Popover trigger through Button (good), but Button's base classes include shrink-0, which breaks the retained max-w-full + inner truncate contract: as a flex item next to the When label the trigger can no longer shrink, so a long when-expression overflows the description column instead of truncating. Suggested fix: add min-w-0 shrink to the call-site class string. Same lines: the !expression && "text-muted-foreground" override drops the hover:text-foreground the previous hand-rolled trigger had; variant={expression ? "ghost" : "ghost-muted"} reproduces both states without overriding the primitive's base color.
Previously reported findings all verified as addressed in this head commit (compact Input sizing, plain-text heading for the add row, shortcut exposed in the pill's accessible name, reserved action slot, single When treatment, labeled browser-notice tooltip trigger, and Save no longer displacing the shortcut control).
Details
Note
Your check run agent prompt is: .macroscope/check-run-agents/ui-consistency.md
More information about how Check Run Agents work can be found in our Help Center.
Reviewed apps/web/src/components/settings/KeybindingsSettings.tsx at 81b9319 against the merge base, plus the incremental commits 5a07878 → 81b9319, and the primitives it now composes: components/ui/button.tsx, components/ui/badge.tsx, components/ui/popover.tsx, and components/settings/settingsLayout.tsx.
Checks performed:
- Confirmed
Buttoncompact/ghostgeometry, focus ring, cursor, and coarse-pointer hit target are now inherited by the When trigger rather than hand-rolled; verifiedtext-[12px] sm:text-[12px]correctly wins overtext-base sm:text-sm/text-xsthroughcn(consumer class merged last). - Traced flex layout of the
Whenrow (SettingsRowdescription<p>→span.flex→ trigger) to confirm theshrink-0interaction withmax-w-fullandtruncate. - Verified Save button reordering keeps the shortcut pill/input right edge stable inside
SettingsRow's right-aligned control cluster (sm:grid-cols-[minmax(0,1fr)_minmax(10rem,auto)]+sm:justify-end), and that DOM order still matches visual order for keyboard flow. - Verified
KeybindingRowMenureserves asize-7slot forDefaultrows,Badge size="sm"exists, and the browser notice tooltip trigger now carries an accessible name matching the other warning triggers in the file. - Icon color indirection:
ChevronDownIconcarries an explicitsize-3.5and picks up--control-icon-colorfrom the ghost variant; tone remains muted, no regression.
🔍 Agent activity — 11 tool calls
💭 I want to see what's changed at the current head (81b9319) compared to the last reviewed commit (6ee6c83), since prior runs already flagged several issues.
1. git_tools — afc8342..81b9319
2. git_tools — 6ee6c83..81b9319
3. git_tools — 6ee6c83..81b9319
💭 I'm working through whether moving Save before the pill/input actually fixes the leftward jump issue, since the cluster is right-aligned and I need to trace how the element order affects positioning relative to the menu and warning indicator. Now I want to check the WhenClauseControl's use of Button with a render prop, and verify the ghost/compact variant classes don't conflict with the overrides, so I should look at the Button primitive and current file region.
4. browse_code — apps/web/src/components/ui/button.tsx
5. browse_code — apps/web/src/components/settings/KeybindingsSettings.tsx
💭 I'm checking the pill button at line 828 — it's a raw button reconstructing Button-ghost styling, but since it existed with identical classes in the original code before being moved, it may not count as a new issue introduced by this change. For the new WhenClauseControl, I'm noting that
size="compact"setsh-7by default, so the call-site'sh-6override doesn't match any existing size variant — meaning this is a call-site override of the primitive's core height rather than reuse of an existing pattern, which is worth flagging per the height/radius override guidance. I'm also checking whether therenderprop on Button, when used inside PopoverTrigger, correctly preserves the button'stype="button"behavior, since passing Button as a render prop could strip that default. I want to verify PopoverTrigger properly merges className and aria-label onto the rendered Button by checking other usages elsewhere in the repo. Repositioning Save to appear first in the cluster shouldn't shift the pill/input or menu since they're right-aligned relative to Save, so that layout concern seems resolved. I still need to check that the grid column widths keep the right-aligned items fixed against the container edge even as the control column grows to fit Save, and confirm SettingsRow's title/description structure accepts nodes and handles the button inside its description paragraph correctly.
6. browse_code — apps/web/src/components/settings/settingsLayout.tsx
💭 I notice the ScrollArea and horizontal-scroll grid have been removed in favor of SettingsRow stacking vertically on small screens, which seems intentional. I'm checking the mobile control cluster layout for the keybinding row and considering what other findings might still need review. The KeybindingSettingsRow's hover background on a non-interactive row is trivial, and the divide-border opacity change is minor too. The BrowserKeybindingNotice now has a proper aria-label matching the pattern used by the other warning triggers, and the header row's Status column removal looks fine. I want to look at the file's panel section around lines 1180-1520 to confirm nothing else needs overflow handling after the ScrollArea removal.
7. browse_code — apps/web/src/components/settings/KeybindingsSettings.tsx
💭 I'm focusing on the new commit's changes, particularly examining the WhenClauseControl Button usage for focus-ring styling inconsistencies compared to other controls in the file. The ghost variant routes icon color through a CSS variable that resolves to a muted-foreground tone, applying opacity-60 to the ChevronDownIcon — a minor color shift from the old hand-rolled trigger, but likely negligible. I'm also checking that the size-3.5 sizing on the chevron overrides the primitive's default sizing rule, and noting that the base Button applies negative margins to its SVG children, which combined with padding and gap could shift the chevron's spacing slightly. I'm now tracing a potential class-conflict issue: the base button sets responsive text sizes that get overridden by more specific pixel values and the compact size's own text-xs, and since cva appends the passed className last, tailwind-merge should correctly let the most specific override win. More concerning is that the button has shrink-0 baked into its base classes, which conflicts with truncate behavior — inside the flex row wrapping the trigger, shrink-0 will prevent the button from shrinking to fit, so long content could overflow past the parent's max-width rather than truncating as intended. The
<p>lacks overflow-hidden, so instead of the old shrink-and-truncate behavior, the trigger button will now stay at its natural width and could visually spill past the column into the control cluster since the grid column is minmax(0,1fr) — a real regression from before. The fix would be to addmin-w-0 shrinkto the className so it can shrink and lettruncateactually take effect on the inner span. I'm weighing whether this is worth flagging as a concrete behavior change from the diff, since Button'sshrink-0overrides the intended shrink-to-truncate pattern. Right, before the shrink-0 addition, truncate worked because the inner span's min-width resolved to 0 due to overflow:hidden, letting the flex item shrink properly. This confirms it's a genuine regression — the fix is addingmin-w-0 shrinkto the className overrides, and I should verify tailwind-merge treatsshrinkandshrink-0as the same conflict group, which it does. I'm also noticing a secondary issue: moving Save before the pill changes tab order, so after typing a shortcut, forward Tab no longer reaches Save like it used to — a minor keyboard-flow trade-off worth flagging but not a blocker. Actually, since DOM order matches visual order here, there's no accessibility mismatch, so this isn't a real finding. Let me verify prior review comments were addressed: the Input className issue is now fixed with size="compact", the heading/combobox concern resolved with title="New keybinding", the sr-only shortcut label fixed via aria-label, and the menu slot issue addressed too. That leaves just the one new finding to flag. Checking the pill button and WhenClauseControl area confirms those are pre-existing or already resolved, and I should verify the Badge primitive actually supports the size prop being used.
8. git_tools — size:
9. git_tools — shrink-0|max-w-full
💭 I should double check that PopoverTrigger doesn't apply its own conflicting className, and that the render merging properly preserves Button's classes.
10. browse_code — apps/web/src/components/ui/popover.tsx
💭 I'm confirming that PopoverContent maps to PopoverPopup with align/sideOffset support unchanged, then working through how PopoverTrigger's render prop merges className from the passed element with Base UI's internal className. I'm also verifying that Base UI's Trigger overrides render-element children with the trigger's own children, and that both Button and Trigger consistently set type="button" without conflict. Checking that the coarse-pointer hit-target styling (min 11px after-element) is preserved alongside the h-6 height override, and turning to whether truncation could break for a long "when" expression given the max-w-xl width constraint on the description text. Weighing whether the shrink-0 addition, combined with the retained truncate/max-w-full pair, could cause the label region to overflow by roughly 40px on narrow/mobile layouts where the row stacks rather than sits in a grid with absorbing gap space—this seems like a small but real and concrete consequence worth flagging, with an easy fix of adding a min-width constraint. I'm also scanning for anything else notable in the commit, like the WhenClauseControl button nested in a paragraph (fine) or the font-normal override canceling the Button's font-medium (purely cosmetic, not worth reporting). I notice the ghost button hand-rolls muted-text styling for the "Always" state instead of using the existing
ghost-mutedvariant that already pairs muted text with hover-to-foreground behavior — a minor consistency nit, though I'm unsure it rises to a real finding. I'll draft a single inline comment covering both issues on the className lines: the missingmin-w-0 shrinkcausing overflow past the truncation boundary, and theghost-mutedvariant as a cleaner fix that preserves the original muted/hover-foreground behavior without the manual class override. I'll pin it to the relevant line range in the diff and offer it as a suggested code change. I'm second-guessing the exact class ordering for shrink and min-w-0, since I don't want to trigger a Tailwind class-sort lint. To sidestep that risk, I'll present the change as a diff rather than an inline suggestion. Writing the replacement Button block... Now I'm weighing whether this overflow issue is significant enough to fail the check, since it's a genuine regression risk affecting layout, and I want to double check against the prior commit's className to confirm this is actually a change in behavior rather than pre-existing. I'll finalize on marking this a failure with one finding, since a layout regression isn't an aesthetic preference the guidelines say to overlook.
11. modify_pr — One finding on the new WhenClauseControl trigger migration to Button.
Agent Credits: 94 credits