Admin GuidesAccessibility Conformance (WCAG 2.2 AA)

Accessibility Conformance Record (WCAG 2.2 AA)

Who this guide is for: tenant administrators, procurement and compliance teams who need to know how accessible EmbayLMS is — for a vendor questionnaire, a public-sector accessibility requirement, or SOC 2 and Law 25 evidence. It is written in the format of a VPAT® (Voluntary Product Accessibility Template) WCAG edition, and it is a self-evaluation, not a third-party audit.

Conformance claim: EmbayLMS is partially conformant with WCAG 2.2 Level AA. Partially conformant is the W3C term for “some parts of the content do not fully conform”. The criteria that are not fully met are marked Partially supports below, each with the reason and the ticket that owns it.

The public, bilingual accessibility statement every learner can reach from the footer of every page is at /legal/accessibility (French: /fr-CA/legal/accessibility). It carries the same claim and the same known limitations in plain language.

Product and evaluation

FieldValue
ProductEmbayLMS web application — learner, instructor, administrator and public (storefront, sign-in, certificate verification) surfaces
Out of scopeThe Embay staff platform console (internal, English-only); content uploaded by your organization (SCORM / cmi5 / AICC packages, videos, documents); tenant custom CSS
StandardWCAG 2.2, Levels A and AA
Evaluation date2026-09-24
MethodAutomated: axe-core 4.x (@axe-core/playwright) on every pull request against the critical journeys; design-token contrast pairs measured in CI; unit guards on landmarks, the skip link and the form primitives. Manual: code review of keyboard operability, focus management, landmarks, headings, labels and live regions. Hands-on (2026-09-24): a keyboard walk-through of production — the public pages, and signed in as an Owner on the administration, Learn, Teach and course-player screens — with the accessibility tree inspected at each stop; and an NVDA pass in Chrome by Embay covering page titles, the skip link, form labels, heading navigation, dialog focus, landmarks, the links list and French voice switching. Its findings were fixed in PR #687 and LMS-1072
BrowsersChromium (automated); Chrome (manual, with NVDA)
Assistive technologyNVDA with Chrome — tested 2026-09-24 on the screens above. JAWS and VoiceOver not yet tested — see Known limitations

Critical journeys covered by the automated gate

The CI job E2E Tests runs apps/web/e2e/specs/accessibility.spec.ts on every pull request. It scans each screen below for serious and critical violations of the WCAG 2.0 / 2.1 / 2.2 A and AA rules and fails the build on any violation that is not in the ticketed baseline (apps/web/e2e/a11y-baseline.json).

JourneyScreens scanned
Sign inSign-in (EN and FR-CA), forgot password
CatalogLearner home, course catalog
EnrollCourse page (the enroll / resume screen)
Course playerPlayer, quiz module
CompleteMy learning, achievements and certificates, transcript
ReportAdmin dashboard, analytics, overdue report, users, courses

How to read the table

LevelMeaning
SupportsThe functionality meets the criterion without known defects
Partially supportsSome functionality does not meet the criterion — the remark says what
Does not supportThe majority of functionality does not meet the criterion
Not applicableThe criterion is not relevant to the product

Table 1 — Level A

