fix: QA regression pass — graph sizing, focus trap, contrast, accessibility

- Fix graph canvas using window dimensions instead of container by using
  ResizeObserver ref callback (attaches when conditionally-rendered
  container mounts)
- Fix dialog focus trap escaping to background — filter hidden/disabled
  elements from focusable selector
- Fix sidebar connection status and disconnection banner contrast — use
  semantic text-warning/bg-warning instead of amber-400 (1.65:1 → 4.5:1+)
- Add aria-label to chat textarea, htmlFor/id pairs to flows dialog inputs
- Add ARIA tab pattern to prompts page (role=tablist/tab/tabpanel,
  aria-selected, aria-controls)
- Fix prompts heading hierarchy (H1→H2 instead of H1→H3)
- Add flex-wrap to flows page header, fix badge contrast across pages
- Fix service-call race condition with early returns instead of console.log

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
elpresidank 2026-04-10 07:48:01 -05:00
parent b854b56558
commit 77a5fa5044
12 changed files with 214 additions and 70 deletions

View file

@ -76,9 +76,8 @@ export class ServiceCall {
* @param resp - The response object received from the server
*/
onReceived(resp: object) {
// Defensive check - this shouldn't happen but log if it does
if (this.complete == true)
console.log(this.mid, "should not happen, request is already complete");
// Guard: ignore duplicate responses after completion
if (this.complete) return;
// Mark as complete to prevent duplicate processing
this.complete = true;
@ -151,12 +150,8 @@ export class ServiceCall {
* Triggers another attempt if retries are available
*/
onTimeout() {
// Defensive check - this shouldn't happen but log if it does
if (this.complete == true)
console.log(
this.mid,
"timeout should not happen, request is already complete",
);
// Guard: ignore timeout after completion
if (this.complete) return;
console.log("Request", this.mid, "timed out");
@ -184,12 +179,8 @@ export class ServiceCall {
* Handles retries and waits for BaseApi to handle reconnection
*/
attempt() {
// Defensive check - this shouldn't be called on completed requests
if (this.complete == true)
console.log(
this.mid,
"attempt should not be called, request is already complete",
);
// Guard: don't retry completed requests
if (this.complete) return;
// Decrement retry counter
this.retries--;