Skip to content

fix(skin): style poster and slider thumbnail shadow hosts in webkit - #2693

Merged
luwes merged 1 commit into
mainfrom
fix/webkit-scoped-shadow-hosts
Sep 9, 2026
Merged

fix(skin): style poster and slider thumbnail shadow hosts in webkit#2693
luwes merged 1 commit into
mainfrom
fix/webkit-scoped-shadow-hosts

Conversation

@luwes

@luwes luwes commented Sep 9, 2026

Copy link
Copy Markdown
Collaborator

Refs #2563
Refs #2572

Summary

In Safari, the poster no longer hides once playback starts and the time slider's storyboard thumbnail renders unstyled inside the preview. WebKit does not match an @scope rule whose subject hosts a shadow root or is slotted into one, and both <media-poster> (#2563) and <media-slider-thumbnail> (#2572) recently became shadow hosts carrying skin classes. Chromium and Firefox are unaffected.

Changes

  • Flag the poster root and image, the slider thumbnail root, image, and spinner, and the shared previewContent and popup.surface rules as shadowHost, so they are also emitted outside the @scope block for WebKit.
  • The vjsc renderer detects shadow-host rules by the selector's subject rather than its first component, so relationship selectors such as :where(.media-slider-preview)[data-pointing] .media-slider-preview-content are covered.
  • Shadow-host rules are repeated outside the scope rather than moved out of it.
Implementation details

Repeating rather than moving keeps the cascade identical in engines that match @scope correctly: a scoped declaration always outranks an equal-specificity unscoped one on scope proximity regardless of source order (verified in Chromium, WebKit, and Firefox), so the :where(scope)-prefixed copy can never beat the original. Moving would have changed tie-breaking for shared classes like media-popup-surface on tooltips and menus.

shadowHost is now documented as covering slotted light-DOM children too; the thumbnail image and spinner are not hosts themselves but are slotted through one, and WebKit skips scoped rules for them as well.

Testing

  • pnpm -F vjsc test src/styles (updated shadow-host compile test) and pnpm -F @videojs/skins test.
  • Manual, via Playwright against the sandbox /html-video/ and /html-mux-video/ pages in WebKit, across the package, registry, and authored skin sources and the minimal skin: media-poster fades to opacity: 0 after play, and media-slider-thumbnail is absolutely positioned at 190×106 with rounded corners, matching Chromium. Chromium output unchanged.

Note

Medium Risk
Touches global skin CSS compilation and cascade for all engines; duplication is designed not to outrank scoped rules, but styling regressions are possible if scope proximity behaves differently than expected.

Overview
Fixes Safari/WebKit styling for <media-poster> and <media-slider-thumbnail> (and related preview/popup surfaces) after those elements became shadow hosts carrying skin classes. WebKit does not apply @scope rules when the subject hosts a shadow root or is slotted through one.

Skin definitions now mark poster/thumbnail (root, image, spinner), slider previewContent, and popup surface with shadowHost: true so the compiler emits the extra unscoped copy.

vjsc CSS emission changes how those rules are handled: shadow-host rules stay inside @scope and are duplicated outside with a :where(.media-skin-video) ancestor (instead of being removed from the scoped block), preserving cascade behavior in Chromium/Firefox while giving WebKit a matching rule. Detection now keys off the selector subject (last compound), so relationship selectors like preview → preview-content are included. Slotted ::slotted rules are still moved out only.

Compile tests were updated to assert the repeat-outside-scope behavior and nested relationship scopes.

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

WebKit does not match an `@scope` rule whose subject hosts a shadow root
or is slotted into one. `<media-poster>` gained a shadow root in #2563
and `<media-slider-thumbnail>` became the styled root in #2572, so in
Safari the poster no longer faded out on play and the slider thumbnail
rendered unpositioned and unstyled inside the preview. Chromium and
Firefox were unaffected.

`vjsc` already has a `shadowHost` rule flag for this, but #2572 removed
its only use from the image rule without flagging the new host, and the
poster was never flagged. The flag now goes on the poster root and image,
the thumbnail root, image, and spinner, and the shared preview-content
and popup-surface rules the thumbnail host carries.

The renderer now detects a shadow-host rule by its selector's subject
rather than its first component, so relationship selectors such as
`:where(.owner)[data-x] .subject` are covered, and it repeats those rules
outside the scope block instead of moving them. A scoped rule always
outranks an equal-specificity unscoped one on proximity, so the copy can
never beat the original and the cascade in engines that match `@scope`
correctly is unchanged.
@vercel

vercel Bot commented Sep 9, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated
v10-sandbox Ready Ready Preview Sep 9, 2026 8:05pm UTC

Request Review

@netlify

netlify Bot commented Sep 9, 2026

Copy link
Copy Markdown

Deploy Preview for vjs-registry ready!

Name Link
🔨 Latest commit ed228ac
🔍 Latest deploy log https://app.netlify.com/projects/vjs-registry/deploys/6aa1bb7f0210950008ccf4aa
😎 Deploy Preview https://deploy-preview-2693--vjs-registry.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.

@netlify

netlify Bot commented Sep 9, 2026

Copy link
Copy Markdown

Deploy Preview for vjs10-site ready!

Name Link
🔨 Latest commit ed228ac
🔍 Latest deploy log https://app.netlify.com/projects/vjs10-site/deploys/6aa1bb7fcc94e3000827d640
😎 Deploy Preview https://deploy-preview-2693--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.

@pkg-pr-new

pkg-pr-new Bot commented Sep 9, 2026

Copy link
Copy Markdown
@videojs/cdn

pnpm add https://pkg.pr.new/@videojs/cdn@2693

@videojs/core

pnpm add https://pkg.pr.new/@videojs/core@2693

@videojs/element

pnpm add https://pkg.pr.new/@videojs/element@2693

@videojs/html

pnpm add https://pkg.pr.new/@videojs/html@2693

@videojs/media

pnpm add https://pkg.pr.new/@videojs/media@2693

@videojs/react

pnpm add https://pkg.pr.new/@videojs/react@2693

@videojs/spf

pnpm add https://pkg.pr.new/@videojs/spf@2693

@videojs/store

pnpm add https://pkg.pr.new/@videojs/store@2693

@videojs/utils

pnpm add https://pkg.pr.new/@videojs/utils@2693

@videojs/cloudflare-video

pnpm add https://pkg.pr.new/@videojs/cloudflare-video@2693

@videojs/dash-video

pnpm add https://pkg.pr.new/@videojs/dash-video@2693

@videojs/hlsjs-video

pnpm add https://pkg.pr.new/@videojs/hlsjs-video@2693

@videojs/mux-audio

pnpm add https://pkg.pr.new/@videojs/mux-audio@2693

@videojs/mux-video

pnpm add https://pkg.pr.new/@videojs/mux-video@2693

@videojs/native-hls-video

pnpm add https://pkg.pr.new/@videojs/native-hls-video@2693

@videojs/shaka-video

pnpm add https://pkg.pr.new/@videojs/shaka-video@2693

@videojs/spotify-audio

pnpm add https://pkg.pr.new/@videojs/spotify-audio@2693

@videojs/tiktok-video

pnpm add https://pkg.pr.new/@videojs/tiktok-video@2693

@videojs/twitch-video

pnpm add https://pkg.pr.new/@videojs/twitch-video@2693

@videojs/vimeo-video

pnpm add https://pkg.pr.new/@videojs/vimeo-video@2693

@videojs/wistia-video

pnpm add https://pkg.pr.new/@videojs/wistia-video@2693

@videojs/youtube-video

pnpm add https://pkg.pr.new/@videojs/youtube-video@2693

@videojs/google-cast

pnpm add https://pkg.pr.new/@videojs/google-cast@2693

@videojs/mux-data

pnpm add https://pkg.pr.new/@videojs/mux-data@2693

commit: ed228ac

@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

📦 Bundle Size Report