CriterionLevelRemarks
1.1.1 Non-text ContentSupportsIcon-only buttons require an accessible name (IconButton refuses to compile without aria-label); decorative icons are aria-hidden; logos carry the platform name. Images inside uploaded course content are your organization’s responsibility
1.2.1 Audio-only and Video-only (Prerecorded)Partially supportsDepends on the uploaded media; your organization can add a transcript as a document or lesson block next to the media
1.2.2 Captions (Prerecorded)Does not support (uploaded video)The video player does not yet load a caption track for uploaded video files — captions burned into the video, or provided by YouTube / Vimeo embeds, are the only option today. Caption tracks and auto-generated captions: LMS-872
1.2.3 Audio Description or Media AlternativePartially supportsDepends on the uploaded media
1.3.1 Info and RelationshipsSupportsOne <main> landmark per page (guard-tested), labelled navigation regions, table headers on every data table (DataTable primitives), labels programmatically tied to every form control (Input / Select / Checkbox / Radio / Switch primitives)
1.3.2 Meaningful SequenceSupportsDOM order matches visual order; no CSS reordering of content
1.3.3 Sensory CharacteristicsSupportsInstructions do not rely on shape, position or colour alone
1.4.1 Use of ColorSupportsStatus is carried by text as well as colour (status pills carry their label; overdue rows carry a label and an edge)
1.4.2 Audio ControlSupportsNothing plays automatically
2.1.1 KeyboardSupportsAll controls are native buttons, links or inputs; the course folder tree offers a Move button for every drag operation
2.1.2 No Keyboard TrapSupportsDialogs and drawers are Radix primitives: Escape closes and focus returns to the opener (proved in overlay-a11y.spec.ts); off-screen navigation drawers are removed from the Tab order
2.1.4 Character Key ShortcutsSupportsNo single-character shortcuts
2.2.1 Timing AdjustablePartially supportsThe only time limits are quiz time limits your organization sets. They are shown before the quiz starts but a learner cannot extend them; a timed assessment can fall under the criterion’s “essential” exception, which is your organization’s call
2.2.2 Pause, Stop, HideSupportsNo auto-moving content; loading animations stop under prefers-reduced-motion
2.3.1 Three Flashes or Below ThresholdSupportsNo flashing content
2.4.1 Bypass BlocksSupportsA “Skip to main content” link is the first Tab stop on every page and targets the page’s <main>
2.4.2 Page TitledSupportsEach page’s title is its heading plus the platform name
2.4.3 Focus OrderSupportsFocus order follows the DOM; dialogs move focus in and back; the SCORM player moves focus into the lesson on launch when nothing else holds focus
2.4.4 Link Purpose (In Context)SupportsLink text or accessible name describes the destination
2.5.1 Pointer GesturesSupportsNo multipoint or path-based gestures
2.5.2 Pointer CancellationSupportsActions fire on click (up event)
2.5.3 Label in NameSupportsVisible labels are the accessible names
2.5.4 Motion ActuationNot applicableNo motion-triggered functionality
3.1.1 Language of PageSupports<html lang> is the user’s locale (en or fr-CA)
3.2.1 On FocusSupportsFocus never triggers a change of context
3.2.2 On InputSupportsChanging a field never submits a form or navigates by itself
3.2.6 Consistent HelpSupportsContextual help (the ”?” help button) sits beside the page heading on every administration screen that has it; the accessibility statement and its contact path are in the footer of every page
3.3.1 Error IdentificationSupportsField errors are shown in text, marked aria-invalid and linked with aria-describedby; form-level errors are role="alert"
3.3.2 Labels or InstructionsSupportsEvery input has a visible or screen-reader label; required fields use the required attribute; format hints are linked to their field
3.3.7 Redundant EntrySupports ¹Multi-step flows (onboarding, checkout) keep what was entered within the flow
4.1.2 Name, Role, ValueSupportsNative elements, Radix primitives, role="switch" with aria-checked, aria-expanded on disclosure buttons; content frames are titled

Table 2 — Level AA

