Skip to content

fix(skin): improve buffering, overlays, and input feedback#1547

Merged
sampotts merged 2 commits into
mainfrom
feat/contrast-improvements
Jun 30, 2026
Merged

fix(skin): improve buffering, overlays, and input feedback#1547
sampotts merged 2 commits into
mainfrom
feat/contrast-improvements

Conversation

@sampotts

@sampotts sampotts commented May 15, 2026

Copy link
Copy Markdown
Collaborator

Summary

This tightens the default and minimal skin feedback paths across HTML and React.

  • Improves video/live-video buffering treatment with centered full-frame indicators and a clearer buffering scrim.
  • Shows audio/live-audio buffering in the play-control slot and registers BufferingIndicator for ejected audio skins.
  • Cleans up input feedback styling in vanilla CSS and Tailwind so seek/play feedback share the same layout, contrast, and transition hooks.
  • Updates input indicator transitions so repeated actions can replay the entry transition by reapplying data-starting-style; volume feedback opts out so repeated volume keypresses do not disappear and reappear.

Validation

  • pnpm -F @videojs/core test src/dom/ui/tests/transition.test.ts
  • pnpm -F @videojs/react test src/ui/input-indicators/tests/use-rendered-indicator-state.test.tsx
  • pnpm -F @videojs/skins build
  • pnpm exec biome check ...
  • pnpm exec tsgo --build packages/core/tsconfig.json packages/html/tsconfig.json packages/react/tsconfig.json

Closes #1509


Note

Medium Risk
Touches shared transition lifecycle and broad skin markup/CSS across HTML/React; behavior changes for buffering UI and input-indicator animations, though covered by new/updated unit tests.

Overview
Improves buffering and overlay presentation across default/minimal skins (HTML + React): video/live-video use a simpler full-frame spinner (no extra surface wrapper), overlays react when buffering is visible, and audio/live-audio show buffering as a spinner over the play control via a new playButton wrapper pattern. Ejected audio UI entries now register BufferingIndicator.

createTransition().open accepts an optional element and, when reopening an already-active transition, cancels subtree animations and flushes layout so CSS entry transitions can replay; input indicators pass the live DOM node and gain replayOnUpdate (default on). Volume feedback sets replayOnUpdate: false so rapid volume changes don’t flash off/on.

Input feedback styling is aligned in CSS/Tailwind: shared bubble/island layout, shorter central play/pause transitions (replacing pop/slide keyframes), and seek icons animate via translate/opacity instead of dedicated keyframe animations.

Reviewed by Cursor Bugbot for commit 4e5e1e7. Bugbot is set up for automated code reviews on this repo. Configure here.

@vercel

vercel Bot commented May 15, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
v10-sandbox Ready Ready Preview, Comment Jun 18, 2026 3:50am

Request Review

@netlify

netlify Bot commented May 15, 2026

Copy link
Copy Markdown

Deploy Preview for vjs10-site ready!

Name Link
🔨 Latest commit 4e5e1e7
🔍 Latest deploy log https://app.netlify.com/projects/vjs10-site/deploys/6a336af03e89ff00083a1013
😎 Deploy Preview https://deploy-preview-1547--vjs10-site.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

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

@github-actions

github-actions Bot commented May 15, 2026

Copy link
Copy Markdown
Contributor

📦 Bundle Size Report

🎨 @videojs/html

