Repository navigation
Chat composition: task-level UX and accessibility fixes - #1435
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
blove
enabled auto-merge (squash)
November 2, 2026 22:31
…d id On the first message of a new conversation the transport creates a thread and the host mirrors its id into the bound threadId signal (null -> id). The bridge already treats that as adoption and keeps streaming, but the agent's derived-state subscription reset status to Idle. The running reply then looked finished: no Stop control, Send enabled, and Enter could start a second, concurrent run. Reset derived thread state only when the bridge itself would switch threads, or when no run is in flight.
…ition Findings from a rubric-based evaluation of send, stop, error recovery, reading while a reply streams, and acting on earlier answers (Chromium, Firefox and WebKit): - Enter during a running reply keeps the draft and says why nothing was sent, instead of starting a concurrent run. - Keyboard focus continues in the composer when a control removes itself: the welcome view on first send, Stop, Retry, and scroll-to-latest. - A reply arriving no longer moves a reader who scrolled up; the person's own turn, a run started on their prompt, a replaced transcript and regenerate still re-pin. - A "Response stopped" marker after a stopped turn, and a polite status announcing "Response complete." / "Response stopped." - The transcript is a named, keyboard-scrollable region; messages carry visually hidden speaker labels (new optional `speaker` input) and dir="auto" for right-to-left text. - Light error text meets 4.5:1; error banner aligned to the composer; composer focus cue; Stop uses the enabled fill; Send/Stop keep a border in forced colours; message actions show on hover-less touch devices. - Scroll-to-latest is named for its action while streaming.
The actions row was revealed under (hover: none), but its .chat-message__controls wrapper still matched only max-width: 768px. On touch tablets wider than that, earlier answers' buttons stayed invisible inside the transparent wrapper while still receiving taps, so a tap could regenerate an answer without a visible control. Both now share one reveal query, with a style contract that keeps them in sync.
blove
force-pushed
the
blove/threadplane-ui-ux-eval-dbca6c
branch
from
November 2, 2026 23:44
3f8b1b3 to
31704b7
Compare
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A rubric-based UI/UX evaluation of the chat composition (send, stop, recover from an error, read history while a reply streams, act on an earlier answer) across Chromium, Firefox and WebKit found six major and several moderate problems. This PR fixes them.
Adapter (
@threadplane/langgraph)threadIdsignal; it now follows the bridge's own adoption rule.Chat (
@threadplane/chat)speakerinput) anddir="auto".--tplane-chat-error-textnow meets 4.5:1 (was 4.41:1); error banner aligned to the composer; composer focus cue; Stop uses the enabled fill; Send/Stop keep a border in forced colours; message actions show on hover-less touch devices; scroll-to-latest named for its action while streaming.Consumer-visible changes
submitMessage()unchanged).#b91c1c.role="region"+aria-label="Conversation"+tabindex="0"on the transcript, a visually hidden speaker span per message, and two politerole="status"regions.Testing
chatvitest: 139 files / 1375 tests;langgraphvitest: 27 files / 527 tests plusruntime-quality;examples-chat-angularunit tests.chatandlanggraph.examples-chat-angulare2e: 64 passed.--write-baseline.Not covered: a real screen-reader session (VoiceOver/NVDA) for the new announcements and labels.
🤖 Generated with Claude Code