Files
buzz/desktop
Matt Toohey cde664e728 feat(desktop): move the Project Canvas beside project chat
The Canvas preview sat above the message timeline as a fixed 25.2/28.8rem
strip, so it ate the top of every project channel's chat: the timeline
started below the fold, and a "Chat preview boundary" marker had to be
drawn across the full Canvas to show authors where that fold landed.

Put the preview in a right-hand pane instead. Chat keeps its full height,
and the Canvas gets a tall column, which suits a dashboard of stacked
widgets far better than a letterbox.

- `ChannelViewOverride` gains `mainColumnHeaderPlacement`
  ("top" | "right", default top). `ChannelPaneMainColumn` lays the header
  out as a sibling column (`order-last`, `clamp(24rem, 38%, 28.8rem)`)
  when it is "right" and keeps the existing `contents` pass-through
  otherwise, so no other channel view changes. `ProjectChannelHome` asks
  for "right" on the chat tab and "top" on the canvas tab, where the
  surface still fills the pane.
- The pane is container-queried, not viewport-queried: it appears only
  once the chat column itself is at least 52rem wide, so a narrow window
  shows chat at full width and users reach the Canvas through its tab.
  `ChannelPane` also passes `hideRightHeader` when a split auxiliary pane
  is open, so a thread, profile, or agent panel takes that space rather
  than competing with it. The frame stays mounted (`display: none`), so
  opening and closing a thread never reloads the package or drops its
  live subscriptions.
- The preview-boundary marker goes away with the fold it described, and
  "Show full canvas" becomes a tooltipped icon button pinned
  bottom-right, since a full-width labelled button no longer fits a 24rem
  column. It follows the existing icon-button idiom: one `aria-label` on
  the button, matching tooltip copy.

The e2e spec binds the new geometry — chat and composer both end at or
before the pane's left edge and the pane is taller than it is wide; the
narrow-viewport test now asserts the pane is hidden and the full tab is
the way in; and a new 1920px test opens a thread to check the pane
yields, chat takes the width, and the frame's `src` survives the round
trip.

Verified: desktop unit suite 5987 passing, project-channel-canvas 8
passing, the project and thread layout specs 6 passing, and tsc, biome,
px-text, pubkey-truncation, and the file-size gate clean. Three specs
fail on this branch independent of this change —
project-cold-start.spec.ts:76 and :107 plus
project-empty-state-alignment.spec.ts:48 look for
`project-home-context-panel`, whose component has had no callers since
the channel-first migration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Matt Toohey <contact@matttoohey.com>
2026-09-02 16:42:24 +10:00
..
2026-06-11 15:06:24 +00:00

Buzz

Desktop chat shell with:

  • Tauri + React + TypeScript + Vite
  • Tailwind CSS
  • shadcn/ui-ready shared components
  • Biome (lint/format/check)
  • Feature-driven frontend structure

Scripts

  • pnpm dev - run the web frontend
  • pnpm tauri dev - run the desktop app
  • pnpm build - typecheck and build frontend
  • pnpm typecheck - TypeScript checks
  • pnpm lint - Biome lint
  • pnpm format - Biome format (write)
  • pnpm check - Biome check

Structure

  • src/shared - reusable app-wide code (ui, lib, styles)
  • src/features - feature modules (vertical slices)
  • src/app - top-level app composition