Skip to content

fix(chat): match the composer's plus button to its 26px footer row - #8216

Merged
AviPeltz merged 1 commit into
mainfrom
breezy-liquid-96603b60
Oct 6, 2026
Merged

AviPeltz merged 1 commit into
mainfrom
breezy-liquid-96603b60

Conversation

@AviPeltz

@AviPeltz AviPeltz commented Oct 6, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • The plus button at the start of the chat composer's footer was a 32px square. Everything else in that row is 26px: the model and mode pills, and send, stop and mic. The plus button now matches at 26px.
  • Every footer icon button is now a circle, the same shape as the New Workspace submit. That covers plus, send, stop, mic, dictation retry and discard.
  • The six inline class strings in ComposerBody now 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 ContextButton was 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:

  • Measured on main: plus is 32px tall, both pills and send are 26px.
  • Measured with this branch: all four are 26px with the same top. The boxes, icons and labels all centre on the same line.
  • Typed text into the composer: send keeps its primary fill as a circle.
  • Dictation and streaming states. They use the same class constants but were not driven live.

Testing

Known Limitations

  • The 16px send and plus glyphs are heavier than the 12px pill chevrons.
  • The inactive send uses the secondary fill, 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 ComposerBody now share four constants: base, ghost, filled, and inactive send.

Written for commit 53da8ed. Summary will update on new commits.

Review in cubic Turn on auto-fix

Summary by CodeRabbit

  • Style
    • Standardized the sizing and appearance of prompt composer controls.
    • Reduced the context button and its plus icon.

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.
@coderabbitai

coderabbitai Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: b601f605-926e-4b3f-916c-1e0f6f299d5a
📥 Commits

Reviewing files that changed from the base of the PR and between 5e9178e and 53da8ed.

📒 Files selected for processing (2)
  • packages/chat-ui/src/components/PromptInput/components/ComposerBody/ComposerBody.tsx
  • packages/chat-ui/src/components/PromptInput/components/ContextButton/ContextButton.tsx

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.


📝 Walkthrough

Walkthrough

ComposerBody now applies shared styling classes to dictation, stop-response, and send controls. ContextButton is now smaller and circular, with a reduced plus icon.

Changes

Prompt input button styling

Layer / File(s) Summary
Apply prompt input button styles
packages/chat-ui/src/components/PromptInput/components/ComposerBody/ComposerBody.tsx, packages/chat-ui/src/components/PromptInput/components/ContextButton/ContextButton.tsx
ComposerBody defines shared sizing and appearance classes and applies them to dictation, stop-response, and send buttons. ContextButton changes to a 26px circular shape, and its plus icon shrinks.

Priority: ⬇️ Low

Estimated code review effort: 1 (Trivial) | ~5 minutes

Change: Bug fix

Suggested reviewers: saddlepaddle

Merge Risk: ⚪ Minimal · up to 53da8

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)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 3 functions across 2 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title uses conventional commit format and clearly identifies the main change: matching the composer’s plus button to the 26px footer row.
Description check ✅ Passed The description explains the change and its context, and provides detailed manual QA and test results. It omits the template’s explicit Checklist section, but the reported checks make the description …
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Loading

Turn on auto-fix | Re-trigger cubic

@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

  • ✅ Neon database branch

Thank you for your contribution! 🎉

@greptile-apps

greptile-apps Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

[Low risk] Adjusts button sizing and styling in the chat composer.

The PR appears safe to merge.

What we checked:

  • Send keeps its active color: The active branch combines the base styles with primary colors. It does not include the secondary colors used by the other buttons.

Summary

The composer’s plus button now matches the 26px footer controls. Footer icon buttons become circular, and ComposerBody shares their styles through four constants.

  • Click handlers and disabled conditions stay unchanged.
  • No actionable issues found.
  • Visual capture was blocked because the local storybook executable was unavailable.
  • AviPeltz explicitly left the heavier glyphs and darker inactive-send fill unchanged. Neither is introduced by this PR.

Reviews (1) · Last reviewed commit: "fix(chat): match the composer's plus but..."

@AviPeltz
AviPeltz merged commit 5965858 into main Oct 6, 2026
19 checks passed
harshithmullapudi added a commit that referenced this pull request Oct 6, 2026
…re shape

#8216 made the send, stop, mic and plus buttons circles. Keep its 26px
sizing, restore the rounded-square corners they had before.
harshithmullapudi added a commit that referenced this pull request Oct 7, 2026
… 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.

This branch was previously deployed

1 inactive deployment
preview — 53da8ed3 Deployed Oct 6, 2026 by AviPeltz via Deploy Database (Neon) #11267
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants