feat(web): unified app sidebar — global nav, gear settings, sidebar New Task#1165
Draft
zeval wants to merge 20 commits into
Draft
feat(web): unified app sidebar — global nav, gear settings, sidebar New Task#1165zeval wants to merge 20 commits into
zeval wants to merge 20 commits into
Conversation
Mounts a single collapsible AppSidebar at the root layout that replaces the former WorkspaceRail, OfficeSidebar, and dockview-embedded sidebar pane. Wires per-section expand + collapse state through a new UI slice with localStorage persistence, ports projects/agents/settings/tasks sections, and trims integrations / quick-chat / settings buttons + the home breadcrumb from the dockview top bar (debug-only MoreToolsMenu kept). Strips the sidebar column from every preset and the panel registry; persisted sidebar panels are dropped by the existing sanitize layer at restore time.
The dockview top bar no longer renders the IconHome breadcrumb after the unified sidebar landed — the home navigation now lives in AppSidebar's primary nav. Update the workflow-filter spec to click that link instead.
…oter migration Gates office-only nav (Inbox, Agents, Projects, New Task) behind the office feature flag, renames Tasks → Kanban as the bottom flex-grow section, replaces the gradient workspace picker with a minimal trigger when office is off, and moves Stats/Improve/What's-New/Office out of the kanban top bar into the AppSidebar footer + a dedicated Integrations section. Expands Settings into a collapsible deep tree mirroring the old SettingsAppSidebar so /settings pages can drop their nested SidebarProvider.
Adds a persistent drag-resize handle on the AppSidebar's right edge that clamps between APP_SIDEBAR_EXPANDED_WIDTH and 30vw; width is stored on the appSidebar slice and persisted to localStorage. Drops the dockview top bar's overflow popover (TopbarActionOverflow) in favor of always-inline clusters, and replaces the debug "More tools" dropdown with a single debug toggle button.
Section headers now lead with a clean uppercase label, drop the mono clash, lift contrast from /60 to /70, and end with the collapse chevron at the right so the section body aligns flush under the label. The Tasks section's filter bar (view chips + gear in a card-tinted strip) is replaced by a compact view dropdown that lives in the section header. Drag-to-reorder lives in the existing filter popover, which is now reachable from the same gear button. Settings moves below Tasks so the kanban list keeps the flex-grow seat in the sidebar.
The kanban top bar's Quick Chat button is removed now that Quick Chat lives in the AppSidebar; workspaceId stops being threaded into the tablet and desktop header variants. Group headers inside the Tasks section (kanban workflow steps) lose the opaque background strip and the section-label uppercase styling so they read as inline subgroup rows, not duplicate section dividers. The tasks-section wrapper drops its negative margin so the group rows sit flush under the TASKS label instead of bleeding out past it.
SettingsLeaf gains a leadingIcon slot for pre-rendered visuals; agents
group passes <AgentLogo agentName={agent.name}> so each profile row
shows its agent's logo like it did before the old SettingsAppSidebar
was retired.
The Add task button (CreateTaskTopbarButton) leaves both the desktop and tablet kanban headers; New Task is now an unconditional primary nav item on the AppSidebar, falling back to a disabled affordance when no workspace is active. AppSidebar header gains a Kandev wordmark that links to /, with a single-letter K mark in collapsed-rail mode. PageTopbar's root variant no longer renders the parent brand label when backLabel is empty, so the home view's top-left "Kandev" goes away in favor of the sidebar.
TOGGLE_SIDEBAR's configurable default is now UNBOUND_SHORTCUT (the new sentinel for "no binding"); matchesShortcut already returns false on an empty key, so the keybind hook needs no change. Keyboard shortcuts settings show "Unbound", expose a Clear (X) button when a custom binding is set, and the reset icon falls back to unbound for entries whose default is unbound. PageTopbar's breadcrumb variant no longer prepends the Home back-link when backHref is "/" (the AppSidebar provides Home navigation).
- Extract AppSidebarNewTaskItem (office vs regular create dialog) with tests - Drop the Workspace selector from the kanban display dropdown and mobile menu sheet; the sidebar workspace picker is now the sole switcher - Factor SectionHeader out of AppSidebarSection; animate fixed sections via Collapsible while the grow (Tasks) section stays flex-driven - Polish brand header, share SIDEBAR_ITEM_ACTIVE accent-bar classes, move task group chevrons to the right, drop the task-item selected fill - Bump dockview layout keys to v3 and filter the orphaned 'sidebar' column so pre-AppSidebar default layouts no longer render a broken grid - Point the cross-workspace isolation e2e at the sidebar picker
…s nav - Restore subtask creation: the sidebar New Task row now shows a trailing subtask affordance when viewing a task (regular mode), reopening the NewSubtaskDialog the retired dockview header dropdown used to provide - Fix settings pages not scrolling: scroll the content region (topbar stays pinned) via min-h-0 + overflow-y-auto - Add a footer gear that toggles a settings-only sidebar takeover; the gear spins on toggle. Mode is transient (never persisted) and force-expands a collapsed rail on entry - Make the settings nav a single-open accordion: opening one top-level group closes the others and reveals its subsections; route changes re-sync the open group. Extract the tree into a reusable SettingsTree - Repoint subtask e2e specs at the new sidebar affordance
The New Task relocation removed the kanban-header create-task-button and made the sidebar entry auto-navigate + open the office dialog under the e2e profile (office on), breaking ~20 specs that drive the regular task-create dialog. - Give the sidebar New Task the create-task-button testid so KanbanPage resolves it again - Drop the post-create auto-navigation so creating a task stays on the board (matches the retired kanban button; specs find/click the new card) - Ungate the subtask affordance from office mode (subtasks use the compact NewSubtaskDialog in both modes, as the old dropdown did) - Add a useRegularMode() helper that runs a spec file with KANDEV_FEATURES_OFFICE disabled (backend.restart bracket) and apply it to the 18 create-task specs - Point the System sidebar-navigation spec at a /settings/system page so the single-open settings accordion has that group expanded Validated: create-task, create-task-disabled-tooltip, create-task-branch-selector, and subtask all green (modulo pre-existing idleInput agent-timing flakes that CI retries absorb).
- Clicking a task in the global sidebar from a non-task page now navigates to the task route (mounts the dockview) instead of only rewriting the URL via an in-place layout switch that assumed the dockview was already mounted - Make the settings-mode 'Settings' header a close affordance (the footer gear is far from the tree); clicking it exits the takeover regardless of which group is expanded, and it fades in when opened - Fade in the Tasks (grow) section content on expand, matching the other sections' animated reveal - Enable next-themes disableTransitionOnChange so dark/light flips switch every surface in the same instant rather than each animating at its own duration - Add a regression e2e for sidebar→dockview navigation
The AppSidebar is global, so tasks.activeTaskId lingered after navigating Home, leaving the last-opened task visually selected in the sidebar. Gate the selected/active highlight by route — only highlight while on /t/ or /office/tasks/. Expose data-active on the sidebar task item for testability. Adds an e2e: entering a task highlights it; returning Home clears it.
On a fresh client-side navigation into a task the dockview can mount before the grid has painted, so measureDockviewContainer returned api.width/height = 0. Building the default layout at width 0 makes dockview collapse the horizontal columns into a vertical stack (chat / files+changes / terminal) instead of the intended side-by-side layout. Fall back to the viewport when neither the live container nor the api report a usable size; the resize observer then snaps the grid to the exact container size. TDD: dockview-measure.test.ts covers the zero-size fallback.
…he session tab Entering a task rendered a vertical stack (chat on top, files/changes in the middle, terminal at the bottom) instead of the side-by-side default. The chat->session-tab swap removed the 'chat' placeholder BEFORE adding the session panel; when chat was the only panel in the center group, removing it destroyed that group, the stored centerGroupId went stale, resolveInitialPosition returned undefined, and the session panel was appended as a new row — flipping the grid root to VERTICAL with three stacked groups. Fix: add the session panel into chat's live group first (resolveInitialPosition now prefers the chat panel's group), THEN remove the chat placeholder, so the center group never empties and the horizontal split is preserved. Also fixes the pre-existing pane-resize reload/clamp e2e failures, which were the same collapse. TDD: task-default-layout.spec.ts asserts the right column sits beside chat.
Settings was still a collapsible nav section in the sidebar AND auto-expanded on /settings routes. That also caused the reported bug: toggling the footer gear off while on a settings page revealed the normal sidebar with the Settings section already expanded, so the settings tree appeared to 'not close'. - Drop the Settings nav section (and its /settings route auto-expand) — the settings tree is reached only via the footer gear takeover - Delete the now-unused sidebar settings-section component - e2e: gear opens the tree and closes it even after navigating into a section
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Inbox, Projects, and Agents were gated on the office feature flag, so they were always visible when the feature was enabled. Gate them on actually being in the Office surface (an /office route, reached via the footer Office button) via a new useInOffice() hook — they stay hidden in the regular workspace and appear only after entering Office. Unit test for the hook; e2e (office fixture) asserts the sections appear on /office and are absent on the regular home.
The workspace picker swapped to a gradient/initials trigger (and gradient swatches in the dropdown) whenever office was enabled. Always use the plain name + chevron trigger and drop the gradient swatches, matching the previous design. Removes the now-unused workspace-gradient helper.
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.
Summary
Unifies the app navigation into a single global AppSidebar (replacing the legacy WorkspaceRail + OfficeSidebar + the dockview-embedded sidebar) and reworks the surfaces that moved as a result. Opening as a draft for review.
Highlights
sidebar-column filtering so pre-overhaul saved layouts don't render a broken grid.Bug fixes folded in
chatplaceholder before adding the session panel, destroying the center group and collapsing the horizontal split. Fixed by adding the session panel into chat's group first, then removing chat. (Also fixes the pre-existingpane-resize-rightreload/clamp e2e failures — same collapse.)disableTransitionOnChange); Tasks/settings-mode fade-in transitions.Tests
task-default-layout(horizontal layout),sidebar-task-open(navigation + Home deselect),settings-gear-only(gear opens/closes the tree).useRegularModehelper applied across the create-task specs).Notes