packages/compliance/a11y/player/VPAT-2026-04-14.md
Date: April 14, 2026
| Field | Value |
|---|---|
| Product Name | @remotion/player (<Player> component) |
| Instance tested | Demo Player on https://www.remotion.dev/player |
| Report Date | 2026-04-14 |
| Contact | remotion.dev/contact |
| Evaluation Methods | Live DOM / accessibility-tree inspection in Chrome; scripted queries; manual focus/label checks. |
| Applicable Standard | WCAG 2.1 Level AA |
| Scope | The Player component only (container semantics, play/pause, mute, seek, volume, fullscreen, time display). Page-level findings on /player (marketing copy, surrounding demo controls, duplicate link text) are out of scope. |
| Term | Definition |
|---|---|
| Supports | Fully meets the criterion |
| Partially Supports | Some content meets, some gaps remain |
| Does Not Support | Significant failures |
| Not Applicable | Feature or content type does not exist in the product |
Conformance Level: Partially Supports
Remarks:
aria-label + title.aria-pressed — state cannot be determined by screen readers (see 4.1.2).Conformance Level: Does Not Support
Remarks:
<Player> provides no text-alternative surface for audio-only or video-only compositions.Conformance Level: Does Not Support
Remarks:
<video>/<track> hierarchy and exposes no captions/subtitles API. Compositions with spoken dialogue cannot have captions without consumer code.Conformance Level: Does Not Support
Remarks:
Conformance Level: Does Not Support
Remarks:
Conformance Level: Does Not Support
Remarks:
.__remotion-player wrapper has no role, aria-label, or aria-roledescription. There is no region/landmark identifying this as a video player.<div> elements with no role="slider", no aria-valuemin/max/now, no label.<div> with no slider role, name, or value attributes.Conformance Level: Does Not Support
Remarks:
Conformance Level: Supports
Remarks:
Conformance Level: Partially Supports
Remarks:
<Player autoPlay loop> instance has no built-in respect for prefers-reduced-motion — autoplay/loop run regardless. Component should default to no-autoplay under reduced motion and document the override.Conformance Level: Supports
Remarks:
outline-style: none only on :focus; Chrome's default :focus-visible UA style restores the ring for keyboard focus.:focus-visible rule on the controls so the indicator is stable across browsers/themes and does not depend on UA defaults.Conformance Level: Does Not Support
Remarks:
role="slider", no aria-valuemin/max/now/text, no aria-label — fails.aria-pressed; label doesn't toggle; muted state not programmatically exposed — fails.Conformance Level: Does Not Support
Remarks:
role="timer", no aria-live.| WCAG | Issue |
|---|---|
| 1.2.2 / 1.2.3 / 1.2.5 | No captions, no audio description, no transcript mechanism in the component API |
| 1.3.1 / 4.1.2 | Seek bar is a plain <div> stack — no slider role, name, or value |
| 1.3.1 / 4.1.2 | Volume slider is a plain <div> — no slider role, name, or value |
| 1.3.1 | .__remotion-player wrapper has no container role or accessible name |
| 2.1.1 | Seek bar and volume slider not keyboard-operable; no media keyboard shortcuts |
| 2.2.2 | <Player autoPlay loop> does not respect prefers-reduced-motion |
| 4.1.2 | Mute button has no aria-pressed and label does not toggle to expose state |
| 4.1.3 | Time display not a live region; mute state changes not announced |
<button> with aria-label + title<audio> elements are display: none — not in the tab orderThe @remotion/player video-player component Partially Supports WCAG 2.1 Level AA. Control buttons are labelled and keyboard-focusable, but the seek bar, volume slider, focus indicator, mute-state semantics, captions/transcript surface, and container landmarking all need work before the component can be considered an accessible media player. Reference implementations for comparison: Able Player, OzPlayer, Video.js.