nav-v2: drop top header, move repo switcher + user card into side nav #1086

Closed
opened 2026-05-10 22:28:19 +00:00 by claude-desktop · 0 comments
Collaborator

User story

As an operator using the dashboard, I want the top header gone and its contents folded into the side nav (workspace switcher at top, user card + status + notifications at bottom), so that the side nav becomes the single chrome surface — like Cursor, Claude Code, Linear, Discord — and the content area reclaims ~56px of vertical space.

Background

Since nav-v2 shipped (milestone #39), the side nav already carries primary navigation. The top header in app-shell.tsx:189-226 now only hosts:

  • Logo + "claude-hooks" wordmark (duplicated — brand already in side nav top)
  • <RepoSelector />
  • <NotificationsBell />
  • <ConnPill /> (LIVE/reconnecting/down)
  • <AvatarMenu />

Mobile drawer (sidebar-nav.tsx) already renders user card + theme/density toggles + logout at the bottom. Desktop just needs to catch up.

Acceptance criteria

Layout

  • Top header (apps/web/src/components/app-shell.tsx lines 189-226) removed; content area renders flush to top of viewport.
  • Side nav grows to full viewport height; brand strip stays at top.
  • Repo switcher (<RepoSelector />) moves to a dedicated row directly below the brand strip in the side nav (workspace-pill pattern: Linear / Slack).
  • Side nav body keeps a flex spacer so WORK + AGENTS sections stay top-aligned and the new utility/user cluster sticks to the bottom.

Bottom cluster (above user card)

  • <NotificationsBell /> rendered above existing "Keyboard shortcuts" + "Collapse navigation" rows. Unread badge preserved.
  • Existing "Keyboard shortcuts" + "Collapse navigation" rows kept where they are.

User card

  • New user card at the very bottom of the side nav: avatar, login, "Operator" chip, settings gear.
  • LIVE/reconnect/down status surfaces as a coloured dot overlaid on the avatar (green / amber / red); <ConnPill /> removed as a standalone element. Tooltip on the dot shows the verbose state ("LIVE", "Reconnecting…", "Disconnected").
  • Clicking the user card opens the existing <AvatarMenu /> upward (theme switcher, settings link, Forgejo profile, docs, logout). Menu content untouched — only the anchor + open direction change.
  • Version footer (claude-hooks v0.0.0 · <sha>) sits below the user card; hidden in collapsed mode (existing behaviour).

Collapsed (56px) mode

  • Brand strip → logo glyph only.
  • Repo switcher → icon-only with hover tooltip showing the active repo name.
  • Notifications icon shows badge dot; tooltip shows unread count.
  • User card → avatar + status dot only; click still opens AvatarMenu (anchored to avatar).

Mobile drawer

  • Drawer (already bottom-aligned user card) inherits the same status-dot on the avatar; existing <ConnPill /> removed from the drawer if present.
  • No behavioural change to drawer toggles otherwise.

Tests

  • Vitest browser-mode test for the new bottom cluster: status dot reflects connection state, click on user card opens AvatarMenu, click on notifications opens panel.
  • Visual regression / screenshot updated in any existing app-shell test.

Out of scope

  • Repo switcher UX changes beyond moving it — selection behaviour, recents list, multi-repo filtering remain identical.
  • AvatarMenu content (theme switcher, density, etc.) — moved as-is, no copy or option changes.
  • Density toggle promotion — stays inside AvatarMenu.
  • Notifications panel internals — only the trigger moves.

References

  • Side-nav rework milestone: nav-v2 (#39)
  • Current header: apps/web/src/components/app-shell.tsx:189-226
  • Sidebar: apps/web/src/components/sidebar-nav.tsx, apps/web/src/components/nav-sections.tsx
  • Avatar menu: apps/web/src/components/avatar-menu.tsx
  • Existing mobile drawer pattern (user card + actions at bottom) → desktop convergence target
  • Inspiration: Cursor (account bottom), Claude Code (user card bottom), Linear (workspace top + user bottom), Discord (status dot on avatar)
## User story As an operator using the dashboard, I want the top header gone and its contents folded into the side nav (workspace switcher at top, user card + status + notifications at bottom), so that the side nav becomes the single chrome surface — like Cursor, Claude Code, Linear, Discord — and the content area reclaims ~56px of vertical space. ## Background Since nav-v2 shipped (milestone #39), the side nav already carries primary navigation. The top header in `app-shell.tsx:189-226` now only hosts: - Logo + "claude-hooks" wordmark (duplicated — brand already in side nav top) - `<RepoSelector />` - `<NotificationsBell />` - `<ConnPill />` (LIVE/reconnecting/down) - `<AvatarMenu />` Mobile drawer (`sidebar-nav.tsx`) already renders user card + theme/density toggles + logout at the bottom. Desktop just needs to catch up. ## Acceptance criteria ### Layout - [ ] Top header (`apps/web/src/components/app-shell.tsx` lines 189-226) removed; content area renders flush to top of viewport. - [ ] Side nav grows to full viewport height; brand strip stays at top. - [ ] Repo switcher (`<RepoSelector />`) moves to a dedicated row directly below the brand strip in the side nav (workspace-pill pattern: Linear / Slack). - [ ] Side nav body keeps a flex spacer so WORK + AGENTS sections stay top-aligned and the new utility/user cluster sticks to the bottom. ### Bottom cluster (above user card) - [ ] `<NotificationsBell />` rendered above existing "Keyboard shortcuts" + "Collapse navigation" rows. Unread badge preserved. - [ ] Existing "Keyboard shortcuts" + "Collapse navigation" rows kept where they are. ### User card - [ ] New user card at the very bottom of the side nav: avatar, login, "Operator" chip, settings gear. - [ ] LIVE/reconnect/down status surfaces as a coloured dot overlaid on the avatar (green / amber / red); `<ConnPill />` removed as a standalone element. Tooltip on the dot shows the verbose state ("LIVE", "Reconnecting…", "Disconnected"). - [ ] Clicking the user card opens the existing `<AvatarMenu />` upward (theme switcher, settings link, Forgejo profile, docs, logout). Menu content untouched — only the anchor + open direction change. - [ ] Version footer (`claude-hooks v0.0.0 · <sha>`) sits below the user card; hidden in collapsed mode (existing behaviour). ### Collapsed (56px) mode - [ ] Brand strip → logo glyph only. - [ ] Repo switcher → icon-only with hover tooltip showing the active repo name. - [ ] Notifications icon shows badge dot; tooltip shows unread count. - [ ] User card → avatar + status dot only; click still opens AvatarMenu (anchored to avatar). ### Mobile drawer - [ ] Drawer (already bottom-aligned user card) inherits the same status-dot on the avatar; existing `<ConnPill />` removed from the drawer if present. - [ ] No behavioural change to drawer toggles otherwise. ### Tests - [ ] Vitest browser-mode test for the new bottom cluster: status dot reflects connection state, click on user card opens AvatarMenu, click on notifications opens panel. - [ ] Visual regression / screenshot updated in any existing app-shell test. ## Out of scope - Repo switcher UX changes beyond moving it — selection behaviour, recents list, multi-repo filtering remain identical. - AvatarMenu content (theme switcher, density, etc.) — moved as-is, no copy or option changes. - Density toggle promotion — stays inside AvatarMenu. - Notifications panel internals — only the trigger moves. ## References - Side-nav rework milestone: nav-v2 (#39) - Current header: `apps/web/src/components/app-shell.tsx:189-226` - Sidebar: `apps/web/src/components/sidebar-nav.tsx`, `apps/web/src/components/nav-sections.tsx` - Avatar menu: `apps/web/src/components/avatar-menu.tsx` - Existing mobile drawer pattern (user card + actions at bottom) → desktop convergence target - Inspiration: Cursor (account bottom), Claude Code (user card bottom), Linear (workspace top + user bottom), Discord (status dot on avatar)
claude-desktop added this to the nav-v2 milestone 2026-05-10 22:28:28 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/claude-hooks#1086
No description provided.