Repository navigation
fix(chat): match the composer's plus button to its 26px footer row - #8216
Conversation
The model and mode pills and the send, stop and mic buttons are 26px, but the plus button that opens the mention menu was still a 32px square, so it stood taller than the rest of the row. It is now 26px, and every footer icon button is a circle, the shape the New Workspace submit uses. The six inline class strings share four constants.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (2)
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review. 📝 WalkthroughWalkthroughComposerBody now applies shared styling classes to dictation, stop-response, and send controls. ContextButton is now smaller and circular, with a reduced plus icon. ChangesPrompt input button styling
Priority: ⬇️ Low Estimated code review effort: 1 (Trivial) | ~5 minutes Change: Bug fix Suggested reviewers: Merge Risk: ⚪ Minimal · up to The footer controls’ sizing and shape are aligned, with no identified behavior change that blocks merging. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
No issues found across 2 files
You’re at about 91% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.
Architecture diagram
sequenceDiagram
participant Client as Client Browser
participant UI as Chat UI (chat-ui)
participant Composer as ComposerBody Component
participant Context as ContextButton Component
participant Styler as Style Constants (Tailwind CSS)
Note over Client,Styler: Chat Composer Footer Rendering (Runtime)
Client->>UI: Render chat interface
UI->>Composer: Mount ComposerBody
Composer->>Styler: Access shared footer button style constants
Note over Composer,Styler: Footer Controls Rendering
Composer->>Context: Render plus button (NEW: 26px circle)
Context->>Styler: Apply consistent size/radius classes
Styler-->>Context: Styled button (26px rounded-full)
Note over Composer,Styler: Dictation Controls (CHANGED: shared constants)
Composer->>Styler: Apply FILLED_FOOTER_BUTTON_CLASS (retry, stop)
Composer->>Styler: Apply GHOST_FOOTER_BUTTON_CLASS (discard, mic)
Note over Composer,Styler: Send Button States (CHANGED: unified inactive)
alt canSend = true
Composer->>Styler: Apply filled primary style (26px rounded-full)
else canSend = false
Composer->>Styler: Apply INACTIVE_SEND_BUTTON_CLASS (secondary)
end
Styler-->>Composer: Consistent 26px circular buttons
Composer-->>UI: Rendered footer row (all controls aligned)
UI-->>Client: Display composer with uniform footer
Note over Composer: User Interaction
Client->>Composer: Click footer button
alt Plus button
Composer->>Context: Trigger onClick (open context menu)
else Send button
Composer->>Composer: submit() if canSend
else Mic button
Composer->>Composer: Toggle dictation session
end
🧹 Preview Cleanup CompleteThe following preview resources have been cleaned up:
Thank you for your contribution! 🎉 |
|
…re shape #8216 made the send, stop, mic and plus buttons circles. Keep its 26px sizing, restore the rounded-square corners they had before.
… chat agents (#8242) * feat(chat): a chat pane of its own, opened for any chat the host runs Chats lived inside the agent's terminal pane and were tracked by a terminal id that died when the chat took over, so chats with no pane (Roster's createSession, automation runs) never showed up, and a continued automation run could not find the chat it should prompt. - The chat-v3 pane now renders the ACP chat, keyed by its chat session; the ChatV3Pane prototype is removed. Saved terminal panes that held a chat move to a chat pane on load. - The CLI/CHAT toggle swaps the pane between a terminal and a chat pane, stopping the process behind the one it leaves. - useAutoAdoptChatSessions opens a chat pane for every live chat session in the workspace that no pane holds, on chat:sessions-changed. - agents.run takes surface: "chat" and starts a host chat session; a continued run prompts the previous run's chat when it is still live. Automations ask for a chat when the owner has the acp-chat flag. - listSessions reports live and terminalId; the chat shows a notice when it was stopped from outside. * fix(desktop): drop the Superset agent choice that opened the removed ChatV3 prototype * fix(chat): stop chat agents a workspace delete or a remount leaves behind Deleting a workspace stopped its terminals but not its chat sessions, so their agent processes ran until the host restarted. A chat pane that unmounted while its session was starting dropped the session and started a second one when it came back. A remount now joins the create in flight, and a session that starts after its pane is gone is closed. * feat(chat): the host starts a new workspace's chat With the chat flag on, a new workspace queued its prompt in desktop state and only started the chat once the workspace page was open. The create now asks the host for surface: chat, which starts the session in the worktree and sends the first message. Chat launches report their chatSessionId so the layout leaves them to the chat pane, and the setup-terminal chain applies only to terminal agents. The host's chat launch also takes a mode and attachments instead of falling back to a terminal. * fix(chat): show a harness notice as one plain line, like a tool summary * feat(chat): show account usage in the chat pane header The usage button read the account the terminal hook reports, which a chat agent never runs. The host now captures the account from the chat agent's own env when it launches, the same profile and API key checks as the hook, and keeps it on the chat's binding. The button moves up to the pane components so the terminal and chat headers share it. * feat(chat): load the chat at once and queue messages while the host connects A chat pane showed a spinner until the host answered, and forever when it never did: useChatSession seeded once and dropped a failed or hung request on the floor, and a new chat waited on createSession before drawing anything. The transcript and composer now render straight away. useChatSession retries the seed with backoff and a per-attempt timeout, and holds sent messages in the outbox until the stream is open. A chat with no session yet shows its composer and keeps messages in a queue on the pane, sent in order once createSession succeeds; createSession retries with the same command id while the host is unreachable and stops on an error the host answered with. Both show "Connecting to the host service…" meanwhile. * fix(chat): give the composer's footer buttons back their rounded-square shape #8216 made the send, stop, mic and plus buttons circles. Keep its 26px sizing, restore the rounded-square corners they had before. * feat(chat): resume a stopped chat by itself and keep its conversation on screen A chat whose agent stopped while it was open showed a panel and waited for Resume, and a resume showed an empty view until the agent replayed the transcript. The pane now resumes on its own, retrying with backoff, and keeps showing the stopped session's conversation with "Resuming the conversation…" until the new session is past starting; prompts typed meanwhile wait on the pane. The panel is left for a chat that moved to a terminal, or one that still fails after three attempts. useChatSession reports unreachable only once a request to the host fails, so a normal first load no longer says it is connecting. The replacement is polled in the background and on chat:sessions-changed, so an unfocused window does not delay the switch. * fix(chat-runtime): record a reply when the agent's cycle ends A reply's text reached the journal only when the next item opened or a prompted turn ended. A reply the agent wrote on its own, after a background task finished, has no turn end, so it stayed an empty item until the user's next message. Streamed text is not replayed, so any remount or reconnect in between showed nothing where the reply was. Claude marks the end of each cycle with a cost on usage_update; the open text is flushed there.
Summary
ComposerBodynow share four constants: base, ghost, filled and inactive send.Verification page with before/after captures and measurements: https://app.superset.sh/page/acp-chat-composer-footer-controls-on-one-height-0hmx0u
Why / Context
#8181 and #8199 brought send, stop and mic down to the pills' 26px. The plus button in
ContextButtonwas left at 32px, so its hover box stood 6px taller than the rest of the row. Sizes and icon sizes follow main; only the plus button's size and the corner radius change.Manual QA
Done in the dev desktop app over CDP, in the ACP chat pane opened from the sidebar:
Testing
tsc --noEmitinpackages/chat-ui: passes.bun test --isolateinpackages/chat-uion Bun 1.4.2: 4 pass. On Bun 1.3.14 thehistoryNavigationtest from feat(chat): composer shortcuts, Cmd+Enter steer, and image attachments in the transcript #8181 fails at import time, with or without this change.biome checkon the changed files: clean.Known Limitations
secondaryfill, which is a shade darker than the pills' 7% foreground tint. Both are left as they are on main.Summary by cubic
Matches the chat composer's plus button to the 26px height of the rest of the footer row and makes every footer icon button a circle, fixing the 6px hover-box mismatch left from #8181 and #8199. The six inline class strings in
ComposerBodynow share four constants: base, ghost, filled, and inactive send.Written for commit 53da8ed. Summary will update on new commits.
Summary by CodeRabbit