Path Base PR Diff %
/audio/minimal-skin.tailwind 36.91 kB 37.21 kB +308 B +0.8% 🔺
/live-audio/minimal-skin 29.62 kB 29.92 kB +309 B +1.0% 🔺
/live-audio/minimal-skin.tailwind 29.08 kB 29.44 kB +370 B +1.2% 🔺
/live-audio/skin 30.94 kB 31.24 kB +304 B +1.0% 🔺
/live-audio/skin.tailwind 30.52 kB 30.86 kB +345 B +1.1% 🔺
Presets (7)
Entry Size
/video (default) 44.18 kB
/video (default + hls) 183.81 kB
/video (minimal) 43.89 kB
/video (minimal + hls) 183.41 kB
/audio (default) 37.98 kB
/audio (minimal) 36.78 kB
/background 4.22 kB
Media (10)
Entry Size
/media/background-video 1.07 kB
/media/container 1.72 kB
/media/dash-video 242.77 kB
/media/hls-video 141.25 kB
/media/mux-audio 163.70 kB
/media/mux-video 163.64 kB
/media/native-hls-video 9.01 kB
/media/simple-hls-audio-only 16.94 kB
/media/simple-hls-video 18.76 kB
/media/vimeo-video 12.32 kB
Players (5)
Entry Size
/video/player 8.06 kB
/audio/player 5.38 kB
/background/player 3.93 kB
/live-video/player 7.64 kB
/live-audio/player 5.39 kB
Skins (30)
Entry Type Size
/video/minimal-skin.css css 5.29 kB
/video/skin.css css 5.27 kB
/video/minimal-skin js 43.88 kB
/video/minimal-skin.tailwind js 44.45 kB
/video/skin js 44.20 kB
/video/skin.tailwind js 44.86 kB
/audio/minimal-skin.css css 3.64 kB
/audio/skin.css css 3.55 kB
/audio/minimal-skin js 36.75 kB
/audio/minimal-skin.tailwind js 37.21 kB
/audio/skin js 37.99 kB
/audio/skin.tailwind js 38.34 kB
/background/skin.css css 133 B
/background/skin js 1.16 kB
/live-video/minimal-skin.css css 5.29 kB
/live-video/skin.css css 5.27 kB
/live-video/minimal-skin js 42.99 kB
/live-video/minimal-skin.tailwind js 43.40 kB
/live-video/skin js 42.95 kB
/live-video/skin.tailwind js 43.45 kB
/live-audio/minimal-skin.css css 3.64 kB
/live-audio/skin.css css 3.55 kB
/live-audio/minimal-skin js 29.92 kB
/live-audio/minimal-skin.tailwind js 29.44 kB
/live-audio/skin js 31.24 kB
/live-audio/skin.tailwind js 30.86 kB
/global.css css 176 B
/shared.css css 88 B
/tailwind.css css 161 B
/skin-element js 1.37 kB
UI Components (38)
Entry Size
/ui/airplay-button 3.64 kB
/ui/alert-dialog 1.23 kB
/ui/alert-dialog-close 564 B
/ui/alert-dialog-description 420 B
/ui/alert-dialog-title 494 B
/ui/buffering-indicator 3.04 kB
/ui/captions-button 3.81 kB
/ui/captions-radio-group 3.46 kB
/ui/cast-button 3.64 kB
/ui/compounds 8.70 kB
/ui/controls 2.84 kB
/ui/error-dialog 3.47 kB
/ui/fullscreen-button 3.65 kB
/ui/hotkey 2.26 kB
/ui/menu 5.64 kB
/ui/mute-button 3.66 kB
/ui/pip-button 3.68 kB
/ui/play-button 3.64 kB
/ui/playback-rate-button 3.70 kB
/ui/playback-rate-radio-group 3.18 kB
/ui/popover 2.08 kB
/ui/poster 2.75 kB
/ui/quality-radio-group 2.52 kB
/ui/seek-button 3.75 kB
/ui/seek-indicator 3.99 kB
/ui/seek-indicator-value 209 B
/ui/slider 1.49 kB
/ui/status-announcer 3.56 kB
/ui/status-indicator 3.80 kB
/ui/status-indicator-value 302 B
/ui/thumbnail 3.43 kB
/ui/time 3.06 kB
/ui/time-slider 4.15 kB
/ui/tooltip 2.36 kB
/ui/volume-indicator 3.94 kB
/ui/volume-indicator-fill 246 B
/ui/volume-indicator-value 246 B
/ui/volume-slider 2.86 kB

Sizes are marginal over the root entry point.

⚛️ @videojs/react

