Repository navigation
Inbox: the Workspaces sidebar (close, open, peek, ⌘B) - #1810
Merged
Merged
Conversation
1 task
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.
The Inbox window's sidebar is now Workspaces' own sidebar primitive, copied with the owner's word (2026-10-09, recorded in the Workspaces brief
research/plans/plannotator-inbox-2026-10-06/briefs/inbox-sidebar.md). It closes and opens on the same spring. ⌘B / Ctrl+B toggles it and the choice is remembered. A rest on the left edge peeks it while it is closed. The edge collapses on a click and resizes on a drag. At a phone width it becomes a sheet. Only the mechanics and the motion came across. The skin stays the Inbox's own (inbox.css, the Tater mark, the sections).Files copied (Workspaces repo, read-only source at
ae582a66e; commit = last change to each file)packages/inbox/shell/shell-motion.tsapps/web/src/lib/shell-motion.tscd4a9bfd1motion/react;useRailMotionleft out (no rail)packages/inbox/shell/shell-animate.tsapps/web/src/lib/shell-animate.tscd4a9bfd1motion/reactpackages/inbox/shell/motion-style-div.tsxapps/web/src/components/ui/motion-style-div.tsxcd4a9bfd1motion/reactpackages/inbox/shell/useResizablePanel.tsapps/web/src/hooks/useResizablePanel.tsa15a2839bstorageinstead of localStoragepackages/inbox/shell/sidebar.tsxapps/web/src/components/ui/sidebar.tsxcd4a9bfd1inertat settle, mobile sheet on the same spring: as is. Tailwind classes becameib-classes. The provider no longer reads or writes localStorage: the Inbox drivesopen. Icon mode,none, floating/inset, right side, SidebarRail, the menu/group/skeleton parts and TooltipProvider were left out. The sheet portals into the provider's wrapper so it keeps the Inbox tokens, and uses Base UI's Dialog directly.sidebar.tsx)PanelLeftIconapps/web/src/components/icons/PanelLeftIcon.tsx0219b4694packages/inbox/shell/SidebarPeek.tsxapps/web/src/components/sidebar/SidebarPeek.tsx+apps/web/src/hooks/useIsDesktopLg.ts499aaa1d9,4459a16b8children. The hidden panel also getsvisibility: hiddenonce its slide-out ends, so the window holds one visible navigation.packages/inbox/shell/CollapsibleEdge.tsxapps/web/src/components/CollapsibleEdge.tsx+apps/web/src/components/ResizeHandle.tsx68afaf421,227b573f2packages/inbox/shell/SidebarShell.tsxapps/web/src/app/AppShell.tsxe2c77711donOpenChangedirectly instead of Workspaces' close/open refs. The page frame, search and assistant stay in Workspaces.inbox.css(sidebar block)--ease-enter,--shadow-sheet,--shadow-tooltip, the scrim colour fromapps/web/src/styles.cssa9184e4f0--ib-tokens on:root(the edge tooltip portals to the body)What else changed
packages/inbox/App.tsx: the shell wraps the Inbox'sSidebar(navigation) andmain.openis the stored choice&& !fileOpen. A file beside a thread (record 2.2) now closes the sidebar on the same spring instead ofdisplay: none, and the stored choice is left as it was. The old.ib-fileopengrid rules are gone.packages/inbox/components/Sidebar.tsx: a pick in the phone sheet closes the sheet.plannotator-inbox-sidebar-open, read and written with ui'sstorageinApp.tsx(open when absent), as the announcement cookies are. Nothing inpackages/uichanges (door review: the shared registry fed the guides.show viewer's pinned manifest).event.composedPath()[0]), so typing in the reply box keeps the sidebar.packages/inbox/package.json:motion ^12.38.0and@base-ui/react ^1.7.0. These are the specspackages/uialready pins. The lockfile resolves the samemotion@12.43.0,framer-motion@12.43.0(the version Workspaces runs) and@base-ui/react@1.7.0, with no second copy (bun.lock+2 lines).AGENTS.md: the Inbox section names the sidebar and the new spec.Geometry values (not person-facing limits)
The default width is 232 px (the record). The drag range is 200 to 520 px, with Workspaces' 520 max. The min is below Workspaces' 240 so the record's width fits inside the range. The edge closes past 100 px (Workspaces' 0.5 ratio). It keeps 320 px of the page (Workspaces'
reserveViewport). The width cookie isplannotator-inbox-sidebar-width. The peek shows from 1024 px, the sheet below 768 px, both as in Workspaces.Bundle and binary size (same build commands, before =
origin/main545c7af)apps/hook/dist/inbox.htmlapps/hook/dist/surface.html(build:surface)plannotatorbinaryThe guides.show viewer build matches its pinned manifest (
build:viewerthencheck:manifest: in sync).Build:
bun run --cwd apps/review build && bun run build:hook && bun build apps/hook/server/index.ts --compile --no-compile-autoload-bunfig --define '__CLI_VERSION__="0.0.0-dev"' --outfile <out>.Proofs
tests/e2e/inbox-sidebar.spec.ts(new, intest:e2e:inbox, compiled binary, tempPLANNOTATOR_DATA_DIRand HOME,PLANNOTATOR_BROWSER=none), 7/7:inertat settle; the cookie flipstest:e2e:inbox(every Inbox spec plus the new one) passes 80/80 against the compiled binary at the head.research/operational/inbox-proofs/sidebar-2026-10-09/in the Workspaces meta layer (inbox-sidebar-e2e.mp4,open-*.png,closed-*.png,peek-*.png,narrow-sheet-*.png,curves.json).side-by-side-strip.pngin the same folder. It compares Workspaces' own unmodified primitive, mounted in a harness in a temp clone atae582a6and served by Vite on free port 49224, with the Inbox. Both are captured at the same instants after the click under Playwright's fake clock. On the real clock, the per-frame widths match frame for frame within one frame's alignment. Both settle in 21 frames: close 226.3/215.8, 112.7/110.0, ... 0.3/0.3, 0. The harness and script are inframes/.Gates
bun run typecheckgreen.bun test packages apps/hook tests scriptsunder a temp data dir: 5876 pass. One unrelated failure,packages/server/agent-terminal.test.ts"node sidecar rebuilds spawn options", read a JSON file before it was written; it passes alone (5/5).bun run check:release-versiongreen.origin/main..HEAD: no leaks..semgrep.yml(the CI image) over the changed source: 0 findings.Left out
Deviations from the window record