Repository navigation
UI Consistency: 1 issue found
apps/web/src/components/pullRequest/PullRequestListFilters.tsx — the filters MenuPopup changed from min-w-56 to a fixed w-56, but the new submenu trigger value spans (PullRequestFilterRadioSubmenu L238, PullRequestAuthorFilter L279) use max-w-32 truncate without min-w-0. A flex item with white-space: nowrap floors at min(min-content, max-w-32) = 128px, so long project titles / logins overflow the fixed 224px popup; since MenuPopup's scroll container is overflow-y-auto with overflow-x unset (computing to auto), the row gains a horizontal scrollbar and pushes the chevron out of view instead of ellipsing. Suggested fix: add min-w-0 to the value spans (or restore min-w-56 on the popup).
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.
Verified as fixed since prior runs, so not re-reported:
Icon/iconslot duplication and the inline-componentIconfor project rows are gone;PullRequestFilterOptionIconowns one glyph slot andProjectFaviconkeeps its ownshrink-0.- Filters trigger dropped
aria-labelnow that it renders visible text plus the count, and renders throughButton variant="outline"; the sort trigger renders throughButton size="icon" variant="outline", matching the adjacent refresh control (no hand-rebuilt outline styling, focus ring or coarse hit target loss). MenuSubTriggerrows no longer fight the primitive'sms-autochevron (label carriesflex-1).- Label rows use
grid-cols-[1rem_minmax(0,1fr)], soMenuCheckboxItemtruncation works; project rows keepdisabled, the tooltip and an explicit "Unavailable" marker. - Author search field sizes the control (
InputGroupInput size="compact") rather than theInputGroupshell;ArrowDown/Escapereach the menu. PullRequestRowLabelsis guarded at thePullRequestMetaLinecall site and its chip is 16px tall (leading-3.5,py-0), matching the meta line and the row's[contain-intrinsic-block-size:54px].pullRequestLabelColornow has a single owner inpullRequestList.logic.ts, consumed by the row, filter menu and summary tab.displayGroupshides the header for the synthetic sorted group (group.label ?guard), so no empty heading renders.
🔍 Agent activity — 17 tool calls
💭 I'm reviewing the current PR diff to check if previously flagged issues were fixed, focusing on the author filter's search input keyboard handling where arrow key and escape propagation still seems incomplete. Looking further, the checkbox item's grid layout and the label filter's clear button removal both address earlier truncation and closeOnClick findings. Now I'm checking the project filter's radio group to see how disabled/unavailable options are being rendered compared to before. I want to verify whether the Tooltip import is now unused since the block that relied on it for unavailable projects was deleted, so I need to check the file directly. The pull request filter trigger dropped its aria-label and icon-only sizing, now showing a full label with count, which seems fine, and the compact filter menu's outlined mode now conditionally sizes the button based on icon-only mode, matching a prior suggestion. I'm also wondering whether icon color styling on the sort trigger's outline variant might mute the icon despite the explicit size class, and whether the route's group display logic still behaves correctly when sorting by something other than "updated." I should just open the actual files to confirm these details rather than speculate further.
1. browse_code — apps/web/src/components/pullRequest/PullRequestListFilters.tsx
2. browse_code — apps/web/src/components/ui/menu.tsx
💭 I'm looking at how the submenu trigger lays out its children—since the label span has flex-1, it takes up all the free space, pushing the value span right up against the chevron icon with no room left for the ms-auto spacing to have any effect. The unavailable indicator now uses simple text ("· Unavailable") instead of the previous amber pill, but tooltip and disabled behavior are still intact, which addresses the earlier feedback. I'm also checking that the MenuRadioItem's wrapper span has min-w-0 and flex-1 so truncation works correctly inside, and I need to look at how the author filter handles avatars next. Home/End still being blocked is a minor residual issue, but I'll consider this resolved enough and move on. Now let me check the route file for CompactFilterMenu's iconOnly and outlined props, the control row layout, and how the empty group label renders in displayGroups by looking at the relevant sections of _chat.pull-requests.tsx.
3. browse_code — apps/web/src/routes/_chat.pull-requests.tsx
4. browse_code — apps/web/src/components/ui/input-group.tsx
💭 I should verify whether the Input component's size prop actually includes a "compact" option.
5. browse_code — apps/web/src/components/ui/input.tsx
6. browse_code — apps/web/src/routes/_chat.pull-requests.tsx
💭 Now I want to check the current CompactFilterMenu implementation, its other non-outlined usages, and the Button primitive.
7. browse_code — apps/web/src/routes/_chat.pull-requests.tsx
8. browse_code — apps/web/src/components/ui/button.tsx
💭 I'm examining the sort trigger's accessible name for the icon-only button, checking whether it needs a tooltip like other icon-only controls (e.g., refresh) in the same header for consistency, though it's a fairly weak finding on its own. Then I'm checking the filters menu trigger icon coloring against Button's control-icon-color variables and confirming the icon sizing is consistent between the sort and filter buttons. I'm also weighing whether the inline count badge should instead reuse the app's Badge primitive, but leaning toward not flagging it since inline count pills are common. Now I'm looking at the author submenu popup's styling. I trace the author list rendering (only slicing the first 10, so no scroll concerns), then check the avatar sizing inside the radio item and how MenuRadioItem's icon margin utilities apply. I confirm the radio item content wraps in a flex-min-width span so truncation works properly, then look at the checkbox item's grid-column override to see if it correctly resolves against the default variant's grid template via twMerge. I check the filter count logic, then the sorted display group's single-group case where the label is empty so its header stays hidden, and confirm the "others" key won't collide since there's only one group. Finally I revisit the label row chip styling, comparing its current padding and line-height against an earlier flagged sizing issue to see if the chip height comes out consistent now. I also notice the new row uses physical
pl-1 pr-1.5padding while other components in the codebase (menu, input-group) consistently use logicalps-/pe-properties for RTL support, which could be a minor consistency finding worth checking against broader usage in the web app. Separately, I compare the label chip styling between the row and summary tab views to see if there's duplicated treatment that could've been extracted into a shared component, similar to a previous flag about repeated color logic. Checking the trigger styling in PullRequestFilterRadioSubmenu looks fine, and the ProjectFavicon inline-component concern from an earlier run was already resolved. Now I'm looking at whether PullRequestFilterOptionIcon's sizing on ProjectFavicon introduces any real issue. The bigger concern is thatshrink-0was dropped from the favicon's className, so if it renders as an img rather than svg, it could shrink under flex pressure when the project title truncates — svg elements are protected by a shrink-0 rule elsewhere, but images wouldn't be. I need to check how ProjectFavicon actually renders to confirm whether this is a real bug.
9. browse_code — apps/web/src/components/ProjectFavicon.tsx
10. git_tools — PullRequestActorAvatar
💭 ProjectFavicon's own shrink-0 class stays intact since cn appends the caller's className last and size-3.5 doesn't conflict with it, so no issue there. Now I'm checking the PullRequestActorAvatar implementation around lines 307-340.
11. browse_code — apps/web/src/components/pullRequest/pullRequestPresentation.tsx
12. browse_code — apps/web/src/components/pullRequest/PullRequestRow.tsx
💭 I'm checking the label chip sizing within PullRequestMetaLine, confirming that the truncating child inside max-w-40 lets it shrink properly alongside sibling elements, then looking at the styling used for the matchedElsewhere chip. I want to verify how PullRequestMetaLine separates its children visually and whether the chip's border plus leading height matches the expected 16px line, then move on to checking whether icon-only controls like the sort button follow the app's convention of wrapping them in a tooltip, similar to the refresh button in PullRequestsColumn. I'm reconsidering the icon-only sort trigger's lack of a visible current-sort indicator, but since I'd previously pushed the author toward icon-only to save width, flagging that again would contradict my earlier feedback, so I'll drop it. I'm now checking whether the filters popup's fixed width of 224px leaves enough room for submenu labels and truncated values without overflow, estimating that "Involvement" plus its value text may be tight against the available space. In a fixed-width popup with overflow-y-auto but no explicit overflow-x, the x-axis actually computes to auto too since CSS forces a non-visible pairing when one axis isn't visible — so overflow would just produce a horizontal scrollbar rather than clipping, which mirrors the same underlying issue as that earlier label truncate fix. Now I'm estimating actual pixel widths for the State submenu trigger — icon, gaps, padding, and chevron eat about 70px, leaving roughly 146px for label+value text — and checking whether real content like "Involvement" combined with a longer value could realistically exceed that budget. Checking involvement values like "Review requests" against the "Involvement" label width, both flex-1 label and truncated value seem prone to not shrinking below their min-content, which suggests actual overflow rather than clean truncation. The Project submenu's value with
max-w-32 truncatehas similar min-content issues since truncate forces nowrap, so long project titles would only get capped at 128px but still risk overflow before hitting that cap. Actually, I recall the CSS spec clarifies that when max-width is definite, it clamps the content-based minimum size for a flex item—so truncate combined with max-w-32 should properly cap the minimum size at 128px, preventing the overflow I was worried about. So this really would cause horizontal scrolling rather than the popup growing. The smallest fix is either reverting tomin-w-56or addingmin-w-0to the value span so it can truncate properly within the fixed width — either approach resolves it while keeping the layout intact. This does look like a genuine layout regression from the width change. I'm thinking the fix is to give the value spanmin-w-0so it truncates properly within the fixed-width popup, while the label keepsflex-1— though I need to work through how the flex-basis and shrink values actually interact when both elements compete for space. Now I'm confirming the flex math actually works out — value shrinks to fit while label stays fixed, so addingmin-w-0fixes it. I want to check if this exact pattern shows up elsewhere in the codebase, since a prior fix for the sametruncate+min-w-0issue apparently addressed the grid case but left these three submenu value spans in PullRequestListFilters untouched. I also notice the popup width changed frommin-w-56to a fixedw-56in this PR, which could prevent truncate from ever engaging, and the author trigger's value span has the identicalmax-w-32 truncateissue for long logins. I'm leaning toward posting a single precise comment on the submenu value span with a suggested fix, while referencing the sibling instance at the author trigger rather than duplicating the comment. The explicitsize-4on the new sort icon overrides Button's responsive sizing, meaning it'll render at 16px on mobile instead of the usual 18px other icons get — but this matches the pre-existing Filters icon which also hardcodessize-4, so it's consistent with that precedent even if slightly inconsistent overall. Minor detail, not worth flagging. Now I'm weighing the count badge — checking whether badge.tsx has a size/variant that matches the custom span's geometry, though a count pill inside a button may not be what Badge primitives are meant for, so this feels like a weak candidate worth verifying before deciding whether to flag it. Continuing down the list, most of these look cosmetic or non-UI: the filter trigger's accessible name issue is resolved, the author/label onChange handlers just pass data objects, and the label filter count badge is purely cosmetic. I'm now looking closer at the author submenu, where an empty-state "No authors found" MenuItem sits inside the MenuRadioGroup alongside an always-visible "Anyone" option, and considering whether using a disabled MenuItem as an empty-state text row is an acceptable pattern. I check the author search input's InputGroup and confirm the compact input height is already fixed properly, and the padding stacking in the MenuSubPopup wrapper adds up correctly. Now I'm looking at keyboard behavior — specifically whether autoFocus on the submenu input conflicts with the base UI submenu's own autofocus on the first item. Revisiting the earlier keyboard flag, I notice the stopPropagation logic still blocks ArrowUp, Home, and End (though ArrowDown still works), which is a minor residual issue since it was already partially addressed — I'll skip re-flagging it to avoid noise. Moving on to check whether there's any way to clear the author filter. Continuing to scan checkbox and menu items, the sort menu placement, and the outline button variant in the compact filter menu — these all look fine on inspection. Checking whether sorting silently drops section labels like "Needs your review" — seems like acceptable, documented behavior — and whether the sort menu header renders correctly in narrow and empty states.
13. git_tools — filtersMenu|sortMenu|searchInput
14. browse_code — apps/web/src/routes/_chat.pull-requests.tsx
💭 I'm checking whether the search input can shrink safely with flex-1 and min-w-0 at the narrowest panel width, since it might become too small to use even though it avoids overflow. My real candidate finding is the fixed w-56 filters popup combined with submenu value spans lacking min-w-0, which likely causes a horizontal scrollbar instead of proper truncation. I want to verify this by carefully calculating the actual pixel widths available inside the popup and submenu rows, accounting for padding and icon sizes, to make sure the overflow claim holds up. Working through it, the label plus value budget in the row comes out to roughly 146px. For a project row, the label alone takes about 48px, and long project titles clamped at max-w-32 (128px) would need about 176px total, which is a 30px overflow that would trigger horizontal scrolling. Similarly, author login values could hit the same issue for longer names, so I want to check the involvement tab labels too before finalizing this as the bug. This confirms the finding is real: previously with
min-w-56the popup could just expand, so this is a regression from the PR's changed line. The simplest fix is addingmin-w-0to the value spans since they already truncate — I'll leave an inline suggestion comment at line 238 covering this pattern, and note that the author trigger at line 279 has the identical issue rather than duplicating the comment. So the value truncates while the label stays fixed-width, which is acceptable and better than overflow. I could also suggest widening the popup with min-w-56 as an alternative to keep even columns, though the fixed width is likely intentional there. Checking the unavailable-option rendering in PullRequestFilterRadioGroup now, using a plain "· Unavailable" text separator on disabled rows, which seems fine accessibility-wise. Tooltips nested inside submenu radio groups retain their disabled hover behavior via data-disabled:pointer-events-auto, consistent with existing patterns elsewhere. I'm noting a minor gap where an unavailable selected project in the submenu trigger gives no visual indication, and also flagging inconsistent popup widths across filters (w-80 for author, w-72 for labels, w-56 for the parent) — not a violation, just worth mentioning. Now looking at whether the label filter's trigger value span is missing a shrink class similar to the other spans. I'm checking whether there's an established empty-state pattern for menus by grepping for disabled MenuItem usages with "No " text, and also verifying how facets behave when the filter menu is closed and facetTargets falls back to an empty list. I trace through the filters menu trigger and count badge styling, confirming the render props and merged classes work correctly, then move on to check the Badge primitive next. Checking the withDiffStat move into the displayGroups memo—it's now properly memoized on groups, sort, and statsByRow, which is actually better than the previous inline call that recreated objects every render. The import path for toSortableTimestamp stays consistent with the relative-import style already used elsewhere in the file. Now I'm looking at whether the "others" group key could overlap with a "Needs review" grouping when sorting. I want to double check the padding on the row label chip—pl-1 pr-1.5 looks asymmetric, so I should grep the codebase to see if that pattern is used consistently elsewhere in these components.
15. git_tools — (pl-|pr-)[0-9]
16. git_tools — INVOLVEMENT_TABS =
💭 Project titles and author logins are the real overflow risk since they can exceed the max-width floor regardless of whether flexbox clamping actually applies—overflow happens either way. I'm now checking whether the popup component actually receives the fixed width class, tracing how the className gets merged with the base styles. Confirming the popup has a fixed 224px width, so its content area (minus padding) is definitely narrower than long titles or logins, causing overflow. Since overflow-x isn't explicitly set while overflow-y is auto, the CSS spec kicks in and computes overflow-x to auto too, meaning a horizontal scrollbar will appear when content overflows — which validates the concern. I'm satisfied this is a real issue worth flagging as a single comment, and I'll also note the author value span as part of the same note. Working out the math to be sure: without min-width:0, flexbox's automatic minimum sizing means fixed-width labels plus content clamped by max-width can exceed the available space by around 14px, which explains the overflow even for moderately long values. I'm confident this is a real bug at line 238, part of the diff's added function, so I'll draft the review comment explaining that the fixed w-56 popup combined with truncate but no min-w-0 lets a flex item's automatic minimum size force overflow instead of ellipsizing. Checking line length against prettier's printWidth, my one-line suggestion runs too long, so I'm reformatting it across multiple lines to stay compliant. Since there's a genuine consistency risk here, I'll mark the review state as failure and post it.
17. modify_pr — One finding: the filters popup is now a fixed w-56, but the new submenu value spans can't ellipsize inside it, so long values give the menu a horizontal scrollbar instead of an ellipsis.
Agent Credits: 160 credits
Token usage: 20 uncached input · 707,455 cache-read input · 106,454 cache-write input · 19,846 output
Agent Credits may also include non-token charges from external tools such as web research.