Skip to content

fix(settings): simplify open source license notices - #8970

Merged
juliusmarminge merged 2 commits into
pingdotgg:feat/open-source-licensesfrom
maria-rcks:t3code/improve-open-licenses-ui
Sep 1, 2026
Merged

juliusmarminge merged 2 commits into
pingdotgg:feat/open-source-licensesfrom
maria-rcks:t3code/improve-open-licenses-ui

fix(settings): use shared license search input

be8e961
Select commit
Loading
Failed to load commit list.
MacroscopeApp / Macroscope - UI Consistency succeeded Sep 1, 2026 in 6m 29s

All clear

All clear

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.


🔍 Agent activity — 20 tool calls

💭 I'm checking the repo for how Collapsible, InputGroup, Tooltip, and SettingsSection components are used, since the diff drops the divide-y bordered wrapper in favor of a plain div — SettingsSection might already supply that styling, so I want to confirm.

1. browse_code — apps/web/src/components/settings/OpenSourceLicenses.tsx

2. browse_code — apps/web/src/components/ui/{collapsible,input-group,tooltip,button}.tsx

💭 I need to verify some primitives: whether Button supports the "icon-micro" size and "ghost-muted" variant, whether InputGroupInput accepts a small size prop, whether SettingsSection has a headerAction option, whether CollapsibleTrigger sets a data-panel-open attribute, and whether thirdPartyLicenseEntryKey exists in the shared package.

3. browse_code — apps/web/src/components/ui/button.tsx

4. browse_code — apps/web/src/components/ui/collapsible.tsx

5. browse_code — apps/web/src/components/ui/input-group.tsx

6. browse_code — apps/web/src/components/settings/settingsLayout.tsx

💭 I need to verify that InputGroupInput's size prop and unstyled rendering actually work with Input's underlying implementation—checking whether Input supports size, autoFocus, type, and onKeyDown properly given the styling changes. Then I'm checking CollapsibleTrigger's rotate animation, which relies on Base UI's data-panel-open attribute being set on the trigger when the panel opens—that part looks correct based on how Base UI collapsible components work. A more concerning issue is the CollapsiblePanel rendering children conditionally based on open state. Since the panel is designed to animate its height on close using data-ending-style, immediately removing children when open becomes false would make the content vanish instantly rather than animating out smoothly, undermining the exit transition entirely. I'm also noting that Base UI's Panel defaults to unmounting only after the closing transition completes, meaning the manual conditional rendering is redundant at best and actively breaks the animation at worst—especially problematic in accordion-style usage where switching between rows would make the previously open content disappear abruptly instead of collapsing gracefully. Accessibility attributes like aria-controls and aria-expanded seem properly delegated to Base UI now, and the source link rendered via Button as an anchor looks fine since it's not nested inside another interactive element. I'm checking hit target sizing—the icon-micro size is 20px but Base UI's coarse-pointer minimum touch target styling should still apply, so that's preserved. The removal of divider lines and rounded borders from the old wrapper seems like an intentional aesthetic simplification rather than a regression. I'm also considering minor UX details: the search field closing on blur when empty, escape key handling, and truncated license names versus the previous wrap-based approach, weighing whether these are worth flagging as real issues or just design choices. I want to verify that swapping the native input for the styled Input component still forwards props like type="search", autoFocus, onKeyDown, and onBlur correctly, since Base UI's Input wraps the native element and needs those to pass through properly.

7. browse_code — apps/web/src/components/ui/input.tsx

8. git_tools — InputGroupInput

💭 The patterns seem consistent, so now I want to check other Collapsible usages for the group-data-panel-open variant and conditional children, and verify that thirdPartyLicenseEntryKey actually exists in the shared package since it's outside my include patterns but could break typechecking if missing. I should also confirm Base UI's Collapsible.Trigger sets data-panel-open when the panel is open by grepping the repo.

9. git_tools — data-panel-open

10. git_tools — thirdPartyLicenseEntryKey

