| 1.1.1 Non-text Content | Supports | Respondent surfaces: the logo has alt text (survey-form.tsx), and icon-only buttons have an accessible name. Email: the logo uses the brand name as its alt text and decorative images use empty alt (src/lib/email/components.tsx). The survey designer uses labelled icon buttons. |
| 1.2.1 Audio-only and Video-only (Prerecorded) | Not Applicable | No audio or video on any surface in scope. |
| 1.2.2 Captions (Prerecorded) | Not Applicable | No audio or video on any surface in scope. |
| 1.2.3 Audio Description or Media Alternative (Prerecorded) | Not Applicable | No audio or video on any surface in scope. |
| 1.3.1 Info and Relationships | Partially Supports | Respondent surfaces: each screen’s question is its heading, controls are grouped and labelled, and the axe-core run passes on twelve respondent states covering ten of the eleven question types, with Multiple choice not yet scanned (survey-form-axe.test.tsx). Email layout tables and the survey designer have no automated check. |
| 1.3.2 Meaningful Sequence | Supports | Respondent surfaces show one question per screen in DOM order, and right-to-left languages set dir on the page. |
| 1.3.3 Sensory Characteristics | Supports | Scale ends and faces carry text labels (survey-scale-input.tsx), so no instruction relies on shape, color or position alone. |
| 1.4.1 Use of Color | Partially Supports | Not verified in a browser that every selected state differs by more than color. Code review only. |
| 1.4.2 Audio Control | Not Applicable | No audio plays on any surface in scope. |
| 2.1.1 Keyboard | Partially Supports | Respondent surfaces are keyboard operable: Space selects a score and Enter confirms it (survey-scale-input.tsx), ranking has Move up and Move down buttons (survey-ranking-input.tsx), and Escape closes the in-app widget (public/sdk/surveys.js). No recorded keyboard-only walkthrough of the survey designer exists. |
| 2.1.2 No Keyboard Trap | Supports | The in-app widget is non-modal in its banner and card positions. Escape and Close survey return focus to the page (sdk-widget-a11y.test.ts). |
| 2.1.4 Character Key Shortcuts | Does Not Support | Pressing ? opens the GainTrace keyboard shortcuts panel on the survey page, the embed and the survey designer, and it can’t be turned off or remapped (keyboard-shortcuts-panel.tsx, mounted for every route outside /auth in providers.tsx). The in-app widget runs on your own page and doesn’t load it. |
| 2.2.1 Timing Adjustable | Supports | Personal links last 30 days. |
| 2.2.2 Pause, Stop, Hide | Supports | Nothing moves or updates on its own. The in-app widget fades instead of sliding when the person prefers reduced motion. |
| 2.3.1 Three Flashes or Below Threshold | Supports | Nothing flashes on any surface in scope. |
| 2.4.1 Bypass Blocks | Supports | Survey pages have no repeated blocks to skip. The survey designer sits in the GainTrace app shell, which is outside this report. |
| 2.4.2 Page Titled | Supports | The survey name is the page title. |
| 2.4.3 Focus Order | Partially Supports | Respondent surfaces: focus moves to each step’s heading (survey-form.tsx, survey-form-a11y.test.tsx) and returns to the page after the in-app widget closes (sdk-widget-a11y.test.ts). The survey designer’s focus order has not been walked. |
| 2.4.4 Link Purpose (In Context) | Supports | The thank-you link is named as opening in a new tab (survey-form-a11y.test.tsx). Email score links are named by their digit, and the email button names its action (invite-email.test.ts). |
| 2.5.1 Pointer Gestures | Supports | No multipoint or path-based gestures are required. Ranking drag has Move up and Move down buttons. |
| 2.5.2 Pointer Cancellation | Supports | Standard buttons and radios act on release. |
| 2.5.3 Label in Name | Partially Supports | CSAT faces show a word inside each answer, such as Very satisfied, but the accessible name is the number (survey-scale-input.tsx). A speech-input user can’t say the visible word to pick it. Other score and choice controls start their accessible name with the visible text. |
| 2.5.4 Motion Actuation | Not Applicable | No function is triggered by device motion. |
| 3.1.1 Language of Page | Supports | lang and dir follow the survey language on the survey page, the embed, the in-app widget and the email (survey-client.tsx, embed-client.tsx, public/sdk/surveys.js, survey-form-i18n.test.tsx). |
| 3.2.1 On Focus | Supports | Focusing a control never changes context. |
| 3.2.2 On Input | Partially Supports | On respondent surfaces, tapping a score with a pointer moves to the next screen without notice. The keyboard selects with Space and confirms with Enter. Back and changing the score undo the move. |
| 3.2.6 Consistent Help | Supports | Survey pages offer no help mechanism. In the survey designer, help sits in the same place on every app page. |
| 3.3.1 Error Identification | Supports | Errors are named next to the field with aria-invalid and aria-describedby (survey-form.tsx). |
| 3.3.2 Labels or Instructions | Supports | Fields have visible labels, and optional fields say so. |
| 3.3.7 Redundant Entry | Supports | Identity comes from the personal link, answers survive Back, and unsent answers are kept in the browser and sent again. |
| 4.1.1 Parsing | Not Applicable | WCAG 2.2 (obsolete and removed) - Does not apply. |
| 4.1.2 Name, Role, Value | Partially Supports | Respondent surfaces: the axe-core aria rules pass on twelve respondent states covering ten of the eleven question types (Multiple choice is not yet scanned), and the in-app widget buttons are named Close survey and Ask me later. The survey designer uses Radix and shadcn primitives and has no axe-core scan. |