Skip to content

Automated WCAG 2.1 AA a11y testing across all themes/modes - #38

Draft
sjoerdbeentjes wants to merge 16 commits into
mainfrom
feat/a11y-testing
Draft

Automated WCAG 2.1 AA a11y testing across all themes/modes#38
sjoerdbeentjes wants to merge 16 commits into
mainfrom
feat/a11y-testing

Conversation

@sjoerdbeentjes

@sjoerdbeentjes sjoerdbeentjes commented Jun 22, 2026

Copy link
Copy Markdown
Collaborator

Adds an automated WCAG 2.1 AA pipeline that sweeps every Storybook story across all themes and modes from @surfnet/tokens, in both React and Angular.

What

  • Shared config in @surfnet/storybook-config: browser-safe a11yParameters (merged into both previews, also scopes the addon-a11y panel) and a node-only runStoryA11yAudit behind a ./test-runner subpath so it never enters a preview bundle.
  • Builder-agnostic runner: @storybook/test-runner + axe-playwright against a served Storybook, so one setup covers React (Vite) and Angular (webpack). Each story is audited once per theme × mode (11 themes × 2 modes), writing a per-story JSON report.
  • Wiring: per-package test:a11y / test:a11y:ci scripts, a turbo task, a root script, and a CI step that runs report-only (continue-on-error) and uploads the JSON as an artifact.

Notes

  • CI is intentionally report-only until the token contrast backlog is triaged; flip to blocking by removing continue-on-error.

@sjoerdbeentjes
sjoerdbeentjes force-pushed the feat/a11y-testing branch 5 times, most recently from b563368 to 871c744 Compare June 22, 2026 14:18
@github-actions

github-actions Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

♿ Accessibility audit — WCAG 2.1 AA

⚠️ 210 finding(s) — 144 contrast (per theme·mode), 66 theme-independent · across 363 stories / 10164 audited combinations. Report-only — does not block merge.

@surfnet/curve-angular — 136 finding(s)

Badge — 24 finding(s)

As Link — 11 finding(s)
  • default
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (default/dark)
  • groenvermogen-nkph2
    • light#84cc16 on #ffffff · ratio 1.97 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
  • surf-blue-purple
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-purple/dark)
  • surf-blue-turquoise
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-turquoise/dark)
  • surf-blue-yellow
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-yellow/dark)
  • surf-green
    • light#00d37f on #ffffff · ratio 1.97 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-green/light)
  • surf-orange
    • light#ff883f on #ffffff · ratio 2.37 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange/light)
  • surf-orange-turquoise
    • light#ff883f on #ffffff · ratio 2.37 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange-turquoise/light)
  • surf-purple
    • dark#420984 on #0a0a0a · ratio 1.51 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple/dark)
  • surf-purple-orange
    • dark#420984 on #0a0a0a · ratio 1.51 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple-orange/dark)
  • surf-yellow
    • light#ffe500 on #ffffff · ratio 1.27 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-yellow/light)
Default — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
Status List — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
Variants — 11 finding(s)
  • default
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (default/dark)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
  • surf-blue-purple
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-purple/dark)
  • surf-blue-turquoise
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-turquoise/dark)
  • surf-blue-yellow
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-yellow/dark)
  • surf-green
    • light#00d37f on #ffffff · ratio 1.97 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-green/light)
  • surf-orange
    • light#ff883f on #ffffff · ratio 2.37 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange/light)
  • surf-orange-turquoise
    • light#ff883f on #ffffff · ratio 2.37 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange-turquoise/light)
  • surf-purple
    • dark#420984 on #0a0a0a · ratio 1.51 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple/dark)
  • surf-purple-orange
    • dark#420984 on #0a0a0a · ratio 1.51 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple-orange/dark)
  • surf-yellow
    • light#ffe500 on #ffffff · ratio 1.27 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-yellow/light)

Button — 4 finding(s)

Default — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
Sizes — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
Variants — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
With Icon — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)

Calendar — 56 finding(s)

