Gallery: whole-window app scenes you can try (app.window)

Merged
TE
6d ago
+250-0

Leo: "we have teh gallery... we should have a faithful all-levle representation of the app through that stuff....." and "WE DONT NEED F***IGN SCREENSHOTS JUST LET ME TRY THE STUFF OUT".

What this adds

One gallery entry, app.window (webviews/src/gallery/scenes/AppWindow.gallery.ts), whose variants are whole-app scenes. Each one mounts the real agent pane (acpmux/main.tsx, AcpmuxApp) through agentPaneEntry, at the pane's real size in a real-size cmux window (the default window frame, src/gallery/window.ts), in dark and light. These are live panes, not pictures: every menu and panel is opened by the play steps a person's clicks would make, and the pane stays usable afterward, so anyone can open the gallery and try it.

VariantWhat it showsHow it gets there
new-tabThe New Tab page as the app opens it (no stored template, so Minimal), with recent chatsthe host's ready.newTab answer, as the app sends it
chat-session-infoA chat after a few turns (reads, edits, a test run, a code block, a follow-up) with Session Info openopen by default; if it is closed, the play clicks the header's Session Info toggle
composer-model-pickerThat chat with the composer's model menu openplay: click the model button
composer-effort-menuThe model menu with the current model's effort levels openplay: model button, then the Effort levels (side dropdown or submenu, by keyboard)
environment-pickerA new chat with the computer (machine) picker open over a fleet of machinesplay: click the location row's Computer control

All data is synthetic, from src/gallery/fixtures/acpmux.ts (chat, noChat, manySessions, fleetPeers, CONTEXT_BREAKDOWN). No native chrome is drawn: window mode sizes the pane from the app's own metrics and draws only the web surface, as for every entry.

covers names the real component files (App.tsx#AcpmuxApp, NewTabScreen, ChatInspector/InspectorPanel, QuickModelMenu.tsx, ComposerPickers.tsx, ComposerContext, EnvironmentPicker.tsx), so scripts/gallery/touched.ts picks these scenes up when those files change.

Design specs (leo-workspace design/): new-tab.md, session-info.md, composer.md, model-picker.md, environment-picker.md. This PR changes none of those surfaces; it only shows them.

Gallery: app.window

Verification

Rendered on Linux CI (cmux-ci fast checks, Chromium, --frame window, 16:9, one pane, Apple System Colors dark and light): bun scripts/gallery/manifest.ts --entries app.window --themes pair then scripts/gallery-matrix/runner.ts. All 10 cases reached ready=1 and every play finished. I opened each still and checked it: New Tab shows its composer, the chat shows Session Info open, the model menu is open, the effort levels are open beside it with High checked, and the machine picker is open with This Mac, My machines and Cloud and VMs. Nothing is blank or cut off.

On the same run, bun test test/gallery-coverage.test.ts test/gallery-env.test.ts test/pane-english.test.ts test/gallery-agent-pane-entries.test.ts test/gallery-entry-store.test.ts has one failure, "every cover names a component or page that exists". It lists 54 covers from other entries (none from app.window), so it comes from the base, not this PR. bun run check type check: no errors. Oxlint: 0 errors.

Observed / Not run

Observed: the 10 renders and the tests above. Not run: WebKit renders, and a native app capture (this PR is a gallery fixture only).

Changelog

none

Risk: low (gallery fixture only, no shipped code).

Agent session: agent session

šŸ¤– Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Adds app.window, a gallery entry that mounts the real agent pane at its real window size in five whole-app scenes a person reaches by using the app, so anyone can open the gallery and try the app instead of looking at screenshots.

  • Variants: New Tab, a chat with Session Info open, the composer's model menu, its effort levels, and a new chat's machine picker.
  • Open states come from play steps a person's clicks would make; each pane stays live after the scene renders.
  • All data is synthetic, and covers name the real component files so the scenes stay current when those files change.