refactor(nav): drop mobile bottom-tab bar, slide nav drawer from left #579

Merged
charles merged 3 commits from refactor/nav-drop-bottom-bar-left-drawer into main 2026-04-30 18:53:02 +00:00
Collaborator

Summary

claude-hooks is operator-watch, not a high-frequency switcher (Twitter, Slack, Discord). Operators park on Board and hop a few times per session — the bottom bar's 64 px + safe-area inset cost dwarfs the convenience it buys, and it duplicates the hamburger drawer (3 items vs 5; operator has to remember which is canonical). Linear, Vercel, Sentry, Forgejo, Notion all ship drawer-only on mobile for the same reason.

Changes

  • Drop BottomTabBar, BOTTOM_TAB_ITEMS, and the pb-[calc(4rem+...)] inset on <main>.
  • Flip the nav drawer to the left side. Universal nav-drawer convention is "originate from the same edge as the hamburger trigger" — Material, iOS, Android, Linear, Vercel.
  • Add side?: "left" | "right" prop on <Drawer>. Existing surface drawers (workspace breakdown, agents detail) keep the right-side default. Add matching ch-slide-in-left / ch-slide-out-left keyframes.

Test plan

  • bun run typecheck clean.
  • just restart — service back up, dist rebuilt.
  • Mobile viewport: hamburger opens drawer from the left; backdrop click + Esc close it; focus trap intact.
  • No bottom bar; board cards reach to the bottom of the viewport.
  • Surface drawers on Workspace + Agents still slide from the right.

🤖 Generated with Claude Code

## Summary claude-hooks is operator-watch, not a high-frequency switcher (Twitter, Slack, Discord). Operators park on Board and hop a few times per session — the bottom bar's 64 px + safe-area inset cost dwarfs the convenience it buys, and it duplicates the hamburger drawer (3 items vs 5; operator has to remember which is canonical). Linear, Vercel, Sentry, Forgejo, Notion all ship drawer-only on mobile for the same reason. **Changes** - Drop `BottomTabBar`, `BOTTOM_TAB_ITEMS`, and the `pb-[calc(4rem+...)]` inset on `<main>`. - Flip the nav drawer to the left side. Universal nav-drawer convention is "originate from the same edge as the hamburger trigger" — Material, iOS, Android, Linear, Vercel. - Add `side?: "left" | "right"` prop on `<Drawer>`. Existing surface drawers (workspace breakdown, agents detail) keep the right-side default. Add matching `ch-slide-in-left` / `ch-slide-out-left` keyframes. ## Test plan - [x] `bun run typecheck` clean. - [x] `just restart` — service back up, dist rebuilt. - [ ] Mobile viewport: hamburger opens drawer from the left; backdrop click + Esc close it; focus trap intact. - [ ] No bottom bar; board cards reach to the bottom of the viewport. - [ ] Surface drawers on Workspace + Agents still slide from the right. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(board): running cards land in impl under group=stage
All checks were successful
qa / dockerfile (pull_request) Successful in 7s
qa / qa (pull_request) Successful in 1m46s
31eddb92b6
`cardBoardStage` only consulted the `stage:*` label; cards without one
(any freshly assigned issue that has not been manually restaged) fell
through to `triage`. Running tasks dispatched via the regular
`issues.assigned` flow are precisely that case — `area:dashboard +
type:user-story` arrives without `stage:*`, so the four agents the
operator just kicked off rendered in the Triage column instead of
Implementation.

Fall back to `card.stage` (already populated server-side from the
card's `status` via `deriveStage`) before defaulting to `triage`. The
`stage:*` label still wins so manual drag-restages stay sticky.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
refactor(nav): drop mobile bottom-tab bar, slide nav drawer from left
Some checks failed
qa / dockerfile (pull_request) Successful in 6s
qa / qa (pull_request) Failing after 1m12s
62203056b5
claude-hooks is operator-watch, not a high-frequency switcher (Twitter,
Slack). Operators park on Board and hop a few times per session — the
bottom bar's 64 px + safe-area inset cost dwarfs the convenience it
buys, and it duplicates the hamburger drawer (3 items vs 5; operator
has to remember which is canonical). Linear, Vercel, Sentry, Forgejo,
Notion all ship drawer-only on mobile for the same reason.

Drop `BottomTabBar`, `BOTTOM_TAB_ITEMS`, the `pb-[calc(4rem+...)]`
inset on `<main>`, and the matching dom assertions. Reclaim the
viewport.

Flip the nav drawer to the left side. Universal nav-drawer convention
(Material, iOS, Android, Linear, Vercel) is "originate from the same
edge as the hamburger" — the trigger sits on the left of the header,
so the drawer should too. Surface drawers used elsewhere (workspace
breakdown, agents detail, etc.) keep the right-side default; the
component now takes a `side?: "left" | "right"` prop.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
claude-desktop closed this pull request 2026-04-30 18:43:04 +00:00
Author
Collaborator

Closing — premature. R1 chat-overhaul tickets (#564–#572) are in flight and #570 (⌘K palette + ? overlay) is going to touch app-shell.tsx + drawer.tsx too. Re-spec as a proper ticket after R1 lands.

Branch refactor/nav-drop-bottom-bar-left-drawer left in place so the diff isn't lost; will rebase + reopen behind the polish sweep.

Closing — premature. R1 chat-overhaul tickets (#564–#572) are in flight and #570 (⌘K palette + `?` overlay) is going to touch `app-shell.tsx` + `drawer.tsx` too. Re-spec as a proper ticket after R1 lands. Branch `refactor/nav-drop-bottom-bar-left-drawer` left in place so the diff isn't lost; will rebase + reopen behind the polish sweep.
claude-desktop reopened this pull request 2026-04-30 18:44:01 +00:00
test(board): update side-panel snapshot for new drawer class order
All checks were successful
qa / dockerfile (pull_request) Successful in 6s
qa / qa (pull_request) Successful in 1m41s
d93fdfe71a
`<Drawer>` gained a `side?: "left" | "right"` prop in this branch; the
conditional `cn()` reorders side-specific classes (`right-0`,
`border-l border-border`) after the base set. Identical class set, just
different order. Refresh the side-panel snapshot to match.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
reviewer approved these changes 2026-04-30 18:52:19 +00:00
reviewer left a comment

CI green on d93fdfe. Drawer side prop is clean — left/right classes and keyframes are consistent, default preserves all existing call-sites. BottomTabBar and the pb-[calc(4rem+...)] inset removed cleanly; snapshot correctly updated to reflect the new conditional class order.

Nit (not blocking): pivot-logic.ts gains a card.stage server-computed fallback that is not mentioned in the PR description or test plan. The logic is safe (STAGE_SET.has(card.stage) guards it, TypeScript is happy), but worth calling out in the body so future bisects land on the right commit.

CI green on `d93fdfe`. Drawer `side` prop is clean — left/right classes and keyframes are consistent, default preserves all existing call-sites. `BottomTabBar` and the `pb-[calc(4rem+...)]` inset removed cleanly; snapshot correctly updated to reflect the new conditional class order. Nit (not blocking): `pivot-logic.ts` gains a `card.stage` server-computed fallback that is not mentioned in the PR description or test plan. The logic is safe (`STAGE_SET.has(card.stage)` guards it, TypeScript is happy), but worth calling out in the body so future bisects land on the right commit.
charles deleted branch refactor/nav-drop-bottom-bar-left-drawer 2026-04-30 18:53:03 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/claude-hooks!579
No description provided.