Trust Center · Accessibility

Our WCAG 2.1 A/AA accessibility self-assessment.

28 success criteria across 4 WCAG principles (Perceivable, Operable, Understandable, Robust), rated against the actual respondent-facing survey runner. This is a self-assessment: we disclose open gaps as “Partial” or “No” rather than overclaiming, and back it with an automated accessibility test that runs in CI on every pull request into our main branch.

Domandata self-assessment against WCAG 2.1 Level A/AA success criteria · Last reviewed: August 2026 · Looking for the HECVAT instead?

18

Yes

Yes responses

8

Partial

Partial responses

2

No

No responses

0

N/A

N/A responses

Yes (64%)Partial (29%)No (7%)N/A (0%)
PCVPerceivable6 Yes2 Partial

PCV-011.1.1 Non-text Content (A) — Do non-text elements have appropriate text alternatives?

Yes

Per-cell aria-labels are present on grid-matrix and slider inputs (verified in grid-matrix-renderer.tsx / slider-renderer.tsx). Uploaded images on content blocks and heatmaps have an author-written Alt text field (translatable), and content-block images can be marked decorative (`alt=""`). Without author text the image is announced generically as "Image" — never by its file name — and Instrument Review raises an `image-missing-alt-text` warning. Conformance for a given survey still depends on the author writing meaningful descriptions.

PCV-021.3.1 Info and Relationships (A) — Is structure (labels, groupings, required state) conveyed programmatically, not just visually?

Yes

Question titles act as programmatic labels; validation errors are associated via `aria-describedby`/`aria-invalid` (verified in short-answer-renderer.tsx, dropdown-renderer.tsx, constant-sum-renderer.tsx); native form controls (radio/checkbox/select) are used for choice-based questions rather than custom unlabeled divs.

PCV-031.3.2 Meaningful Sequence (A) — Does reading/navigation order match the visual presentation order?

Yes

Confirmed via the live axe scan across all six audited renderer types — no violations related to DOM/visual order mismatches.

PCV-041.4.1 Use of Color (A) — Is color never the only way information (required state, errors, selection) is conveyed?

Yes

Required state is never conveyed by color: required questions always carry screen-reader-only "(required)" text, authors can opt in to a visible asterisk glyph (Deploy → Structure; off by default), and a blank required answer produces a text error; validation errors render as text with `role="alert"`; card-sort selection state is exposed as `aria-pressed` on each card's button as well as a ring/border color change.

PCV-051.4.3 Contrast (Minimum) (AA) — Does text meet the 4.5:1 (normal) / 3:1 (large) contrast ratio against its background?

Partial

The default "void" and "nice" themes use the app's own design-token palette, which was built with contrast in mind, but has not been run through automated contrast tooling end-to-end. Authors can also set fully custom theme colors per survey (`SurveyTheme.colors`) — Domandata cannot guarantee an author-chosen color combination meets contrast minimums, and no linting or warning currently flags a low-contrast custom theme.

PCV-061.4.4 Resize Text (AA) — Can text be resized up to 200% without loss of content or function?

Yes

No `maximum-scale`/`user-scalable` viewport restriction is set (`src/app/layout.tsx` only sets `colorScheme`), and question/answer typography uses relative (rem/Tailwind scale) units rather than fixed pixel sizes that would clip on zoom.

PCV-071.4.10 Reflow (AA) — Does content reflow to a single column at 320px width without requiring horizontal scrolling?

Yes

The public runner and its renderers use responsive Tailwind layout throughout; grid-matrix specifically has an author-toggleable "mobile-friendly layout" mode for narrow viewports.

PCV-081.4.11 Non-text Contrast (AA) — Do UI component boundaries and states (input borders, focus rings) meet 3:1 contrast?

Partial

Default themes use the app's token border/ring colors, which were designed with contrast in mind, but the same custom-theme caveat as PCV-05 applies — an author-set custom accent or border color is not automatically checked against its background.

OPROperable5 Yes4 Partial

OPR-012.1.1 Keyboard (A) — Can every question type be answered using only a keyboard?

Partial

