feat(web): chat-first shell redesign — runs rail, composer-first Home, warm reskin #50
No reviewers
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Cloonar/coding-lab!50
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "lab/20260708-1248"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements the full maintainer spec from the #41 design interview in five commits that mirror the suggested slices.
Closes #41
What changed
① App shell (
d9c46f8) — the runs rail is the app's spine on every authenticated page: persistent 260px rail ≥1024px (collapsible via chevron / Ctrl+Cmd+B, state inlocalStorage), the same SideNav as a left overlay drawer below that (hamburger + left-edge swipe to open; scrim / leftward swipe / Escape / route change to close; iOS-standalone-PWA edge-gesture caveat documented in code). Rail = live instances only, attention-first (needs_input/question→ accent dot →working→ rest, neweststarted_atwithin groups), no destructive actions in rows. Dashboard dissolved: repo cards →/repos, Runs →/history(/runsredirects), ClaudeAuthCard → Credentials. TopBar deleted.② New-run composer (
f5c10c7) —/is a big centered composer: repo chip (last-used remembered, cloning/error repos disabled with live progress), model/effort chips through the existing resolution chain, optional label behind…. Send =startInstance→ navigate; typed text becomes a client-side queued first message rendered as a pending user bubble that auto-sends exactly once when the transcript is confirmed available (take-before-POST idempotence; failure seeds the composer draft; tab close loses it — documented and accepted; no backend change). Empty send = plain spawn. The AFK machinery re-homes under the composer as a compact per-repo strip (same greyed-hint/paused/Reset semantics); a slim banner links to Credentials while Claude is logged out.③ Warm reskin (
108e2d2,277142b) — token-level swap: bone/ivory light, warm-charcoal dark, terracotta#d97757accent. Source Serif 4 variable (OFL) vendored as static woff2 (no npm dep) for headings + assistant prose. Manifest/theme-color follow. Theme stays OS-driven.④ Chat restyle (
60a9ab4) — assistant messages lose the bubble (serif prose on the background, full width); user messages become a soft warm-neutral right-aligned bubble; tool chips flatten to quiet bordered mono rows. All #35 behaviors preserved —RunChat.tsxhad zero edits in this slice (pure CSS) andlib/chatStream.tsis untouched.⑤ Review fixes + docs (
0d37595) — from an adversarial review pass: closed drawer now leaves the a11y tree/tab order (was focusable off-screen — worse than the old menu, which unmounted); AFK budget countdown re-homed onto rail rows (it lived only in the deleted InstanceList); rail rows carry the state word in their accessible name (dot is color-only); 44px targets restored on two controls. ADR-0025 records the pivot; CONTEXT.md updated.Decisions worth reviewer attention
--accent-textis warm coffee-brown, not white — white on#d97757measures 3.12:1 (AA fail); the brown clears 5.36:1. Accent buttons therefore have dark glyphs, which deviates from claude.ai's white-on-coral.--link— terracotta as text (links, active nav, tinted chips) uses a per-theme darker/lighter cut; raw accent on bone is 2.96:1.…popover holds only the label: manual spawn accepts label/model/effort (internal/httpapi/instances.gohas no options bag), so #21 stays open on its own surfaces.automarker back in the rail.Verification
tsc --noEmit,eslint,prettier --check,vitest run(426 passed / 34 files),vite build— all green./repos,/history, Login, and the collapsed-rail state.🤖 Generated with Claude Code
https://claude.ai/code/session_01Y7KA3oRdeGYu8ExvkQReyX