VPAT — OpenLab Science (2026 Q4)

Voluntary Product Accessibility Template®, Version 2.4 — WCAG Edition. Evaluation date: 2026-09-19 (previous evaluation: 2026-09-18).

Product: OpenLab Science — openlabscience.com (physics simulations, Investigation Notebook, Assignment Builder, Grading Workspace, printable lab sheets, evidence-pack and portfolio printing)

Evaluation date note: This revision closes the lab-sheet coverage gap the 2026-09-18 evaluation named: all 138 printable lab sheets are now axe-scanned (previously 8 of 138, one flagship per module), in both shipped themes. It does not re-run or retract the 2026-09-18 findings outside that scope, which still hold.

Evaluation method: Self-audited. No external auditor was engaged, and no assistive-technology user testing has been performed. The method is disclosed in full in the "Evaluation methods" section below, and its limits are stated in "Evaluation limitations" — read both before relying on any Supported/Partially Supports claim here.

Contact for accessibility feedback: the site's contact form (openlabscience.com/contact).

Evaluation scope

Six teacher-facing surfaces, per the product's own accessibility commitments:

Six scoped teacher-facing surfaces and their routes
SurfaceRoute(s)Notes
Investigation Notebookin-lab panel over /lab?preset=<id>the student/teacher working notebook
Evidence-pack print/evidence-pack-printprintable per-investigation pack
Portfolio print/portfolio-printprintable multi-investigation portfolio
Assignment Builder/assign/buildteacher assignment authoring
Grading Workspace/gradingteacher review and grading of collected packs
Printable lab sheets/sheets/<preset>138 printable worksheets + answer-key gate

The interactive simulation stage itself (canvas/Konva rendering) is out of scope of the automated claims below, consistent with the product's documented exemption for the canvas region. The chrome around the stage (toolbar, readouts, panels, forms) is in scope and was scanned. All eight module lab shells (mechanics, circuits, fluids, waves, thermo, electromagnetism, modern, optics) additionally received scripted, real-keyboard walkthroughs.

Evaluation methods

  1. Automated rule-based scanning. axe-core 4.x (via @axe-core/playwright), rules tagged wcag2a, wcag2aa, wcag21a and wcag21aa (WCAG 2.0 and 2.1, levels A and AA), run against every scoped surface in a real Chromium browser (tests/e2e/a11y-phase-e.spec.ts, 16 tests at this evaluation, down from 23 after retiring its now-superseded 7-sheet flagship loop; plus tests/e2e/a11y-labsheets-all.spec.ts, 138 tests, one per printable lab sheet, added at this evaluation). Both specs are set up to run in a dedicated a11y job in CI (.github/workflows/ci.yml), separate from the main build job, and were run for this evaluation with the exact CI command; the results below come from that evaluation run, not from a standing CI record. Coverage includes populated states, not only empty ones: a real stashed evidence pack (Evidence-pack print), a real portfolio section (Portfolio print), a real loaded pack (Grading Workspace), a real selected preset (Assignment Builder). Lab-sheet coverage is now complete: all 138 of the product's printable lab sheets are scanned (previously 8 of 138, one flagship per module), each in both shipped themes (Academic Blue and Dusk Blue) since the sheet surface follows the same global theme toggle as the rest of the product, not a single fixed theme. The original empty-state scans still run alongside the populated ones. At evaluation date the run reported 0 critical/serious violations across all 276 lab-sheet scans (138 sheets × 2 themes) and all other scanned states. Coverage caveat, updated: the print routes are scanned in both their empty and one populated state each; the lab-sheet scan is now full-catalog (138 of 138) rather than a sample — it covers everything an automated rule-based pass can check, and does not substitute for a screen-reader or manual keyboard pass of every sheet (see Evaluation limitations).
  2. Keyboard-only walkthroughs. Scripted, real-keyboard traversal tests (tests/e2e/a11y-keyboard.spec.ts, 27 tests at this evaluation, all passing), extended at this evaluation to real Tab/Shift+Tab/Enter/Escape key presses (no programmatic .focus()) and to bounded tab-order reachability, not just activation — a helper fails the test if a control isn't reached within 300 real Tab presses. Verifies: focus moves into opened dialogs (not left on the triggering toolbar) and traps Tab while open; a non-empty visible focus ring renders on every focused control; Shift+Tab correctly reverses through the lab toolbar without focus getting lost; Escape closes the Investigation Notebook, the lesson-intro dialog, and the tutorial concept modal, returning focus to the control that opened them, and stands down (does not close the dialog) while a video is open inside one of them. Eight full guided-lesson walkthroughs, one per module — mechanics/projectile, circuits/single-resistor, fluids/fluid-float, waves/standing-string, thermo/ideal-gas-sandbox, electromagnetism/faraday-lenz, modern/photoelectric-threshold and optics/converging-real — complete every step of the S4.3 inquiry loop (predict, change, run-and-capture, action, explain), pressing Play, selecting the simulated object via a real keyboard-operable object list, and opening the Math tab, entirely by keyboard. (In thermo/ideal-gas-sandbox the single chamber is auto-selected on load, so that walkthrough has no separate selection step.) Shift+Tab reversal and the Escape checks run on the mechanics shell, whose toolbar and dialogs are shared by every module.
  3. Manual code review. The authors reviewed the markup and interaction code of the scoped surfaces against the success criteria below.