Path Base PR Diff %
/audio/minimal-skin 29.96 kB 30.47 kB +523 B +1.7% 🔺
/audio/minimal-skin.tailwind 31.75 kB 32.34 kB +607 B +1.9% 🔺
/audio/skin 29.93 kB 30.42 kB +511 B +1.7% 🔺
/audio/skin.tailwind 33.77 kB 34.29 kB +536 B +1.6% 🔺
/live-audio/minimal-skin 21.74 kB 22.29 kB +564 B +2.5% 🔺
/live-audio/minimal-skin.tailwind 24.65 kB 25.26 kB +630 B +2.5% 🔺
/live-audio/skin 21.79 kB 22.34 kB +561 B +2.5% 🔺
/live-audio/skin.tailwind 24.76 kB 25.35 kB +604 B +2.4% 🔺
/audio (default) 29.97 kB 30.51 kB +553 B +1.8% 🔺
/audio (minimal) 30.04 kB 30.53 kB +507 B +1.6% 🔺
Presets (7)
Entry Size
/video (default) 36.77 kB
/video (default + hls) 175.10 kB
/video (minimal) 36.90 kB
/video (minimal + hls) 175.32 kB
/audio (default) 30.51 kB
/audio (minimal) 30.53 kB
/background 754 B
Media (9)
Entry Size
/media/background-video 575 B
/media/dash-video 241.13 kB
/media/hls-video 139.75 kB
/media/mux-audio 162.35 kB
/media/mux-video 162.22 kB
/media/native-hls-video 7.39 kB
/media/simple-hls-audio-only 15.37 kB
/media/simple-hls-video 17.18 kB
/media/vimeo-video 10.58 kB
Skins (27)
Entry Type Size
/tailwind.css css 161 B
/video/minimal-skin.css css 5.20 kB
/video/skin.css css 5.18 kB
/video/minimal-skin js 36.81 kB
/video/minimal-skin.tailwind js 42.38 kB
/video/skin js 36.76 kB
/video/skin.tailwind js 42.36 kB
/audio/minimal-skin.css css 3.52 kB
/audio/skin.css css 3.42 kB
/audio/minimal-skin js 30.47 kB
/audio/minimal-skin.tailwind js 32.34 kB
/audio/skin js 30.42 kB
/audio/skin.tailwind js 34.29 kB
/background/skin.css css 90 B
/background/skin js 272 B
/live-video/minimal-skin.css css 5.20 kB
/live-video/skin.css css 5.18 kB
/live-video/minimal-skin js 32.53 kB
/live-video/minimal-skin.tailwind js 38.06 kB
/live-video/skin js 32.55 kB
/live-video/skin.tailwind js 38.07 kB
/live-audio/minimal-skin.css css 3.52 kB
/live-audio/skin.css css 3.42 kB
/live-audio/minimal-skin js 22.29 kB
/live-audio/minimal-skin.tailwind js 25.26 kB
/live-audio/skin js 22.34 kB
/live-audio/skin.tailwind js 25.35 kB
UI Components (32)
Entry Size
/ui/airplay-button 3.60 kB
/ui/alert-dialog 1.16 kB
/ui/buffering-indicator 2.15 kB
/ui/captions-button 3.53 kB
/ui/captions-radio-group 2.72 kB
/ui/cast-button 3.53 kB
/ui/controls 2.13 kB
/ui/error-dialog 2.70 kB
/ui/fullscreen-button 2.61 kB
/ui/gesture 2.15 kB
/ui/hotkey 2.03 kB
/ui/live-button 2.89 kB
/ui/menu 7.47 kB
/ui/mute-button 2.65 kB
/ui/pip-button 2.62 kB
/ui/play-button 2.65 kB
/ui/playback-rate 2.71 kB
/ui/playback-rate-button 2.68 kB
/ui/popover 2.27 kB
/ui/poster 2.26 kB
/ui/quality 2.92 kB
/ui/seek-button 2.64 kB
/ui/seek-indicator 2.16 kB
/ui/slider 3.72 kB
/ui/status-announcer 1.99 kB
/ui/status-indicator 3.40 kB
/ui/thumbnail 2.32 kB
/ui/time 3.02 kB
/ui/time-slider 4.20 kB
/ui/tooltip 2.90 kB
/ui/volume-indicator 2.15 kB
/ui/volume-slider 4.07 kB

Sizes are marginal over the root entry point.

