Skip to content

feat(skin): add error handling for audio players#1048

Merged
sampotts merged 1 commit intomainfrom
feat/audio-error-handling
Mar 22, 2026
Merged

feat(skin): add error handling for audio players#1048
sampotts merged 1 commit intomainfrom
feat/audio-error-handling

Conversation

@sampotts
Copy link
Copy Markdown
Collaborator

@sampotts sampotts commented Mar 20, 2026

Summary

  • Add error dialog to audio player skins (default and minimal) with a compact inline layout suited to the audio form factor
  • Move the shared ErrorDialog React component from presets/video/ to presets/ so both audio and video skins reuse it
  • Add media-button--subtle variant for transparent background buttons used across audio controls
  • Add error feature to audio presets in core so audio players surface playback errors

Closes #813

Test plan

  • Verify error dialog appears on audio players when a playback error occurs (both default and minimal skins)
  • Verify error dialog still works correctly on video players (both default and minimal skins)
  • Verify CSS and Tailwind variants render consistently
  • Verify React presets render the error dialog for audio
  • Verify HTML (custom elements) skins include error handling for audio
  • Test dark mode and prefers-reduced-motion transitions

🤖 Generated with Claude Code

Copilot AI review requested due to automatic review settings March 20, 2026 02:11
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 20, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
v10-sandbox Ready Ready Preview, Comment Mar 22, 2026 10:27pm

Request Review

@netlify
Copy link
Copy Markdown

netlify bot commented Mar 20, 2026

Deploy Preview for vjs10-site ready!

Name Link
🔨 Latest commit 80bc005
🔍 Latest deploy log https://app.netlify.com/projects/vjs10-site/deploys/69c06ca25dd61f00087781db
😎 Deploy Preview https://deploy-preview-1048--vjs10-site.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds playback error handling to audio player skins and unifies error-dialog rendering across audio/video while updating button styling to support a “subtle” control variant. It also enables the error feature in the core audio feature preset so audio players can surface errors consistently.

Changes:

  • Add shared React ErrorDialog preset and wire it into audio skins (default/minimal, CSS + Tailwind variants) while updating video skins to use the shared component.
  • Introduce/standardize media-button--subtle (and --primary usage for confirmation actions), plus small layout tweaks (controls padding/radius, seek label sizing).
  • Enable errorFeature in audioFeatures and update core typing/tests accordingly.

Reviewed changes

Copilot reviewed 44 out of 44 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
site/src/content/docs/concepts/skins.mdx Updates docs examples to use media-button--subtle for icon controls.
packages/skins/src/minimal/tailwind/video.tailwind.ts Adds error styling overrides + padding variable; hides controls when error open.
packages/skins/src/minimal/tailwind/components/seek.ts Adjusts seek label sizing.
packages/skins/src/minimal/tailwind/components/root.ts Introduces --media-controls-radius token.
packages/skins/src/minimal/tailwind/components/error.ts Refines minimal error base styles (outline/text sizing).
packages/skins/src/minimal/tailwind/components/button.ts Adds primary/subtle variants + radius/padding-based rounding.
packages/skins/src/minimal/tailwind/audio.tailwind.ts Adds compact inline audio error dialog styling + error-open visibility behavior.
packages/skins/src/minimal/css/video.css Moves/defines video error dialog styling and control padding token.
packages/skins/src/minimal/css/components/root.css Adds --media-controls-radius token for CSS skin.
packages/skins/src/minimal/css/components/error.css Moves common error styles out; hides controls content when error open.
packages/skins/src/minimal/css/components/buttons.css Adds --primary/--subtle variants and updates base button behavior.
packages/skins/src/minimal/css/audio.css Adds compact inline audio error dialog styling + new tokens.
packages/skins/src/default/tailwind/video.tailwind.ts Hides controls when error open; refines error dialog typography/shadows.
packages/skins/src/default/tailwind/components/seek.ts Adjusts seek label sizing.
packages/skins/src/default/tailwind/components/error.ts Refines default error base styles (outline/text sizing).
packages/skins/src/default/tailwind/components/button.ts Adds primary/subtle variants and tweaks focus/active behavior.
packages/skins/src/default/tailwind/audio.tailwind.ts Adds audio error dialog layout and ties controls visibility to error state.
packages/skins/src/default/css/video.css Moves/defines video error dialog styling + hides controls when error open.
packages/skins/src/default/css/components/slider.css Adds focus ring styling via ::after.
packages/skins/src/default/css/components/error.css Removes shared positioning styles and adds error-open control hiding behavior.
packages/skins/src/default/css/components/buttons.css Adds --primary/--subtle variants and updates base button behavior.
packages/skins/src/default/css/audio.css Adds compact inline audio error dialog styling + new tokens.
packages/sandbox/app/shell/navbar.tsx Adds overflow handling/padding to the sandbox navbar control group.
packages/react/src/presets/video/skin.tsx Switches to shared preset ErrorDialog and uses subtle icon button styling.
packages/react/src/presets/video/skin.tailwind.tsx Switches to shared preset ErrorDialog + updates Tailwind button composition.
packages/react/src/presets/video/minimal-skin.tsx Switches to shared preset ErrorDialog and uses subtle icon button styling.
packages/react/src/presets/video/minimal-skin.tailwind.tsx Switches to shared preset ErrorDialog + updates Tailwind button composition.
packages/react/src/presets/error-dialog.tsx Moves/standardizes shared ErrorDialog preset API (classesclassNames).
packages/react/src/presets/audio/skin.tsx Adds ErrorDialog to default audio skin and updates buttons to subtle style.
packages/react/src/presets/audio/skin.tailwind.tsx Adds ErrorDialog to default audio Tailwind skin + integrates error styles.
packages/react/src/presets/audio/minimal-skin.tsx Adds ErrorDialog to minimal audio skin and updates buttons to subtle style.
packages/react/src/presets/audio/minimal-skin.tailwind.tsx Adds ErrorDialog to minimal audio Tailwind skin + integrates error styles.
packages/html/src/player/tests/create-player.test-d.ts Extends type test coverage for audio store error state/dismiss API.
packages/html/src/define/video/skin.ts Updates video HTML skin control buttons to use subtle variant.
packages/html/src/define/video/skin.tailwind.ts Updates video HTML Tailwind skin control buttons to use subtle variant.
packages/html/src/define/video/minimal-skin.ts Updates minimal video HTML skin control buttons to use subtle variant.
packages/html/src/define/video/minimal-skin.tailwind.ts Updates minimal video HTML Tailwind skin control buttons to use subtle variant.
packages/html/src/define/audio/skin.ts Updates audio HTML skin control buttons to use subtle variant.
packages/html/src/define/audio/skin.tailwind.ts Updates audio HTML Tailwind skin control buttons to use subtle variant.
packages/html/src/define/audio/minimal-skin.ts Updates minimal audio HTML skin control buttons to use subtle variant.
packages/html/src/define/audio/minimal-skin.tailwind.ts Updates minimal audio HTML Tailwind skin control buttons to use subtle variant.
packages/core/src/dom/store/features/presets.ts Adds errorFeature to audioFeatures.
packages/core/src/dom/media/types.ts Updates AudioFeatures tuple type to include MediaErrorState.
cspell.json Adds “squircle” to dictionary for new CSS feature usage.
Comments suppressed due to low confidence (1)

packages/html/src/define/audio/minimal-skin.ts:33

  • The PR description/test plan mentions that the HTML (custom elements) audio skins include error handling, but this minimal audio template still does not include any alert/error UI markup wired to the error feature state. If HTML skins are in scope, add the corresponding dialog elements here as well so errors are visible.