Evaluation limitations (read this)

  • Automated axe-core scans cover only what rules can check (markup semantics, some contrast, some form labeling). They cannot judge whether a workflow makes sense with a screen reader, whether focus order is sensible in every state, or whether content that is announced is also understandable.
  • No screen-reader user testing was performed for this template, at this or any prior evaluation. "Supports" claims below are supported by automated rules, scripted keyboard walkthroughs, and code review — not by assistive-technology user sessions. Where that gap matters most (complex drag interactions) this template says Partially Supports.
  • The keyboard walkthroughs prove reachability and activation for one guided lesson per module (all eight modules) and for the shared lab-shell primitives (Notebook, theme switch, tab bar). They do not cover every preset or every optional free-build interaction.
  • The simulation stage is canvas-based; phenomena are rendered graphically. The product renders numeric readouts (text) alongside the canvas, and the guided lessons narrate aloud, but a screen-reader user cannot follow the moving canvas graphics themselves.
  • The product's videos are hosted on YouTube; captions are enabled by default in the embedded player (cc_load_policy=1) and follow the interface language where a caption track exists in that language. Some videos rely on automatic (machine-generated) captions rather than human-reviewed ones — this was not and cannot be verified from the product's own code, since caption-track presence and quality are set on YouTube's side per video.

WCAG 2.1 — Success Criteria, Level A

Level A success criteria, status, and remarks
CriterionStatusRemarks
1.1.1 Non-text ContentSupportsAll images carry alt text or are marked decorative (alt=""). The canvas stage is exempt from simulation semantics (see the Evaluation limitations section); its controls are real buttons with names.
1.2.1 Audio-only / Video-onlySupportsGuided-lesson videos are narrated; no video-only content ships.
1.2.2 Captions (Prerecorded)Partially SupportsCaptions are enabled by default in the embedded player (cc_load_policy=1, language preference from the interface) and the videos are YouTube-hosted uploads, so captions render wherever a caption track exists. Some caption tracks are automatic rather than human-reviewed. Separately, the narrated in-app lesson slides (LessonPlayer) ship an always-visible on-screen transcript of their own narration, not gated behind a captions toggle.
1.2.3 Audio Description or Media AlternativePartially SupportsLesson narration describes the phenomenon aloud; no separate audio-description track exists.
1.4.1 Use of ColorSupportsState is conveyed by text, icons, and borders in addition to color (verification flags pair color with icons and text; correct/incorrect use symbols).
1.4.2 Audio ControlSupportsNarration and video are user-initiated; the video player exposes pause. No auto-playing sound outside the user-triggered video.
2.1.1 KeyboardPartially SupportsScripted, real-keyboard walkthroughs (see Evaluation methods) now complete the full guided-lesson path — including selecting the simulated object and opening the Math tab — for one guided lesson in each of the eight modules. Circuits (2026-09-18) and fluids, waves, thermo, electromagnetism, modern and optics (2026-09-19) previously had no keyboard way to select a simulated object at all; a keyboard-operable object list (matching the pattern mechanics already had) was added to each and is covered by the walkthroughs. Known gap: some sandbox interactions that are drag-based on the canvas have no keyboard equivalent — the canvas is exempt, but this limits completing every optional free-build interaction by keyboard.
2.1.2 No Keyboard TrapSupports (scoped surfaces)Scripted keyboard tests verify focus never ends up lost (it remains on a real element after repeated Tabs and after Shift+Tab reversal on scoped surfaces). Escape now closes the Investigation Notebook, the lesson-intro dialog, and the tutorial concept modal, returning focus to the triggering control — each was previously a real, scripted-and-confirmed focus trap with no keyboard exit other than its Close/Skip button; Escape is now wired to the same effect as that button in each case, and correctly stands down while a video is open inside one of them rather than closing both at once.
2.1.4 Character Key ShortcutsPartially SupportsTwo single-character shortcuts exist and cannot be turned off or remapped: / opens global search (skipped while typing in a text field), and ? toggles the in-lab help menu (same typing guard). Neither is active only on focus, so the criterion's mechanisms are not fully met.
2.2.1 Timing AdjustableSupportsNo time limits on student work. Assignment links expire (configurable, default 14 days, up to 180) — an administrative, not interaction, timer; expiry is set by the teacher at authoring time.
2.2.2 Pause, Stop, HideSupportsAnimations run only inside the user-initiated simulation; video exposes pause.
2.3.1 Three FlashesSupportsNo flashing content.
2.4.1 Bypass BlocksSupportsRepeated navigation is bypassable via the page outline and (in the Assignment Builder) a purpose-built skip link over the large preset picker.
2.4.2 Page TitledSupports (scoped surfaces)Every scoped surface sets a document title (the two noindex print routes set theirs in code; they have no SEO config). Some out-of-scope utility routes (assignment landing, internal tooling) do not, and inherit the previous title on SPA navigation.
2.4.3 Focus OrderPartially SupportsOpened dialogs move focus into themselves on mount (scripted). Shift+Tab reversal through the lab toolbar is now scripted and confirmed not to skip or misorder controls. Focus order within forms follows DOM order. Full-order sensibility for every modal combination has not been user-tested.
2.5.1 Pointer GesturesSupportsNo multipoint or path-based gestures outside the canvas stage.
2.5.2 Pointer CancellationSupportsActions commit on click/up, not down.
2.5.3 Label in NameSupportsVisible labels match accessible names.
2.5.4 Motion ActuationSupportsNo device-motion triggers.

