Repository navigation
UI Consistency: 3 issues found
Three consistency findings, all in apps/web/src/components/settings/OpenSourceLicenses.tsx:
- Locally rebuilt disclosure (lines 40-65) — the license row hand-rolls a raw
<button>toggle with manualaria-expanded/aria-controls,cursor-pointer, and a conditionally mounted panel, losingCollapsiblePanel's height transition and thedata-panel-opentrigger contract used by every other disclosure in the app. - Search input bypasses
InputGroup(lines 159-173) — an absolutely positionedSearchIconplus[&_[data-slot=input]]:pl-8overridesInput's internal padding from the call site and re-creates addon geometry thatInputGroup/InputGroupAddon/InputGroupInputalready own (as used byThemeSearchSection.tsxin the same folder). - Foreground-alpha borders and surfaces (lines 44, 69, 101, 181, 199) —
border-foreground/10,divide-foreground/10,bg-foreground/2, andhover:bg-foreground/4bypass the semanticborder/mutedroles that the rest of Settings uses, so themes defining their own--border/--muteddo not reach this page.
Other in-scope changes (settings row, breadcrumb label, search catalog entry, sidebar active-state, generated route tree) match existing patterns.
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.
Files reviewed against the include patterns (apps/web/src/**/*.ts|tsx|css): components/settings/OpenSourceLicenses.tsx, components/settings/SettingsPanels.tsx, components/settings/SettingsBreadcrumb.tsx, components/settings/SettingsSidebarNav.tsx, components/settings/settingsSearch.ts, routes/settings.open-source-licenses.tsx, routeTree.gen.ts.
Context used for the findings:
components/ui/input.tsxandcomponents/ui/input-group.tsx— the addon contract (responsive icon sizing, logicalps-*/pe-*padding,data-slot=inputownership) and the existing settings precedent incomponents/settings/ThemeSearchSection.tsx.components/ui/collapsible.tsxand its consumers (components/settings/SettingsPanels.tsxlegacy section,ProviderSettingsPanel.tsxadvanced section,pullRequest/PullRequestSummaryTab.tsx,ChatMarkdown.tsx) — established disclosure composition.index.css(--color-border: var(--contrast-border),--color-foreground: var(--contrast-foreground)) andappearanceContrast.ts— border and foreground map to different derived roles, and settings surfaces elsewhere consistently useborder-border/NNandbg-muted/NN, so foreground-alpha separators diverge under custom themes.
No environment-routing, scroll/virtualization, or emitted-CSS concerns were identified: the page performs no environment-scoped actions, uses no masks or virtualized overflow fades, and adds no new CSS selectors or Tailwind variants.
🔍 Agent activity — 22 tool calls
💭 I'm reviewing the settings-related files, focusing on OpenSourceLicenses.tsx which uses a raw button element for a disclosure row—checking whether that's semantically appropriate or needs fixing. I should check whether the codebase has existing Collapsible/Accordion or InputGroup primitives in components/ui, since the search input with nativeInput and an icon might duplicate an existing pattern. Heading levels look fine, so let me dig into the repo structure to confirm.
1. browse_code — apps/web/src/components/ui/*
2. browse_code — apps/web/src/components/settings/OpenSourceLicenses.tsx
💭 I want to check whether the Input primitive has a nativeInput option and if there's an existing InputGroup pattern for search inputs, then compare against how other settings pages implement search fields.
3. browse_code — apps/web/src/components/ui/input.tsx
4. browse_code — apps/web/src/components/ui/input-group.tsx
💭 I notice there's already an InputGroup and InputGroupAddon primitive built for exactly this leading-icon pattern, but the new code bypasses it—absolutely positioning the search icon and forcing padding onto the input via an arbitrary child selector. That's overriding the primitive's padding contract at the call site instead of using the addon component as intended, which is worth flagging. I should also check whether other search inputs in the codebase already follow the InputGroupAddon pattern, and note that this custom
pl-8approach won't adapt for RTL the way the primitive's logical padding props would.
5. git_tools — SearchIcon
💭 I notice the settings page already has a precedent with ThemeSearchSection using InputGroup composition, while the new panel instead absolutely positions its icon and overrides input padding directly—reconstructing an existing addon primitive rather than reusing it. I'll flag this as a concrete finding and suggest using InputGroup composition instead. Now I'm checking a few other potential issues: the
LicenseNoticeRowuses a raw<button>for its disclosure rather than the existingCollapsibleprimitive, though I need to verify whether the rules would exempt this as a semantic settings row. I'm also weighing whether the missing focus-visible styling matters given the browser's default focus ring likely still applies. Separately, I want to compare the header markup here against other settings pages like diagnostics to see if there's a shared header component being bypassed, so I'm going to look at settingsLayout.tsx next.
6. browse_code — apps/web/src/components/settings/settingsLayout.tsx
7. browse_code — apps/web/src/components/ui/collapsible.tsx
💭 I'm weighing whether the row's self-built disclosure toggle counts as reconstructing the Collapsible primitive, even though Collapsible isn't explicitly named in the flagging rules, versus whether this is just a legitimate semantic row pattern that shouldn't be flagged. Its accessibility attributes look mostly right, though it lacks a focus-visible ring, so let me check whether other settings rows like diagnostics or keybindings already use CollapsibleTrigger for similar disclosures.
8. git_tools — CollapsibleTrigger
💭 I notice the app has an established pattern of using shared Collapsible/CollapsibleTrigger/CollapsiblePanel components for disclosure rows, but this new LicenseNoticeRow instead hand-builds its own disclosure with a raw button, manual aria attributes, and a conditional render that skips the height transition—losing the shared animation and trigger contract. This looks like a genuine case of locally reconstructing a primitive that already exists elsewhere. I'm also flagging the search input, which uses an absolute-positioned icon plus a padding override targeting the input's data-slot selector rather than using InputGroup/InputGroupAddon, recreating addon behavior like click-to-focus and icon sizing when a precedent already exists in ThemeSearchSection.tsx. Separately, I want to check the SettingsSidebarNav change, which hardcodes two pathnames for active-state matching—I should look for an existing mechanism like a matchPaths field before concluding this is a real inconsistency.
9. browse_code — apps/web/src/components/settings/settingsSearch.ts
10. browse_code — apps/web/src/components/settings/settingsSearch.ts
💭 That matches the diagnostics precedent. I want to check the new SettingsPanel row against the diagnostics row above it, comparing the Button variant/size and confirming placement under the About section, so I'll look around line 2500-2545 for context.
11. browse_code — apps/web/src/components/settings/SettingsPanels.tsx
💭 That row checks out consistently. Now I want to compare the new panel's page structure against the diagnostics page to see if there's a shared header pattern, so I'll look for the DiagnosticsPanel component.
12. git_tools — SettingsPageContainer width=|text-balance text-2xl
💭 I notice the diagnostics page uses SettingsSection with an h2 rather than a page-level h1, so I'm checking whether other settings pages establish a precedent for h1 headers, and whether the new page's h1 might be redundant given that the breadcrumb already shows "Open source licenses."
13. git_tools — <h1
💭 This file diverges from other settings pages that use SettingsSection with h2/text-lg styling, introducing an h1 with text-2xl instead. That's more a consistency nit than a concrete violation, so I'd flag it lightly rather than fail on it since the rules say not to penalize aesthetic preferences. Now checking the search input finding: the Input primitive uses
data-slot="input"with symmetric horizontal padding, but the call site overrides that padding via an arbitrary descendant selector targeting the data-slot, using a physicalpl-8rather than a logical property—which breaks RTL support and bypasses the primitive's own padding system instead of using InputGroup/InputGroupAddon for icon placement. Writing the diff hunk... I should check whether ThemeSearchSection actually passes nativeInput, since this fix also requires an import change, making it a multi-hunk edit. Given the guidance to avoid diffs for multi-hunk fixes, I'm weighing whether to still show the JSX diff and just mention the import addition in prose, since that seems clearer and more useful despite the ambiguity.
14. browse_code — apps/web/src/components/settings/ThemeSearchSection.tsx
💭 Now I'm looking at the disclosure row's button implementation, checking whether the missing focus-visible outline is a real regression versus just relying on the browser default ring. The bigger concern is that reconstructing this manually as a raw button rather than using Collapsible loses the shared panel height transition, the data-panel-open styling contract, and Base UI's built-in aria wiring—duplicating cursor-pointer and aria-controls by hand instead. I'm weighing whether this counts as a strong enough finding against the guidance to prefer core UI primitives over local triggers. Since collapsible disclosures aren't explicitly named in the rule but fall under "locally reconstructed primitives," and the repo consistently uses Collapsible for this exact chevron pattern elsewhere, I think it's worth flagging as an inline comment. I'm also spot-checking a few smaller details: the pre element's whitespace and font styling look fine, the arbitrary opacity utilities like bg-foreground/2 and hover:bg-foreground/4 seem consistent with existing sidebar patterns, and now I want to grep for border-foreground/10 usage to see if that's an established token pattern versus something like border-border/60.
15. git_tools — border-foreground/10
💭 I notice this new file uses
border-foreground/10while the rest of the app relies on the semanticborder-bordertoken, which is a discrepancy worth flagging since the repo's contrast rules require theme-derived tokens rather than one-off literals, and there's an existing audit note about runtime-adjusted--borderneeding to stay a shared custom property rather than splitting into adjusted and unadjusted paths. I should check whether there's actually a contrast mechanism adjusting--borderat runtime, so I'll grep index.css or a contrast module to confirm.
16. git_tools — --border
17. git_tools — appearanceContrast|contrastAdjust|--border\b
18. browse_code — apps/web/src/appearanceContrast.ts
💭 I'm guessing --border likely gets its contrast boost from index.css, so I should check where that variable is defined with the contrast values.
19. git_tools — appearance-contrast-border-boost
💭 There's a
--contrast-borderderived role, so borders usingborder-foreground/10bypass the semantic border system entirely, including that high-contrast variant. I want to check whether--color-borderactually maps to--contrast-borderin the theme configuration.
20. git_tools — --color-border|--color-foreground:
💭 I realize
border-foreground/10does respond to contrast changes, but it bypasses the theme's dedicated border role, so custom themes defining a distinct--borderwon't affect these separators — while every other surface in the app draws borders from the semantic border token. That's a real token-ownership inconsistency worth flagging as a single comment covering the file. There are several instances of this pattern in the separators, so I'll flag the main one and mention the others alongside it, framing the finding as a theming/ownership consistency issue rather than something more severe. I should also note the similar case where a foreground-alpha background is used for a panel instead of a semantic surface token likebg-muted/40orbg-card, and I want to check quickly how other settings-panel rows handle inset panel backgrounds before finalizing that suggestion.
21. git_tools — border-border|bg-muted/
💭 I'm confirming this is a real inconsistency—the settings UI standardizes on border-border and bg-muted tokens, while this new file uses foreground-alpha variants that would break under custom themes. I'll draft three inline comments flagging these deviations, starting with the list container's border/surface styling. For comment two, I'm targeting the reconstructed disclosure component and suggesting it use Collapsible primitives instead. Comment three covers the search input, recommending InputGroup/InputGroupAddon/InputGroupInput components rather than the current absolute-positioned icon with padding overrides. I'm mapping these to specific diff line ranges since the whole file is new—line 181 for the container, lines 40-46 for the disclosure button, and 159-173 for the search input—then preparing suggested fixes with unified diffs for each. For the first comment I can offer a clean inline suggestion since it's a single-line class swap: replacing the foreground-based border and divider tokens with border/60 tokens, preserving the exact ten-space indentation. The disclosure fix touches multiple hunks (imports plus structural changes) so I'll describe it in prose instead of a diff. Now I'm drafting the review body and comment text, and since findings were found, the overall check state should default to failure. Wrapping in
Collapsiblewith trigger/panel components keeps this consistent with other disclosures. For the third comment, several separators and surfaces use foreground-alpha values instead of semantic border/surface tokens, meaning imported themes with custom--borderor--mutedwon't apply correctly here while the rest of Settings respects theming. I'll keep the review body minimal since the three inline comments already carry the findings—just a brief note that the new Settings page mostly follows the layout primitives with three consistency issues flagged inline.
22. modify_pr — New Settings page follows the surrounding settings layout helpers; three primitive/token consistency findings are inline on apps/web/src/components/settings/OpenSourceLicenses.tsx.
Agent Credits: 247 credits
Token usage: 36 uncached input · 2,143,962 cache-read input · 147,171 cache-write input · 14,049 output
Agent Credits may also include non-token charges from external tools such as web research.