💭 I'm looking at CollapsiblePanel gating its children on the open state, which seems like it would break the close animation since content disappears instantly instead of transitioning with the height. Comparing it to SettingsPanels.tsx, which renders children unconditionally, makes me suspect this conditional rendering is a regression—though I want to double check how Base UI's Panel handles the hidden state when closed. That does look like a real regression worth flagging — I'd suggest removing that guard so the exit animation still shows content. Looking at other changes: the accordion now only allows one row open at a time via openEntryKey, which is a behavior shift but reads as an intentional design choice, not a bug. The truncated license label and count text tweaks are cosmetic and fine. I'm also noting the external link button now relies on icon-only presentation with title/aria-label instead of visible text, which is a step down in accessibility compared to the old version that showed the link text directly. I'm also checking whether title is used consistently elsewhere in the codebase for icon buttons, since the header search button uses Tooltip while this row uses title — that inconsistency might be worth flagging depending on repo conventions. The most concrete issue I'm landing on is that the CollapsibleTrigger button has no focus-visible ring styling at all, though I notice the old raw button also lacked one, so this isn't strictly a regression — just a pre-existing gap that carried over. I'm also spot-checking smaller details: search input blur/close behavior with empty vs non-empty queries looks correct, and autoFocus wiring through the InputGroupInput to Base UI's Input component should work fine. Controlled value without onValueChange on Base UI Input is consistent with other existing call sites like PullRequestListFilters and ThemeSearchSection, so that's not a real issue. The removal of the bordered/divided container in favor of plain SettingsRow styling actually matches the rest of the settings UI better, so that's an intentional improvement rather than a regression. That's fine since it matches the addon sizing convention. I'm also flagging a potential tap-target regression: the trigger's min-height shrank from 56px down to 40px (or 36px at sm+), which is below the usual 44px touch target recommendation and worth noting given the rules about preserving coarse-pointer hit targets. That's just the primitive's built-in row-tap behavior though, so not really a bug worth flagging. Now I need to decide which findings are strong enough to report — the conditional children in CollapsiblePanel stands out. I want to verify whether keepMounted defaults to false, meaning closed panels already skip rendering children regardless, which would make the open ? ... : null gating redundant rather than harmful — let me check other CollapsiblePanel usages in the repo for this same pattern to see if it's an established convention here.

11. git_tools — CollapsiblePanel|CollapsibleContent

12. git_tools — "@base-ui/react"

💭 The collapsible panel pattern matches existing conventions in the repo, so that's not a real finding. I'm now checking for subtler issues around row layout truncation and hover state styling on the license/bundle label. Search behavior seems mostly fine — blur only closes it when empty, and query persists across retries, though search hides briefly during loading transitions, which is a minor rough edge. I'm also noticing the expanded panel lost its heading context, and the external-link button uses a plain title attribute rather than the Tooltip component used elsewhere in the repo for icon-only buttons, which is an inconsistency worth flagging. I'm also second-guessing whether truncate actually works correctly on that name span given the flex layout — since it sets overflow:hidden, the flex item's automatic minimum width should resolve to zero, allowing it to shrink properly within its flex parent. Then I turn to the icon color inheritance: since neither the ExternalLinkIcon nor SearchIcon set an explicit text- class, they correctly pick up --control-icon-color from the button variant, so that part looks fine. The bigger concern is that the page's <h1> and description paragraph were removed, leaving only an SettingsSection h2 — if the route doesn't supply its own page title elsewhere, this could be a real heading-structure regression worth flagging.

13. git_tools — OpenSourceLicensesPanel

14. git_tools — title="[A-Z]

💭 I'm checking whether the native title attribute is used elsewhere on buttons in the repo, since most other instances I found are actually component props rather than native HTML attributes. It seems the established convention for icon-only actions is to use the Tooltip component instead, as seen elsewhere in this same file. Using a native title yields a delayed, unstyled browser tooltip that's inconsistent with the app's Tooltip primitive and doesn't appear on keyboard focus — a legitimate but minor consistency finding, since the check guidance says only clear consistency or regression risks warrant failing. I also want to verify how other settings pages render page-level headers to see whether dropping the h1 here would be a regression, so I'm checking the settings route layout for a topbar or route title pattern.

15. browse_code — In apps/web, how do settings pages get their page-level title/heading? Does the settings route layout (e.g. settings route file, topbar, or SettingsPageContainer) render an h1 or a topbar title for routes like /settings/open-source-licenses? Do other settings panels (e.g. SettingsPanels About, KeybindingsSettings) render their own h1 page header inside SettingsPageContainer, or only SettingsSection headings? Give specific file/line evidence.

