fix: replace all buttons for design system buttons#17007
Merged
Conversation
…ch/hermes-agent into austin/fix/more-design-system
3 tasks
thesunofdog
pushed a commit
to thesunofdog/hermes-agent
that referenced
this pull request
Apr 28, 2026
`web/package-lock.json` was updated by the design-system refactor (merged via NousResearch#17007 + follow-ups: spinner / select / badges / buttons) without bumping `nix/web.nix::npmDeps.hash`, breaking nix builds on every PR + main since 2026-04-28T18:46. Hash sourced from the actual `Check flake` failure output: specified: sha256-AahWmJ9gDQ9pMPa1FYwUjYdO2mOi6JM9Mst27E0vp68= got: sha256-+B2+Fe4djPzHHcUXRx+m0cuyaopAhW0PcHsMgYfV5VE= Standalone single-file fix so it can land fast and clear nix on every other open PR.
ulasbilgen
pushed a commit
to ulasbilgen/hermes-adhd-agent
that referenced
this pull request
May 1, 2026
…re-design-system fix: replace all buttons for design system buttons
ulasbilgen
pushed a commit
to ulasbilgen/hermes-adhd-agent
that referenced
this pull request
May 1, 2026
`web/package-lock.json` was updated by the design-system refactor (merged via NousResearch#17007 + follow-ups: spinner / select / badges / buttons) without bumping `nix/web.nix::npmDeps.hash`, breaking nix builds on every PR + main since 2026-04-28T18:46. Hash sourced from the actual `Check flake` failure output: specified: sha256-AahWmJ9gDQ9pMPa1FYwUjYdO2mOi6JM9Mst27E0vp68= got: sha256-+B2+Fe4djPzHHcUXRx+m0cuyaopAhW0PcHsMgYfV5VE= Standalone single-file fix so it can land fast and clear nix on every other open PR.
donald131
pushed a commit
to donald131/hermes-agent
that referenced
this pull request
May 2, 2026
`web/package-lock.json` was updated by the design-system refactor (merged via NousResearch#17007 + follow-ups: spinner / select / badges / buttons) without bumping `nix/web.nix::npmDeps.hash`, breaking nix builds on every PR + main since 2026-04-28T18:46. Hash sourced from the actual `Check flake` failure output: specified: sha256-AahWmJ9gDQ9pMPa1FYwUjYdO2mOi6JM9Mst27E0vp68= got: sha256-+B2+Fe4djPzHHcUXRx+m0cuyaopAhW0PcHsMgYfV5VE= Standalone single-file fix so it can land fast and clear nix on every other open PR.
02356abc
pushed a commit
to 02356abc/hermes-agent
that referenced
this pull request
May 14, 2026
…re-design-system fix: replace all buttons for design system buttons
02356abc
pushed a commit
to 02356abc/hermes-agent
that referenced
this pull request
May 14, 2026
`web/package-lock.json` was updated by the design-system refactor (merged via NousResearch#17007 + follow-ups: spinner / select / badges / buttons) without bumping `nix/web.nix::npmDeps.hash`, breaking nix builds on every PR + main since 2026-04-28T18:46. Hash sourced from the actual `Check flake` failure output: specified: sha256-AahWmJ9gDQ9pMPa1FYwUjYdO2mOi6JM9Mst27E0vp68= got: sha256-+B2+Fe4djPzHHcUXRx+m0cuyaopAhW0PcHsMgYfV5VE= Standalone single-file fix so it can land fast and clear nix on every other open PR.
dannyJ848
pushed a commit
to dannyJ848/hermes-agent
that referenced
this pull request
May 17, 2026
…re-design-system fix: replace all buttons for design system buttons
dannyJ848
pushed a commit
to dannyJ848/hermes-agent
that referenced
this pull request
May 17, 2026
`web/package-lock.json` was updated by the design-system refactor (merged via NousResearch#17007 + follow-ups: spinner / select / badges / buttons) without bumping `nix/web.nix::npmDeps.hash`, breaking nix builds on every PR + main since 2026-04-28T18:46. Hash sourced from the actual `Check flake` failure output: specified: sha256-AahWmJ9gDQ9pMPa1FYwUjYdO2mOi6JM9Mst27E0vp68= got: sha256-+B2+Fe4djPzHHcUXRx+m0cuyaopAhW0PcHsMgYfV5VE= Standalone single-file fix so it can land fast and clear nix on every other open PR.
gweeteve
pushed a commit
to gweeteve/hermes-agent
that referenced
this pull request
Jun 2, 2026
…re-design-system fix: replace all buttons for design system buttons
gweeteve
pushed a commit
to gweeteve/hermes-agent
that referenced
this pull request
Jun 2, 2026
`web/package-lock.json` was updated by the design-system refactor (merged via NousResearch#17007 + follow-ups: spinner / select / badges / buttons) without bumping `nix/web.nix::npmDeps.hash`, breaking nix builds on every PR + main since 2026-04-28T18:46. Hash sourced from the actual `Check flake` failure output: specified: sha256-AahWmJ9gDQ9pMPa1FYwUjYdO2mOi6JM9Mst27E0vp68= got: sha256-+B2+Fe4djPzHHcUXRx+m0cuyaopAhW0PcHsMgYfV5VE= Standalone single-file fix so it can land fast and clear nix on every other open PR.
Egavasyug
pushed a commit
to Egavasyug/hermes-agent
that referenced
this pull request
Jun 10, 2026
…re-design-system fix: replace all buttons for design system buttons
Egavasyug
pushed a commit
to Egavasyug/hermes-agent
that referenced
this pull request
Jun 10, 2026
`web/package-lock.json` was updated by the design-system refactor (merged via NousResearch#17007 + follow-ups: spinner / select / badges / buttons) without bumping `nix/web.nix::npmDeps.hash`, breaking nix builds on every PR + main since 2026-04-28T18:46. Hash sourced from the actual `Check flake` failure output: specified: sha256-AahWmJ9gDQ9pMPa1FYwUjYdO2mOi6JM9Mst27E0vp68= got: sha256-+B2+Fe4djPzHHcUXRx+m0cuyaopAhW0PcHsMgYfV5VE= Standalone single-file fix so it can land fast and clear nix on every other open PR.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this PR do?
Migrates the Hermes Agent dashboard to the upgraded
@nous-research/uiAPI and eliminates every native<button>element inhermes-agent/web/src/(final count: 25 → 0). Every interactive control now flows through a DS component. Drops the local!p-2 aspect-square/!bg-destructive/text-destructive hover:!text-destructiveworkarounds along with three full local primitives that were duplicating DS work.End state:
size="icon"/size="xs"/ghost/destructiveprops<ListItem>instead of 13 ad-hoc<button class="w-full flex…">patterns<Stats>; copy-with-feedback affordances use DS<CopyButton>mondwestvoice is preserved on popover triggers (Language / Theme switchers) by composing DS<Button ghost>with inner<Typography mondwest>The companion DS work (
design-languagerepo, ships as@nous-research/ui@0.9.0) extended the existing<Button>and added four new components:<Button>extensions — addedsize: 'xs'for tight inline contexts (eg clear-search × inside an Input). Earlier in this PR seriessize: 'icon' | 'sm' | 'default'+ghost+destructivealready landed.<ListItem>(new) — full-width row primitive withactive/disabled/prefix/suffixand pass-through ARIA. Used everywhere a list row needed click affordance.<Switch>(new) — toggle switch primitive (replaces localcomponents/ui/switch.tsx).<Tabs>/<TabsList>/<TabsTrigger>(new) — tab primitive with the same render-prop API as the previous local component, so plugin-SDK callers don't need to change (replaces localcomponents/ui/tabs.tsx).<Segmented>/<FilterGroup>(new) — segmented filter chip group with optional label wrapper (replaces localcomponents/ui/segmented.tsx).Also picked up
<Select>/<SelectOption>from a sibling DS port done in this same series.All new DS APIs are additive — existing
<Button invert outlined>and<Card>callers across all Nous products are 100% unchanged. Storybook coverage added for ListItem, Switch, Tabs, Segmented, and Select.A
resolve.dedupeblock invite.config.tscoversreact,react-dom,three,gsap,leva,@react-three/fiber,@observablehq/plot. Defensive — it's a no-op under registry installs but lets future local DS iteration via afile:symlink to a siblingdesign-languagecheckout work without dual-React-instance hook crashes.Related Issue
N/A (internal design-system consolidation; no tracking issue)
Type of Change
Changes Made
DS Button consumption (icon / ghost / destructive / size variants)
src/pages/CronPage.tsx— Pause/Resume/Trigger row buttons →ghost size="icon"; Delete →ghost destructive size="icon"src/pages/ConfigPage.tsx— Export/Import/Reset toolbar →ghost size="icon"; clear-search × →ghost size="xs"; YAML toggle / Save →size="sm"(header chrome should not be hero-CTA height)src/pages/SessionsPage.tsx— Resume row →ghost size="icon"; Delete row →ghost destructive size="icon"; pagination chevrons →outlined size="icon"; clear-search × →ghost size="xs"; banner-dismiss →ghost size="icon"src/pages/SkillsPage.tsx— clear-search × →ghost size="xs"src/pages/EnvPage.tsx— Eye/EyeOff reveal →ghost size="icon"; Clear →outlined destructive size="sm"; all Set/Replace/Save/Cancel/Show-advanced row actions →size="sm"; "not configured" disclosure →ghost size="sm"src/pages/AnalyticsPage.tsx— 7D/30D/90D filter chips + Refresh →size="sm"src/pages/LogsPage.tsx— Refresh →size="sm"src/components/OAuthProvidersCard.tsx— Docs link →ghost size="icon"; Refresh / Login / Disconnect →size="sm"src/components/ChatSidebar.tsx— model-picker trigger →ghost size="sm"with link styling overrides; Reconnect →outlined size="sm"src/components/ModelPickerDialog.tsx— close × →ghost size="icon"src/components/OAuthLoginModal.tsx— close × →ghost size="icon"src/components/ui/confirm-dialog.tsx— Confirm button →destructiveprop (replacesclassName={destructive ? "!bg-destructive !text-destructive-foreground" : undefined})src/App.tsx— mobile-nav hamburger / mobile-sidebar close →ghost size="icon"; full-screen backdrop scrim → childless<Button ghost>withblock p-0overridessrc/pages/ChatPage.tsx— mobile-panel close →ghost size="icon"; mobile model-tools header trigger →<Button ghost>with custom border chrome; copy-last-response →<Button ghost>pinned to xterm theme color; full-screen backdrop scrim → childless<Button ghost>DS
<ListItem>adoption (13 list-row buttons swept)src/components/SlashPopover.tsx— slash-command popover rowsrc/components/ToolCall.tsx— tool-call disclosure headersrc/components/ModelPickerDialog.tsx— provider list row + model list rowsrc/components/ThemeSwitcher.tsx— theme list row (the trigger itself uses<Button ghost>with<Typography mondwest>inside, see Bucket D below)src/pages/ConfigPage.tsx— sidebar category nav rowsrc/pages/EnvPage.tsx— provider accordion headersrc/pages/SessionsPage.tsx— tool-call action banner row (warning-tone variant via className)src/pages/SkillsPage.tsx— skill key-picker chip + source-panel item (PanelItem)src/App.tsx— system-action menu list items (busy / pending / disabled state)New DS composite primitives (replaces local files)
src/components/ui/switch.tsx— deleted, all callers now importSwitchfrom@nous-research/ui(SkillsPage,LogsPage,AutoField)src/components/ui/tabs.tsx— deleted, plugin SDK inplugins/registry.tsnow re-exports DSTabs/TabsList/TabsTriggersrc/components/ui/segmented.tsx— deleted, all callers (LogsPage) now importSegmented/FilterGroupfrom@nous-research/uiBrand-font popover triggers (preserves
font-mondwest)src/components/LanguageSwitcher.tsx— flag + lang code button rebuilt as<Button ghost>+ inner<Typography mondwest>src/components/ThemeSwitcher.tsx— palette-icon trigger rebuilt the same wayDS components for shared patterns
src/pages/AnalyticsPage.tsx— three-SummaryCardgrid → single DS<Stats>(5 metrics: total tokens, input, output, sessions, API calls); two-columnStats + TokenBarChartlayout onlg:viewportssrc/components/OAuthProvidersCard.tsx— local copy-CLI Button +copiedIdstate +handleCopy→ DS<CopyButton>(deletes the state and handler entirely)src/components/OAuthLoginModal.tsx— local copy-user-code Button +codeCopiedstate +handleCopyUserCode→ DS<CopyButton>(same simplification)Local primitives removed
src/components/ui/button.tsx— deleted (everything imports from@nous-research/ui)src/components/ui/switch.tsx— deletedsrc/components/ui/tabs.tsx— deletedsrc/components/ui/segmented.tsx— deletedsrc/components/ui/select.tsx— deleted (sibling DS<Select>port)Vite config
vite.config.ts— addedresolve.dedupefor shared deps that exist in bothhermes-agent/web/node_modulesanddesign-language/node_modules. Inline comment explains why.Verification
npx tsc -b --noEmit --force— cleannpm run build— cleanrg '<button[\s>]'overhermes-agent/web/src— 0 matchessetState-in-effect,react-hooks/exhaustive-depsfor unrelated effects); no new warnings introducedKnown follow-up (out of scope)
src/pages/DocsPage.tsx— keeps a hand-rolledDS_BUTTON_OUTLINED_LINK_CNconstant because the docs CTA renders as<a>and the DS Button is<button>-only. A future polymorphicasprop on DS Button would let us delete that.How to Test
After
npm install && npm run dev(the dashboard now pulls@nous-research/ui@^0.9.0from the registry):xsbutton that fits inside the Input edge; tool-call action banner row is a<ListItem>with warning tone.outlined destructive size="sm"; all row Set/Replace/Save/Cancel buttons aresize="sm"(header-row height, not hero-CTA height); Show-advanced and "not configured" disclosure alsosize="sm"; provider accordion headers click as<ListItem>.size="sm"; sidebar category nav uses<ListItem>; clear-search × in header usessize="xs".<ListItem>; key-picker chips are<ListItem>; toggles use DS<Switch>; clear-search × usessize="xs".<Segmented>+<FilterGroup>; auto-refresh toggle uses DS<Switch>; Refresh button issize="sm".lg+width, Stats card sits beside<TokenBarChart>in a 2-col grid; 7D/30D/90D filter chips and Refresh are allsize="sm".size="sm"; copy-CLI uses DS<CopyButton>.<ListItem>; slash-command popover uses<ListItem>; tool-call disclosure headers use<ListItem>; sidebar model-picker trigger uses<Button ghost size="sm">with link aesthetic; backdrop scrims (mobile nav, mobile model-tools panel) are childless<Button ghost>with full-screen overrides.<Button ghost>but keep theirfont-mondwestvoice via inner<Typography mondwest>.Visually verify nothing regresses (no
useRef of nullfrom React-instance dupes, no missing icons, no oversized header rows, no clipped Badge text).Checklist
Code
feat(dashboard):/refactor(dashboard):)pytest tests/ -qand all tests pass — N/A (frontend-only PR, no Python touched)npm run build)Documentation & Housekeeping
docs/, docstrings) — N/Acli-config.yaml.exampleif I added/changed config keys — N/ACONTRIBUTING.mdorAGENTS.mdif I changed architecture or workflows — N/AScreenshots / Logs