Drag-to-order and card-sort both work end-to-end with a keyboard via dnd-kit's `KeyboardSensor` (Tab to the grip handle, Space to pick up, arrow keys to move, Space to drop) — verified in drag-to-order-renderer.tsx and card-sort-renderer.tsx, where `{...attributes}{...listeners}` live on the drag handle. Card-sort's "select a card, then choose a category" path is also keyboard-operable: each card's label is a real `<button>` (with `aria-pressed` for its selected state), and each category has its own "Place here" button, so no interactive control is nested inside another. Rated Partial rather than Supports because keyboard operation has not yet been re-verified across every newer question type (e.g. tree testing, conjoint column headers).

OPR-022.1.2 No Keyboard Trap (A) — Can keyboard focus always move away from any component?

Yes

No modal-style focus trap exists in the audited renderers; dnd-kit's keyboard drag mode releases focus normally on drop or Escape.

OPR-032.4.3 Focus Order (A) — Does focus move in a sensible, predictable order?

Yes

Confirmed via the live axe scan across all six audited renderer types — no focus-order violations. When a respondent moves to another page, focus moves to the first question on the new page (the Next button they pressed is replaced), and when a page can't be submitted, focus moves to the first question that needs attention.

OPR-042.4.4 Link Purpose (In Context) (A) — Is a link's purpose clear from its text or context?

Partial

Renderer-generated UI has no ambiguous links. Question titles and custom-HTML blocks are author-written content (sanitized, not authored by Domandata) and can include arbitrary links — their purpose is the survey author's responsibility, not something the runner enforces.

OPR-052.4.6 Headings and Labels (AA) — Do headings and labels describe topic or purpose?

Yes

Question titles double as the associated label for their answer control. Each survey page has a single `<h1>` (the survey title, or a screen-reader-only "Survey" heading when the author hides the title), block names are `<h2>`, and the questions sit inside a `<main>` landmark.

OPR-062.4.7 Focus Visible (AA) — Is keyboard focus always visibly indicated?

Yes

Focus-visible ring styling is applied through the shared UI primitives (e.g. `focus-visible:ring-2 focus-visible:ring-ring/50` used across footer/nav links and form primitives). One real gap was found and fixed during a manual tab-through audit (2026-08-28, not something the automated axe scan catches): the slider's underlying native `<input type="range">` is `opacity-0` to let a custom-styled track/thumb render on top, which also hid its native focus ring with no substitute — a keyboard user tabbing to any slider had no visible focus indicator at all. Fixed in `slider-renderer.tsx` via a Tailwind `peer-focus-visible` ring on the visible thumb, verified with a before/after screenshot showing the ring appear on Tab. Not exhaustively re-verified against every author-defined custom survey theme, since custom CSS can in principle override focus styling.

OPR-072.5.3 Label in Name (A) — Does a control's accessible name contain its visible label text?

Yes

Grid-matrix per-cell `aria-label`s are built directly from the visible row/column text (`{row}, {colLabel}`), so the accessible name is a superset of what's visually shown, not an unrelated string.

OPR-082.5.5 Target Size (AAA, tracked here as a stretch goal beyond our stated AA baseline) — Are touch targets at least 44×44px?

Partial

Slider's draggable hit area (the invisible native `<input type="range">` spanning the full track) was widened from 20px to 44px tall (`slider-renderer.tsx`, 2026-08-28), verified visually and against the automated suite. Not exhaustively verified for every other custom control across every theme, so still rated Partial overall rather than Yes.

OPR-092.2.1 Timing Adjustable (A) — Can a respondent get more time if content is time-limited?

Partial