CriterionLevelRemarks
1.2.4 Captions (Live)Not applicableLive sessions run in your Zoom / Meet account, whose captions apply
1.2.5 Audio Description (Prerecorded)Partially supportsDepends on the uploaded media
1.3.4 OrientationSupports ¹No layout locks orientation
1.3.5 Identify Input PurposeSupportsPersonal-data fields carry autocomplete (email, given-name, family-name, current-password, new-password, one-time-code)
1.4.3 Contrast (Minimum)SupportsEvery text / background token pair is measured in CI (token-contrast.test.ts) at ≥ 4.5:1; tenant colour themes are refused on save below 4.5:1
1.4.4 Resize TextSupports ¹Text is sized in rem and scales with browser zoom
1.4.5 Images of TextSupportsNo images of text (logos excepted)
1.4.10 ReflowSupports ¹Mobile-first layouts; navigation folds into a menu below the md / lg breakpoints. Wide data tables scroll horizontally inside their own region, which the criterion allows for two-dimensional content
1.4.11 Non-text ContrastPartially supportsControls use --color-border-interactive (≥ 3:1) and the teal focus ring; the switch off-track was moved to it in this change. The lighter hairline token --color-border-strong (1.46:1) still separates some non-interactive regions and outlines secondary buttons — tracked as LMS-858 (needs a design decision on the neutral scale)
1.4.12 Text SpacingSupports ¹Text containers are not fixed-height
1.4.13 Content on Hover or FocusSupports ¹Tooltips are native title; menus open on click and close on Escape
2.4.5 Multiple WaysSupportsNavigation, catalog search and the transcript reach every learning item
2.4.6 Headings and LabelsSupportsEvery page has one <h1> on the title scale; sections are <h2>
2.4.7 Focus VisibleSupportsA 2 px teal :focus-visible outline globally, a teal focus shadow on form controls; hidden-until-hover row actions also appear on keyboard focus
2.4.11 Focus Not Obscured (Minimum)SupportsThe course player’s sticky header is offset with scroll-padding-top, so a focused control is scrolled clear of it; closed drawers leave the Tab order
2.5.7 Dragging MovementsSupportsEvery drag has a single-pointer alternative: course folders and courses — the Move button (a destination picker); modules, lesson blocks, quiz questions and learning-path courses — Move up / Move down buttons; file drop zones — a file picker
2.5.8 Target Size (Minimum)SupportsButtons are 32–40 px; the smallest in-row icon buttons are 24 px; the switch has a 44 × 28 px hit area; footer links are at least 24 px tall
3.1.2 Language of PartsSupportsEach page is in one language; course content in another language is authored per language version
3.2.3 Consistent NavigationSupportsEach role has one shell whose navigation does not change order between pages
3.2.4 Consistent IdentificationSupportsShared primitives give the same function the same name everywhere
3.3.3 Error SuggestionSupportsError messages say how to fix the problem (e.g. password length and match)
3.3.4 Error Prevention (Legal, Financial, Data)SupportsPurchases show a review step; destructive actions ask for confirmation
3.3.8 Accessible Authentication (Minimum)SupportsSign-in allows password managers and paste (autocomplete set, no paste blocking); the MFA code is a one-time code that can be pasted; single sign-on is available; the optional registration CAPTCHA (Cloudflare Turnstile) is non-interactive in most cases
4.1.3 Status MessagesSupportsToasts are live regions (role="status"; failures role="alert"); form-level errors are alerts; loading skeletons announce a busy state

¹ By design, not yet verified by a manual test. The remark describes how the product is built; no dedicated zoom / reflow / text-spacing / orientation test has been run yet. These are listed as a known limitation below and will be confirmed or corrected by the manual pass.

Known limitations

These are the reasons the claim is partially conformant. Each is listed in the public statement as well.

LimitationWCAGOwner
Light hairline borders and secondary-button outlines below 3:11.4.11LMS-858 — design decision on the neutral border scale
Not yet tested with JAWS or VoiceOver, or in Firefox and Safari; the keyboard and NVDA pass (2026-09-24) covered the main screens, not every administration screen2.1.1, 2.4.3, 1.3.1, 4.1.2, 4.1.3 (verification)Epic LMS-525 — extend the manual pass
Manual zoom (200 % / 400 % reflow), text-spacing and orientation checks not yet run — the rows marked ¹ are by design only1.3.4, 1.4.4, 1.4.10, 1.4.12, 1.4.13, 3.3.7Epic LMS-525 — manual pass still to run
Administration screens outside the critical journeys are covered by the shared primitives but not by the axe gateAllEpic LMS-525 — extend the gate screen by screen
Downloaded PDF certificates and report exports are not tagged PDFs1.3.1 (documents)Not yet ticketed as a story; tracked on epic LMS-525
Tenant custom CSS is not checked for contrast or focus visibility1.4.3, 2.4.7By design — the tenant owns it (DESIGN.md §9)
The video player cannot show a caption track for uploaded video files; transcripts and descriptions of uploaded media depend on your organization1.2.1, 1.2.2, 1.2.3, 1.2.5LMS-872 (caption tracks + auto-captions)
Quiz time limits cannot be extended by the learner2.2.1Not yet ticketed as a story; tracked on epic LMS-525

Automated baseline

The axe gate compares each screen with apps/web/e2e/a11y-baseline.json. An entry there is known debt with the ticket that owns it; the gate fails on anything new. When a baselined rule stops firing, the test report says so and the entry must be removed.

Troubleshooting

ProblemWhat to do
A procurement form asks for a VPATSend this page. Its tables follow the VPAT WCAG edition
A learner reports a barrierAsk which page and what they were doing, then email support@embaylms.com — the same contact the public statement gives
A course is not accessibleCourse content is uploaded by your organization; check captions, alternative text and the authoring tool’s accessibility export settings
Your custom colours are refused on saveThe theme would fall below 4.5:1 contrast — pick a darker primary or a lighter canvas

Revision history

DateChange
2026-09-24First record — axe gate on the critical journeys, keyboard / focus / forms / landmarks fixes, WCAG 2.2 criteria, bilingual statement (epic LMS-525)