Skip to content

feat(settings): add open source license notices

MacroscopeApp / Macroscope - UI Consistency failed Aug 31, 2026 in 6m 11s

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 manual aria-expanded/aria-controls, cursor-pointer, and a conditionally mounted panel, losing CollapsiblePanel's height transition and the data-panel-open trigger contract used by every other disclosure in the app.
  • Search input bypasses InputGroup (lines 159-173) — an absolutely positioned SearchIcon plus [&_[data-slot=input]]:pl-8 overrides Input's internal padding from the call site and re-creates addon geometry that InputGroup/InputGroupAddon/InputGroupInput already own (as used by ThemeSearchSection.tsx in the same folder).
  • Foreground-alpha borders and surfaces (lines 44, 69, 101, 181, 199) — border-foreground/10, divide-foreground/10, bg-foreground/2, and hover:bg-foreground/4 bypass the semantic border/muted roles that the rest of Settings uses, so themes defining their own --border/--muted do 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.tsx and components/ui/input-group.tsx — the addon contract (responsive icon sizing, logical ps-*/pe-* padding, data-slot=input ownership) and the existing settings precedent in components/settings/ThemeSearchSection.tsx.
  • components/ui/collapsible.tsx and its consumers (components/settings/SettingsPanels.tsx legacy section, ProviderSettingsPanel.tsx advanced section, pullRequest/PullRequestSummaryTab.tsx, ChatMarkdown.tsx) — established disclosure composition.
  • index.css (--color-border: var(--contrast-border), --color-foreground: var(--contrast-foreground)) and appearanceContrast.ts — border and foreground map to different derived roles, and settings surfaces elsewhere consistently use border-border/NN and bg-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-8 approach 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 LicenseNoticeRow uses a raw <button> for its disclosure rather than the existing Collapsible primitive, 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 physical pl-8 rather 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/10 while the rest of the app relies on the semantic border-border token, 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 --border needing 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 --border at 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-border derived role, so borders using border-foreground/10 bypass the semantic border system entirely, including that high-contrast variant. I want to check whether --color-border actually maps to --contrast-border in the theme configuration.

20. git_tools — --color-border|--color-foreground:

💭 I realize border-foreground/10 does respond to contrast changes, but it bypasses the theme's dedicated border role, so custom themes defining a distinct --border won'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 like bg-muted/40 or bg-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 Collapsible with 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 --border or --muted won'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.