1.5 Web app shell + navigation
The chrome every signed-in surface lives inside: a persistent left sidebar holding project-scoped navigation (Issues, Boards, Settings), a thinner top nav for workspace switching + user menu + theme + cmd-k, and a main content panel. Replaces 1.3.4's temporary top-nav project switcher with the durable sidebar-driven IA Linear / Jira / GitHub Projects all use. Responsive (collapses to a drawer below the md breakpoint), keyboard-navigable end-to-end, theme-aware via the existing two-axis ThemeProvider from Story 1.0.5. No new data layer — every Subtask composes existing primitives + already-shipped services.
Prerequisites: Story 1.0.5 is the load-bearing dependency — the sidebar, command palette, and theme toggle all compose existing primitives (Button, Dialog, Tooltip, Popover, Toast, the ThemeProvider in lib/theme/, the --el-* token vocabulary). Story 1.2 ships the WorkspaceSwitcher the new top-nav consumes; Story 1.3 ships ProjectSwitcher + getActiveProject(). After 1.5, the top-nav project switcher from 1.3.4 is retired — the sidebar header carries it.
Verification
- Pull the merged Story branch;
pnpm install && pnpm dev. - Sign in (use the seeded auth-credentials fixture user); confirm landing at
/dashboardwith the sidebar visible on the left and the top-nav across the top. - Click "Issues" / "Boards" / "Reports" / "Settings" in the sidebar — each navigates and the active item highlights.
- Click the sidebar collapse button → sidebar shrinks; reload → still collapsed. Click again → expands; reload → still expanded.
- Press
⌘K→ palette opens. Type "issues" → highlighted match.↵→ URL is /issues. - Press
⌘K→ type the alternate workspace's name → ↵ → workspace switches (cookie + sidebar contents reflect it). - Press
⌘K→ type "theme" → ↵ → the theme toggles (light ↔ dark). Reload → preserved. - Press
?→ shortcut cheatsheet opens, listing ⌘K / ⌘\ / ? at minimum.esc→ closes. - Resize to a 375×812 viewport → sidebar disappears, hamburger appears in top-nav. Click hamburger → drawer slides in with scrim. Click an item → drawer closes after route change.
- Open the user menu → "Sign out" → redirected to /sign-in. Sign back in.
- Press
⌘K→ "Sign out" → same outcome (palette path). - Sign in as a user with zero projects in their workspace (or temporarily archive all projects via Settings → Project) → confirm the sidebar header shows the projects empty-state CTA inline and project-scoped nav is hidden.