# shadcn workspace migration ## Target Replace the custom workspace UI with the Base UI version of shadcn sidebar-09 at commit 98a1fe67b439324ddc857f47fbdce056600a4329. Preserve its icon rail, contextual second sidebar and SidebarInset. Adapt the rail to research chat and deck management, keeping the research panel mounted so SSE state remains live. On small screens, use the sidebar Sheet and keep all actions reachable. Use official MessageScroller, Message, Bubble and Marker for the existing Codex conversation. Keep transport, history, retry, stop, account selection, Markdown and citation navigation. Use shadcn primitives for forms, dialogs, menus and post metadata throughout the app. Use Tailwind v4 and shared shadcn semantic tokens; remove legacy control styles that override primitives. Install @shadcn/lint with an executable design-token policy alongside Biome. Update README and Nix dependency hash as needed. ## Verification - Typecheck, Biome, design lint, unit suite, production build, unused-code check. - Browser integration suite: decks, source editing, connections, conversation, citation navigation, menus and keyboard focus. - Render desktop plus 320/375/414/768 px: rail collapse, mobile Sheet, independent column scrolling, chat composer visibility, no document horizontal overflow. - Inspect screenshots and run Axe on relevant states. ## Status Completed on 2026-09-28. - SidebarProvider, nested icon/context Sidebars and SidebarInset now implement the referenced sidebar-09 structure; the mobile Sheet keeps its content mounted. - Research state and deck-dialog drafts live above the responsive shell. Closing or resizing the sidebar preserves drafts, selected accounts and retry identity. - MessageScroller, Message, Bubble/BubbleContent, Marker/MarkerContent, InputGroup and Collapsible replace the chat UI. Markdown list markers and headings remain visible after Tailwind's reset; citation highlighting uses theme tokens. - Forms, dialogs, dropdown menus, avatars, badges and empty states use Base UI shadcn components. No backend transport, storage or access contracts changed. - @shadcn/lint runs in pnpm lint and rejects raw palette colors. Nix dependency hash and README/deck docs are updated. Verification: 336 unit tests passed (one explicit live-relay test skipped), all 56 desktop/mobile E2E tests passed. After the final isolated chat styling fixes, all 10 research E2E tests and 22 related unit tests passed again. Typecheck, Biome/design lint, Knip, production build and the Nix package build passed. Browser checks covered 320/375/414/768px, rendered chat and post screenshots, Axe, dialog focus restoration, breakpoint draft preservation and closed-sidebar SSE deck updates. Automated browser tests use mock relay/research data. A subsequent dev-server smoke check through the Tailscale HTTPS URL confirmed the real relay displayed 14 posts across six columns without UI alerts. No production deployment was performed.