feat(web): migrate dashboard checkboxes to @nous-research/ui + DS polish#28814
Conversation
Replaces the hand-rolled shadcn-style `Checkbox` in `web/src/components/ui/` with the Nous DS `Checkbox` (Radix-backed) from `@nous-research/ui`, bumps the DS to 0.14.2, and picks up two regressions surfaced by the bump. Checkbox migration - bump `@nous-research/ui` 0.14.0 → ^0.14.2 and remove `web/src/components/ui/checkbox.tsx` - migrate `ProfilesPage` and `ModelPickerDialog` to the DS Checkbox API (`onCheckedChange`, paired `<Label htmlFor>`) - expose `Checkbox` on the dashboard plugin SDK (`web/src/plugins/registry.ts`) so plugin bundles can use the same DS component - migrate the kanban dashboard plugin's 7 native `<input type="checkbox">` call sites to the SDK `Checkbox`, with a native-input fallback shim so the bundle still renders against older hosts that predate the SDK export Fix: missing font registrations after the 0.14.x split - import `@nous-research/ui/styles/fonts.css` before `globals.css` in `web/src/index.css`. As of 0.14.x, `globals.css` only declares the `--font-*` variables (Collapse, Mondwest, Rules Compressed/Expanded); the `@font-face` registrations now live in a separate `fonts.css`, so without this import the DS components silently fall back to a system font stack and look unstyled. Fix: right-align page header toolbars on sm+ viewports - The mobile dashboard polish in #28127 flipped four pages' `setEnd(...)` wrappers from `justify-end` to `w-full ... justify-start` so toolbars stack below the title and align left on small screens. But the outer `end` slot in `PageHeaderProvider` already has `sm:justify-end`, and that has no effect when its only child is `w-full` — once a flex child fills the row, the parent's `justify-*` can't move it. The toolbar pinned to the *left* of the right-side `sm:max-w-md` (~448px) slot, making the buttons appear to float a couple-hundred pixels off the right edge on Analytics, Models, Logs, and Plugins. - Re-add `sm:justify-end` on the inner wrapper of each affected page, preserving the mobile stacked layout. Co-authored-by: Cursor <cursoragent@cursor.com>
🔎 Lint report:
|
There was a problem hiding this comment.
Pull request overview
This PR migrates the dashboard’s checkbox usage to the Radix-backed Nous design-system Checkbox (@nous-research/ui) and polishes related UI regressions introduced by the DS bump and prior mobile header layout changes.
Changes:
- Replace local shadcn-style checkbox with
@nous-research/uiCheckbox across the dashboard and expose it via the plugin SDK (plus kanban plugin migration with a backwards-compatible shim). - Fix DS font loading regression by importing
@nous-research/ui/styles/fonts.cssbeforeglobals.css. - Restore right-aligned header toolbars on
sm:+ viewports while preserving the mobile left-stacked layout.
Reviewed changes
Copilot reviewed 10 out of 12 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| web/src/plugins/registry.ts | Exposes DS Checkbox on the plugin SDK components surface. |
| web/src/pages/ProfilesPage.tsx | Migrates “Clone from default” to DS Checkbox + Label htmlFor wiring. |
| web/src/components/ModelPickerDialog.tsx | Migrates “Persist globally” to DS Checkbox + Label htmlFor wiring and onCheckedChange. |
| web/src/pages/AnalyticsPage.tsx | Adds sm:justify-end to inner end-slot wrapper to re-enable desktop right alignment. |
| web/src/pages/LogsPage.tsx | Same sm:justify-end header alignment fix for logs toolbar. |
| web/src/pages/ModelsPage.tsx | Same sm:justify-end header alignment fix for models toolbar. |
| web/src/pages/PluginsPage.tsx | Same sm:justify-end header alignment fix for plugins toolbar. |
| web/src/index.css | Imports DS fonts.css before globals.css to restore custom font faces. |
| web/src/components/ui/checkbox.tsx | Removes the local checkbox implementation now replaced by DS. |
| web/package.json | Bumps @nous-research/ui dependency to ^0.14.2. |
| web/package-lock.json | Lockfile update for @nous-research/ui@0.14.2 and transitive deps. |
| plugins/kanban/dashboard/dist/index.js | Migrates kanban checkboxes to SDK Checkbox with fallback shim for older hosts. |
Files not reviewed (1)
- web/package-lock.json: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Applied nix lockfile hash fix for |
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…ish (NousResearch#28814) * feat(web): migrate dashboard checkboxes to @nous-research/ui + DS polish Replaces the hand-rolled shadcn-style `Checkbox` in `web/src/components/ui/` with the Nous DS `Checkbox` (Radix-backed) from `@nous-research/ui`, bumps the DS to 0.14.2, and picks up two regressions surfaced by the bump. Checkbox migration - bump `@nous-research/ui` 0.14.0 → ^0.14.2 and remove `web/src/components/ui/checkbox.tsx` - migrate `ProfilesPage` and `ModelPickerDialog` to the DS Checkbox API (`onCheckedChange`, paired `<Label htmlFor>`) - expose `Checkbox` on the dashboard plugin SDK (`web/src/plugins/registry.ts`) so plugin bundles can use the same DS component - migrate the kanban dashboard plugin's 7 native `<input type="checkbox">` call sites to the SDK `Checkbox`, with a native-input fallback shim so the bundle still renders against older hosts that predate the SDK export Fix: missing font registrations after the 0.14.x split - import `@nous-research/ui/styles/fonts.css` before `globals.css` in `web/src/index.css`. As of 0.14.x, `globals.css` only declares the `--font-*` variables (Collapse, Mondwest, Rules Compressed/Expanded); the `@font-face` registrations now live in a separate `fonts.css`, so without this import the DS components silently fall back to a system font stack and look unstyled. Fix: right-align page header toolbars on sm+ viewports - The mobile dashboard polish in NousResearch#28127 flipped four pages' `setEnd(...)` wrappers from `justify-end` to `w-full ... justify-start` so toolbars stack below the title and align left on small screens. But the outer `end` slot in `PageHeaderProvider` already has `sm:justify-end`, and that has no effect when its only child is `w-full` — once a flex child fills the row, the parent's `justify-*` can't move it. The toolbar pinned to the *left* of the right-side `sm:max-w-md` (~448px) slot, making the buttons appear to float a couple-hundred pixels off the right edge on Analytics, Models, Logs, and Plugins. - Re-add `sm:justify-end` on the inner wrapper of each affected page, preserving the mobile stacked layout. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(nix): update web npmDeps hash for package-lock bump Co-authored-by: Cursor <cursoragent@cursor.com> * fix(nix): refresh npm lockfile hashes * chore(ci): re-trigger checks after nix lockfile hash fix Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…ish (NousResearch#28814) * feat(web): migrate dashboard checkboxes to @nous-research/ui + DS polish Replaces the hand-rolled shadcn-style `Checkbox` in `web/src/components/ui/` with the Nous DS `Checkbox` (Radix-backed) from `@nous-research/ui`, bumps the DS to 0.14.2, and picks up two regressions surfaced by the bump. Checkbox migration - bump `@nous-research/ui` 0.14.0 → ^0.14.2 and remove `web/src/components/ui/checkbox.tsx` - migrate `ProfilesPage` and `ModelPickerDialog` to the DS Checkbox API (`onCheckedChange`, paired `<Label htmlFor>`) - expose `Checkbox` on the dashboard plugin SDK (`web/src/plugins/registry.ts`) so plugin bundles can use the same DS component - migrate the kanban dashboard plugin's 7 native `<input type="checkbox">` call sites to the SDK `Checkbox`, with a native-input fallback shim so the bundle still renders against older hosts that predate the SDK export Fix: missing font registrations after the 0.14.x split - import `@nous-research/ui/styles/fonts.css` before `globals.css` in `web/src/index.css`. As of 0.14.x, `globals.css` only declares the `--font-*` variables (Collapse, Mondwest, Rules Compressed/Expanded); the `@font-face` registrations now live in a separate `fonts.css`, so without this import the DS components silently fall back to a system font stack and look unstyled. Fix: right-align page header toolbars on sm+ viewports - The mobile dashboard polish in NousResearch#28127 flipped four pages' `setEnd(...)` wrappers from `justify-end` to `w-full ... justify-start` so toolbars stack below the title and align left on small screens. But the outer `end` slot in `PageHeaderProvider` already has `sm:justify-end`, and that has no effect when its only child is `w-full` — once a flex child fills the row, the parent's `justify-*` can't move it. The toolbar pinned to the *left* of the right-side `sm:max-w-md` (~448px) slot, making the buttons appear to float a couple-hundred pixels off the right edge on Analytics, Models, Logs, and Plugins. - Re-add `sm:justify-end` on the inner wrapper of each affected page, preserving the mobile stacked layout. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(nix): update web npmDeps hash for package-lock bump Co-authored-by: Cursor <cursoragent@cursor.com> * fix(nix): refresh npm lockfile hashes * chore(ci): re-trigger checks after nix lockfile hash fix Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…ish (NousResearch#28814) * feat(web): migrate dashboard checkboxes to @nous-research/ui + DS polish Replaces the hand-rolled shadcn-style `Checkbox` in `web/src/components/ui/` with the Nous DS `Checkbox` (Radix-backed) from `@nous-research/ui`, bumps the DS to 0.14.2, and picks up two regressions surfaced by the bump. Checkbox migration - bump `@nous-research/ui` 0.14.0 → ^0.14.2 and remove `web/src/components/ui/checkbox.tsx` - migrate `ProfilesPage` and `ModelPickerDialog` to the DS Checkbox API (`onCheckedChange`, paired `<Label htmlFor>`) - expose `Checkbox` on the dashboard plugin SDK (`web/src/plugins/registry.ts`) so plugin bundles can use the same DS component - migrate the kanban dashboard plugin's 7 native `<input type="checkbox">` call sites to the SDK `Checkbox`, with a native-input fallback shim so the bundle still renders against older hosts that predate the SDK export Fix: missing font registrations after the 0.14.x split - import `@nous-research/ui/styles/fonts.css` before `globals.css` in `web/src/index.css`. As of 0.14.x, `globals.css` only declares the `--font-*` variables (Collapse, Mondwest, Rules Compressed/Expanded); the `@font-face` registrations now live in a separate `fonts.css`, so without this import the DS components silently fall back to a system font stack and look unstyled. Fix: right-align page header toolbars on sm+ viewports - The mobile dashboard polish in NousResearch#28127 flipped four pages' `setEnd(...)` wrappers from `justify-end` to `w-full ... justify-start` so toolbars stack below the title and align left on small screens. But the outer `end` slot in `PageHeaderProvider` already has `sm:justify-end`, and that has no effect when its only child is `w-full` — once a flex child fills the row, the parent's `justify-*` can't move it. The toolbar pinned to the *left* of the right-side `sm:max-w-md` (~448px) slot, making the buttons appear to float a couple-hundred pixels off the right edge on Analytics, Models, Logs, and Plugins. - Re-add `sm:justify-end` on the inner wrapper of each affected page, preserving the mobile stacked layout. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(nix): update web npmDeps hash for package-lock bump Co-authored-by: Cursor <cursoragent@cursor.com> * fix(nix): refresh npm lockfile hashes * chore(ci): re-trigger checks after nix lockfile hash fix Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…ish (NousResearch#28814) * feat(web): migrate dashboard checkboxes to @nous-research/ui + DS polish Replaces the hand-rolled shadcn-style `Checkbox` in `web/src/components/ui/` with the Nous DS `Checkbox` (Radix-backed) from `@nous-research/ui`, bumps the DS to 0.14.2, and picks up two regressions surfaced by the bump. Checkbox migration - bump `@nous-research/ui` 0.14.0 → ^0.14.2 and remove `web/src/components/ui/checkbox.tsx` - migrate `ProfilesPage` and `ModelPickerDialog` to the DS Checkbox API (`onCheckedChange`, paired `<Label htmlFor>`) - expose `Checkbox` on the dashboard plugin SDK (`web/src/plugins/registry.ts`) so plugin bundles can use the same DS component - migrate the kanban dashboard plugin's 7 native `<input type="checkbox">` call sites to the SDK `Checkbox`, with a native-input fallback shim so the bundle still renders against older hosts that predate the SDK export Fix: missing font registrations after the 0.14.x split - import `@nous-research/ui/styles/fonts.css` before `globals.css` in `web/src/index.css`. As of 0.14.x, `globals.css` only declares the `--font-*` variables (Collapse, Mondwest, Rules Compressed/Expanded); the `@font-face` registrations now live in a separate `fonts.css`, so without this import the DS components silently fall back to a system font stack and look unstyled. Fix: right-align page header toolbars on sm+ viewports - The mobile dashboard polish in NousResearch#28127 flipped four pages' `setEnd(...)` wrappers from `justify-end` to `w-full ... justify-start` so toolbars stack below the title and align left on small screens. But the outer `end` slot in `PageHeaderProvider` already has `sm:justify-end`, and that has no effect when its only child is `w-full` — once a flex child fills the row, the parent's `justify-*` can't move it. The toolbar pinned to the *left* of the right-side `sm:max-w-md` (~448px) slot, making the buttons appear to float a couple-hundred pixels off the right edge on Analytics, Models, Logs, and Plugins. - Re-add `sm:justify-end` on the inner wrapper of each affected page, preserving the mobile stacked layout. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(nix): update web npmDeps hash for package-lock bump Co-authored-by: Cursor <cursoragent@cursor.com> * fix(nix): refresh npm lockfile hashes * chore(ci): re-trigger checks after nix lockfile hash fix Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> #AI commit#
…ish (NousResearch#28814) * feat(web): migrate dashboard checkboxes to @nous-research/ui + DS polish Replaces the hand-rolled shadcn-style `Checkbox` in `web/src/components/ui/` with the Nous DS `Checkbox` (Radix-backed) from `@nous-research/ui`, bumps the DS to 0.14.2, and picks up two regressions surfaced by the bump. Checkbox migration - bump `@nous-research/ui` 0.14.0 → ^0.14.2 and remove `web/src/components/ui/checkbox.tsx` - migrate `ProfilesPage` and `ModelPickerDialog` to the DS Checkbox API (`onCheckedChange`, paired `<Label htmlFor>`) - expose `Checkbox` on the dashboard plugin SDK (`web/src/plugins/registry.ts`) so plugin bundles can use the same DS component - migrate the kanban dashboard plugin's 7 native `<input type="checkbox">` call sites to the SDK `Checkbox`, with a native-input fallback shim so the bundle still renders against older hosts that predate the SDK export Fix: missing font registrations after the 0.14.x split - import `@nous-research/ui/styles/fonts.css` before `globals.css` in `web/src/index.css`. As of 0.14.x, `globals.css` only declares the `--font-*` variables (Collapse, Mondwest, Rules Compressed/Expanded); the `@font-face` registrations now live in a separate `fonts.css`, so without this import the DS components silently fall back to a system font stack and look unstyled. Fix: right-align page header toolbars on sm+ viewports - The mobile dashboard polish in NousResearch#28127 flipped four pages' `setEnd(...)` wrappers from `justify-end` to `w-full ... justify-start` so toolbars stack below the title and align left on small screens. But the outer `end` slot in `PageHeaderProvider` already has `sm:justify-end`, and that has no effect when its only child is `w-full` — once a flex child fills the row, the parent's `justify-*` can't move it. The toolbar pinned to the *left* of the right-side `sm:max-w-md` (~448px) slot, making the buttons appear to float a couple-hundred pixels off the right edge on Analytics, Models, Logs, and Plugins. - Re-add `sm:justify-end` on the inner wrapper of each affected page, preserving the mobile stacked layout. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(nix): update web npmDeps hash for package-lock bump Co-authored-by: Cursor <cursoragent@cursor.com> * fix(nix): refresh npm lockfile hashes * chore(ci): re-trigger checks after nix lockfile hash fix Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
What does this PR do?
Replaces the hand-rolled shadcn-style
Checkboxinweb/src/components/ui/with the Nous DSCheckbox(Radix-backed) from@nous-research/ui, bumps the DS to^0.14.2, and picks up two regressions surfaced by the bump.The unifying motivation is design-system cleanup: the dashboard's checkbox styling now tracks
@nous-research/uiinstead of drifting locally, and the kanban dashboard plugin gets the same component via the existing plugin SDK rather than continuing to render bare native<input type="checkbox">controls.Two regressions came along for the ride because they were the immediate fallout from poking at this area of the dashboard:
@font-facedeclarations out ofglobals.cssinto a newfonts.cssin 0.14.x. The dashboard only importedglobals.css, so after the bump all DS components silently fell back to a system font stack (Collapse / Mondwest / Rules Compressed / Rules Expanded never registered).sm:viewports — PR feat(web): mobile dashboard UX polish #28127 ("mobile dashboard UX polish") flipped four pages'setEnd(...)wrappers tow-full ... justify-startso toolbars stack left on mobile, but the outerendslot inPageHeaderProvideralready hassm:justify-end— which has no effect when its only child isw-full. The Analytics / Models / Logs / Plugins toolbars ended up pinned to the left of the right-sidesm:max-w-mdslot on desktop instead of flush against the right edge.Related Issue
Fixes #
Type of Change
(Primarily a DS migration; also rolls up two
fix:regressions.)Changes Made
Checkbox migration
web/package.json/web/package-lock.json— bump@nous-research/uifrom0.14.0→^0.14.2web/src/components/ui/checkbox.tsx— deleted (replaced by DS Checkbox)web/src/components/ModelPickerDialog.tsx— switch to DS Checkbox + paired<Label htmlFor>, useonCheckedChangeweb/src/pages/ProfilesPage.tsx— same migration pattern as aboveweb/src/plugins/registry.ts— exposeCheckboxonwindow.__HERMES_PLUGIN_SDK__.componentsplugins/kanban/dashboard/dist/index.js— migrate the 7 native checkbox call sites (settings auto-decompose, create-board "switch to", "show archived", "lanes by profile", bulk "reclaim first", column-header select-all, per-card select) to the SDKCheckbox. Includes a fallback shim (const Checkbox = SDK.components.Checkbox || function (...) { return h("input", ...); }) so the bundle still renders against older hosts that don't yet exposeCheckboxon the SDKFix: missing fonts after DS 0.14.x bump
web/src/index.css— add@import '@nous-research/ui/styles/fonts.css';beforeglobals.css. As of 0.14.x,globals.cssonly declares the--font-*variables — the@font-facerules live in the separatefonts.css, which the dashboard wasn't importingFix: right-align header toolbars on
sm:and upweb/src/pages/AnalyticsPage.tsx,web/src/pages/LogsPage.tsx,web/src/pages/ModelsPage.tsx,web/src/pages/PluginsPage.tsx— addsm:justify-endon thesetEnd(...)inner wrappers (which arew-fulland therefore neutralise the outersm:justify-endonPageHeaderProvider)How to Test
cd web && pnpm i(picks up@nous-research/ui@^0.14.2)python -m hermes_cli.main web --no-openandcd web && npm run devin another terminal.bg-midground/15+ check icon when active), not the old shadcn-style input.htmlFor)./kanban. All seven checkbox sites should be DS-styled: settings → "Auto-decompose triage tasks"; "+ New board" dialog → "Switch to this board"; toolbar → "Show archived" + "Lanes by profile"; bulk-actions bar → "Reclaim first"; per-column header select-all; per-card select. Toggling a card checkbox should NOT also open the card detail (click propagation stopped).Collapse-*.woff2,RulesExpanded-*.woff2,Mondwest-Regular.woff2, etc. are loaded fromnode_modules/@nous-research/ui/dist/fonts/....sm, 640px+), the action toolbars on Analytics (7D / 30D / 90D / Refresh), Models, Logs (Auto-refresh / Refresh), and Plugins (Rescan dashboard extensions) should sit flush against the right edge of the header, in line with the right edge of the body cards below.sm(or open DevTools mobile emulator). The same toolbars should stack below the title and align to the LEFT of the row, as introduced in feat(web): mobile dashboard UX polish #28127.Checklist
Code
feat(web):for this PR)pytest tests/ -qand all tests pass — N/A, dashboard-only changes; rancd web && npx tsc -b(passes) andnpx eslint src/plugins/registry.ts src/pages/{Analytics,Logs,Models,Plugins}Page.tsx(clean). The pre-existing lint errors inPluginsPage(setLoading(true)in an effect, missingonRescandep) andthemes/context.tsx(mixed exports) are unrelated.Documentation & Housekeeping
cli-config.yaml.exampleif I added/changed config keys — N/ACONTRIBUTING.mdorAGENTS.mdif I changed architecture or workflows — N/A (the plugin SDK now exportsCheckboxalongside the other DS components, no docs reference its surface yet)Screenshots / Logs
Before (regression introduced by #28127 — toolbars floating mid-row on
sm:and up): see screenshots attached in the originating issue/conversation for Analytics, Models, Logs, Plugins. After this PR, those toolbars sit flush against the right edge of the header, in line with the right edge of the body cards below.