Chat UI redesign: quick-return mobile header, in-stream needs-input note, jump-to-latest pill, merged composer #35
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Cloonar/coding-lab#35
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Goal
Improve the chat view (
web/src/routes/RunChat.tsx, route/runs/:id) so that on mobile you can read long assistant messages comfortably, and the composer reads as one polished control. Phone-first; the app is a ~760px centered column at all widths, with a single breakpoint at 640px.Scope tags: 📱 = mobile only (<640px) · 🌐 = all widths
Primary files:
web/src/routes/RunChat.tsx·web/src/base.css(chat block ~L1597–1900) ·web/src/lib/chatStream.tsConstraints: no new dependencies — plain global CSS + SolidJS signals. A single scroll listener on
.chat-streamshould drive both §2 (header) and §4 (pill).Current pain points
ChatHeader, RunChat.tsx:323) is aflex-wraprow that wraps to 2+ lines on narrow screens.1 · One-line header +
•••dropdown 📱Collapse the wrapping header to a single non-wrapping row:
[← back] · [title · repo (truncates)] · [● state dot] · [•••]convostate chip (working / needs-input / question) shrinks to a small colored dot next to the title, reusing the existing convo colors; it expands back to the full text chip at ≥640px.•••opens an anchored dropdown containing: Show/Hide thinking (toggle, reflects current state) · Open / Attach (theOpenAffordance, when available) · Stop run… (destructive/red, keeps its existing two-step confirm). Items are contextual (Stop only for live runs, Open only when available);•••is always present for a stable layout.Acceptance
•••.•••dropdown exposes the thinking-toggle, open/attach (when present), and Stop (with its confirm).2 · Quick-return (hide-on-scroll) header 📱
Auto-hide the header while reading, reveal on reverse:
translateY— content must not reflow / jump..chat-stream.Acceptance
3 · Relocate the needs-input note into the stream 🌐
Move only the
needs_inputnote (currently RunChat.tsx:874, "Claude needs input — reply below, or open it in claude.ai.") out of the composer:.chat-stream, a subtle centered status line (styled likechat-lifecycle), not a chat bubble.needs_input, hides when the agent resumes working.needs_inputcollapses to just the input row. The other composer notes (ended / transcript-gone / question-state / working-hint) are unchanged.Acceptance
needs_input, "Claude is waiting for your reply." appears as the last stream item (status-line style, not a bubble) and clears when working resumes.4 · Jump-to-latest pill 🌐 (new)
Closes the discoverability gap created by §2 + §3 — while reading scrolled-up you'd otherwise get no signal that Claude finished / needs you:
↓chevron + short label; slide-up + fade in; fades out on reaching bottom.Acceptance
needs_input.5 · Merge the send button into the textfield 🌐
Acceptance
Out of scope / follow-ups