Skip to content

fix(a11y): info-and-relationships compliance (WCAG 1.3.1)#3432

Merged
bilal-karim merged 3 commits into
mainfrom
a11y/1.3.1-info-relationships
May 29, 2026
Merged

fix(a11y): info-and-relationships compliance (WCAG 1.3.1)#3432
bilal-karim merged 3 commits into
mainfrom
a11y/1.3.1-info-relationships

Conversation

@bilal-karim
Copy link
Copy Markdown
Member

@bilal-karim bilal-karim commented May 22, 2026

Summary

Bundled SC 1.3.1 fixes (audit groups them per SC):

  • NumberInput / Textarea — forward required to native element. Visual red-dot was already shown via <Label>, but native HTML required was missing, so AT users heard an optional-field announcement despite the visible indicator. One-line fix per primitive.
  • RadioGroup — group semantics. Added role="radiogroup" and linked the optional description via aria-labelledby so AT users hear the group as a whole rather than each radio in isolation.
  • Tables — scope="col" on every <th>. Workflow lists, schedule lists, workers, batch-operations, child/parent workflow relationships. Fixes WCAG technique H63. Includes the two reusable header-cell primitives so future configurable-table consumers get it for free.

Audit context

  • WCAG 2.2 SC 1.3.1 Info and Relationships (Level A) — Moderate (forwarders / RadioGroup), Serious (table scope).
  • Issue files: audit-output/issues/1.3.1-{number-input,textarea}-required-forwarding.md, 1.3.1-radio-group-role-and-labelling.md, 1.3.1-table-scope-attributes.md.
  • Note: This PR unblocks 1.4.1-label-required-indicator.md which depends on the two forwarding fixes shipping first.

Files (14)

  • src/lib/holocene/input/number-input.svelte{required} on <input>
  • src/lib/holocene/textarea.svelte{required} on <textarea>
  • src/lib/holocene/radio-input/radio-group.svelte — role + aria-labelledby wiring
  • 11 table consumers — scope="col" on <th>

Test plan

  • Focus a required NumberInput/Textarea (e.g. activity-options-update-drawer); screen reader announces "required".
  • Empty-submit a form with a required field; native HTML validation blocks submit.
  • Open a form using RadioGroup (schedule retention, start-workflow input encoding); screen reader announces ", radiogroup" when entering the first radio.
  • On any data table page (/namespaces/<ns>/workflows, schedules, workers), navigate cells; AT announces column headers ("Status, column 1").
  • pnpm exec playwright test tests/accessibility/ — axe rules aria-required-attr, aria-required-children, scope-attr-valid, td-has-header should not flag the touched surfaces.

🤖 Generated with Claude Code

A11y-Audit-Ref: 1.3.1-number-input-required-forwarding
A11y-Audit-Ref: 1.3.1-textarea-required-forwarding
A11y-Audit-Ref: 1.3.1-radio-group-role-and-labelling
A11y-Audit-Ref: 1.3.1-table-scope-attributes

Four related fixes under SC 1.3.1, grouped per the audit's
correction of the matrix pathway:

- NumberInput / Textarea: forward `required` to the underlying
  native element. Previously the visual red-dot appeared via
  <Label> but the field was not programmatically required, so AT
  users heard an optional-field announcement despite the visible
  indicator.
- RadioGroup: add role="radiogroup" and link the optional
  description via aria-labelledby so AT users hear the group as a
  whole rather than each radio in isolation.
- Tables: add scope="col" to every <th> in product data tables
  (workflows, schedules, workers, batch-operations, child/parent
  workflow relationships). Fixes WCAG technique H63.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@bilal-karim bilal-karim requested a review from a team as a code owner May 22, 2026 00:23
@vercel
Copy link
Copy Markdown

vercel Bot commented May 22, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
holocene Ready Ready Preview, Comment May 29, 2026 8:01pm

Request Review

@temporal-cicd
Copy link
Copy Markdown
Contributor

temporal-cicd Bot commented May 22, 2026

Warnings
⚠️

📊 Strict Mode: 16 errors in 4 files (1.8% of 895 total)

src/lib/holocene/textarea.svelte (1)
  • L29:13: Type 'null' is not assignable to type 'boolean'.
src/lib/holocene/input/number-input.svelte (3)
  • L9:13: Type 'null' is not assignable to type '"search" | "link" | "success" | "error" | "action" | "activity" | "add-square" | "add" | "apple" | "archives" | "arrow-down" | "arrow-left" | "arrow-up" | "arrow-right" | "ascending" | ... 140 more ... | "xmark-square"'.
  • L20:13: Type 'undefined' is not assignable to type 'number'.
  • L21:13: Type 'undefined' is not assignable to type 'number'.
src/lib/components/workflow/child-workflows-table.svelte (6)
  • L36:15: 'c.attributes.workflowExecution' is possibly 'null' or 'undefined'.
  • L37:20: 'c.attributes.workflowExecution' is possibly 'null' or 'undefined'.
  • L79:14: Type 'string | null | undefined' is not assignable to type 'string'.
  • L80:14: Type 'string | null | undefined' is not assignable to type 'string'.
  • L90:14: Type 'string | null | undefined' is not assignable to type 'string'.
  • L91:14: Type 'string | null | undefined' is not assignable to type 'string'.
src/lib/components/workflow/parent-workflow-table.svelte (6)
  • L32:10: Type 'string | null | undefined' is not assignable to type 'string'.
  • L33:10: Type 'string | null | undefined' is not assignable to type 'string'.
  • L39:10: Type 'string | null | undefined' is not assignable to type 'string'.
  • L48:10: Type 'string | null | undefined' is not assignable to type 'string'.
  • L49:10: Type 'string | null | undefined' is not assignable to type 'string'.
  • L55:10: Type 'string | null | undefined' is not assignable to type 'string'.

Generated by 🚫 dangerJS against 9f0edd3

@github-actions github-actions Bot added a11y Accessibility audit PR a11y:no-fix-doc No A11y-Audit-Ref line; audit team triage a11y:bucket-2 Bucket 2: design-mergeable, HTML / ARIA a11y:sc-1.3.1 and removed a11y:no-fix-doc No A11y-Audit-Ref line; audit team triage labels May 28, 2026
@bilal-karim bilal-karim merged commit 34e582a into main May 29, 2026
17 checks passed
@bilal-karim bilal-karim deleted the a11y/1.3.1-info-relationships branch May 29, 2026 20:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

a11y:bucket-2 Bucket 2: design-mergeable, HTML / ARIA a11y:sc-1.3.1 a11y Accessibility audit PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants