fix(web): 130+ UI consistency fixes - #6218
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
ApprovabilityVerdict: Approved e156f01 This PR contains 130+ CSS styling consistency fixes: adding cursor-pointer to interactive elements, normalizing opacity values, adding focus-visible accessibility styles, and using CSS variables. The only logic change is a minor animation polish fix in the sidebar. All changes are low-risk UI improvements with no material runtime behavior impact. You can customize Macroscope's approvability policy. Learn more. |
d86f2ed to
e21bd74
Compare
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Dismissing prior approval to re-evaluate e21bd74
e21bd74 to
c4ef3ee
Compare
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Dismissing prior approval to re-evaluate c4ef3ee
c4ef3ee to
00fe156
Compare
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
00fe156 to
6798e63
Compare
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
6798e63 to
602815c
Compare
Dismissing prior approval to re-evaluate 602815c
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
602815c to
66f4e28
Compare
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Dismissing prior approval to re-evaluate 66f4e28
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 66f4e28. Configure here.
66f4e28 to
42dc566
Compare
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Dismissing prior approval to re-evaluate 42dc566
42dc566 to
39544e9
Compare
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Dismissing prior approval to re-evaluate 39544e9
Cursor, focus-ring, disabled-opacity, popup-animation, glass-surface, padding/typography, and descender-clipping consistency fixes across the web app, aligning hand-rolled elements with the shared ui/ primitives. Model: Claude Fable 5 · Harness: Claude Code in T3 Code
…sable The prefers-reduced-motion block preceded the provider-update pill, ultrathink frame, and chroma animation declarations; at equal specificity the later rules won, so those animations kept running. Moved the block to the end of the stylesheet.
Both put the scale/fade transition on a wrapper span via has-data-starting-style/has-data-ending-style, but Base UI sets those attributes on the inner Popup and only waits on that node's own animations before unmounting, so exit popped instantly. Moved the transition onto the Popup itself, matching menu/select/popover/tooltip.
The collapse-all button forced itself to 22px with an !important override, 2px smaller than the adjacent Open-diff button. Removed the override so both render the standard control size; the two tests pinning the old markup now pin its absence.
…le button Takes the upstream profile-page refactor as-is and re-applies the icon-size normalization in its new home; the sm button already sizes bare svgs correctly.
39544e9 to
e156f01
Compare
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Dismissing prior approval to re-evaluate e156f01