Default — 28 finding(s)
  • default
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (default/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (default/dark)
  • groenvermogen-nkph2
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
    • dark#575757 on #0a0a0a · ratio 2.73 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/dark)
  • shadcn-default
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (shadcn-default/light)
    • dark#575757 on #0a0a0a · ratio 2.73 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (shadcn-default/dark)
  • shadcn-default-grey-background
    • light#a4a4a4 on #f5f5f5 · ratio 2.28 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (shadcn-default-grey-background/light)
    • dark#575757 on #0a0a0a · ratio 2.73 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (shadcn-default-grey-background/dark)
  • surf-blue-purple
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-purple/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-purple/dark)
  • surf-blue-turquoise
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-turquoise/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-turquoise/dark)
  • surf-blue-yellow
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-yellow/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-yellow/dark)
  • surf-green
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-green/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-green/dark)
  • surf-orange
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange/dark)
  • surf-orange-turquoise
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange-turquoise/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange-turquoise/dark)
  • surf-pilot
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-pilot/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-pilot/dark)
  • surf-purple
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple/dark)
  • surf-purple-orange
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple-orange/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple-orange/dark)
  • surf-yellow
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-yellow/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-yellow/dark)
Multiple — 28 finding(s)
  • default
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (default/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (default/dark)
  • groenvermogen-nkph2
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
    • dark#575757 on #0a0a0a · ratio 2.73 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/dark)
  • shadcn-default
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (shadcn-default/light)
    • dark#575757 on #0a0a0a · ratio 2.73 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (shadcn-default/dark)
  • shadcn-default-grey-background
    • light#a4a4a4 on #f5f5f5 · ratio 2.28 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (shadcn-default-grey-background/light)
    • dark#575757 on #0a0a0a · ratio 2.73 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (shadcn-default-grey-background/dark)
  • surf-blue-purple
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-purple/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-purple/dark)
  • surf-blue-turquoise
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-turquoise/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-turquoise/dark)
  • surf-blue-yellow
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-yellow/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-yellow/dark)
  • surf-green
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-green/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-green/dark)
  • surf-orange
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange/dark)
  • surf-orange-turquoise
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange-turquoise/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange-turquoise/dark)
  • surf-pilot
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-pilot/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-pilot/dark)
  • surf-purple
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple/dark)
  • surf-purple-orange
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple-orange/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple-orange/dark)
  • surf-yellow
    • light#a9a9a9 on #ffffff · ratio 2.35 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-yellow/light)
    • dark#6f6f6f on #0a0a0a · ratio 3.94 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-yellow/dark)

Combobox — 4 finding(s)

Default — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation
Disabled — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation
Grouped — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation
Multiple — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation

Command — 8 finding(s)

Default — 3 finding(s)
  • ARIA input fields must have an accessible name — aria-input-field-name · all themes/modes
    aria-input-field-name violation
  • Required ARIA attributes must be provided — aria-required-attr (4.1.2) · all themes/modes
    aria-required-attr (4.1.2) violation
  • Certain ARIA roles must contain particular children — aria-required-children · all themes/modes
    aria-required-children violation
Disabled Item — 2 finding(s)
  • ARIA input fields must have an accessible name — aria-input-field-name · all themes/modes
    aria-input-field-name violation
  • Required ARIA attributes must be provided — aria-required-attr (4.1.2) · all themes/modes
    aria-required-attr (4.1.2) violation
Empty — 3 finding(s)
  • ARIA input fields must have an accessible name — aria-input-field-name · all themes/modes
    aria-input-field-name violation
  • Required ARIA attributes must be provided — aria-required-attr (4.1.2) · all themes/modes
    aria-required-attr (4.1.2) violation
  • Certain ARIA roles must contain particular children — aria-required-children · all themes/modes
    aria-required-children violation

CurveDataTable — 1 finding(s)

Default — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation

DataTable — 1 finding(s)

Custom Toolbar — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)

Empty — 2 finding(s)

Default — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
With Multiple Actions — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)

Input Group — 2 finding(s)

Textarea With Block End Toolbar — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation
With Text Prefix — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation

InputOTP — 3 finding(s)

Default — 1 finding(s)
  • Form elements must have labels — label · all themes/modes
    label violation
Disabled — 1 finding(s)
  • Form elements must have labels — label · all themes/modes
    label violation
With Separator — 1 finding(s)
  • Form elements must have labels — label · all themes/modes
    label violation

Item — 1 finding(s)

With Header And Footer — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)

NativeSelect — 5 finding(s)

Default — 1 finding(s)
  • Select element must have an accessible name — select-name · all themes/modes
    select-name violation
Disabled — 1 finding(s)
  • Select element must have an accessible name — select-name · all themes/modes
    select-name violation
Invalid — 1 finding(s)
  • Select element must have an accessible name — select-name · all themes/modes
    select-name violation
Sizes — 1 finding(s)
  • Select element must have an accessible name — select-name · all themes/modes
    select-name violation
With Option Groups — 1 finding(s)
  • Select element must have an accessible name — select-name · all themes/modes
    select-name violation

Pagination — 15 finding(s)

