Repository navigation
Design audit 3/4: AI tools and practice tools - #128
Conversation
…eader
Fixes the AI tools rows of the 2026-10-09 design audit (Ask and the four
form tools; the practice tools follow in the next commit).
- Ask: the stored reply keeps the streaming bubble's id, so it doesn't
remount mid-read. New text scrolls only a reader at the bottom, inside
the chat, never the window; otherwise "Jump to latest" appears. The box
stays editable while answering, Send becomes Stop (which keeps the
partial), and failures stay above the box with a Retry that doesn't
duplicate the question. The four switches and the model picker move into
an Options popover. The status is one true line ("Searching the web…",
"Working…") plus elapsed time, and the height uses dvh.
- Attack, Brainstorm, Factoids, Generate: requests take an AbortSignal and
show Cancel. One spinner and one status line replace five loops and a
fake progress bar. Errors are an inline panel with Retry. The success
toasts are gone, results scroll into view on phones, and the empty
states use the Lucide EmptyState.
- One ResultHeader: title, meta, actions, and the AI caveat. Generate marks
evidence "Unverified" when no web research backs it. Researched sources
sit in a disclosure under the header.
- "Discuss" prompts are built line by line through i18n and sent from Ask
on the streaming path. Markdown gets an inline mode and safe links.
- Deleted: StreamingIndicator, AnimatedSection, StaggeredContainer,
AutoSavedSourcesUndo and the unused showUndo prop, the stagger and
message keyframes, the typing dots, the streaming glow and token fade.
The caret blinks by opacity only. Error copy is localized, the form
cards drop their duplicate titles, and the no-debate notice appears once.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes the Timer, Crossfire, Sparring and Flowchart rows of the 2026-10-09 design audit. - One RoundClock for Timer, Sparring and Crossfire: Inter tabular figures, amber in the last 30 seconds, red at zero (the Timer no longer goes calm at 0:00). A ClockAnnouncer speaks only at 1:00, 0:30 and 0:00 instead of every tick. - Timer: the ring sweeps linearly; the clock works in milliseconds, so a pause no longer gives up to a second back (unit test); a wake lock while running; sound and vibration together at 0:00; R and Escape reset only while paused, and the reset button offers Undo; keyboard hints are hidden on touch; solid card; no pulsing digits. - Crossfire: the clock ticks inside its own component instead of re-rendering the page twice a second; the header shows the resolution; the composer stays editable while the AI works (only Send waits); only turns that just arrived fade in. - Sparring: one spinner instead of a ping, a pulse and bouncing dots; the opponent's latest speech is pinned above the composer. - Flowchart: static edges, with rebuttals dashed; deleting a node or a saved flowchart acts at once with Undo; auto layout uses fitView with a 250ms glide; wheel scrolls the page; new nodes appear at the visible centre; touch-sized handles and controls; a real h1. - One ListeningIndicator for Ask, Generate and voice rounds, with no pulsing buttons. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- sparring.spec reads the opponent's reply from the transcript and checks it is pinned above the composer. - The flow-edit recipe proves a node deletes at once and Undo restores it; the feature map says so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…inned copy Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
React Flow's stylesheet loads after ours and sizes the buttons content-box, so the coarse-pointer rule needs the extra class and border-box. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning Review limit reachedEnable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. Next included review available in 59 minutes. View limit details
Note 🎁 Summarized by CodeRabbit Free
Comment |
- A form tool's request belongs to the tool, not one mount of its page, so Cancel still works after leaving and coming back (unit test). Every page checks the signal after the request returns, so a canceled run never publishes or saves. - Timer Undo returns to the paused remainder and stops the clock, instead of writing a paused clock under a running timer, which froze it. - Flowchart node Undo belongs to the chart it was deleted from: loading another chart dismisses it. A saved-chart delete writes first and throws on failure, so Undo is only offered once the row is gone. - Ask renders stored and streaming messages as one keyed list, so the finished reply keeps its bubble instead of remounting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Codex review round 1 (on 4fee6f5) found six issues. All are fixed in bac0f45:
Also in 8db4a3b: the Timer's Reset button was announced as "R to reset" (the keyboard hint). It now has a real name in en, es and hu. That label came from Local checks at 8db4a3b: lint, typecheck, |
…ell header is the banner Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rors - A saved chart's Delete is disabled while its delete is in flight, so a double click can't offer two Undos (which would save two copies). - Signed in, a failed user lookup now fails the delete instead of skipping the server row and offering an Undo that would duplicate it. Signed out stays local-only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Codex round 2 (on 8db4a3b) confirmed the six round-1 fixes and found two gaps in the saved-flowchart delete. Both are fixed in a41e963:
Local checks at a41e963: lint, typecheck, |
…s clickable while busy A disabled button has pointer-events: none, so a second click fell through to the row and loaded the chart. The button is now aria-disabled and dimmed, and the handler already ignores repeat clicks. getSession errors no longer read as signed out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Codex round 3 (on a41e963) found two gaps in the round-2 fixes. Both are fixed in cca52c1:
Local checks at cca52c1: lint, typecheck, |
The row was a role=button wrapping the Delete button, so a click or an Enter/Space on a busy Delete could reach the row and load the chart being deleted. The title is now its own load button beside Delete, and Delete is disabled while its delete runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Codex round 4 (on cca52c1) confirmed the session-error fix and found one gap. While a delete was running, Enter or Space on the Delete button could still reach the clickable row and load the chart being deleted. Fixed in 0770b94 at the root: the row was a Checked at 0770b94:
|
|
Codex round 5 (on 0770b94): no findings. All review findings on this PR are resolved. |
Third of four stacked PRs for the 2026-10-09 design audit. Base: #126 (Shell).
What changed
Ask
scrollIntoView({behavior:'smooth'}), which pulled the whole page down mid-read.dvh, so the box isn't hidden behind the phone's toolbar.Generate, Attack, Brainstorm, Factoids
AbortSignal, and the form shows Cancel while it runs.ResultHeader: title, meta, actions and the AI caveat. Generate marks evidence Unverified when no web research backs it. Researched sources sit in a disclosure under the header.Timer, Sparring, Crossfire
RoundClockfor all three: Inter tabular figures, amber in the last 30 seconds, red at zero. Before, the Timer turned calm again at 0:00. A screen reader hears 1:00, 0:30 and 0:00 instead of every tick.clip-path 1000msease per tick, so it surged and stopped every second);Flowchart
fitView.Changes from the audit's literal After
None. Every PR3 row follows the recommended After, and each is ticked in the plan.
Verification
All runs are local. GitHub Actions is out of minutes: every job fails in about 2 seconds with "recent account payments have failed".
npm run lint,typecheck,npm test(276, including the newtimer-clocktest),buildanddocs:checkall pass at a168d14. The touch-size fix in 4fee6f5 changes only CSS, and its effect was measured in the browser.verify.sh drive all: 30 passed and 2 skipped on desktop-chromium, and the same on mobile-chromium. The skips are workspace-autosave, which needs--collab. Recipes updated in this PR:account(flowchart Undo instead of a confirm) andlibrary(now on the Shell base).verify.sh e2e run(agentic): 174 passed, 4 skipped, 1 failed and 1 interrupted when my 30-minute background limit cut the run off.clip-path 1000ms cubic-bezier(0.4,0,0.2,1)per tick, now1000ms linear.shimmer 3000ms, now none.message-enter 300msplusstreaming-glow-pulse 1500ms, now neither.Not verified: real touch hardware (wake lock, vibration), WebKit and Safari, live AI output (fake provider only), staging and production.
🤖 Generated with Claude Code