Problem
The web app has accumulated small UI drift: raw interactive elements missing the
cursor-pointerthe primitives opt into (Tailwind v4 preflight leaves buttons atcursor: default), controls withoutline-noneand no focus ring, seven different disabled opacities (30/40/45/50/55/60/80) against the primitives'opacity-64, popups that animate in but not out (or not at all), single-line text clipping descenders, and sibling components hand-rolling what a shared primitive already provides.None of these are features — every change aligns an element with what its own siblings or the
ui/primitives already do. When one instance of a defect was found, the identical pattern was grepped for across the tree, so each category below is exhaustive rather than anecdotal. ~130 fixes, 87 files, +249/−283.Fixes
1. Switch thumb flush against the track edge; unchecked state invisible in dark
The thumb had a 1px inset (
p-pxon a track sizedthumb+2px). The track now grows 2px each way withp-0.5, giving an even 2px inset in both states — the checked translate distance is unchanged (--thumb-size − 4pxbefore and after). Separately, the dark unchecked track was--input= white/8% under abg-backgroundthumb — structurally invisible. It now getsdark:data-unchecked:bg-foreground/16plus the hairlineinset-ring-white/6edge treatment dark surfaces use elsewhere. Checked state untouched. Applied toui/switch.tsxand the inline switch inui/menu.tsx.2. Descender clipping (the letter g cut off)
leading-nonecombined withtruncate/line-clampgives a 1em line box withoverflow: hidden, so g/y/p/q tails clip at the box edge. Three real instances: the sidebar thread tooltip title (Sidebar.tsx),InputGroupText, and a copy-pastedleading-8.5on the smallNumberField(a 34px line box inside a 26px input).3. ~60 clickable elements missing
cursor-pointerRaw
<button>s and clickable labels across the sidebar, terminal drawer, pull-requests page, changed-files tree, settings, diff panel, and preview cards rendered the arrow cursor. Also fixed at the source:AutocompleteItemshippedcursor-default, which three consumers (command palette, composer command/stash menus) had each patched around locally; the base is now correct. Conditionally-clickable elements set both branches (isClickable ? "cursor-pointer" : "cursor-default").Each clip shows nightly first, then the fixed build after the window switch:
4. Menus and selects don't animate; popovers animate in but not out
ui/popover.tsxhaddata-starting-stylewith nodata-ending-style, so popovers faded in and popped out.ui/menu.tsxandui/select.tsxpopups carriedorigin-(--transform-origin)but no transition at all. The combobox and autocomplete popups declaredtransition-[scale,opacity]with nothing driving it. All five now share the tooltip's bidirectional scale/fade. Frame-level proof: at 120Hz, nightly's menu open/close changes exactly 1 frame; fixed shows a multi-frame ramp both directions.5. Snoozed shelf expand judders the list; Settled doesn't
The thread list FLIP-animates every moved row (
auto-animate). Settled sits at the list tail, so expanding it moves nothing and looks smooth; Snoozed sits mid-list, so expanding it slides every settled row below while translucent rows cross each other. Shelf toggles now suspend the list animation for that one update (toggleShelfWithoutListAnimationinSidebar.tsx), making both shelves behave identically. Single-row transitions — settle, wake, pin reorder — keep the animation they were designed for.6. Autocomplete popup was the only opaque popup
Every popup surface uses
dropdown-glassexcept the autocomplete popup (composer @-mentions, file pickers), which hand-rolledborder bg-popover shadow-lg/5— and therefore also ignored the Settings → Appearance glass controls.7. Theme color picker cancelled its own glass
The picker painted
bg-popoveron a child filling its glass popover, stackedborder-border/70+shadow-2xlon top of the glass border/elevation (utilities beat the@layer componentsshadow silently), and its dark hex field used a black wash on a dark surface — the only dark overlay in settings that darkens instead of lightens (cf.AddProviderInstanceDialog'sdark:bg-white/*pattern).8. Two select triggers, two chevrons
ui/select.tsxcontains two trigger components. One rendered the picker-standard⇕(matching comboboxes, the diff-panel branch picker, the PR base selector); the other a half-size 50%-opacity˅. Value pickers now consistently use⇕; menus and compact ghost selects keep˅— the pop-up vs pull-down distinction the app already follows.9. Invisible keyboard focus on ~15 controls
outline-none/outline-hiddenwith no replacement ring: diff-file collapse chevrons, changed-files tree rows (three of five also missing the ring offset their two siblings have), markdown<details>triggers, toast copy/expand buttons, combobox/autocomplete trigger and clear buttons, the ⌘K submenu Back button, the scroll-to-end pill, onboarding step cards. All now use the standard ring (focus-visible:ring-2 focus-visible:ring-ring+ offset), or the inset variant where full-bleed rows would clip an offset ring.The tooltip proves focus is on the collapse button in both shots; only one shows it:
10. Project settings "Actions" section invented a third heading scale
text-base font-semiboldwhere every settings row title istext-sm font-medium tracking-[-0.005em], a brighter description than the canonical recipe, andpy-2rows against theITEM_ROW_CLASSNAMEstandard ofpy-3.11. Preview controller badge didn't match the zoom pill
Same overlay layer, same geometry, different everything else:
text-[11px]onbg-background/90+shadow-smvs the zoom pill'stext-xsonbg-popover/95+shadow-md/10. Now identical.12. Timeline disclosure rows misaligned
The turn-plan row lacked the
size-5chevron centering box its sibling work-group rows use (and usedgap-2vs theirgap-1.5), so stacked rows' labels started at different x-offsets; one chevron was alsosize-3vssize-3.5.Unannotated pair
13. Disabled states dimmed to seven different values
opacity-30/40/45/50/55/60/80normalized to the primitives'opacity-64across ~20 sites, including the sharedsidebarMenuButtonVariants(disabled:andaria-disabled:). Two disabled rows (search results in flight, saved-backend cards while applying) had no dimming at all and gained it.14. Fixes without a useful screenshot
electron-drag-regionclassPreviewPanelShellreferenced a class that no stylesheet defines — the preview panel's window-drag strip has been inert since it shipped (the bundle defines only.drag-region). Renamed to the real class.bg-background/60 backdrop-blur-xs(2px); dialogs use.dialog-backdrop(4px + tuned tint). Sheets now use the shared class.dropdown-glasslackedsaturate()saturate(var(--glass-saturation)); content behind menus read grayer than behind dialogs.prefers-reduced-motion.ultrathink-pill,.ultrathink-word,.turn-chip-strip,.diff-render-file) plus a duplicate darkmodel-picker-surfacerule that overrode nothing; the split.dialog-glassdeclaration merged; two near-identical markdown scrollbar styles unified on the--app-scrollbar-widthtoken.--sidebar-*-inset,--floating-content-inset,--command-content-inset, and--fade-sizenow route through the vars (zero visual delta — these tokens exist, per the comment above them, so these surfaces "cannot quietly drift apart").sidebarMenuButtonVariantslg/smhad the radius and inset values transposed relative todefault.transitionwhere only colors change, color hovers with no transition, hover-reveals without a keyboard reveal (focus-visible:opacity-100), one-off hover tokens (hover:bg-accent/50amid/20siblings), a deadtransition-colorswith no hover state,hover:cursor-pointerinstead ofcursor-pointer.15. Added during review
Two fixes landed after the PR opened, in the same spirit:
Autocomplete and combobox popups now animate their exit (Cursor Bugbot finding, confirmed real). Both put the scale/fade transition on a wrapper span reacting to a child's
data-ending-style, but Base UI waits only on the Popup node's own animations before unmounting, so exits popped instantly. The transition now lives on the Popup itself, matching menu, select, popover, and tooltip.The changed-files header buttons were different sizes. The collapse-all button carried a
!size-[22px]override forcing it 2px smaller than the Open-diff button beside it. Removed the override so both render the standard control size; the two tests pinning the old markup now pin its absence.Notes
Validation
vp run --filter @t3tools/web typecheckvp test run --project unit(apps/web) — 2199 tests passedvp lint --report-unused-disable-directivesvp fmt --checkvp run --filter @t3tools/web buildModel: Claude Fable 5 · Harness: Claude Code in T3 Code
Note
Apply 130+ UI consistency fixes across cursor, opacity, spacing, and focus styles
cursor-pointerto dozens of interactive buttons and links across chat, settings, sidebar, pull request, and preview panels that were missing pointer cursor affordance.opacity-64across components.--control-radius,--sidebar-content-inset,--fade-size) in sidebar and scroll area components.focus-visiblering styles to several interactive elements including image anchors, user avatar triggers, and sidebar thread links.AutocompletePopupandComboboxPopupDOM structure by removing intermediatespanwrappers, applying props directly to the primitive popup elements.Macroscope summarized e156f01.
Note
Low Risk
Mostly Tailwind/className and shared primitive styling with test updates; no auth, data, or API logic. Shelf animation suspend and switch geometry are isolated UX tweaks with limited blast radius.
Overview
Broad UI polish pass (~87 files) that aligns interactive surfaces with shared
ui/primitives instead of one-off class strings.Interaction & a11y: Adds
cursor-pointeron raw buttons/links across sidebar, chat, settings, PR/diff/preview flows; fixesAutocompleteItemat the source. Addsfocus-visiblerings (and ring offsets where rows would clip) on controls that only hadoutline-none.Checkbox/Radiogain pointer cursors; disabled states standardize onopacity-64(replacing mixed 30–80 values).Overlays & motion: Menu, select, popover, combobox, and autocomplete popups get matching enter/exit scale+fade (
data-ending-styleon the Popup node); autocomplete/combobox drop extra wrapper spans and adoptdropdown-glass. Sheet backdrop usesdialog-backdrop; preview shellelectron-drag-region→drag-region.Sidebar: Snoozed/settled shelf toggles briefly disable
auto-animateso mid-list expand doesn’t FLIP every row below; shelf headers get hover/focus styling. Row chrome uses--control-radius/--sidebar-row-content-insettokens.Component-specific: Switch track/thumb geometry and dark unchecked track in
menu/switch; default select value triggers use ⇕ chevron; theme color picker stops painting opaquebg-popoverover glass; changed-files header drops!size-[22px]so actions match; misc typography/spacing (descenders, timeline chevron box, pending-approval label, stop buttonsize-9 sm:size-8).Reviewed by Cursor Bugbot for commit e156f01. Bugbot is set up for automated code reviews on this repo. Configure here.