Skip to content

feat(frontend): rebuild the workspace shell on shadcn sidebar + site header - #570

Open
Ashin-LX-98 wants to merge 3 commits into
developfrom
reui
Open

feat(frontend): rebuild the workspace shell on shadcn sidebar + site header#570
Ashin-LX-98 wants to merge 3 commits into
developfrom
reui

Conversation

@Ashin-LX-98

Copy link
Copy Markdown
Collaborator

What

Rebuilds the workspace desktop shell around the ReUI app-shell-12 block, without installing the block itself.

App shell

  • Sidebar — icon-rail collapsible nav (collapsible="icon") built from Brand / NavMain / NavAgents / NavSecondary, plus the app-shell-12 rail handle (two bars that splay on hover with a Collapse/Expand label). Replaces sidebar.tsx / sidebar-content.tsx / sidebar-header.tsx; nav counts and the agent list keep their previous behaviour.
  • Site header — new h-12 bar with breadcrumbs (view + current thread/file), a Cmd-K command palette over threads/files/agents, a notifications popover reusing the Inbox card, and the account menu (theme, copy token, claim workspace, settings, sign in/out). Mobile gets the notifications + account menus in MobileHeader so nothing that lived in the old sidebar footer is lost.
  • SidebarProvider is controlled by the existing useLayout().isSidebarOpen, so every other caller is untouched.

Registry components landed by hand

npx shadcn add sidebar breadcrumb popover command skeleton would have overwritten 8 existing files (dialog, button, sheet, tooltip, input, textarea, separator, hooks/use-mobile) — dialog.tsx carries this repo's pinned header/footer contract and button.tsx differs from upstream by ~480 lines. So the six new files were extracted from the registry JSON and adapted instead: registry import paths rewritten, the broken IconPlaceholder import swapped for lucide icons, and size="icon-sm" mapped to this Button's size="icon". --sidebar-* tokens (light + dark) were added to globals.css; cmdk is the only new dependency.

Layout & dialogs

  • Panes now sit flush against the rail with 1px dividers instead of floating rounded-xl cards, and every pane header is h-12 with a shared bottom border, so the site header, list pane and detail pane line up.
  • share-dialog, create-routine-dialog and invitation-dialog now follow the dialog spec — actions live in a pinned DialogFooter, DialogBody is the only scroll region, and hardcoded zinc-*/blue-500/red-500 are replaced by design tokens. Native confirm/prompt calls move to the shared dialogs provider.

Notes

  • data-active={isActive} in the upstream sidebar.tsx renders data-active="false", which Tailwind v4's data-active: variant still matches — every menu item rendered as selected. Fixed to isActive || undefined.
  • The radix-nova CommandDialog does not include a cmdk root, so SearchMenu wraps its children in <Command> itself.
  • components.json is added with the @reui registry; the license key stays in .env.local (gitignored).

Testing

  • npx tsc --noEmit clean
  • npm run build succeeds
  • Interactive verification (rail collapse, Cmd-K navigation, notification read-sync, light/dark) needs a real workspace — reviewer should click through those.

🤖 Generated with Claude Code

…header

- App shell: icon-rail sidebar (brand, nav, agents, rail toggle) plus a new
  h-12 site header with breadcrumbs, cmd-K search, notifications and the
  account menu. Replaces sidebar/sidebar-content/sidebar-header; the settings
  dialog is extracted so the header menu can own it.
- Lands sidebar, breadcrumb, popover, command, input-group and skeleton from
  the shadcn radix-nova registry by hand — the CLI would have overwritten eight
  existing ReUI components (dialog, button, sheet, ...). Adds the --sidebar-*
  tokens and cmdk.
- Panes sit flush against the rail with 1px dividers instead of floating cards,
  and every pane header is h-12 with a shared bottom border.
- Share, create-routine and invitation dialogs follow the pinned
  header/body/footer spec and use design tokens instead of hardcoded zinc/blue.
- Confirm and prompt flows move to the shared dialogs provider.
@vercel

vercel Bot commented Jul 28, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
openagents-workspace Ready Ready Preview, Comment Jul 28, 2026 1:23pm
openagents-workspace (beta) Ready Ready Preview, Comment Jul 28, 2026 1:23pm

Request Review

@zomux zomux left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve with minor changes — solid, well-documented app-shell refactor; mostly presentational and tsc/build pass.

Would like addressed before merge:

  • command.tsx: DialogHeader/DialogTitle are rendered as siblings of DialogContent rather than inside it. aria wiring still works via Radix context, but Dialog.Root always renders children, so this leaves a persistent sr-only heading in the DOM when the palette is closed and diverges from the idiomatic shadcn pattern. Move the header inside DialogContent.

Worth a manual check:

  • notifications-menu.tsx handleNavigate only navigates when notification.channelName exactly equals a sessionId — if those are different id spaces, clicking a notification silently no-ops. Please click through against real notifications.

Nits (non-blocking):

  • settings-dialog.tsx collaborators list keeps a nested max-h-40 overflow-y-auto scroll region, contradicting the 'DialogBody is the only scroll region' convention applied to invitation-dialog.
  • components.json adds a third-party registry proxy (proxy.collectui.pro) with a bearer license key — only matters for future npx shadcn add, but confirm the proxy/license is trusted.
  • Controlled SidebarProvider still writes the sidebar_state cookie that's never read back; mobile mounts a second global Cmd+B listener toggling an unused openMobile.

Verified fine: no Cmd+K/Cmd+B collision; showCloseButton / NotificationCard.onNavigate / useIsMobile all exist on-branch; rail CSS vars inherit into the fixed handle; AppSidebar gated behind !isDetailExpanded; data-active v4 fix is correct.

Replaces the sidebar + site-header shell with ReUI's app-shell-4 pattern: one
`collapsible="icon"` shell holding two inner sidebars — a permanent icon rail
and a 440px list panel — beside a single action header.

- Rail (nav-rail) owns view navigation, agent presence and the global tools
  (search, notifications, account). Replaces nav-main/nav-agents/brand on
  desktop; the mobile sheet still uses them.
- List panel (list-panel) hosts the per-view list. Threads is rebuilt on the
  MailItem pattern: header + search row + filter tabs (All/Starred/Archived/
  DMs) + rich preview rows. Archived and DM sections become tabs.
- One action header (app-header) replaces every per-view header bar: expand
  control, prev/next navigation through the current list, the selected item's
  title, and a toolbar each view fills through a portal (AppHeaderActions), so
  view logic stays in the view. Deletes site-header.
- Knowledge is split into list + detail so it uses the shell instead of
  re-implementing a split view, which also gives it collapse for free. Skills
  and FileGrid fold their title rows into the header.
- Threads gain real unread state. The backend has no per-thread read marker,
  so it is derived client-side from activity vs. last-opened, persisted in
  localStorage and baselined on first visit. lastEventAt comes back null on
  some workspaces, so activity falls back to createdAt plus an observed
  preview-change signal. The rail dot and row dots now mean unread instead of
  "list is non-empty" and "running".
- List collapse is remembered per view in a cookie, so switching views or
  reloading no longer resets it. The sidebar's own sidebar_state cookie was
  never read back under controlled usage.

Also lands the radix-nova tabs component by hand and fixes two defects it
surfaced: tabs shipped `data-active:` variants that never match Radix's
`data-state="active"`, and the rail's icon buttons had no accessible name.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants