Skip to content

Commit 5fc780e

Browse files
authored
fix(vidstack): support custom player aria label (#1821)
1 parent 2744171 commit 5fc780e

3 files changed

Lines changed: 13 additions & 6 deletions

File tree

packages/vidstack/src/components/player.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -268,17 +268,15 @@ export class MediaPlayer
268268
#skipTitleUpdate = false;
269269
#watchTitle() {
270270
const el = this.$el,
271+
{ ariaLabel } = this.$props,
271272
{ title, live, viewType, providedTitle } = this.$state,
272273
isLive = live(),
273274
type = uppercaseFirstChar(viewType()),
274275
typeText = type !== 'Unknown' ? `${isLive ? 'Live ' : ''}${type}` : isLive ? 'Live' : 'Media',
275-
currentTitle = title();
276+
currentTitle = title(),
277+
label = ariaLabel() || `${typeText} Player` + (currentTitle ? ` - ${currentTitle}` : '');
276278

277-
setAttribute(
278-
this.el!,
279-
'aria-label',
280-
`${typeText} Player` + (currentTitle ? ` - ${currentTitle}` : ''),
281-
);
279+
setAttribute(this.el!, 'aria-label', label);
282280

283281
// Title attribute is removed to prevent popover interfering with user hovering over player.
284282
if (!__SERVER__ && el?.hasAttribute('title')) {

packages/vidstack/src/core/api/player-props.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import type { MediaLoadingStrategy, MediaPosterLoadingStrategy } from './types';
1313
export const mediaPlayerProps: MediaPlayerProps = {
1414
artist: '',
1515
artwork: null,
16+
ariaLabel: '',
1617
autoplay: false,
1718
autoPlay: false,
1819
clipStartTime: 0,
@@ -58,6 +59,8 @@ export interface MediaStateAccessors extends Pick<
5859

5960
export type PlayerSrc = MediaSrc | MediaSrc[];
6061

62+
export type MediaPlayerAriaLabel = string;
63+
6164
export interface MediaPlayerProps
6265
// Prefer picking off the `MediaStore` type to ensure docs are kept in-sync.
6366
extends Pick<
@@ -84,6 +87,11 @@ export interface MediaPlayerProps
8487
| 'liveEdgeTolerance'
8588
| 'minLiveDVRWindow'
8689
> {
90+
/**
91+
* A custom ARIA label for the player root. By default, the player will generate a label using
92+
* the current media type, live state, and title.
93+
*/
94+
ariaLabel: MediaPlayerAriaLabel;
8795
/** @deprecated - Use `autoPlay` */
8896
autoplay: boolean;
8997
/** @deprecated - Use `crossOrigin` */

packages/vidstack/src/elements/define/player-element.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export class MediaPlayerElement extends Host(HTMLElement, MediaPlayer) {
1818
static tagName = 'media-player';
1919

2020
static override attrs: Attributes<MediaPlayerProps> = {
21+
ariaLabel: 'aria-label',
2122
autoPlay: 'autoplay',
2223
crossOrigin: 'crossorigin',
2324
playsInline: 'playsinline',

0 commit comments

Comments
 (0)