Numbered Pagination — 15 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation
  • default
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (default/dark)
  • groenvermogen-nkph2
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/dark)
  • shadcn-default
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (shadcn-default/dark)
  • shadcn-default-grey-background
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (shadcn-default-grey-background/dark)
  • surf-blue-purple
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-purple/dark)
  • surf-blue-turquoise
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-turquoise/dark)
  • surf-blue-yellow
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-yellow/dark)
  • surf-green
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-green/dark)
  • surf-orange
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange/dark)
  • surf-orange-turquoise
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange-turquoise/dark)
  • surf-pilot
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-pilot/dark)
  • surf-purple
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple/dark)
  • surf-purple-orange
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple-orange/dark)
  • surf-yellow
    • dark#4a5565 on #0a0a0a · ratio 2.61 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-yellow/dark)

Progress — 3 finding(s)

Default — 1 finding(s)
  • ARIA progressbar nodes must have an accessible name — aria-progressbar-name · all themes/modes
    aria-progressbar-name violation
Indeterminate — 1 finding(s)
  • ARIA progressbar nodes must have an accessible name — aria-progressbar-name · all themes/modes
    aria-progressbar-name violation
With Label — 1 finding(s)
  • ARIA progressbar nodes must have an accessible name — aria-progressbar-name · all themes/modes
    aria-progressbar-name violation

Resizable — 4 finding(s)

Composed Layout — 1 finding(s)
  • Required ARIA attributes must be provided — aria-required-attr (4.1.2) · all themes/modes
    aria-required-attr (4.1.2) violation
Default — 1 finding(s)
  • Required ARIA attributes must be provided — aria-required-attr (4.1.2) · all themes/modes
    aria-required-attr (4.1.2) violation
Vertical — 1 finding(s)
  • Required ARIA attributes must be provided — aria-required-attr (4.1.2) · all themes/modes
    aria-required-attr (4.1.2) violation
Without Handle Grip — 1 finding(s)
  • Required ARIA attributes must be provided — aria-required-attr (4.1.2) · all themes/modes
    aria-required-attr (4.1.2) violation

Sidebar — 2 finding(s)

Default — 2 finding(s)
  • surf-blue-yellow
    • dark#fafafa on #8a7900 · ratio 4.17 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-yellow/dark)
  • surf-yellow
    • dark#fafafa on #8a7900 · ratio 4.17 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-yellow/dark)

Tabs — 1 finding(s)

Default — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
@surfnet/curve-react — 74 finding(s)

Badge — 24 finding(s)

As Link — 11 finding(s)
  • default
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (default/dark)
  • groenvermogen-nkph2
    • light#84cc16 on #ffffff · ratio 1.97 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
  • surf-blue-purple
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-purple/dark)
  • surf-blue-turquoise
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-turquoise/dark)
  • surf-blue-yellow
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-yellow/dark)
  • surf-green
    • light#00d37f on #ffffff · ratio 1.97 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-green/light)
  • surf-orange
    • light#ff883f on #ffffff · ratio 2.37 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange/light)
  • surf-orange-turquoise
    • light#ff883f on #ffffff · ratio 2.37 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange-turquoise/light)
  • surf-purple
    • dark#420984 on #0a0a0a · ratio 1.51 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple/dark)
  • surf-purple-orange
    • dark#420984 on #0a0a0a · ratio 1.51 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple-orange/dark)
  • surf-yellow
    • light#ffe500 on #ffffff · ratio 1.27 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-yellow/light)
Default — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
Status List — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
Variants — 11 finding(s)
  • default
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (default/dark)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
  • surf-blue-purple
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-purple/dark)
  • surf-blue-turquoise
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-turquoise/dark)
  • surf-blue-yellow
    • dark#053eaa on #0a0a0a · ratio 2.14 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-blue-yellow/dark)
  • surf-green
    • light#00d37f on #ffffff · ratio 1.97 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-green/light)
  • surf-orange
    • light#ff883f on #ffffff · ratio 2.37 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange/light)
  • surf-orange-turquoise
    • light#ff883f on #ffffff · ratio 2.37 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-orange-turquoise/light)
  • surf-purple
    • dark#420984 on #0a0a0a · ratio 1.51 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple/dark)
  • surf-purple-orange
    • dark#420984 on #0a0a0a · ratio 1.51 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-purple-orange/dark)
  • surf-yellow
    • light#ffe500 on #ffffff · ratio 1.27 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (surf-yellow/light)

Button — 4 finding(s)

Default — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
Sizes — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
Variants — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
With Icon — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)

Calendar — 3 finding(s)

Dropdown Caption — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
In Card — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
Single — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)

Card — 1 finding(s)

Default — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)

Checkbox — 1 finding(s)

Default — 1 finding(s)
  • ARIA toggle fields must have an accessible name — aria-toggle-field-name · all themes/modes
    aria-toggle-field-name violation

Combobox — 4 finding(s)

Default — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation
Disabled — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation
Grouped — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation
Multiple — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation

Command — 1 finding(s)