🎨 @videojs/html — 30 small size changes
Path Base initial PR initial Initial diff Lazy diff
/video/minimal-skin.css 7.71 kB 7.82 kB +111 B (+1.4%)
/video/skin.css 7.51 kB 7.64 kB +127 B (+1.7%)
/video/minimal-skin 62.24 kB 62.51 kB +271 B (+0.4%) 0 B
/video/minimal-skin2 8.16 kB 8.37 kB +221 B (+2.6%)
/video/skin 62.03 kB 62.32 kB +300 B (+0.5%) 0 B
/video/skin2 8.00 kB 8.24 kB +247 B (+3.0%)
/audio/minimal-skin.css 5.60 kB 5.64 kB +43 B (+0.8%)
/audio/skin.css 5.43 kB 5.47 kB +39 B (+0.7%)
/audio/minimal-skin 46.19 kB 46.25 kB +59 B (+0.1%) 0 B
/audio/minimal-skin2 5.93 kB 6.00 kB +71 B (+1.2%)
/audio/skin 45.94 kB 46.13 kB +190 B (+0.4%) 0 B
/audio/skin2 5.75 kB 5.83 kB +76 B (+1.3%)
/live-video/minimal-skin.css 6.23 kB 6.28 kB +48 B (+0.8%)
/live-video/skin.css 6.23 kB 6.26 kB +36 B (+0.6%)
/live-video/minimal-skin 49.77 kB 49.85 kB +78 B (+0.2%) 0 B
/live-video/minimal-skin2 6.58 kB 6.66 kB +82 B (+1.2%)
/live-video/skin 49.79 kB 49.91 kB +129 B (+0.3%) 0 B
/live-video/skin2 6.63 kB 6.71 kB +84 B (+1.2%)
/live-audio/minimal-skin.css 4.45 kB 4.46 kB +18 B (+0.4%)
/live-audio/skin.css 4.45 kB 4.46 kB +9 B (+0.2%)
/live-audio/minimal-skin 35.64 kB 35.69 kB +44 B (+0.1%) 0 B
/live-audio/minimal-skin2 4.70 kB 4.74 kB +36 B (+0.7%)
/live-audio/skin 35.64 kB 35.68 kB +46 B (+0.1%) 0 B
/live-audio/skin2 4.70 kB 4.74 kB +34 B (+0.7%)
/video (default) 63.49 kB 63.76 kB +274 B (+0.4%) 0 B
/video (default + hls) 65.30 kB 65.59 kB +290 B (+0.4%) 0 B
/video (minimal) 63.87 kB 64.01 kB +151 B (+0.2%) 0 B
/video (minimal + hls) 65.56 kB 65.82 kB +267 B (+0.4%) 0 B
/audio (default) 47.47 kB 47.53 kB +56 B (+0.1%) 0 B
/audio (minimal) 47.70 kB 47.72 kB +18 B (+0.0%) 0 B
Presets (7)
Entry Initial Lazy
/video (default) 63.76 kB 58.19 kB
/video (default + hls) 65.59 kB 58.19 kB
/video (minimal) 64.01 kB 58.19 kB
/video (minimal + hls) 65.82 kB 58.19 kB
/audio (default) 47.53 kB 58.19 kB
/audio (minimal) 47.72 kB 58.19 kB
/background 11.65 kB 58.19 kB
Media (18)
Entry Initial
/media/mux-video 3.01 kB
/media/mux-audio 2.69 kB
/media/background-video 1.16 kB
/media/cloudflare-video 2.90 kB
/media/dash-video 2.63 kB
/media/hls-audio 22.05 kB
/media/hls-background-video 16.85 kB
/media/hls-video 28.01 kB
/media/hlsjs-video 2.63 kB
/media/mux-background-video 16.86 kB
/media/native-hls-video 7.59 kB
/media/shaka-video 2.63 kB
/media/spotify-audio 3.02 kB
/media/tiktok-video 3.13 kB
/media/twitch-video 2.93 kB
/media/vimeo-video 2.90 kB
/media/wistia-video 607 B
/media/youtube-video 2.90 kB
Players (5)
Entry Initial Lazy
/video/player 9.79 kB 58.19 kB
/audio/player 6.21 kB 58.19 kB
/background/player 4.46 kB 58.19 kB
/live-video/player 9.18 kB 58.19 kB
/live-audio/player 6.22 kB 58.19 kB
Skins (29)
Entry Type Initial Lazy
/video/minimal-skin.css css 7.82 kB
/video/skin.css css 7.64 kB
/video/minimal-skin js 62.51 kB 58.19 kB
/video/minimal-skin2 js 8.37 kB
/video/skin js 62.32 kB 58.19 kB
/video/skin2 js 8.24 kB
/audio/minimal-skin.css css 5.64 kB
/audio/skin.css css 5.47 kB
/audio/minimal-skin js 46.25 kB 58.19 kB
/audio/minimal-skin2 js 6.00 kB
/audio/skin js 46.13 kB 58.19 kB
/audio/skin2 js 5.83 kB
/background/skin.css css 139 B
/background/skin js 9.91 kB 58.19 kB
/background/skin2 js 187 B
/live-video/minimal-skin.css css 6.28 kB
/live-video/skin.css css 6.26 kB
/live-video/minimal-skin js 49.85 kB 58.19 kB
/live-video/minimal-skin2 js 6.66 kB
/live-video/skin js 49.91 kB 58.19 kB
/live-video/skin2 js 6.71 kB
/live-audio/minimal-skin.css css 4.46 kB
/live-audio/skin.css css 4.46 kB
/live-audio/minimal-skin js 35.69 kB 58.19 kB
/live-audio/minimal-skin2 js 4.74 kB
/live-audio/skin js 35.68 kB 58.19 kB
/live-audio/skin2 js 4.74 kB
/global.css css 190 B
/shared.css css 118 B
UI Components (62)
Entry Initial Lazy
/ui/airplay-button 11.36 kB 58.19 kB
/ui/alert-dialog 8.79 kB 58.19 kB
/ui/audio-track-radio-group 11.46 kB 58.19 kB
/ui/buffering-indicator 8.68 kB 58.19 kB
/ui/captions-button 11.59 kB 58.19 kB
/ui/captions-radio-group 11.54 kB 58.19 kB
/ui/cast-button 11.34 kB 58.19 kB
/ui/container 9.58 kB 58.19 kB
/ui/controls 8.86 kB 58.19 kB
/ui/controls-backdrop 1.69 kB 58.19 kB
/ui/controls-content 1.67 kB 58.19 kB
/ui/dialog 8.73 kB 58.19 kB
/ui/dialog-backdrop 1.70 kB 58.19 kB
/ui/dialog-close 2.06 kB 58.19 kB
/ui/dialog-description 1.69 kB 58.19 kB
/ui/dialog-popup 1.90 kB 58.19 kB
/ui/dialog-title 1.70 kB 58.19 kB
/ui/error-dialog 12.47 kB 58.19 kB
/ui/fullscreen-button 11.33 kB 58.19 kB
/ui/gesture 9.66 kB 58.19 kB
/ui/hotkey 10.13 kB 58.19 kB
/ui/live-button 9.89 kB 58.19 kB
/ui/menu 18.54 kB 58.19 kB
/ui/menu-checkbox-item 1.97 kB 58.19 kB
/ui/menu-content 7.52 kB 58.19 kB
/ui/menu-group 2.09 kB 58.19 kB
/ui/menu-group-label 1.64 kB
/ui/menu-item 2.30 kB 58.19 kB
/ui/menu-item-indicator 1.38 kB 58.19 kB
/ui/menu-radio-group 3.01 kB 58.19 kB
/ui/menu-radio-item 2.13 kB 58.19 kB
/ui/menu-separator 1.30 kB 58.19 kB
/ui/mute-button 11.36 kB 58.19 kB
/ui/pip-button 11.31 kB 58.19 kB
/ui/play-button 11.31 kB 58.19 kB
/ui/playback-rate-button 11.41 kB 58.19 kB
/ui/playback-rate-radio-group 11.46 kB 58.19 kB
/ui/popover 8.57 kB 58.19 kB
/ui/poster 8.97 kB 58.19 kB
/ui/quality-radio-group 12.05 kB 58.19 kB
/ui/seek-button 11.34 kB 58.19 kB
/ui/seek-indicator 12.77 kB 58.19 kB
/ui/seek-indicator-value 1.10 kB
/ui/slider 11.75 kB 58.19 kB
/ui/slider-preview 2.01 kB 58.19 kB
/ui/status-announcer 10.68 kB 58.19 kB
/ui/status-indicator 13.10 kB 58.19 kB
/ui/status-indicator-value 1.10 kB
/ui/thumbnail 10.35 kB 58.19 kB
/ui/time 11.11 kB 58.19 kB
/ui/time-slider 13.22 kB 58.19 kB
/ui/time-slider-chapter-title 8.87 kB 58.19 kB
/ui/time-slider-chapters 9.71 kB 58.19 kB
/ui/title 8.25 kB 58.19 kB
/ui/tooltip 9.95 kB 58.19 kB
/ui/tooltip-label 1.21 kB
/ui/tooltip-shortcut 1.18 kB
/ui/volume-indicator 13.11 kB 58.19 kB
/ui/volume-indicator-fill 1.11 kB
/ui/volume-indicator-value 1.10 kB
/ui/volume-popover 14.82 kB 58.19 kB
/ui/volume-slider 12.43 kB 58.19 kB
⚛️ @videojs/react — 8 small size changes
Path Base initial PR initial Initial diff Lazy diff
/video/minimal-skin.css 7.56 kB 7.68 kB +120 B (+1.5%)
/video/skin.css 7.37 kB 7.50 kB +124 B (+1.6%)
/audio/minimal-skin.css 5.42 kB 5.46 kB +44 B (+0.8%)
/audio/skin.css 5.25 kB 5.29 kB +40 B (+0.7%)
/live-video/minimal-skin.css 6.08 kB 6.13 kB +43 B (+0.7%)
/live-video/skin.css 6.08 kB 6.12 kB +45 B (+0.7%)
/live-audio/minimal-skin.css 4.26 kB 4.28 kB +19 B (+0.4%)
/live-audio/skin.css 4.26 kB 4.28 kB +14 B (+0.3%)
Presets (7)
Entry Initial Lazy
/video (default) 51.38 kB 58.19 kB
/video (default + hls) 51.54 kB 58.19 kB
/video (minimal) 51.51 kB 58.19 kB
/video (minimal + hls) 51.80 kB 58.19 kB
/audio (default) 39.82 kB 58.19 kB
/audio (minimal) 39.89 kB 58.19 kB
/background 581 B 58.19 kB
Media (22)
Entry Initial
/media/mux-video/hls-js 958 B
/media/mux-video/spf 962 B
/media/mux-audio/hls-js 699 B
/media/mux-audio/spf 703 B
/media/background-video 402 B
/media/cloudflare-video 911 B
/media/dash-video 693 B
/media/hls-audio 20.32 kB
/media/hls-background-video 16.47 kB
/media/hls-video 26.32 kB
/media/hlsjs-video 695 B
/media/mux-audio 693 B
/media/mux-background-video 16.41 kB
/media/mux-video 948 B
/media/native-hls-video 5.78 kB
/media/shaka-video 704 B
/media/spotify-audio 901 B
/media/tiktok-video 906 B
/media/twitch-video 929 B
/media/vimeo-video 888 B
/media/wistia-video 619 B
/media/youtube-video 897 B
Extensions (2)
Entry Initial
/extensions/google-cast 1.59 kB
/extensions/mux-data 1.64 kB
Players (5)
Entry Initial Lazy
/video/player 7.67 kB 58.19 kB
/audio/player 4.06 kB 58.19 kB
/background/player 2.27 kB 58.19 kB
/live-video/player 7.06 kB 58.19 kB
/live-audio/player 4.05 kB 58.19 kB
Skins (18)
Entry Type Initial Lazy
/video/minimal-skin.css css 7.68 kB
/video/skin.css css 7.50 kB
/video/minimal-skin js 51.46 kB 58.19 kB
/video/skin js 51.32 kB 58.19 kB
/audio/minimal-skin.css css 5.46 kB
/audio/skin.css css 5.29 kB
/audio/minimal-skin js 39.78 kB 58.19 kB
/audio/skin js 39.74 kB 58.19 kB
/background/skin.css css 90 B
/background/skin js 277 B
/live-video/minimal-skin.css css 6.13 kB
/live-video/skin.css css 6.12 kB
/live-video/minimal-skin js 42.90 kB 58.19 kB
/live-video/skin js 42.92 kB 58.19 kB
/live-audio/minimal-skin.css css 4.28 kB
/live-audio/skin.css css 4.28 kB
/live-audio/minimal-skin js 30.55 kB 58.19 kB
/live-audio/skin js 30.58 kB 58.19 kB
UI Components (39)
Entry Initial Lazy
/ui/airplay-button 10.53 kB 58.19 kB
/ui/alert-dialog 4.73 kB 58.19 kB
/ui/audio-track 8.04 kB 58.19 kB
/ui/audio-track-radio-group 9.57 kB 58.19 kB
/ui/buffering-indicator 7.88 kB 58.19 kB
/ui/captions-button 10.51 kB 58.19 kB
/ui/captions-radio-group 9.67 kB 58.19 kB
/ui/cast-button 10.51 kB 58.19 kB
/ui/controls 7.80 kB 58.19 kB
/ui/dialog 4.75 kB 58.19 kB
/ui/error-dialog 11.88 kB 58.19 kB
/ui/fullscreen-button 10.49 kB 58.19 kB
/ui/gesture 8.07 kB 58.19 kB
/ui/hotkey 8.56 kB 58.19 kB
/ui/live-button 8.91 kB 58.19 kB
/ui/menu 19.54 kB 58.19 kB
/ui/mute-button 10.53 kB 58.19 kB
/ui/pip-button 10.48 kB 58.19 kB
/ui/play-button 10.45 kB 58.19 kB
/ui/playback-rate 8.07 kB 58.19 kB
/ui/playback-rate-button 10.45 kB 58.19 kB
/ui/playback-rate-radio-group 9.60 kB 58.19 kB
/ui/popover 8.16 kB 58.19 kB
/ui/poster 7.95 kB 58.19 kB
/ui/quality 8.50 kB 58.19 kB
/ui/quality-radio-group 10.04 kB 58.19 kB
/ui/seek-button 10.52 kB 58.19 kB
/ui/seek-indicator 12.06 kB 58.19 kB
/ui/slider 13.12 kB 58.19 kB
/ui/status-announcer 10.18 kB 58.19 kB
/ui/status-indicator 12.37 kB 58.19 kB
/ui/thumbnail 9.18 kB 58.19 kB
/ui/time 10.03 kB 58.19 kB
/ui/time-slider 14.40 kB 58.19 kB
/ui/title 7.35 kB 58.19 kB
/ui/tooltip 8.93 kB 58.19 kB
/ui/volume-indicator 12.42 kB 58.19 kB
/ui/volume-popover 14.29 kB 58.19 kB
/ui/volume-slider 12.25 kB 58.19 kB
🧩 @videojs/core — no changes
Entries (76)
Entry Initial Lazy
. 13.35 kB
/dom 22.82 kB 58.19 kB
/vjsc 1.87 kB
/i18n 3.23 kB 58.19 kB
/i18n/locales/all 35.98 kB
/i18n/locales/ar 1.24 kB
/i18n/locales/az 1.12 kB
/i18n/locales/bg 1.32 kB
/i18n/locales/bn 1.25 kB
/i18n/locales/bs 1.03 kB
/i18n/locales/ca 1.10 kB
/i18n/locales/cs 1.11 kB
/i18n/locales/cy 1.05 kB
/i18n/locales/da 1.01 kB
/i18n/locales/de 1.11 kB
/i18n/locales/el 1.53 kB
/i18n/locales/en 801 B
/i18n/locales/es 1.02 kB
/i18n/locales/et 1.07 kB
/i18n/locales/eu 1.04 kB
/i18n/locales/fa 1.25 kB
/i18n/locales/fi 1.07 kB
/i18n/locales/fr 1.09 kB
/i18n/locales/gd 1.13 kB
/i18n/locales/gl 1.02 kB
/i18n/locales/he 1.16 kB
/i18n/locales/hi 1.33 kB
/i18n/locales/hr 1.05 kB
/i18n/locales/hu 1.11 kB
/i18n/locales/id 941 B
/i18n/locales/it 1.04 kB
/i18n/locales/ja 1.22 kB
/i18n/locales/ko 1.18 kB
/i18n/locales/lt 1.04 kB
/i18n/locales/lv 1.11 kB
/i18n/locales/mr 1.32 kB
/i18n/locales/nb 1015 B
/i18n/locales/ne 1.32 kB
/i18n/locales/nl 1.02 kB
/i18n/locales/nn 1015 B
/i18n/locales/oc 1.10 kB
/i18n/locales/pl 1.17 kB
/i18n/locales/pt 1.05 kB
/i18n/locales/pt-BR 1.05 kB
/i18n/locales/pt-PT 1.04 kB
/i18n/locales/ro 1.10 kB
/i18n/locales/ru 1.42 kB
/i18n/locales/sk 1.13 kB
/i18n/locales/sl 1.07 kB
/i18n/locales/sr 1.13 kB
/i18n/locales/sv 1.03 kB
/i18n/locales/te 1.34 kB
/i18n/locales/th 1.31 kB
/i18n/locales/tr 1.09 kB
/i18n/locales/uk 1.44 kB
/i18n/locales/vi 1.13 kB
/i18n/locales/zh 1.04 kB
/i18n/locales/zh-CN 1.04 kB
/i18n/locales/zh-TW 1.04 kB
/i18n/text/airplay 101 B
/i18n/text/buttons 137 B
/i18n/text/captions 93 B
/i18n/text/cast 114 B
/i18n/text/common 90 B
/i18n/text/container 75 B
/i18n/text/errors 285 B
/i18n/text/fullscreen 98 B
/i18n/text/live 126 B
/i18n/text/menu 249 B
/i18n/text/pip 101 B
/i18n/text/playback 80 B
/i18n/text/seek 105 B
/i18n/text/slider 65 B
/i18n/text/status 222 B
/i18n/text/time 322 B
/i18n/text/volume 133 B
🏷️ @videojs/element — no changes
Entries (2)
Entry Initial
. 1.05 kB
/context 943 B
📦 @videojs/store — no changes
Entries (3)
Entry Initial
. 1.72 kB
/html 703 B
/react 365 B
🔧 @videojs/utils — no changes
Entries (13)
Entry Initial
/array 271 B
/dom 5.11 kB
/events 320 B
/function 386 B
/i18n 249 B
/jwt 176 B
/object 535 B
/predicate 297 B
/percent 281 B
/string 239 B
/style 212 B
/time 976 B
/number 199 B
📦 @videojs/cdn — no changes
📦 @videojs/cloudflare-video — no changes
📦 @videojs/dash-video — no changes
📦 @videojs/google-cast — no changes
📦 @videojs/hlsjs-video — no changes
📦 @videojs/media — no changes
Entries (3)
Entry Initial
. 1.29 kB
/dom 4.12 kB
/media-tracks 2.05 kB
📦 @videojs/mux — no changes
📦 @videojs/mux-audio — no changes
Entries (2)
Entry Initial
. 135.53 kB
/spf 20.81 kB
📦 @videojs/mux-data — no changes
📦 @videojs/mux-video — no changes
Entries (2)
Entry Initial
. 135.67 kB
/spf 26.72 kB
📦 @videojs/native-hls-video — no changes
📦 @videojs/shaka-video — no changes
📦 @videojs/spf — no changes
Entries (7)
Entry Initial
. 4.55 kB
/dom 6.60 kB
/hls 22.15 kB
/media-tracks 504 B
/hls-background-video 15.84 kB
/hls-audio 19.84 kB
/hls-video 25.89 kB
📦 @videojs/spotify-audio — no changes
📦 @videojs/tiktok-video — no changes
📦 @videojs/twitch-video — no changes
📦 @videojs/vimeo-video — no changes
📦 @videojs/wistia-video — no changes
Entries (2)
Entry Initial
. 1.91 kB
/helpers 1.77 kB
📦 @videojs/youtube-video — no changes

ℹ️ How to interpret

Each entry is independently bundled, minified, and brotli-compressed. Initial size includes its static import graph; lazy dynamic chunks are reported separately.

Entries are not additive because their dependency graphs overlap. Preset rows represent realistic combined bundles.

Changes of 300 B or less across initial, lazy, and total size are collapsed, not discarded.

Run pnpm size locally to check current initial sizes.

@decepulis decepulis left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

based on the fact that this fixes the problem, is easily reversible, and doesn't affect the user-facing api, I'm inclined to approve!

@luwes
luwes merged commit 0a40865 into main Sep 9, 2026
37 of 39 checks passed
@luwes
luwes deleted the fix/webkit-scoped-shadow-hosts branch September 9, 2026 21:51
@videojs-release videojs-release Bot mentioned this pull request Sep 9, 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.

3 participants