16. git_tools — render={<a href

💭 I'm comparing this to ThemeSearchSection's similar icon button pattern, which also lacks a Tooltip but has no native title either—so adding a native title here is a minor inconsistency, though arguably a small improvement rather than a real problem. Now I'm checking the container width change from "wide" to "readable" for the license notice text, which looks like an intentional layout choice. I'm also tracing the search toggle behavior—autofocus on open, blur closing when the query is empty—looking for an edge case where an open search with a non-empty query might behave unexpectedly on blur or outside click. Then I turn to the icon-only external link button replacing the previous text link, and its expanded coarse-pointer tap target: since that overlay is centered on a 20px icon sitting close to the row's edge, its 44px hit area could bleed outward and overlap the row's own click trigger, potentially stealing taps meant to expand the row rather than open the link. Working out the math, the overlay would bleed about 14px into the next 40px-tall row, meaning a touch tap near the top-right of the next row could accidentally trigger the previous row's source link. It's a real edge case, but it stems from pre-existing coarse-pointer expansion behavior in the design system, so it feels speculative rather than a clear bug worth flagging. I should check whether there are existing tests for OpenSourceLicenses to see if this behavior is already covered.

17. browse_code — apps/web/src/**/icense

18. github_api_read_only — repos/{owner}/{repo}/pulls/{pull_number}

💭 I've tested this at desktop widths of 1280x800 and 1920x1080, but I'm now worried about mobile responsiveness — the new truncation approach with fixed narrow max-widths could cause names to cut off harshly, and some text sizes are now fixed small values instead of following the repo's usual touch-friendly responsive pattern. Actually the fixed sizes seem consistent with the rest of SettingsRow's design, and the row wrapper still keeps the responsive text sizing so names should render fine on mobile. My bigger concern is the touch target height: dropping from min-h-14 (56px) down to min-h-10/9 (40/36px) on the CollapsibleTrigger falls below the 44px coarse-pointer standard the design system otherwise enforces, and since this trigger has no built-in hit-target expansion, that's a real accessibility regression worth flagging. But comparing against other collapsible rows in the settings panels, they also use similarly small min-h-8 triggers, so this height reduction may actually be consistent with existing patterns rather than a new problem. I'm also checking the truncation behavior on the license metadata span alongside the icon and name — the flex layout with shrink-0 and max-width percentage should truncate gracefully when content overflows. Then I notice the "3 of 120" license count filtered display seems to have dropped the word "notices" from its label. Now I'm looking at the search field's placement inside the settings section header and the Escape key handling that intercepts native browser input-clearing behavior — since this settings page is a route rather than a dialog, that seems fine, though I'm double-checking whether settings ever renders inside a sheet/dialog on mobile that could conflict with this Escape interception. That edge case seems fine on reflection. There's a tension between the instruction to output plain text "All clear" versus the JSON schema requirement—I think the intent is that a clean check still returns JSON, just with a success state and a minimal summary rather than actual literal text output. Rechecking for a real issue: possible minor gaps like a missing version label, an unhidden decorative icon, redundant aria-label/title pairing, or inconsistent use of Tooltip versus native title across similar buttons—these all feel weak. I want to look more carefully at whether the row loses expected hover or interaction states. The collapsible panel's fixed height with overflow-hidden should work fine with wrapped long lines. I also note the settings container's default width changed from "wide" to "readable" with gap-12 replacing the old gap-6 override, which seems fine, and I'm now checking whether the small search input size inside InputGroup matches its expected data-size styling. Since the addon comes before the input in the DOM here, the CSS selector expecting the addon after the input for inline-start alignment won't match, so the padding adjustment meant for small inputs won't apply correctly in this arrangement. Actually, there's a more substantive issue here: the row previously wrapped content on narrow screens, but now the name is truncated and metadata takes up 42% width, meaning long package names get cut off with no tooltip to reveal the full text. Since the author only tested at desktop resolutions like 1280x800 and 1920x1080, this narrow-screen truncation without any affordance could count as a real responsive regression worth flagging. This does fall within the visual/layout preservation scope since information becomes unreachable. I should verify how other dense list rows in the repo handle truncated names—checking things like ThemeSearchSection or PullRequest list rows for a title/tooltip convention, which would strengthen the consistency argument.

19. git_tools — truncate

20. git_tools — truncate.*\n.*title=|title={[a-zA-Z.]+}

💭 The truncation behavior matches other components in the repo, so that's not a real issue. The controlled input pattern with value/onChange also matches existing call sites like PullRequestListFilters, so I'm confident this change is clean and consistent with conventions. I'm double-checking the type props and event handler merging around the Button and TooltipTrigger render, but these all follow existing patterns elsewhere in the codebase (like SettingResetButton), so nothing stands out as problematic. The accordion open-state edge case when search filters out the open row also seems harmless since that row simply won't render. I've concluded there are no real findings here — this is clean, and I'll report success with an "All clear" summary.


Agent Credits: 202 credits

Token usage: 44 uncached input · 830,916 cache-read input · 147,884 cache-write input · 23,181 output
Agent Credits may also include non-token charges from external tools such as web research.