function getTemplateHTML() {
  return /*html*/ `
    <media-container class="media-minimal-skin media-minimal-skin--audio">
      <slot name="media"></slot>

      <div class="media-controls">
        <media-tooltip-group>
          <div class="media-button-group">
            <media-play-button commandfor="play-tooltip" class="media-button media-button--subtle media-button--icon media-button--play">
              ${renderIcon('restart', { class: 'media-icon media-icon--restart' })}
              ${renderIcon('play', { class: 'media-icon media-icon--play' })}
              ${renderIcon('pause', { class: 'media-icon media-icon--pause' })}
            </media-play-button>

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/skins/src/default/tailwind/components/button.ts Outdated
Comment thread packages/skins/src/default/css/components/buttons.css Outdated
Comment thread packages/skins/src/default/css/audio.css Outdated
Comment thread site/src/content/docs/concepts/skins.mdx Outdated
Comment thread packages/html/src/define/audio/skin.ts
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 20, 2026

📦 Bundle Size Report

🎨 @videojs/html

Path Base PR Diff %
/video/minimal-skin.tailwind 22.50 kB 22.82 kB +319 B +1.4% 🔺
/audio/minimal-skin.tailwind 20.70 kB 21.08 kB +392 B +1.8% 🔺
Presets (7)
Entry Size
/video (default) 23.30 kB
/video (default + hls) 153.90 kB
/video (minimal) 23.16 kB
/video (minimal + hls) 153.62 kB
/audio (default) 21.48 kB
/audio (minimal) 21.49 kB
/background 6.51 kB
Media (5)
Entry Size
/media/background-video 1.03 kB
/media/container 1.59 kB
/media/dash-video 236.04 kB
/media/hls-video 131.57 kB
/media/simple-hls-video 12.33 kB
Players (3)
Entry Size
/video/player 6.24 kB
/audio/player 6.23 kB
/background/player 6.22 kB
Skins (16)
Entry Type Size
/video/minimal-skin.css css 3.23 kB
/video/skin.css css 3.23 kB
/video/minimal-skin js 22.37 kB
/video/minimal-skin.tailwind js 22.82 kB
/video/skin js 22.50 kB
/video/skin.tailwind js 22.78 kB
/audio/minimal-skin.css css 2.31 kB
/audio/skin.css css 2.30 kB
/audio/minimal-skin js 20.69 kB
/audio/minimal-skin.tailwind js 21.08 kB
/audio/skin js 20.67 kB
/audio/skin.tailwind js 21.02 kB
/background/skin.css css 117 B
/background/skin js 1.13 kB
/base.css css 157 B
/shared.css css 86 B
UI Components (21)
Entry Size
/ui/alert-dialog 2.16 kB
/ui/alert-dialog-close 1.60 kB
/ui/alert-dialog-description 1.52 kB
/ui/alert-dialog-title 1.50 kB
/ui/buffering-indicator 1.79 kB
/ui/captions-button 1.83 kB
/ui/controls 1.60 kB
/ui/fullscreen-button 1.82 kB
/ui/mute-button 1.81 kB
/ui/pip-button 1.81 kB
/ui/play-button 1.81 kB
/ui/playback-rate-button 1.83 kB
/ui/popover 3.29 kB
/ui/poster 1.70 kB
/ui/seek-button 1.80 kB
/ui/slider 2.00 kB
/ui/thumbnail 2.14 kB
/ui/time 1.62 kB
/ui/time-slider 2.12 kB
/ui/tooltip 2.42 kB
/ui/volume-slider 2.20 kB

Sizes are marginal over the root entry point.

⚛️ @videojs/react

Path Base PR Diff %
/audio/minimal-skin 14.93 kB 15.78 kB +868 B +5.7% 🔺
/audio/minimal-skin.tailwind 17.00 kB 18.16 kB +1.16 kB +6.8% 🔺
/audio/skin 14.88 kB 15.75 kB +892 B +5.9% 🔺
/audio/skin.tailwind 17.21 kB 18.09 kB +903 B +5.1% 🔺
/audio (default) 14.96 kB 15.80 kB +855 B +5.6% 🔺
/audio (minimal) 15.01 kB 15.85 kB +866 B +5.6% 🔺
Presets (7)
Entry Size
/video (default) 18.96 kB
/video (default + hls) 149.66 kB
/video (minimal) 18.97 kB
/video (minimal + hls) 149.82 kB
/audio (default) 15.80 kB
/audio (minimal) 15.85 kB
/background 3.13 kB
Media (4)
Entry Size
/media/background-video 476 B
/media/dash-video 236.19 kB
/media/hls-video 131.59 kB
/media/simple-hls-video 12.34 kB
Skins (14)
Entry Type Size
/video/minimal-skin.css css 3.23 kB
/video/skin.css css 3.23 kB
/video/minimal-skin js 18.89 kB
/video/minimal-skin.tailwind js 22.11 kB
/video/skin js 18.87 kB
/video/skin.tailwind js 22.12 kB
/audio/minimal-skin.css css 2.31 kB
/audio/skin.css css 2.30 kB
/audio/minimal-skin js 15.78 kB
/audio/minimal-skin.tailwind js 18.16 kB
/audio/skin js 15.75 kB
/audio/skin.tailwind js 18.09 kB
/background/skin.css css 90 B
/background/skin js 272 B
UI Components (18)
Entry Size
/ui/alert-dialog 2.21 kB
/ui/buffering-indicator 2.20 kB
/ui/captions-button 2.25 kB
/ui/controls 2.23 kB
/ui/fullscreen-button 2.25 kB
/ui/mute-button 2.26 kB
/ui/pip-button 2.22 kB
/ui/play-button 2.25 kB
/ui/playback-rate-button 2.25 kB
/ui/popover 2.85 kB
/ui/poster 2.05 kB
/ui/seek-button 2.30 kB
/ui/slider 3.16 kB
/ui/thumbnail 2.01 kB
/ui/time 1.92 kB
/ui/time-slider 2.66 kB
/ui/tooltip 2.69 kB
/ui/volume-slider 2.68 kB

Sizes are marginal over the root entry point.

🧩 @videojs/core — no changes
Entries (6)
Entry Size
. 4.81 kB
/dom 8.41 kB
/dom/media/custom-media-element 1.81 kB
/dom/media/dash 235.62 kB
/dom/media/hls 131.27 kB
/dom/media/simple-hls 11.85 kB
🏷️ @videojs/element — no changes
Entries (2)
Entry Size
. 999 B
/context 943 B
📦 @videojs/store — no changes
Entries (3)
Entry Size
. 1.32 kB
/html 700 B
/react 360 B
🔧 @videojs/utils — no changes
Entries (10)
Entry Size
/array 104 B
/dom 1.25 kB
/events 227 B
/function 261 B
/object 119 B
/predicate 265 B
/string 148 B
/style 190 B
/time 478 B
/number 158 B
📦 @videojs/spf — no changes
Entries (3)
Entry Size
. 40 B
/dom 10.04 kB
/playback-engine 9.94 kB

ℹ️ How to interpret

All sizes are standalone totals (minified + brotli).

Icon Meaning
No change
🔺 Increased ≤ 10%
🔴 Increased > 10%
🔽 Decreased
🆕 New (no baseline)

Run pnpm size locally to check current sizes.

@github-actions
Copy link
Copy Markdown
Contributor

CI Failure Diagnosis

File Type What failed
packages/react/src/presets/video/minimal-skin.tailwind.tsx lint Biome formatter found unformatted code (indentation).
packages/react/src/presets/video/skin.tailwind.tsx lint Biome formatter found unformatted code (indentation).

Fix: run pnpm lint:fix:file on both files, or pnpm lint --write from root.

Add error dialog to audio skins (default and minimal) with a compact
inline layout suited to the audio player form factor. Move the shared
ErrorDialog React component from video-specific to a shared presets
location so both audio and video skins can reuse it.

- Add audio-specific error dialog styles for both CSS and Tailwind skins
- Move video error dialog styles from shared component to video-specific
- Add `media-button--subtle` variant for transparent background buttons
- Update button class names across audio skins for consistency
- Add `error` to audio feature presets in core
- Update sandbox navbar layout overflow handling

Closes #813

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@sampotts sampotts force-pushed the feat/audio-error-handling branch from 6e3d055 to 80bc005 Compare March 22, 2026 22:26
@sampotts sampotts merged commit df927f6 into main Mar 22, 2026
20 checks passed
@sampotts sampotts deleted the feat/audio-error-handling branch March 22, 2026 22:33
@luwes luwes mentioned this pull request Mar 22, 2026
This was referenced Apr 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skins: Add error handling for audio players

2 participants