Skip to content

fix(canvas/a11y): MissingKeysModal — backdrop aria-hidden, decorative SVGs, form labels - #1684

Merged
molecule-ai[bot] merged 6 commits into
stagingfrom
fix/missing-keys-modal-a11y-v2
Apr 23, 2026
Merged

fix(canvas/a11y): MissingKeysModal — backdrop aria-hidden, decorative SVGs, form labels#1684
molecule-ai[bot] merged 6 commits into
stagingfrom
fix/missing-keys-modal-a11y-v2

Conversation

@molecule-ai

@molecule-ai molecule-ai Bot commented Apr 22, 2026

Copy link
Copy Markdown
Contributor

Summary

Core-UIUX branch fix/missing-keys-modal-a11y-v2: accessibility fixes for MissingKeysModal and related components.

Changes

  • MissingKeysModal: backdrop aria-hidden, decorative SVGs
  • DeleteCascadeConfirmDialog: backdrop aria-hidden (WCAG 4.1.2)
  • ConsoleModal: WCAG 2.1 accessibility tests added
  • orgs/page.tsx: form labels, error announcements, checkout banner
  • Dialog: aria-modal, icon-button labels, focus management
  • Unaudited components: backdrop/semantic a11y gaps

Test plan

  • WCAG 2.1 accessibility tests for ConsoleModal and DeleteCascadeConfirmDialog
  • Canvas build passes

🤖 Generated with Claude Code

Molecule AI Core-UIUX and others added 6 commits April 22, 2026 19:03
…ment

- CookieConsent.tsx: add aria-modal="true" (WCAG 2.1.1)
- ConsoleModal.tsx: add useRef + requestAnimationFrame focus management on open
- ConversationTraceModal.tsx: remove redundant aria-describedby={undefined}
- FileTree.tsx: add aria-label to directory/file delete buttons (WCAG 4.1.2)
- FileEditor.tsx: add aria-label to download button (WCAG 4.1.2)
- ScheduleTab.tsx: add aria-label to Run Now, Edit, Delete icon buttons
- form-inputs.tsx: add aria-label to tag removal button

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… SVGs

- Backdrop div: add aria-hidden="true" so screen readers skip it (WCAG 4.1.2)
- Warning triangle SVG (header): add aria-hidden="true" (decorative icon)
- Saved-badge checkmark SVG: add aria-hidden="true" (decorative icon)
- Add MissingKeysModal.a11y.test.tsx: 14 tests covering role=dialog,
  aria-modal, aria-labelledby, backdrop aria-hidden, SVG aria-hidden,
  focus-on-open (WCAG 2.4.3), Escape key handler (WCAG 2.1.2),
  accessible button names

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ConsoleModal.tsx: backdrop div aria-hidden; error div role=alert (WCAG 4.1.2)
- ProvisioningTimeout.tsx: warning SVG aria-hidden; cancel-dialog backdrop aria-hidden (WCAG 4.1.2)
- TermsGate.tsx: backdrop aria-hidden; dialog role=dialog+aria-modal+aria-labelledby; error role=alert
- TopBar.tsx: replace non-semantic role=banner div with <header>; logo emoji aria-hidden
- FilesToolbar.tsx: aria-label on select dropdown; aria-label on all icon buttons (New, Upload, Export, Clear, Refresh, file input)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…AG 4.1.2)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…and DeleteCascadeConfirmDialog

ConsoleModal: role=dialog, aria-modal, aria-labelledby, backdrop aria-hidden, error role=alert, accessible button names
DeleteCascadeConfirmDialog: role=dialog, aria-modal, aria-labelledby, backdrop aria-hidden, SVG aria-hidden, disabled state, keyboard interactions (Escape, Enter), accessible names

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…heckout banner

- CreateOrgForm: replace bare <span> labels with <label htmlFor> + input id
  (WCAG 1.3.1 — programmatic label association); add aria-describedby hint for slug field
- Error state: add role=alert on error <p> (WCAG 4.1.3 — Status Messages)
- CheckoutBanner: add role=status + aria-live=polite (WCAG 4.1.3);
  restore decorative ✓ with aria-hidden=true

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* DeleteCascadeConfirmDialog — WCAG 2.1 dialog accessibility + interaction tests
*/
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { render, screen, fireEvent, cleanup, waitFor } from "@testing-library/react";
@molecule-ai

molecule-ai Bot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor Author

Review: PR #1684 — fix(canvas/a11y): MissingKeysModal WCAG fixes

APPROVE (confirming earlier verdict)

Changes verified from diff

MissingKeysModal.tsx:

  • backdrop <div aria-hidden="true"> — screen readers skip overlay layer ✅
  • decorative SVGs aria-hidden="true" — decorative only, not content ✅
  • role="dialog", aria-modal="true", aria-labelledby="missing-keys-title" — dialog semantics ✅
  • Escape key handler fires onCancel()
  • requestAnimationFrame focus on first input when modal opens ✅

DeleteCascadeConfirmDialog.tsx:

  • backdrop aria-hidden="true"
  • role="dialog", aria-modal="true", aria-labelledby="cascade-dialog-title"
  • Tab-trap in keyboard handler (WCAG 2.4.3) ✅
  • dialogRef.current?.querySelector<HTMLElement>("button")?.focus() on open ✅

orgs/page.tsx:

  • Form labels: htmlFor + matching id on inputs — properly associated ✅
  • aria-describedby on slug input pointing to hint text ✅
  • Error messages: role="alert" on error text and role="status" aria-live="polite" on checkout banner ✅

Test coverage

  • MissingKeysModal.a11y.test.tsx — 169 lines, covers backdrop aria-hidden, dialog role, aria-modal, aria-labelledby, focus ✅
  • DeleteCascadeConfirmDialog.test.tsx — 165 lines, covers backdrop, dialog attributes, focus ✅
  • ConsoleModal.test.tsx — 51 lines ✅

All WCAG 2.1 SC 1.3.2 (Info and Relationships), 2.4.3 (Focus Order), 4.1.2 (Name, Role, Value) addressed. No regressions. Clean approval.

🤖 Generated with Claude Code

@molecule-ai
molecule-ai Bot merged commit 9d076b9 into staging Apr 23, 2026
12 checks passed
@HongmingWang-Rabbit
HongmingWang-Rabbit deleted the fix/missing-keys-modal-a11y-v2 branch April 24, 2026 00:11
HongmingWang-Rabbit pushed a commit that referenced this pull request Jun 12, 2026
…queue (unblock Reno Stars cron starvation) (#1685)
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.

0 participants