Default — 1 finding(s)
  • Certain ARIA roles must contain particular children — aria-required-children · all themes/modes
    aria-required-children violation

DataTable — 1 finding(s)

Custom Toolbar — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)

Empty — 2 finding(s)

Default — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)
With Multiple Actions — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)

InputGroup — 2 finding(s)

Textarea With Block End Toolbar — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation
With Text Prefix — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation

InputOTP — 3 finding(s)

Default — 1 finding(s)
  • Form elements must have labels — label · all themes/modes
    label violation
Disabled — 1 finding(s)
  • Form elements must have labels — label · all themes/modes
    label violation
With Separator — 1 finding(s)
  • Form elements must have labels — label · all themes/modes
    label violation

Item — 2 finding(s)

Group — 1 finding(s)
  • Certain ARIA roles must contain particular children — aria-required-children · all themes/modes
    aria-required-children violation
With Header And Footer — 1 finding(s)
  • groenvermogen-nkph2
    • light#fafafa on #84cc16 · ratio 1.89 — color-contrast (1.4.3)
      color-contrast (1.4.3) violation (groenvermogen-nkph2/light)

NativeSelect — 3 finding(s)

Default — 1 finding(s)
  • Select element must have an accessible name — select-name · all themes/modes
    select-name violation
Disabled — 1 finding(s)
  • Select element must have an accessible name — select-name · all themes/modes
    select-name violation
Invalid — 1 finding(s)
  • Select element must have an accessible name — select-name · all themes/modes
    select-name violation

Pagination — 1 finding(s)

NumberedPagination — 1 finding(s)
  • Buttons must have discernible text — button-name (4.1.2) · all themes/modes
    button-name (4.1.2) violation

Progress — 1 finding(s)

Default — 1 finding(s)

…truncated; see the a11y-reports artifact for the full list.

@sjoerdbeentjes sjoerdbeentjes linked an issue Jun 23, 2026 that may be closed by this pull request
@sjoerdbeentjes
sjoerdbeentjes force-pushed the feat/a11y-testing branch 3 times, most recently from 8b13cff to fc78595 Compare June 30, 2026 06:45
@sjoerdbeentjes
sjoerdbeentjes force-pushed the feat/a11y-testing branch 4 times, most recently from 52bcb10 to 5afc87c Compare July 1, 2026 18:46
Comment thread .github/workflows/ci.yml

# Scoped to @surfnet/storybook-config, which pins playwright, so both
# framework runs share one browser.
- name: Install Playwright Chromium

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hoe is de performance? Ik zou verwachten dat we in een CI-stap een headless browser gebruiken.

@sjoerdbeentjes
sjoerdbeentjes force-pushed the feat/a11y-testing branch 2 times, most recently from 573772a to 4c66f62 Compare July 6, 2026 07:43
github-actions Bot added a commit that referenced this pull request Jul 6, 2026
github-actions Bot added a commit that referenced this pull request Jul 6, 2026
github-actions Bot added a commit that referenced this pull request Jul 6, 2026
github-actions Bot added a commit that referenced this pull request Jul 7, 2026
github-actions Bot added a commit that referenced this pull request Jul 14, 2026
Dot-prefix the per-package report output (and the generated PR-comment
markdown) so a single .gitignore entry covers them and they read as
generated/hidden. Updates the audit default dir, the comment script's
read/write paths, turbo outputs, the CI artifact/comment paths, and
.gitignore.
Replace the flat findings table with a nested layout (component heading,
theme bullet, mode sub-bullet with the contrast detail) so reviewers can
scan by component and drill into a theme. Cap body length under GitHub's
comment size limit.
Show the component (e.g. Button) as an h4 and each story variation (e.g.
Variants, As Link) as an h5 beneath it, instead of merging them into one
"Button / Variants" heading. Theme/mode nesting is unchanged.
Only contrast rules (color-contrast, link-in-text-block) depend on the
theme/mode, so report those per theme·mode as before. DOM-structural
rules (missing alt, button/link name, ARIA, etc.) are identical across
themes — collapse each to a single finding per story variation, flagged
'all themes/modes', instead of repeating it for every combination.
Disable CSS transitions/animations and await fonts before the axe sweep so
contrast reads settled colors and correct large-text thresholds. Condense the
verbose comments added across the a11y tooling.
Update the a11y tooling's imports, CI filter and PR-comment labels for the
@surfnet/* -> @surfnet/curve-* rebrand on main, and spell out in ci.yml that
the audit drives Playwright Chromium headless (a few seconds per framework
after the Storybook build).
Forcing width=360 upscaled small violation screenshots, making them
pixelated in the PR comment; render at native size instead.
github-actions Bot added a commit that referenced this pull request Aug 25, 2026
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.

WCAG 2.1 AA-check op alle PoC-componenten

2 participants