WCAG 2.1 — Success Criteria, Level AA

Level AA success criteria, status, and remarks
CriterionStatusRemarks
1.3.1 Info and RelationshipsSupportsTables use real th/td; dialogs use role="dialog" with labels; form fields use label/aria-label (scanned by axe rules 1.3.1-compatible).
1.3.2 Meaningful SequenceSupportsDOM order matches reading order on scoped surfaces.
1.3.3 Sensory CharacteristicsSupportsInstructions reference controls by name, not by shape or position.
1.3.4 OrientationSupportsNo orientation restriction; both orientations usable.
1.3.5 Identify Input PurposePartially SupportsCommon fields (student name) are text inputs; only limited autocomplete metadata is declared.
1.4.1 Use of Color (AA)SupportsSee 1.4.1 at Level A.
1.4.3 Contrast (Minimum)Supports (scoped surfaces)axe color-contrast rules ran over every scoped surface, now including populated states; 0 critical/serious findings at this evaluation date, after fixing one real defect the populated-state Grading Workspace scan caught (label text at 3.77:1 and 4.0:1 against forced-Dusk panel backgrounds, raised to the existing --text token's proven ≥4.5:1 pairing). Separately, and outside axe's own scan (axe cannot evaluate live/dynamic canvas text): a manual pass computed WCAG contrast ratios (the same relative-luminance formula the repo's apparatusContrast.test.ts gate already trusts) for the product's projector-facing live readouts — ProjectorReadoutStrip (the ?projector=1 overlay) and the canvas-drawn probe/timer text in Stage.tsx. Both were found and fixed: the projector strip's translucent background dropped its own text to as low as ~2.9:1 against the canvas floor color (fixed by making the background opaque, reusing the existing --bg token — no new color); the canvas readout text shared a color with graphics elements held only to a 3:1 floor (fixed with a second, text-only color already used elsewhere in the design system, --ap-eyebrow). Both themes now clear 4.5:1 on every readout pairing (several clear 7:1); locked as permanent regression tests in apparatusContrast.test.ts. Grading Workspace's queue-list :hover/:focus-visible states for a not-yet-selected item share that tinted background; their captions now also switch to --text in those states (fixed at this evaluation, existing tokens only). Coverage caveat, updated: the lab-sheet scan now covers all 138 of 138 sheets, in both themes (previously 8 of 138) — 0 critical/serious color-contrast findings across all 276 scans. Print styles force light tokens for legible output; this scan covers the on-screen, pre-print render in both themes, not the printed page.
1.4.4 Resize TextSupports (code review)Layout is responsive and the product ships a text-size preference, based on manual code review of the scoped surfaces. No dedicated 200%-zoom pass has been run; the responsive/reflow claims in 1.4.10 rest on the same code review.
1.4.5 Images of TextSupportsText is real text; images are logos/illustrations with names.
1.4.10 ReflowSupports (code review)Layouts reflow to a single column and data tables scroll horizontally in place rather than clipping, based on manual code review (same basis as 1.4.4 — no dedicated zoom pass).
1.4.11 Non-text ContrastSupports (code review)Focus ring and control borders use high-contrast design-system tokens, based on manual code review. The focus-ring claim is now additionally supported by scripted evidence: 40 Tab stops × 2 themes on each of the eight module lab shells each found a non-empty visible indicator (see 2.4.7). axe-core has no rule for this criterion generally, and no dedicated manual contrast pass beyond the focus ring has been run for ordinary control borders.
1.4.12 Text SpacingSupports (code review)No fixed-height text containers on the scoped surfaces, based on manual code review; no dedicated text-spacing override pass has been run.
1.4.13 Content on Hover or FocusSupportsTooltips are used sparingly and do not obscure content or trap pointers.
2.4.5 Multiple WaysPartially SupportsThe catalog, search, curriculum pages, and go-links provide multiple paths to experiments; the in-lab surfaces are single-purpose.
2.4.6 Headings and LabelsSupportsSections carry real headings (h1–h2 per surface); forms label every field.
2.4.7 Focus VisibleSupports (scoped surfaces)A global :focus-visible ring renders on every interactive control. At this evaluation, scripted tests walked 40 real Tab presses from a fresh load of each of the eight module lab shells in BOTH shipped themes (Dusk Blue and Academic Blue), asserting a visible indicator (non-empty box-shadow or non-zero outline) at every stop reached — 16 of 16 walks passed with 0 failing stops.
3.1.1 Language of PageSupportslang is set per locale (46 locales).
3.1.2 Language of PartsPartially SupportsIsolated non-locale strings (formula symbols, numeric readouts) are isolated for directionality; embedded-phrase language tagging is not exhaustive.
3.2.1 On FocusSupportsNo component triggers a context change on focus alone.
3.2.2 On InputSupportsForms submit on explicit activation.
3.2.3 Consistent NavigationSupportsShared header across surfaces.
3.2.4 Consistent IdentificationSupportsShared components for load/print/export actions.
3.3.1 Error IdentificationSupportsInline, text-based error messages on forms (mint/verify/import paths); import rejections state the reason inline.
3.3.2 Labels or InstructionsSupportsEvery field carries a visible label; complex steps (file import) carry explicit instructions.
3.3.3 Error SuggestionSupportsImport and validation errors state the corrective condition (e.g. "no usable numeric table"; server validation messages surfaced verbatim).
3.3.4 Error Prevention (Legal, Financial, Data)SupportsDestructive actions (trial delete) are explicit clicks; the grading purge pattern requires typed confirmation on internal tooling.

Known limitations (summary)

  1. Canvas stage. Simulation graphics are canvas-rendered; screen-reader users follow the numeric readouts and narration, not the graphics. Some free-build drag interactions lack a keyboard equivalent. This exemption is unchanged at this evaluation.
  2. Captions. Captions are on by default and available on hosted videos, but some tracks are machine-generated rather than human-reviewed; authored transcripts are not yet published for every video, though the in-app narrated lesson slides carry their own always-visible transcript. Per-video YouTube caption-track presence and quality remain external to this codebase and were not and cannot be verified from it. Unchanged at this evaluation.
  3. No screen-reader user testing. The claims in this template rest on automated rules, scripted keyboard walkthroughs, and code review — not on sessions with assistive technology users. Feedback through the contact form is treated as a priority. Unchanged at this evaluation.
  4. Projector-readable readout contrast. Verified and fixed at this evaluation for the two live-readout surfaces found in the product's rendering and component code — the projector overlay strip and the canvas-drawn probe/timer text — both themes, 4.5:1 minimum with several pairings clearing 7:1. This was previously an open, under-review commitment; it is now claimed within that tested scope. A related contrast gap found in the same pass (Grading Workspace's queue-list hover/focus state for a not-yet-selected item) was also fixed.
  5. Module coverage. The scripted keyboard walkthroughs and the both-themes focus walkthroughs cover all eight module routes, one guided lesson each; they do not cover every preset.
  6. Scope. This template covers the six scoped teacher-facing surfaces. Marketing pages are keyboard-navigable but were not part of the automated scans at evaluation date.