Agentic UI: Make the sidebar site-centric#4191
Conversation
Replace the sidebar's site+chat sublists with a flat list of site rows. Clicking a row opens the site's latest non-archived chat (or a new-chat route when it has none); chats no longer render in the sidebar. Each row aggregates its sessions' agent activity into one indicator with priority sync > pending question > working > new message. Extracts DeleteSiteDialog into its own component with an onDeleted callback, and forwards onClick/onPointerDown through Menu.Popup so menu clicks don't bubble into row navigation. Co-authored-by: Shaun Andrews <191598+shaunandrews@users.noreply.github.com>
Full-bleed 44px site icon with overlaid status badge in the site dropdown, flattened site-icon (no border/inner shadow), visible hover tint on the sidebar create button, floating sidebar toggle moved to the bottom-left of the main area, and settings-header padding aligned with the new layout. Co-authored-by: Shaun Andrews <191598+shaunandrews@users.noreply.github.com>
Brings over the exploration's AgentWorkingIndicator — a 2×3 grid of brand-blue pixels breathing out of phase — and uses it instead of the generic spinner for a site row's working state, matching the design exploration. Co-authored-by: Shaun Andrews <191598+shaunandrews@users.noreply.github.com>
Inline the UUID-safe settings-path check and single-caller helpers, require hasUnreadUpdate at the call site, drop the unused presentational prop from AgentWorkingIndicator, and collapse the four row-background aliases into one --sidebar-row-background var.
…ntric # Conflicts: # apps/ui/src/components/site-list/style.module.css
The seen/unread bookkeeping keyed off the siteId route param, so sitting on a site's settings page suppressed its unread badge even though the chat wasn't visible. Key it off the open session's site instead, and derive the settings-route outline directly from the route param.
|
I think this mostly looks good but one bit that I am finding strange is that the Screen.Recording.2026-07-15.at.8.32.05.PM.movWhen you click it at the bottom, it restarts the chat and opens a new one whivh makes sense but the |
That button is going away with #4177 |
Behavior when deleting site will be addressed by #4132 |
katinthehatsite
left a comment
There was a problem hiding this comment.
If the issues that I mentioned will be addressed in separate PRs, then the changes look good to me 👍 I did not spot any regressions
Maybe some styling comments could be cleaned up but I think overall, it looks fine 👍
…ntric # Conflicts: # apps/ui/src/components/sidebar-header/index.test.tsx
Could you share those in a Linear issue to ensure we don't miss that cleanup as a follow-up, please? 🙇 |
📊 Performance Test ResultsComparing 83d0e3b vs trunk app-size
site-editor
site-startup
Results are median values from multiple test runs. Legend: 🟢 Improvement (faster) | 🔴 Regression (slower) | ⚪ No change (<50ms diff) |


Related issues
How AI was used in this PR
Claude (Fable 5) extracted and adapted this change from the #3998 reference branch under close direction, preserving Shaun Andrews' original work via co-authored commits, and re-verified the result (typecheck, unit tests, light/dark visual pass in the browser UI). Code was human-reviewed throughout.
Proposed Changes
This is the capstone of the site-centric sidebar work: the sidebar becomes a flat list of sites, with no per-site chat sublists.
--studio-color-status-*tokens: the wpds palette has no vivid status colors (--wpds-color-fg-content-successresolves to near-black at dot size), which also fixes the session header's running dot rendering almost black.Two product decisions to be aware of (intentional for now):
aria-current+ active-row styling, not the literal "Current chat" label from the mockups.Testing Instructions
npm startand enable theAgentic UIfeature flag.Pre-merge Checklist
🤖 Generated with Claude Code