Surveys have no time limit unless the author turns on Timed Survey in the Deploy tab. When they do, the runner shows a visible "N left" countdown, announces a warning to screen readers at 1 minute and again at 20 seconds, and ends the response when time runs out. There is no way for a respondent to request more time. Research designs sometimes need a fixed limit (WCAG's "essential" exception), but without an extension option this stays Partial.

UNDUnderstandable5 Yes1 Partial

UND-013.1.1 Language of Page (A) — Is the page's default human language programmatically set, and updated for multi-language surveys?

Yes

`<html lang="en">` is set at the root layout, and the public survey client runner updates `document.documentElement.lang` to the respondent's active survey language at runtime (`public-survey-client-runner.tsx`) for surveys using the multi-language / RTL feature.

UND-023.2.1 On Focus (A) — Does receiving focus ever trigger an unexpected context change?

Yes

No renderer in the audited set navigates, submits, or opens new context on focus alone; advancing the survey always requires an explicit Next/Submit action.

UND-033.2.2 On Input (A) — Does changing a value ever trigger an unexpected context change without warning?

Yes

Selecting an answer never auto-advances the page or auto-submits the survey; the respondent always reaches the next page through the visible Next/Submit control.

UND-043.3.1 Error Identification (A) — Are input errors identified and described to the user in text?

Yes

Required-field and validation errors render as visible text with `role="alert"` and are tied to their control via `aria-describedby`/`aria-invalid` (verified in short-answer-renderer.tsx and others).

UND-053.3.2 Labels or Instructions (A) — Are labels or instructions provided for user input?

Yes

Every question renders its title as a visible label, plus author-optional instruction text (e.g. card-sort's `config.instructions`, drag-to-order's static "Drag the handle to rank in order" hint).

UND-063.3.3 Error Suggestion (AA) — When an input error is detected, is a correction suggested where feasible?

Partial

Some renderers give a specific, actionable message (text-response's character-count-over-limit text); others state only that the field is required (e.g. card-sort's "Sort every card into a category before continuing") without a more granular suggestion. Not inconsistent enough to call broken, but not uniformly best-practice either.

RBTRobust2 Yes1 Partial2 No

RBT-014.1.1 Parsing (A) — Is markup free of duplicate IDs, unclosed elements, and other parsing errors?

Yes

React/JSX's compile step structurally prevents unclosed-tag and malformed-nesting errors; this criterion is largely superseded by modern HTML5 parsing behavior (dropped entirely in WCAG 2.2) but is included here since we scope this assessment to 2.1.

RBT-024.1.2 Name, Role, Value (A) — Does every UI component expose a correct accessible name, role, and state to assistive technology?

Yes

This is the exact criterion the live axe scan caught two real regressions against: a progress bar with no accessible name (`aria-progressbar-name`, serious) and an invalid `aria-pressed` on a plain, roleless `<div>` in card-sort (`aria-allowed-attr`, critical). Both are fixed as part of this same change — the progress bar now has `aria-label={`Survey progress, ${Math.round(percent)}% complete`}`, and card-sort's selected state moved into the drag handle's existing `aria-label` text instead of an invalid ARIA attribute on a non-interactive div. A re-scan after both fixes showed zero violations across all six audited renderer types.

RBT-034.1.3 Status Messages (AA) — Are status messages (that don't receive focus) announced to assistive technology?

Partial

Validation errors use `role="alert"` and card-sort's tap-to-select state uses `role="status"` in the six renderer types covered by the automated scan. This has not been audited across every status-style message in the rest of the app (e.g. toast notifications, save confirmations outside the survey runner), so it is disclosed as partial rather than a blanket yes.

RBT-04Has an independent third-party VPAT or formal WCAG 2.1 AA conformance audit been performed?

No

No formal, externally-produced VPAT or third-party accessibility audit has been performed. This page is a Domandata self-assessment backed by an automated axe-core scan of six renderer types, not an independent audit. Open item, disclosed honestly rather than implied otherwise.

RBT-05Has a manual screen-reader test matrix (e.g. NVDA, JAWS, VoiceOver) been performed beyond automated aria-attribute scanning?

No

No documented manual screen-reader test pass exists. Current coverage is automated (`@axe-core/playwright` against six renderer types, gated in CI on every PR into `main` — see docs/accessibility-compliance-runbook.md) plus ad hoc aria attributes verified by code review; it has not been exercised with a real screen reader by a human tester.

Accessibility Questions

Need this attached to your institution's 508 or accessibility review?

This page can be linked directly in a procurement or IT accessibility review. If your review needs a different format, or you find an accessibility issue we haven't caught, contact us directly.