🧩 @videojs/core — no changes
Entries (13)
Entry Size
. 8.65 kB
/dom 17.03 kB
/dom/media/custom-media-element 2.05 kB
/dom/media/dash 236.79 kB
/dom/media/google-cast 4.04 kB
/dom/media/hls 135.63 kB
/dom/media/media-host 1.25 kB
/dom/media/media-played-ranges 576 B
/dom/media/mux 151.26 kB
/dom/media/native-hls 3.05 kB
/dom/media/simple-hls 16.55 kB
/dom/media/simple-hls-audio-only 14.79 kB
/dom/media/vimeo 9.86 kB
🏷️ @videojs/element — no changes
Entries (2)
Entry Size
. 996 B
/context 943 B
📦 @videojs/store — no changes
Entries (3)
Entry Size
. 1.39 kB
/html 696 B
/react 360 B
🔧 @videojs/utils — no changes
Entries (10)
Entry Size
/array 104 B
/dom 2.22 kB
/events 319 B
/function 327 B
/object 275 B
/predicate 265 B
/string 232 B
/style 190 B
/time 478 B
/number 158 B
📦 @videojs/spf — no changes
Entries (4)
Entry Size
. 4.45 kB
/dom 6.33 kB
/hls 15.44 kB
/background-looping-video 12.95 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.

@sampotts sampotts changed the title [codex] improve video feedback contrast fix(skin): improve video feedback contrast May 15, 2026
@sampotts sampotts marked this pull request as ready for review May 15, 2026 04:53
@sampotts sampotts requested review from littlespex and luwes and removed request for littlespex May 15, 2026 04:53
Comment thread packages/skins/src/minimal/css/components/input-feedback.css
Comment thread packages/skins/src/default/css/components/input-feedback.css
Comment thread packages/skins/src/default/css/components/overlay.css
Comment thread packages/skins/src/default/tailwind/components/buffering.ts Outdated
@sampotts sampotts force-pushed the feat/contrast-improvements branch from 80cbe01 to 0878b37 Compare May 15, 2026 06:21
@sampotts sampotts changed the title fix(skin): improve video feedback contrast fix(skin): improve buffering feedback across video and audio May 15, 2026
@sampotts sampotts force-pushed the feat/contrast-improvements branch from 0878b37 to 4af528d Compare May 15, 2026 06:24
@sampotts sampotts changed the title fix(skin): improve buffering feedback across video and audio fix(skin): improve buffering, overlays, and input feedback May 15, 2026
Comment thread packages/skins/src/default/css/components/buffering.css
Comment thread packages/skins/src/default/tailwind/audio.tailwind.ts Outdated
Comment thread packages/skins/src/minimal/tailwind/components/input-feedback.ts Outdated
Comment thread packages/skins/src/default/tailwind/components/buffering.ts Outdated
@sampotts

sampotts commented Jun 17, 2026

Copy link
Copy Markdown
Collaborator Author

I'm working on a fix for a flash of white that's suddenly appeared after a rebase on this branch. Will get it fixed today.

Fixed. It was the source video! 🤦🏼

- Video/live-video: simplify full-area buffering markup; center with grid and
  clearer stacking; add a buffering scrim on the stage overlay (default and
  minimal, CSS + Tailwind).
- Input feedback: refine seek/feedback bubble layout, sizing, and contrast;
  keep vanilla CSS and Tailwind tokens aligned (grid placement, icon sizing from
  --media-icon-size).
- Audio/live-audio: show buffering in the play control slot without layout shift;
  CSS skin hooks and Tailwind playButton utilities; register BufferingIndicator in
  audio UI entrypoints.

Co-authored-by: Cursor <cursoragent@cursor.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit b5c8044. Configure here.

Comment thread packages/skins/src/default/tailwind/video.tailwind.ts Outdated
@sampotts sampotts merged commit 0de3fef into main Jun 30, 2026
26 checks passed
@sampotts sampotts deleted the feat/contrast-improvements branch June 30, 2026 23:49
@luwes luwes mentioned this pull request Jun 30, 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.

Bug: Contrast on Central UI Too Low

3 participants