@videojs/react 10.0.0-beta.29 → 10.0.0-beta.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/default/index.js +2 -1
  2. package/dist/default/media/shaka-video/index.js +2 -0
  3. package/dist/default/media/shaka-video/media.js +21 -0
  4. package/dist/default/media/shaka-video/media.js.map +1 -0
  5. package/dist/default/presets/audio/minimal-skin.css +1 -3
  6. package/dist/default/presets/audio/skin.css +1 -3
  7. package/dist/default/presets/live-audio/minimal-skin.css +1 -3
  8. package/dist/default/presets/live-audio/skin.css +1 -3
  9. package/dist/default/presets/live-video/minimal-skin.css +2 -31
  10. package/dist/default/presets/live-video/minimal-skin.js +2 -6
  11. package/dist/default/presets/live-video/minimal-skin.js.map +1 -1
  12. package/dist/default/presets/live-video/minimal-skin.tailwind.js +2 -6
  13. package/dist/default/presets/live-video/minimal-skin.tailwind.js.map +1 -1
  14. package/dist/default/presets/live-video/skin.css +2 -33
  15. package/dist/default/presets/live-video/skin.js +2 -6
  16. package/dist/default/presets/live-video/skin.js.map +1 -1
  17. package/dist/default/presets/live-video/skin.tailwind.js +2 -6
  18. package/dist/default/presets/live-video/skin.tailwind.js.map +1 -1
  19. package/dist/default/presets/video/minimal-skin.css +2 -31
  20. package/dist/default/presets/video/minimal-skin.js +2 -6
  21. package/dist/default/presets/video/minimal-skin.js.map +1 -1
  22. package/dist/default/presets/video/minimal-skin.tailwind.js +2 -6
  23. package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
  24. package/dist/default/presets/video/skin.css +2 -33
  25. package/dist/default/presets/video/skin.js +2 -6
  26. package/dist/default/presets/video/skin.js.map +1 -1
  27. package/dist/default/presets/video/skin.tailwind.js +2 -6
  28. package/dist/default/presets/video/skin.tailwind.js.map +1 -1
  29. package/dist/default/skins/dist/default/default/tailwind/components/button.js +1 -1
  30. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  31. package/dist/default/skins/dist/default/default/tailwind/components/menu.js +2 -2
  32. package/dist/default/skins/dist/default/default/tailwind/components/menu.js.map +1 -1
  33. package/dist/default/skins/dist/default/default/tailwind/components/poster.js +1 -7
  34. package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  35. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +1 -10
  36. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  37. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +1 -1
  38. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  39. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js +2 -2
  40. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -1
  41. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +1 -7
  42. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  43. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -10
  44. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  45. package/dist/default/ui/thumbnail/thumbnail.js +18 -1
  46. package/dist/default/ui/thumbnail/thumbnail.js.map +1 -1
  47. package/dist/default/ui/title/index.js +2 -0
  48. package/dist/default/ui/title/title.js +44 -0
  49. package/dist/default/ui/title/title.js.map +1 -0
  50. package/dist/dev/index.d.ts +3 -2
  51. package/dist/dev/index.js +2 -1
  52. package/dist/dev/media/shaka-video/index.d.ts +2 -0
  53. package/dist/dev/media/shaka-video/index.js +2 -0
  54. package/dist/dev/media/shaka-video/media.d.ts +13 -0
  55. package/dist/dev/media/shaka-video/media.d.ts.map +1 -0
  56. package/dist/dev/media/shaka-video/media.js +21 -0
  57. package/dist/dev/media/shaka-video/media.js.map +1 -0
  58. package/dist/dev/presets/audio/minimal-skin.css +1 -3
  59. package/dist/dev/presets/audio/skin.css +1 -3
  60. package/dist/dev/presets/live-audio/minimal-skin.css +1 -3
  61. package/dist/dev/presets/live-audio/skin.css +1 -3
  62. package/dist/dev/presets/live-video/minimal-skin.css +2 -31
  63. package/dist/dev/presets/live-video/minimal-skin.js +2 -6
  64. package/dist/dev/presets/live-video/minimal-skin.js.map +1 -1
  65. package/dist/dev/presets/live-video/minimal-skin.tailwind.js +2 -6
  66. package/dist/dev/presets/live-video/minimal-skin.tailwind.js.map +1 -1
  67. package/dist/dev/presets/live-video/skin.css +2 -33
  68. package/dist/dev/presets/live-video/skin.js +2 -6
  69. package/dist/dev/presets/live-video/skin.js.map +1 -1
  70. package/dist/dev/presets/live-video/skin.tailwind.js +2 -6
  71. package/dist/dev/presets/live-video/skin.tailwind.js.map +1 -1
  72. package/dist/dev/presets/types.d.ts +0 -2
  73. package/dist/dev/presets/types.d.ts.map +1 -1
  74. package/dist/dev/presets/video/minimal-skin.css +2 -31
  75. package/dist/dev/presets/video/minimal-skin.js +2 -6
  76. package/dist/dev/presets/video/minimal-skin.js.map +1 -1
  77. package/dist/dev/presets/video/minimal-skin.tailwind.js +2 -6
  78. package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
  79. package/dist/dev/presets/video/skin.css +2 -33
  80. package/dist/dev/presets/video/skin.js +2 -6
  81. package/dist/dev/presets/video/skin.js.map +1 -1
  82. package/dist/dev/presets/video/skin.tailwind.js +2 -6
  83. package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
  84. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +1 -1
  85. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  86. package/dist/dev/skins/dist/default/default/tailwind/components/menu.js +2 -2
  87. package/dist/dev/skins/dist/default/default/tailwind/components/menu.js.map +1 -1
  88. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js +1 -7
  89. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  90. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +1 -10
  91. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  92. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +1 -1
  93. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  94. package/dist/dev/skins/dist/default/minimal/tailwind/components/menu.js +2 -2
  95. package/dist/dev/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -1
  96. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js +1 -7
  97. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  98. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -10
  99. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  100. package/dist/dev/ui/thumbnail/thumbnail.d.ts.map +1 -1
  101. package/dist/dev/ui/thumbnail/thumbnail.js +18 -1
  102. package/dist/dev/ui/thumbnail/thumbnail.js.map +1 -1
  103. package/dist/dev/ui/title/index.d.ts +2 -0
  104. package/dist/dev/ui/title/index.js +2 -0
  105. package/dist/dev/ui/title/title.d.ts +27 -0
  106. package/dist/dev/ui/title/title.d.ts.map +1 -0
  107. package/dist/dev/ui/title/title.js +47 -0
  108. package/dist/dev/ui/title/title.js.map +1 -0
  109. package/docs/README.md +1 -1
  110. package/docs/concepts/presets.md +4 -4
  111. package/docs/concepts/skins.md +8 -48
  112. package/docs/how-to/add-a-poster-placeholder.md +133 -0
  113. package/docs/how-to/customize-skins.md +10 -92
  114. package/docs/how-to/migrate-from-mux-player.md +14 -8
  115. package/docs/llms.txt +3 -0
  116. package/docs/reference/feature-fullscreen.md +9 -8
  117. package/docs/reference/feature-metadata.md +129 -0
  118. package/docs/reference/feature-orientation-lock.md +94 -8
  119. package/docs/reference/feature-text-tracks.md +10 -0
  120. package/docs/reference/menu.md +0 -1
  121. package/docs/reference/thumbnail.md +4 -0
  122. package/docs/reference/title.md +208 -0
  123. package/package.json +8 -8
@@ -34,20 +34,11 @@ const container = (isShadowDOM) => cn(container$1, "group/skin", "bg-black overf
34
34
  "[&_video::-webkit-media-text-track-container]:scale-98",
35
35
  "[&_video::-webkit-media-text-track-container]:z-1",
36
36
  "[&_video::-webkit-media-text-track-container]:font-[inherit]"
37
- ] : [], !isShadowDOM ? [
38
- "before:absolute before:inset-0 before:pointer-events-none",
39
- "before:[background-image:var(--media-poster-placeholder,none)]",
40
- "before:bg-no-repeat",
41
- "before:[background-position:var(--media-object-position,center)]",
42
- "before:[background-size:var(--media-object-fit,contain)]",
43
- "before:opacity-0 before:[filter:blur(var(--media-poster-placeholder-blur,20px))]",
44
- "before:transition-opacity before:duration-250",
45
- "has-[img[data-visible]:not([data-loaded])]:before:opacity-100"
46
37
  ] : [], "[&:fullscreen]:[--container-border-radius:0]", {
47
38
  "[&:fullscreen_video]:object-contain": !isShadowDOM,
48
39
  "[&:fullscreen_::slotted(video)]:object-contain": isShadowDOM
49
40
  });
50
- const controls = cn(controls$1, "absolute bottom-1 inset-x-1", "[--base-side-offset:5] [--base-boundary-offset:1]", "[--volume-mask:linear-gradient(to_right,transparent_10%,black_25%,black_100%)]", "gap-x-2 flex-wrap rounded-[--spacing(3)] group/controls", "text-white z-20", "peer-data-open/error:hidden", "ease-(--controls-transition-timing-function)", "duration-[calc(var(--controls-transition-duration)/2)]", "not-data-visible:duration-(--controls-transition-duration)", "pointer-fine:will-change-[translate,filter,opacity]", "pointer-fine:transition-[translate,filter,opacity]", "pointer-coarse:will-change-[translate,opacity]", "pointer-coarse:transition-[translate,opacity]", "not-data-visible:opacity-0 not-data-visible:pointer-events-none", "motion-safe:not-data-visible:translate-y-full", "pointer-fine:motion-safe:not-data-visible:blur-sm", "@2xl/media-root:flex-nowrap @2xl/media-root:[--controls-padding:2] @2xl/media-root:[--base-side-offset:2]");
41
+ const controls = cn(controls$1, "absolute bottom-1 inset-x-1", "[--base-side-offset:5] [--base-boundary-offset:1]", "[--volume-mask:linear-gradient(to_right,transparent_10%,black_25%,black_100%)]", "gap-x-2 flex-wrap rounded-[--spacing(3)] group/controls", "text-white z-20", "peer-data-open/error:hidden", "ease-(--controls-transition-timing-function)", "duration-[calc(var(--controls-transition-duration)/2)]", "not-data-visible:duration-(--controls-transition-duration)", "pointer-fine:transition-[translate,filter,opacity]", "pointer-coarse:transition-[translate,opacity]", "not-data-visible:opacity-0 not-data-visible:pointer-events-none", "motion-safe:not-data-visible:translate-y-full", "pointer-fine:motion-safe:not-data-visible:blur-sm", "@2xl/media-root:flex-nowrap @2xl/media-root:[--controls-padding:2] @2xl/media-root:[--base-side-offset:2]");
51
42
  const volumeMaskTarget = cn("[mask-image:var(--volume-mask-image,none)]", "[mask-repeat:no-repeat]", "[mask-position:var(--volume-mask-position,100%_0)]", "[mask-size:var(--volume-mask-size,200%_100%)]", "[transition:mask-position_50ms_ease-out]");
52
43
  const buttonGroupStart = cn(buttonGroup, "flex-1 @2xl/media-root:flex-none");
53
44
  const buttonGroupEnd = cn(buttonGroup, volumeMaskTarget, "flex-1 justify-end @2xl/media-root:flex-none", "group-has-[[data-volume-level][aria-expanded=true]]/controls:@max-2xl/media-root:[--volume-mask-image:var(--volume-mask)]", "group-has-[[data-volume-level][aria-expanded=true]]/controls:@max-2xl/media-root:[--volume-mask-position:0_0]", "group-has-[[data-volume-level][aria-expanded=true]]/controls:@max-2xl/media-root:[--volume-mask-size:400%_100%]");
@@ -1 +1 @@
1
- {"version":3,"file":"video.tailwind.js","names":[],"sources":["../../../../../../../../skins/dist/default/minimal/tailwind/video.tailwind.js"],"sourcesContent":["import { container as container$1 } from \"./components/container.js\";\nimport { controls as controls$1 } from \"./components/controls.js\";\nimport { error as error$1 } from \"./components/error.js\";\nimport { popup as popup$1 } from \"./components/popup.js\";\nimport { slider as slider$1 } from \"./components/slider.js\";\nimport { iconState } from \"../../shared/tailwind/icon-state.js\";\nimport { badge } from \"./components/badge.js\";\nimport { bufferingIndicator } from \"./components/buffering.js\";\nimport { button } from \"./components/button.js\";\nimport { buttonGroup } from \"./components/button-group.js\";\nimport { icon, iconContainer, iconFlipped, iconHidden } from \"./components/icon.js\";\nimport { menu as menu$1 } from \"./components/menu.js\";\nimport { playbackRate } from \"./components/playback-rate.js\";\nimport { seek } from \"./components/seek.js\";\nimport { time as time$1 } from \"./components/time.js\";\nimport { thumbnail as thumbnail$1 } from \"./components/thumbnail.js\";\nimport { inputIndicatorOverlay } from \"./components/input-indicator-overlay.js\";\nimport { overlay } from \"./components/overlay.js\";\nimport { poster } from \"./components/poster.js\";\nimport { seekIndicator } from \"./components/seek-indicator.js\";\nimport { statusIndicator } from \"./components/status-indicator.js\";\nimport { volumeIndicator } from \"./components/volume-indicator.js\";\nimport { cn } from \"@videojs/utils/style\";\n//#region src/minimal/tailwind/video.tailwind.ts\nconst container = (isShadowDOM) => cn(container$1, \"group/skin\", \"bg-black overflow-clip\", \"after:absolute after:pointer-events-none after:rounded-[inherit] after:z-10\", \"[&:fullscreen]:after:hidden\", \"after:inset-0 after:ring-1 after:ring-inset after:ring-(color:--border-color)\", {\n\t\"[&_::slotted(video)]:block [&_::slotted(video)]:w-full [&_::slotted(video)]:h-full [&_::slotted(video)]:rounded-(--container-border-radius) [&_::slotted(video)]:[object-fit:var(--media-object-fit,cover)] [&_::slotted(video)]:[object-position:var(--media-object-position,center)]\": isShadowDOM,\n\t\"[&_video]:block [&_video]:w-full [&_video]:h-full [&_video]:rounded-[inherit] [&_video]:[object-fit:var(--media-object-fit,contain)] [&_video]:[object-position:var(--media-object-position,center)]\": !isShadowDOM\n}, \"[--default-accent-color:oklch(1_0_0)]\", \"[--border-color:light-dark(oklch(0_0_0/0.15),oklch(1_0_0/0.15))]\", \"[--focus-ring-color:light-dark(oklch(0_0_0),oklch(1_0_0))]\", \"**:[--focus-ring-color:oklch(1_0_0)]\", \"[--container-border-radius:var(--media-border-radius,0.75rem)]\", \"[--media-video-border-radius:var(--container-border-radius)]\", \"[--controls-background-color:transparent]\", \"[--controls-transition-duration:100ms]\", \"[--controls-transition-timing-function:ease-out]\", \"[--error-dialog-transition-duration:150ms]\", \"[--error-dialog-transition-delay:100ms]\", \"[--error-dialog-transition-timing-function:ease-out]\", \"[--popup-transition-duration:100ms]\", \"[--popup-transition-timing-function:ease-out]\", \"[--popover-backdrop-filter:blur(16px)_saturate(1.5)]\", \"[--popover-background-color:oklch(0_0_0/0.5)]\", \"[--popover-border-color:oklch(1_0_0/0.1)]\", \"[--tooltip-backdrop-filter:var(--popover-backdrop-filter)]\", \"[--tooltip-background-color:var(--popover-background-color)]\", \"[--tooltip-border-color:var(--popover-border-color)]\", \"[--tooltip-text-color:currentColor]\", \"min-[1280px]:[&:fullscreen]:[--scale:1.25]\", \"min-[1536px]:[&:fullscreen]:[--scale:1.5]\", \"min-[1920px]:[&:fullscreen]:[--scale:1.75]\", \"motion-reduce:[--error-dialog-transition-duration:50ms]\", \"motion-reduce:[--error-dialog-transition-delay:0ms]\", \"motion-reduce:[--popup-transition-duration:0ms]\", \"[@media(prefers-reduced-transparency:reduce)]:[--controls-background-color:oklch(0_0_0)]\", \"contrast-more:[--controls-background-color:oklch(0_0_0)]\", \"[@media(prefers-reduced-transparency:reduce)]:[--tooltip-background-color:oklch(0_0_0)]\", \"contrast-more:[--tooltip-background-color:oklch(0_0_0)]\", \"pointer-fine:has-[[data-controls]:not([data-visible])]:[--controls-transition-duration:300ms]\", \"pointer-coarse:has-[[data-controls]:not([data-visible])]:[--controls-transition-duration:150ms]\", \"motion-reduce:has-[[data-controls]:not([data-visible])]:[--controls-transition-duration:50ms]\", \"[--media-caption-track-y:--spacing(-2)]\", \"[--media-caption-track-delay:25ms]\", \"[--media-caption-track-duration:var(--controls-transition-duration)]\", \"has-[[data-controls][data-visible]]:[--media-caption-track-y:--spacing(-18)]\", \"@2xl/media-root:has-[[data-controls][data-visible]]:*:[--media-caption-track-y:--spacing(-12)]\", !isShadowDOM ? [\n\t\"[&_video::-webkit-media-text-track-container]:transition-[translate]\",\n\t\"[&_video::-webkit-media-text-track-container]:duration-(--media-caption-track-duration)\",\n\t\"[&_video::-webkit-media-text-track-container]:ease-out\",\n\t\"[&_video::-webkit-media-text-track-container]:delay-(--media-caption-track-delay)\",\n\t\"[&_video::-webkit-media-text-track-container]:translate-y-(--media-caption-track-y)\",\n\t\"[&_video::-webkit-media-text-track-container]:scale-98\",\n\t\"[&_video::-webkit-media-text-track-container]:z-1\",\n\t\"[&_video::-webkit-media-text-track-container]:font-[inherit]\"\n] : [], !isShadowDOM ? [\n\t\"before:absolute before:inset-0 before:pointer-events-none\",\n\t\"before:[background-image:var(--media-poster-placeholder,none)]\",\n\t\"before:bg-no-repeat\",\n\t\"before:[background-position:var(--media-object-position,center)]\",\n\t\"before:[background-size:var(--media-object-fit,contain)]\",\n\t\"before:opacity-0 before:[filter:blur(var(--media-poster-placeholder-blur,20px))]\",\n\t\"before:transition-opacity before:duration-250\",\n\t\"has-[img[data-visible]:not([data-loaded])]:before:opacity-100\"\n] : [], \"[&:fullscreen]:[--container-border-radius:0]\", {\n\t\"[&:fullscreen_video]:object-contain\": !isShadowDOM,\n\t\"[&:fullscreen_::slotted(video)]:object-contain\": isShadowDOM\n});\nconst controls = cn(controls$1, \"absolute bottom-1 inset-x-1\", \"[--base-side-offset:5] [--base-boundary-offset:1]\", \"[--volume-mask:linear-gradient(to_right,transparent_10%,black_25%,black_100%)]\", \"gap-x-2 flex-wrap rounded-[--spacing(3)] group/controls\", \"text-white z-20\", \"peer-data-open/error:hidden\", \"ease-(--controls-transition-timing-function)\", \"duration-[calc(var(--controls-transition-duration)/2)]\", \"not-data-visible:duration-(--controls-transition-duration)\", \"pointer-fine:will-change-[translate,filter,opacity]\", \"pointer-fine:transition-[translate,filter,opacity]\", \"pointer-coarse:will-change-[translate,opacity]\", \"pointer-coarse:transition-[translate,opacity]\", \"not-data-visible:opacity-0 not-data-visible:pointer-events-none\", \"motion-safe:not-data-visible:translate-y-full\", \"pointer-fine:motion-safe:not-data-visible:blur-sm\", \"@2xl/media-root:flex-nowrap @2xl/media-root:[--controls-padding:2] @2xl/media-root:[--base-side-offset:2]\");\nconst volumeMaskTarget = cn(\"[mask-image:var(--volume-mask-image,none)]\", \"[mask-repeat:no-repeat]\", \"[mask-position:var(--volume-mask-position,100%_0)]\", \"[mask-size:var(--volume-mask-size,200%_100%)]\", \"[transition:mask-position_50ms_ease-out]\");\nconst buttonGroupStart = cn(buttonGroup, \"flex-1 @2xl/media-root:flex-none\");\nconst buttonGroupEnd = cn(buttonGroup, volumeMaskTarget, \"flex-1 justify-end @2xl/media-root:flex-none\", \"group-has-[[data-volume-level][aria-expanded=true]]/controls:@max-2xl/media-root:[--volume-mask-image:var(--volume-mask)]\", \"group-has-[[data-volume-level][aria-expanded=true]]/controls:@max-2xl/media-root:[--volume-mask-position:0_0]\", \"group-has-[[data-volume-level][aria-expanded=true]]/controls:@max-2xl/media-root:[--volume-mask-size:400%_100%]\");\nconst spacer = \"grow\";\nconst time = {\n\t...time$1,\n\tcontrols: cn(time$1.controls, volumeMaskTarget, \"[--slider-height:--spacing(5)] grow-0 shrink-0 basis-full order-[-1] px-1.5\", \"@2xl/media-root:[--slider-height:--spacing(8)] @2xl/media-root:grow @2xl/media-root:shrink @2xl/media-root:basis-0 @2xl/media-root:order-[unset]\", \"group-has-[[data-volume-level][aria-expanded=true]]/controls:@2xl/media-root:[--volume-mask-image:var(--volume-mask)]\", \"group-has-[[data-volume-level][aria-expanded=true]]/controls:@2xl/media-root:[--volume-mask-position:0_0]\")\n};\nconst error = {\n\t...error$1,\n\troot: cn(error$1.root, \"pointer-events-none outline-none\"),\n\tdialog: cn(error$1.dialog, \"pointer-events-auto w-full max-w-64 p-4 rounded-none\"),\n\tcontent: cn(error$1.content, \"p-0 py-1.5\"),\n\ttitle: \"text-(length:--font-size-medium)\"\n};\nconst thumbnail = thumbnail$1;\nconst slider = {\n\t...slider$1,\n\ttrack: cn(slider$1.track, \"ring-1 ring-black/5\"),\n\tpreview: cn(slider$1.preview, \"[--preview-end-inset:calc(100cqi-100%)]\", \"[--preview-left:clamp(calc(var(--max-size)/2),var(--media-slider-pointer),calc(100%-var(--max-size)/2+var(--preview-end-inset)))]\", \"@2xl/media-root:[--preview-left:var(--media-slider-pointer)]\")\n};\nconst popup = {\n\t...popup$1,\n\tvolume: cn(popup$1.popover, \"p-0 bg-transparent\", \"@max-2xl/media-root:[--media-popover-side-offset:--spacing(3)]\")\n};\nconst menu = {\n\t...menu$1,\n\troot: menu$1.root,\n\tsettings: menu$1.settings\n};\n//#endregion\nexport { badge, bufferingIndicator, button, buttonGroup, buttonGroupEnd, buttonGroupStart, container, controls, error, icon, iconContainer, iconFlipped, iconHidden, iconState, inputIndicatorOverlay, menu, overlay, playbackRate, popup, poster, seek, seekIndicator, slider, spacer, statusIndicator, thumbnail, time, volumeIndicator };\n\n//# sourceMappingURL=video.tailwind.js.map"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,aAAa,gBAAgB,GAAG,aAAa,cAAc,0BAA0B,+EAA+E,+BAA+B,iFAAiF;CACzR,0RAA0R;CAC1R,wMAAwM,CAAC;AAC1M,GAAG,yCAAyC,oEAAoE,8DAA8D,wCAAwC,kEAAkE,gEAAgE,6CAA6C,0CAA0C,oDAAoD,8CAA8C,2CAA2C,wDAAwD,uCAAuC,iDAAiD,wDAAwD,iDAAiD,6CAA6C,8DAA8D,gEAAgE,wDAAwD,uCAAuC,8CAA8C,6CAA6C,8CAA8C,2DAA2D,uDAAuD,mDAAmD,4FAA4F,4DAA4D,2FAA2F,2DAA2D,iGAAiG,mGAAmG,iGAAiG,2CAA2C,sCAAsC,wEAAwE,gFAAgF,kGAAkG,CAAC,cAAc;CACzxE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,IAAI,CAAC,GAAG,CAAC,cAAc;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,IAAI,CAAC,GAAG,gDAAgD;CACvD,uCAAuC,CAAC;CACxC,kDAAkD;AACnD,CAAC;AACD,MAAM,WAAW,GAAG,YAAY,+BAA+B,qDAAqD,kFAAkF,2DAA2D,mBAAmB,+BAA+B,gDAAgD,0DAA0D,8DAA8D,uDAAuD,sDAAsD,kDAAkD,iDAAiD,mEAAmE,iDAAiD,qDAAqD,2GAA2G;AAC/7B,MAAM,mBAAmB,GAAG,8CAA8C,2BAA2B,sDAAsD,iDAAiD,0CAA0C;AACtP,MAAM,mBAAmB,GAAG,aAAa,kCAAkC;AAC3E,MAAM,iBAAiB,GAAG,aAAa,kBAAkB,gDAAgD,6HAA6H,iHAAiH,iHAAiH;AACxc,MAAM,SAAS;AACf,MAAM,OAAO;CACZ,GAAG;CACH,UAAU,GAAG,OAAO,UAAU,kBAAkB,+EAA+E,oJAAoJ,yHAAyH,2GAA2G;AACxf;AACA,MAAM,QAAQ;CACb,GAAG;CACH,MAAM,GAAG,QAAQ,MAAM,kCAAkC;CACzD,QAAQ,GAAG,QAAQ,QAAQ,sDAAsD;CACjF,SAAS,GAAG,QAAQ,SAAS,YAAY;CACzC,OAAO;AACR;AACA,MAAM,YAAY;AAClB,MAAM,SAAS;CACd,GAAG;CACH,OAAO,GAAG,SAAS,OAAO,qBAAqB;CAC/C,SAAS,GAAG,SAAS,SAAS,2CAA2C,qIAAqI,8DAA8D;AAC7Q;AACA,MAAM,QAAQ;CACb,GAAG;CACH,QAAQ,GAAG,QAAQ,SAAS,sBAAsB,gEAAgE;AACnH;AACA,MAAM,OAAO;CACZ,GAAG;CACH,MAAM,OAAO;CACb,UAAU,OAAO;AAClB"}
1
+ {"version":3,"file":"video.tailwind.js","names":[],"sources":["../../../../../../../../skins/dist/default/minimal/tailwind/video.tailwind.js"],"sourcesContent":["import { container as container$1 } from \"./components/container.js\";\nimport { controls as controls$1 } from \"./components/controls.js\";\nimport { error as error$1 } from \"./components/error.js\";\nimport { popup as popup$1 } from \"./components/popup.js\";\nimport { slider as slider$1 } from \"./components/slider.js\";\nimport { iconState } from \"../../shared/tailwind/icon-state.js\";\nimport { badge } from \"./components/badge.js\";\nimport { bufferingIndicator } from \"./components/buffering.js\";\nimport { button } from \"./components/button.js\";\nimport { buttonGroup } from \"./components/button-group.js\";\nimport { icon, iconContainer, iconFlipped, iconHidden } from \"./components/icon.js\";\nimport { menu as menu$1 } from \"./components/menu.js\";\nimport { playbackRate } from \"./components/playback-rate.js\";\nimport { seek } from \"./components/seek.js\";\nimport { time as time$1 } from \"./components/time.js\";\nimport { thumbnail as thumbnail$1 } from \"./components/thumbnail.js\";\nimport { inputIndicatorOverlay } from \"./components/input-indicator-overlay.js\";\nimport { overlay } from \"./components/overlay.js\";\nimport { poster } from \"./components/poster.js\";\nimport { seekIndicator } from \"./components/seek-indicator.js\";\nimport { statusIndicator } from \"./components/status-indicator.js\";\nimport { volumeIndicator } from \"./components/volume-indicator.js\";\nimport { cn } from \"@videojs/utils/style\";\n//#region src/minimal/tailwind/video.tailwind.ts\nconst container = (isShadowDOM) => cn(container$1, \"group/skin\", \"bg-black overflow-clip\", \"after:absolute after:pointer-events-none after:rounded-[inherit] after:z-10\", \"[&:fullscreen]:after:hidden\", \"after:inset-0 after:ring-1 after:ring-inset after:ring-(color:--border-color)\", {\n\t\"[&_::slotted(video)]:block [&_::slotted(video)]:w-full [&_::slotted(video)]:h-full [&_::slotted(video)]:rounded-(--container-border-radius) [&_::slotted(video)]:[object-fit:var(--media-object-fit,cover)] [&_::slotted(video)]:[object-position:var(--media-object-position,center)]\": isShadowDOM,\n\t\"[&_video]:block [&_video]:w-full [&_video]:h-full [&_video]:rounded-[inherit] [&_video]:[object-fit:var(--media-object-fit,contain)] [&_video]:[object-position:var(--media-object-position,center)]\": !isShadowDOM\n}, \"[--default-accent-color:oklch(1_0_0)]\", \"[--border-color:light-dark(oklch(0_0_0/0.15),oklch(1_0_0/0.15))]\", \"[--focus-ring-color:light-dark(oklch(0_0_0),oklch(1_0_0))]\", \"**:[--focus-ring-color:oklch(1_0_0)]\", \"[--container-border-radius:var(--media-border-radius,0.75rem)]\", \"[--media-video-border-radius:var(--container-border-radius)]\", \"[--controls-background-color:transparent]\", \"[--controls-transition-duration:100ms]\", \"[--controls-transition-timing-function:ease-out]\", \"[--error-dialog-transition-duration:150ms]\", \"[--error-dialog-transition-delay:100ms]\", \"[--error-dialog-transition-timing-function:ease-out]\", \"[--popup-transition-duration:100ms]\", \"[--popup-transition-timing-function:ease-out]\", \"[--popover-backdrop-filter:blur(16px)_saturate(1.5)]\", \"[--popover-background-color:oklch(0_0_0/0.5)]\", \"[--popover-border-color:oklch(1_0_0/0.1)]\", \"[--tooltip-backdrop-filter:var(--popover-backdrop-filter)]\", \"[--tooltip-background-color:var(--popover-background-color)]\", \"[--tooltip-border-color:var(--popover-border-color)]\", \"[--tooltip-text-color:currentColor]\", \"min-[1280px]:[&:fullscreen]:[--scale:1.25]\", \"min-[1536px]:[&:fullscreen]:[--scale:1.5]\", \"min-[1920px]:[&:fullscreen]:[--scale:1.75]\", \"motion-reduce:[--error-dialog-transition-duration:50ms]\", \"motion-reduce:[--error-dialog-transition-delay:0ms]\", \"motion-reduce:[--popup-transition-duration:0ms]\", \"[@media(prefers-reduced-transparency:reduce)]:[--controls-background-color:oklch(0_0_0)]\", \"contrast-more:[--controls-background-color:oklch(0_0_0)]\", \"[@media(prefers-reduced-transparency:reduce)]:[--tooltip-background-color:oklch(0_0_0)]\", \"contrast-more:[--tooltip-background-color:oklch(0_0_0)]\", \"pointer-fine:has-[[data-controls]:not([data-visible])]:[--controls-transition-duration:300ms]\", \"pointer-coarse:has-[[data-controls]:not([data-visible])]:[--controls-transition-duration:150ms]\", \"motion-reduce:has-[[data-controls]:not([data-visible])]:[--controls-transition-duration:50ms]\", \"[--media-caption-track-y:--spacing(-2)]\", \"[--media-caption-track-delay:25ms]\", \"[--media-caption-track-duration:var(--controls-transition-duration)]\", \"has-[[data-controls][data-visible]]:[--media-caption-track-y:--spacing(-18)]\", \"@2xl/media-root:has-[[data-controls][data-visible]]:*:[--media-caption-track-y:--spacing(-12)]\", !isShadowDOM ? [\n\t\"[&_video::-webkit-media-text-track-container]:transition-[translate]\",\n\t\"[&_video::-webkit-media-text-track-container]:duration-(--media-caption-track-duration)\",\n\t\"[&_video::-webkit-media-text-track-container]:ease-out\",\n\t\"[&_video::-webkit-media-text-track-container]:delay-(--media-caption-track-delay)\",\n\t\"[&_video::-webkit-media-text-track-container]:translate-y-(--media-caption-track-y)\",\n\t\"[&_video::-webkit-media-text-track-container]:scale-98\",\n\t\"[&_video::-webkit-media-text-track-container]:z-1\",\n\t\"[&_video::-webkit-media-text-track-container]:font-[inherit]\"\n] : [], \"[&:fullscreen]:[--container-border-radius:0]\", {\n\t\"[&:fullscreen_video]:object-contain\": !isShadowDOM,\n\t\"[&:fullscreen_::slotted(video)]:object-contain\": isShadowDOM\n});\nconst controls = cn(controls$1, \"absolute bottom-1 inset-x-1\", \"[--base-side-offset:5] [--base-boundary-offset:1]\", \"[--volume-mask:linear-gradient(to_right,transparent_10%,black_25%,black_100%)]\", \"gap-x-2 flex-wrap rounded-[--spacing(3)] group/controls\", \"text-white z-20\", \"peer-data-open/error:hidden\", \"ease-(--controls-transition-timing-function)\", \"duration-[calc(var(--controls-transition-duration)/2)]\", \"not-data-visible:duration-(--controls-transition-duration)\", \"pointer-fine:transition-[translate,filter,opacity]\", \"pointer-coarse:transition-[translate,opacity]\", \"not-data-visible:opacity-0 not-data-visible:pointer-events-none\", \"motion-safe:not-data-visible:translate-y-full\", \"pointer-fine:motion-safe:not-data-visible:blur-sm\", \"@2xl/media-root:flex-nowrap @2xl/media-root:[--controls-padding:2] @2xl/media-root:[--base-side-offset:2]\");\nconst volumeMaskTarget = cn(\"[mask-image:var(--volume-mask-image,none)]\", \"[mask-repeat:no-repeat]\", \"[mask-position:var(--volume-mask-position,100%_0)]\", \"[mask-size:var(--volume-mask-size,200%_100%)]\", \"[transition:mask-position_50ms_ease-out]\");\nconst buttonGroupStart = cn(buttonGroup, \"flex-1 @2xl/media-root:flex-none\");\nconst buttonGroupEnd = cn(buttonGroup, volumeMaskTarget, \"flex-1 justify-end @2xl/media-root:flex-none\", \"group-has-[[data-volume-level][aria-expanded=true]]/controls:@max-2xl/media-root:[--volume-mask-image:var(--volume-mask)]\", \"group-has-[[data-volume-level][aria-expanded=true]]/controls:@max-2xl/media-root:[--volume-mask-position:0_0]\", \"group-has-[[data-volume-level][aria-expanded=true]]/controls:@max-2xl/media-root:[--volume-mask-size:400%_100%]\");\nconst spacer = \"grow\";\nconst time = {\n\t...time$1,\n\tcontrols: cn(time$1.controls, volumeMaskTarget, \"[--slider-height:--spacing(5)] grow-0 shrink-0 basis-full order-[-1] px-1.5\", \"@2xl/media-root:[--slider-height:--spacing(8)] @2xl/media-root:grow @2xl/media-root:shrink @2xl/media-root:basis-0 @2xl/media-root:order-[unset]\", \"group-has-[[data-volume-level][aria-expanded=true]]/controls:@2xl/media-root:[--volume-mask-image:var(--volume-mask)]\", \"group-has-[[data-volume-level][aria-expanded=true]]/controls:@2xl/media-root:[--volume-mask-position:0_0]\")\n};\nconst error = {\n\t...error$1,\n\troot: cn(error$1.root, \"pointer-events-none outline-none\"),\n\tdialog: cn(error$1.dialog, \"pointer-events-auto w-full max-w-64 p-4 rounded-none\"),\n\tcontent: cn(error$1.content, \"p-0 py-1.5\"),\n\ttitle: \"text-(length:--font-size-medium)\"\n};\nconst thumbnail = thumbnail$1;\nconst slider = {\n\t...slider$1,\n\ttrack: cn(slider$1.track, \"ring-1 ring-black/5\"),\n\tpreview: cn(slider$1.preview, \"[--preview-end-inset:calc(100cqi-100%)]\", \"[--preview-left:clamp(calc(var(--max-size)/2),var(--media-slider-pointer),calc(100%-var(--max-size)/2+var(--preview-end-inset)))]\", \"@2xl/media-root:[--preview-left:var(--media-slider-pointer)]\")\n};\nconst popup = {\n\t...popup$1,\n\tvolume: cn(popup$1.popover, \"p-0 bg-transparent\", \"@max-2xl/media-root:[--media-popover-side-offset:--spacing(3)]\")\n};\nconst menu = {\n\t...menu$1,\n\troot: menu$1.root,\n\tsettings: menu$1.settings\n};\n//#endregion\nexport { badge, bufferingIndicator, button, buttonGroup, buttonGroupEnd, buttonGroupStart, container, controls, error, icon, iconContainer, iconFlipped, iconHidden, iconState, inputIndicatorOverlay, menu, overlay, playbackRate, popup, poster, seek, seekIndicator, slider, spacer, statusIndicator, thumbnail, time, volumeIndicator };\n\n//# sourceMappingURL=video.tailwind.js.map"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,aAAa,gBAAgB,GAAG,aAAa,cAAc,0BAA0B,+EAA+E,+BAA+B,iFAAiF;CACzR,0RAA0R;CAC1R,wMAAwM,CAAC;AAC1M,GAAG,yCAAyC,oEAAoE,8DAA8D,wCAAwC,kEAAkE,gEAAgE,6CAA6C,0CAA0C,oDAAoD,8CAA8C,2CAA2C,wDAAwD,uCAAuC,iDAAiD,wDAAwD,iDAAiD,6CAA6C,8DAA8D,gEAAgE,wDAAwD,uCAAuC,8CAA8C,6CAA6C,8CAA8C,2DAA2D,uDAAuD,mDAAmD,4FAA4F,4DAA4D,2FAA2F,2DAA2D,iGAAiG,mGAAmG,iGAAiG,2CAA2C,sCAAsC,wEAAwE,gFAAgF,kGAAkG,CAAC,cAAc;CACzxE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,IAAI,CAAC,GAAG,gDAAgD;CACvD,uCAAuC,CAAC;CACxC,kDAAkD;AACnD,CAAC;AACD,MAAM,WAAW,GAAG,YAAY,+BAA+B,qDAAqD,kFAAkF,2DAA2D,mBAAmB,+BAA+B,gDAAgD,0DAA0D,8DAA8D,sDAAsD,iDAAiD,mEAAmE,iDAAiD,qDAAqD,2GAA2G;AACt1B,MAAM,mBAAmB,GAAG,8CAA8C,2BAA2B,sDAAsD,iDAAiD,0CAA0C;AACtP,MAAM,mBAAmB,GAAG,aAAa,kCAAkC;AAC3E,MAAM,iBAAiB,GAAG,aAAa,kBAAkB,gDAAgD,6HAA6H,iHAAiH,iHAAiH;AACxc,MAAM,SAAS;AACf,MAAM,OAAO;CACZ,GAAG;CACH,UAAU,GAAG,OAAO,UAAU,kBAAkB,+EAA+E,oJAAoJ,yHAAyH,2GAA2G;AACxf;AACA,MAAM,QAAQ;CACb,GAAG;CACH,MAAM,GAAG,QAAQ,MAAM,kCAAkC;CACzD,QAAQ,GAAG,QAAQ,QAAQ,sDAAsD;CACjF,SAAS,GAAG,QAAQ,SAAS,YAAY;CACzC,OAAO;AACR;AACA,MAAM,YAAY;AAClB,MAAM,SAAS;CACd,GAAG;CACH,OAAO,GAAG,SAAS,OAAO,qBAAqB;CAC/C,SAAS,GAAG,SAAS,SAAS,2CAA2C,qIAAqI,8DAA8D;AAC7Q;AACA,MAAM,QAAQ;CACb,GAAG;CACH,QAAQ,GAAG,QAAQ,SAAS,sBAAsB,gEAAgE;AACnH;AACA,MAAM,OAAO;CACZ,GAAG;CACH,MAAM,OAAO;CACb,UAAU,OAAO;AAClB"}
@@ -4,8 +4,24 @@ import { renderElement } from "../../utils/use-render.js";
4
4
  import { createThumbnail, selectTextTrack } from "@videojs/core/dom";
5
5
  import { forwardRef, useMemo, useRef, useState } from "react";
6
6
  import { jsx } from "react/jsx-runtime";
7
+ import { isNull, isUndefined } from "@videojs/utils/predicate";
7
8
  import { ThumbnailCore, ThumbnailDataAttrs, mapCuesToThumbnails } from "@videojs/core";
8
9
  //#region src/ui/thumbnail/thumbnail.tsx
10
+ /**
11
+ * Leaving `crossOrigin` unset means "follow the media element", so thumbnails
12
+ * keep working on a CORS-enabled player without a skin having to thread a prop
13
+ * through. `null` opts out and fetches the sprites no-CORS. `''` is passed
14
+ * straight through, since the CORS-settings attribute reads it as Anonymous.
15
+ *
16
+ * Only the `<track>` path inherits: `thumbnails` passed directly may point at a
17
+ * host that has nothing to do with the media element.
18
+ */
19
+ function resolveCrossOrigin(explicit, external, inherited) {
20
+ if (isNull(explicit)) return void 0;
21
+ if (!isUndefined(explicit)) return explicit;
22
+ if (external?.length) return void 0;
23
+ return inherited ?? void 0;
24
+ }
9
25
  const Thumbnail = forwardRef(function Thumbnail(componentProps, forwardedRef) {
10
26
  const { render, className, style, time = 0, thumbnails: externalThumbnails, crossOrigin, loading, fetchPriority, ...elementProps } = componentProps;
11
27
  const [core] = useState(() => new ThumbnailCore());
@@ -28,6 +44,7 @@ const Thumbnail = forwardRef(function Thumbnail(componentProps, forwardedRef) {
28
44
  thumbnails,
29
45
  time
30
46
  ]);
47
+ const resolvedCrossOrigin = resolveCrossOrigin(crossOrigin, externalThumbnails, textTrack?.thumbnailTrackCrossOrigin);
31
48
  handle.updateSrc(thumbnail?.url);
32
49
  const state = core.getState(handle.loading, handle.error, thumbnail);
33
50
  let containerStyle = { overflow: "hidden" };
@@ -67,7 +84,7 @@ const Thumbnail = forwardRef(function Thumbnail(componentProps, forwardedRef) {
67
84
  "aria-hidden": "true",
68
85
  decoding: "async",
69
86
  src: thumbnail?.url,
70
- crossOrigin: crossOrigin === "" || crossOrigin === null ? void 0 : crossOrigin,
87
+ crossOrigin: resolvedCrossOrigin,
71
88
  loading,
72
89
  style: imgStyle,
73
90
  fetchPriority
@@ -1 +1 @@
1
- {"version":3,"file":"thumbnail.js","names":[],"sources":["../../../../src/ui/thumbnail/thumbnail.tsx"],"sourcesContent":["import {\n mapCuesToThumbnails,\n ThumbnailCore,\n ThumbnailDataAttrs,\n type ThumbnailFetchPriority,\n type ThumbnailImage,\n} from '@videojs/core';\nimport { createThumbnail, selectTextTrack } from '@videojs/core/dom';\nimport type { CSSProperties } from 'react';\nimport { forwardRef, useMemo, useRef, useState } from 'react';\n\nimport { useOptionalPlayer } from '../../player/context';\nimport type { UIComponentProps } from '../../utils/types';\nimport { useDestroy } from '../../utils/use-destroy';\nimport { renderElement } from '../../utils/use-render';\n\nexport interface ThumbnailProps extends UIComponentProps<'div', ThumbnailCore.State>, ThumbnailCore.Props {\n /** Pre-parsed thumbnail images — bypasses the automatic `<track>` detection. */\n thumbnails?: ThumbnailImage[] | undefined;\n}\n\nexport const Thumbnail = forwardRef<HTMLDivElement, ThumbnailProps>(function Thumbnail(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n time = 0,\n thumbnails: externalThumbnails,\n crossOrigin,\n loading,\n fetchPriority,\n ...elementProps\n } = componentProps;\n\n const [core] = useState(() => new ThumbnailCore());\n const divRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n const textTrack = useOptionalPlayer(selectTextTrack);\n\n // Force re-render when the handle's state changes (img load/error, resize).\n const [, setRenderToken] = useState(0);\n\n const [handle] = useState(() =>\n createThumbnail({\n getContainer: () => divRef.current,\n getImg: () => imgRef.current,\n onStateChange: () => setRenderToken((n) => n + 1),\n })\n );\n\n useDestroy(handle, () => handle.connect());\n\n // Resolve thumbnails: external prop takes priority over auto <track> path.\n const thumbnails = useMemo(() => {\n if (externalThumbnails && externalThumbnails.length > 0) return externalThumbnails;\n return textTrack && textTrack.thumbnailCues.length > 0\n ? mapCuesToThumbnails(textTrack.thumbnailCues, textTrack.thumbnailTrackSrc ?? undefined)\n : [];\n }, [externalThumbnails, textTrack]);\n\n const thumbnail = useMemo(() => core.findActiveThumbnail(thumbnails, time), [core, thumbnails, time]);\n\n // Track src changes via the handle.\n handle.updateSrc(thumbnail?.url);\n\n const state = core.getState(handle.loading, handle.error, thumbnail);\n\n // Compute styles declaratively from resize result.\n let containerStyle: CSSProperties = { overflow: 'hidden' };\n let imgStyle: CSSProperties | undefined;\n\n if (thumbnail && handle.naturalWidth && handle.naturalHeight) {\n const constraints = handle.readConstraints();\n const result = core.resize(thumbnail, handle.naturalWidth, handle.naturalHeight, constraints);\n\n if (result) {\n containerStyle = {\n overflow: 'hidden',\n width: result.containerWidth,\n height: result.containerHeight,\n };\n imgStyle = {\n width: result.imageWidth,\n height: result.imageHeight,\n maxWidth: 'none',\n transform:\n result.offsetX || result.offsetY ? `translate(-${result.offsetX}px, -${result.offsetY}px)` : undefined,\n };\n }\n }\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: ThumbnailDataAttrs,\n ref: [forwardedRef, divRef],\n props: [\n core.getAttrs(state),\n { style: containerStyle },\n elementProps,\n {\n children: (\n <img\n ref={imgRef}\n alt=\"\"\n aria-hidden=\"true\"\n decoding=\"async\"\n src={thumbnail?.url}\n crossOrigin={crossOrigin === '' || crossOrigin === null ? undefined : crossOrigin}\n loading={loading}\n style={imgStyle}\n // React's types omit `| undefined` from fetchPriority — cast to satisfy exactOptionalPropertyTypes.\n fetchPriority={fetchPriority as ThumbnailFetchPriority}\n />\n ),\n },\n ],\n }\n );\n});\n\nexport namespace Thumbnail {\n export type Props = ThumbnailProps;\n export type State = ThumbnailCore.State;\n}\n"],"mappings":";;;;;;;;AAqBA,MAAa,YAAY,WAA2C,SAAS,UAAU,gBAAgB,cAAc;CACnH,MAAM,EACJ,QACA,WACA,OACA,OAAO,GACP,YAAY,oBACZ,aACA,SACA,eACA,GAAG,iBACD;CAEJ,MAAM,CAAC,QAAQ,eAAe,IAAI,cAAc,CAAC;CACjD,MAAM,SAAS,OAAuB,IAAI;CAC1C,MAAM,SAAS,OAAyB,IAAI;CAC5C,MAAM,YAAY,kBAAkB,eAAe;CAGnD,MAAM,GAAG,kBAAkB,SAAS,CAAC;CAErC,MAAM,CAAC,UAAU,eACf,gBAAgB;EACd,oBAAoB,OAAO;EAC3B,cAAc,OAAO;EACrB,qBAAqB,gBAAgB,MAAM,IAAI,CAAC;CAClD,CAAC,CACH;CAEA,WAAW,cAAc,OAAO,QAAQ,CAAC;CAGzC,MAAM,aAAa,cAAc;EAC/B,IAAI,sBAAsB,mBAAmB,SAAS,GAAG,OAAO;EAChE,OAAO,aAAa,UAAU,cAAc,SAAS,IACjD,oBAAoB,UAAU,eAAe,UAAU,qBAAqB,KAAA,CAAS,IACrF,CAAC;CACP,GAAG,CAAC,oBAAoB,SAAS,CAAC;CAElC,MAAM,YAAY,cAAc,KAAK,oBAAoB,YAAY,IAAI,GAAG;EAAC;EAAM;EAAY;CAAI,CAAC;CAGpG,OAAO,UAAU,WAAW,GAAG;CAE/B,MAAM,QAAQ,KAAK,SAAS,OAAO,SAAS,OAAO,OAAO,SAAS;CAGnE,IAAI,iBAAgC,EAAE,UAAU,SAAS;CACzD,IAAI;CAEJ,IAAI,aAAa,OAAO,gBAAgB,OAAO,eAAe;EAC5D,MAAM,cAAc,OAAO,gBAAgB;EAC3C,MAAM,SAAS,KAAK,OAAO,WAAW,OAAO,cAAc,OAAO,eAAe,WAAW;EAE5F,IAAI,QAAQ;GACV,iBAAiB;IACf,UAAU;IACV,OAAO,OAAO;IACd,QAAQ,OAAO;GACjB;GACA,WAAW;IACT,OAAO,OAAO;IACd,QAAQ,OAAO;IACf,UAAU;IACV,WACE,OAAO,WAAW,OAAO,UAAU,cAAc,OAAO,QAAQ,OAAO,OAAO,QAAQ,OAAO,KAAA;GACjG;EACF;CACF;CAEA,OAAO,cACL,OACA;EAAE;EAAQ;EAAW;CAAM,GAC3B;EACE;EACA,cAAc;EACd,KAAK,CAAC,cAAc,MAAM;EAC1B,OAAO;GACL,KAAK,SAAS,KAAK;GACnB,EAAE,OAAO,eAAe;GACxB;GACA,EACE,UACE,oBAAC,OAAD;IACE,KAAK;IACL,KAAI;IACJ,eAAY;IACZ,UAAS;IACT,KAAK,WAAW;IAChB,aAAa,gBAAgB,MAAM,gBAAgB,OAAO,KAAA,IAAY;IAC7D;IACT,OAAO;IAEQ;GAChB,CAAA,EAEL;EACF;CACF,CACF;AACF,CAAC"}
1
+ {"version":3,"file":"thumbnail.js","names":[],"sources":["../../../../src/ui/thumbnail/thumbnail.tsx"],"sourcesContent":["import {\n mapCuesToThumbnails,\n ThumbnailCore,\n ThumbnailDataAttrs,\n type ThumbnailFetchPriority,\n type ThumbnailImage,\n} from '@videojs/core';\nimport { createThumbnail, selectTextTrack } from '@videojs/core/dom';\nimport type { MediaTextTrackState } from '@videojs/media';\nimport { isNull, isUndefined } from '@videojs/utils/predicate';\nimport type { CSSProperties } from 'react';\nimport { forwardRef, useMemo, useRef, useState } from 'react';\n\nimport { useOptionalPlayer } from '../../player/context';\nimport type { UIComponentProps } from '../../utils/types';\nimport { useDestroy } from '../../utils/use-destroy';\nimport { renderElement } from '../../utils/use-render';\n\nexport interface ThumbnailProps extends UIComponentProps<'div', ThumbnailCore.State>, ThumbnailCore.Props {\n /** Pre-parsed thumbnail images — bypasses the automatic `<track>` detection. */\n thumbnails?: ThumbnailImage[] | undefined;\n}\n\n/**\n * Leaving `crossOrigin` unset means \"follow the media element\", so thumbnails\n * keep working on a CORS-enabled player without a skin having to thread a prop\n * through. `null` opts out and fetches the sprites no-CORS. `''` is passed\n * straight through, since the CORS-settings attribute reads it as Anonymous.\n *\n * Only the `<track>` path inherits: `thumbnails` passed directly may point at a\n * host that has nothing to do with the media element.\n */\nfunction resolveCrossOrigin(\n explicit: ThumbnailCore.Props['crossOrigin'],\n external: ThumbnailImage[] | undefined,\n inherited: MediaTextTrackState['thumbnailTrackCrossOrigin'] | undefined\n) {\n if (isNull(explicit)) return undefined;\n if (!isUndefined(explicit)) return explicit;\n if (external?.length) return undefined;\n\n return inherited ?? undefined;\n}\n\nexport const Thumbnail = forwardRef<HTMLDivElement, ThumbnailProps>(function Thumbnail(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n time = 0,\n thumbnails: externalThumbnails,\n crossOrigin,\n loading,\n fetchPriority,\n ...elementProps\n } = componentProps;\n\n const [core] = useState(() => new ThumbnailCore());\n const divRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n const textTrack = useOptionalPlayer(selectTextTrack);\n\n // Force re-render when the handle's state changes (img load/error, resize).\n const [, setRenderToken] = useState(0);\n\n const [handle] = useState(() =>\n createThumbnail({\n getContainer: () => divRef.current,\n getImg: () => imgRef.current,\n onStateChange: () => setRenderToken((n) => n + 1),\n })\n );\n\n useDestroy(handle, () => handle.connect());\n\n // Resolve thumbnails: external prop takes priority over auto <track> path.\n const thumbnails = useMemo(() => {\n if (externalThumbnails && externalThumbnails.length > 0) return externalThumbnails;\n return textTrack && textTrack.thumbnailCues.length > 0\n ? mapCuesToThumbnails(textTrack.thumbnailCues, textTrack.thumbnailTrackSrc ?? undefined)\n : [];\n }, [externalThumbnails, textTrack]);\n\n const thumbnail = useMemo(() => core.findActiveThumbnail(thumbnails, time), [core, thumbnails, time]);\n\n const resolvedCrossOrigin = resolveCrossOrigin(crossOrigin, externalThumbnails, textTrack?.thumbnailTrackCrossOrigin);\n\n // Track src changes via the handle.\n handle.updateSrc(thumbnail?.url);\n\n const state = core.getState(handle.loading, handle.error, thumbnail);\n\n // Compute styles declaratively from resize result.\n let containerStyle: CSSProperties = { overflow: 'hidden' };\n let imgStyle: CSSProperties | undefined;\n\n if (thumbnail && handle.naturalWidth && handle.naturalHeight) {\n const constraints = handle.readConstraints();\n const result = core.resize(thumbnail, handle.naturalWidth, handle.naturalHeight, constraints);\n\n if (result) {\n containerStyle = {\n overflow: 'hidden',\n width: result.containerWidth,\n height: result.containerHeight,\n };\n imgStyle = {\n width: result.imageWidth,\n height: result.imageHeight,\n maxWidth: 'none',\n transform:\n result.offsetX || result.offsetY ? `translate(-${result.offsetX}px, -${result.offsetY}px)` : undefined,\n };\n }\n }\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: ThumbnailDataAttrs,\n ref: [forwardedRef, divRef],\n props: [\n core.getAttrs(state),\n { style: containerStyle },\n elementProps,\n {\n children: (\n <img\n ref={imgRef}\n alt=\"\"\n aria-hidden=\"true\"\n decoding=\"async\"\n src={thumbnail?.url}\n crossOrigin={resolvedCrossOrigin}\n loading={loading}\n style={imgStyle}\n // React's types omit `| undefined` from fetchPriority — cast to satisfy exactOptionalPropertyTypes.\n fetchPriority={fetchPriority as ThumbnailFetchPriority}\n />\n ),\n },\n ],\n }\n );\n});\n\nexport namespace Thumbnail {\n export type Props = ThumbnailProps;\n export type State = ThumbnailCore.State;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAgCA,SAAS,mBACP,UACA,UACA,WACA;CACA,IAAI,OAAO,QAAQ,GAAG,OAAO,KAAA;CAC7B,IAAI,CAAC,YAAY,QAAQ,GAAG,OAAO;CACnC,IAAI,UAAU,QAAQ,OAAO,KAAA;CAE7B,OAAO,aAAa,KAAA;AACtB;AAEA,MAAa,YAAY,WAA2C,SAAS,UAAU,gBAAgB,cAAc;CACnH,MAAM,EACJ,QACA,WACA,OACA,OAAO,GACP,YAAY,oBACZ,aACA,SACA,eACA,GAAG,iBACD;CAEJ,MAAM,CAAC,QAAQ,eAAe,IAAI,cAAc,CAAC;CACjD,MAAM,SAAS,OAAuB,IAAI;CAC1C,MAAM,SAAS,OAAyB,IAAI;CAC5C,MAAM,YAAY,kBAAkB,eAAe;CAGnD,MAAM,GAAG,kBAAkB,SAAS,CAAC;CAErC,MAAM,CAAC,UAAU,eACf,gBAAgB;EACd,oBAAoB,OAAO;EAC3B,cAAc,OAAO;EACrB,qBAAqB,gBAAgB,MAAM,IAAI,CAAC;CAClD,CAAC,CACH;CAEA,WAAW,cAAc,OAAO,QAAQ,CAAC;CAGzC,MAAM,aAAa,cAAc;EAC/B,IAAI,sBAAsB,mBAAmB,SAAS,GAAG,OAAO;EAChE,OAAO,aAAa,UAAU,cAAc,SAAS,IACjD,oBAAoB,UAAU,eAAe,UAAU,qBAAqB,KAAA,CAAS,IACrF,CAAC;CACP,GAAG,CAAC,oBAAoB,SAAS,CAAC;CAElC,MAAM,YAAY,cAAc,KAAK,oBAAoB,YAAY,IAAI,GAAG;EAAC;EAAM;EAAY;CAAI,CAAC;CAEpG,MAAM,sBAAsB,mBAAmB,aAAa,oBAAoB,WAAW,yBAAyB;CAGpH,OAAO,UAAU,WAAW,GAAG;CAE/B,MAAM,QAAQ,KAAK,SAAS,OAAO,SAAS,OAAO,OAAO,SAAS;CAGnE,IAAI,iBAAgC,EAAE,UAAU,SAAS;CACzD,IAAI;CAEJ,IAAI,aAAa,OAAO,gBAAgB,OAAO,eAAe;EAC5D,MAAM,cAAc,OAAO,gBAAgB;EAC3C,MAAM,SAAS,KAAK,OAAO,WAAW,OAAO,cAAc,OAAO,eAAe,WAAW;EAE5F,IAAI,QAAQ;GACV,iBAAiB;IACf,UAAU;IACV,OAAO,OAAO;IACd,QAAQ,OAAO;GACjB;GACA,WAAW;IACT,OAAO,OAAO;IACd,QAAQ,OAAO;IACf,UAAU;IACV,WACE,OAAO,WAAW,OAAO,UAAU,cAAc,OAAO,QAAQ,OAAO,OAAO,QAAQ,OAAO,KAAA;GACjG;EACF;CACF;CAEA,OAAO,cACL,OACA;EAAE;EAAQ;EAAW;CAAM,GAC3B;EACE;EACA,cAAc;EACd,KAAK,CAAC,cAAc,MAAM;EAC1B,OAAO;GACL,KAAK,SAAS,KAAK;GACnB,EAAE,OAAO,eAAe;GACxB;GACA,EACE,UACE,oBAAC,OAAD;IACE,KAAK;IACL,KAAI;IACJ,eAAY;IACZ,UAAS;IACT,KAAK,WAAW;IAChB,aAAa;IACJ;IACT,OAAO;IAEQ;GAChB,CAAA,EAEL;EACF;CACF,CACF;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Title } from "./title.js";
2
+ export { Title };
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { usePlayer } from "../../player/context.js";
3
+ import { renderElement } from "../../utils/use-render.js";
4
+ import { selectMetadata } from "@videojs/core/dom";
5
+ import { forwardRef, useState } from "react";
6
+ import { TitleCore, TitleDataAttrs } from "@videojs/core";
7
+ //#region src/ui/title/title.tsx
8
+ /**
9
+ * Displays the resolved content title.
10
+ *
11
+ * The component owns its text content. Set the title through the player's
12
+ * `title` prop rather than by passing children.
13
+ *
14
+ * Renders nothing when no title resolves.
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * <Title />
19
+ *
20
+ * <Title className="title" />
21
+ * ```
22
+ */
23
+ const Title = forwardRef(function Title(componentProps, forwardedRef) {
24
+ const { render, className, style, ...elementProps } = componentProps;
25
+ const metadata = usePlayer(selectMetadata);
26
+ const [core] = useState(() => new TitleCore());
27
+ if (!metadata) return null;
28
+ const state = core.getState(metadata);
29
+ if (state.hidden) return null;
30
+ return renderElement("span", {
31
+ render,
32
+ className,
33
+ style
34
+ }, {
35
+ state,
36
+ stateAttrMap: TitleDataAttrs,
37
+ ref: [forwardedRef],
38
+ props: [{ children: state.title }, elementProps]
39
+ });
40
+ });
41
+ //#endregion
42
+ export { Title };
43
+
44
+ //# sourceMappingURL=title.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title.js","names":[],"sources":["../../../../src/ui/title/title.tsx"],"sourcesContent":["'use client';\n\nimport { TitleCore, TitleDataAttrs } from '@videojs/core';\nimport { logMissingFeature, selectMetadata } from '@videojs/core/dom';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef, useState } from 'react';\n\nimport { usePlayer } from '../../player/context';\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\n\nexport interface TitleProps extends Omit<UIComponentProps<'span', TitleCore.State>, 'children'> {}\n\n/**\n * Displays the resolved content title.\n *\n * The component owns its text content. Set the title through the player's\n * `title` prop rather than by passing children.\n *\n * Renders nothing when no title resolves.\n *\n * @example\n * ```tsx\n * <Title />\n *\n * <Title className=\"title\" />\n * ```\n */\nexport const Title = forwardRef(function Title(\n componentProps: TitleProps,\n forwardedRef: ForwardedRef<HTMLSpanElement>\n) {\n const { render, className, style, ...elementProps } = componentProps;\n\n const metadata = usePlayer(selectMetadata);\n\n const [core] = useState(() => new TitleCore());\n\n if (!metadata) {\n if (__DEV__) logMissingFeature('Title', 'metadata');\n return null;\n }\n\n const state = core.getState(metadata);\n\n if (state.hidden) return null;\n\n return renderElement(\n 'span',\n { render, className, style },\n {\n state,\n stateAttrMap: TitleDataAttrs,\n ref: [forwardedRef],\n props: [{ children: state.title }, elementProps],\n }\n );\n});\n\nexport namespace Title {\n export type Props = TitleProps;\n export type State = TitleCore.State;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAa,QAAQ,WAAW,SAAS,MACvC,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,GAAG,iBAAiB;CAEtD,MAAM,WAAW,UAAU,cAAc;CAEzC,MAAM,CAAC,QAAQ,eAAe,IAAI,UAAU,CAAC;CAE7C,IAAI,CAAC,UAEH,OAAO;CAGT,MAAM,QAAQ,KAAK,SAAS,QAAQ;CAEpC,IAAI,MAAM,QAAQ,OAAO;CAEzB,OAAO,cACL,QACA;EAAE;EAAQ;EAAW;CAAM,GAC3B;EACE;EACA,cAAc;EACd,KAAK,CAAC,YAAY;EAClB,OAAO,CAAC,EAAE,UAAU,MAAM,MAAM,GAAG,YAAY;CACjD,CACF;AACF,CAAC"}
@@ -82,6 +82,7 @@ import { TimeSliderChapterTitleProps, TimeSliderChapterTitleState } from "./ui/t
82
82
  import { TimeSliderChapterState, TimeSliderChaptersProps, TimeSliderChaptersState } from "./ui/time-slider/time-slider-chapters/time-slider-chapters.js";
83
83
  import { index_parts_d_exports as index_parts_d_exports$9 } from "./ui/time-slider/index.parts.js";
84
84
  import "./ui/time-slider/index.js";
85
+ import { Title, TitleProps } from "./ui/title/title.js";
85
86
  import { TooltipContent, TooltipContextValue, useTooltipContext } from "./ui/tooltip/context.js";
86
87
  import { index_parts_d_exports as index_parts_d_exports$10 } from "./ui/tooltip/index.parts.js";
87
88
  import "./ui/tooltip/index.js";
@@ -107,10 +108,10 @@ import { IndicatorStatus, InputAction, InputIndicatorLabels } from "@videojs/cor
107
108
  export * from "@videojs/core/dom";
108
109
  export * from "@videojs/media/dom";
109
110
  declare namespace index_d_exports {
110
- export { AirPlayButton, AirPlayButtonProps, index_parts_d_exports as AlertDialog, AlertDialogContextValue, AudioTrackOption, AudioTrackOptionsProps, AudioTrackOptionsResult, AudioTrackRadioGroup, AudioTrackRadioGroupItemProps, AudioTrackRadioGroupItemState, AudioTrackRadioGroupProps, BufferingIndicator, BufferingIndicatorProps, CaptionsButton, CaptionsButtonProps, CaptionsOption, CaptionsOptionsProps, CaptionsOptionsResult, CaptionsRadioGroup, CaptionsRadioGroupItemProps, CaptionsRadioGroupItemState, CaptionsRadioGroupProps, CastButton, CastButtonProps, Comparator, Container, ContainerProps, index_parts_d_exports$1 as Controls, ControlsGroupProps, ControlsRootProps, CreateI18nOptions, CreateI18nResult, CreatePlayerConfig, CreatePlayerResult, index_parts_d_exports$2 as ErrorDialog, ErrorDialogContextValue, FlatTranslations, FullscreenButton, FullscreenButtonProps, Gesture, GestureProps, HTMLProps, Hotkey, HotkeyProps, I18nContext, I18nContextValue, I18nProvider, I18nProviderProps, IndicatorStatus, InputAction, InputIndicatorLabels, LiveButton, LiveButtonProps, Locale, MediaGesture, MediaGestureProps, MediaHotkey, MediaHotkeyProps, index_parts_d_exports$3 as Menu, MenuContextValue, MuteButton, MuteButtonProps, NodeListLike, PiPButton, PiPButtonProps, PlayButton, PlayButtonProps, PlaybackRateButton, PlaybackRateButtonProps, PlaybackRateOption, PlaybackRateOptionsProps, PlaybackRateOptionsResult, PlaybackRateRadioGroup, PlaybackRateRadioGroupItemProps, PlaybackRateRadioGroupItemState, PlaybackRateRadioGroupProps, PlayerContextValue, PlayerProps, index_parts_d_exports$4 as Popover, PopoverContextValue, Poster, PosterProps, QualityOption, QualityOptionsProps, QualityOptionsResult, QualityRadioGroup, QualityRadioGroupItemProps, QualityRadioGroupItemState, QualityRadioGroupProps, RenderFunction, RenderProp, SeekButton, SeekButtonProps, index_parts_d_exports$5 as SeekIndicator, SeekIndicatorRootProps, SeekIndicatorValueProps, Selector, index_parts_d_exports$6 as Slider, SliderBufferProps, SliderFillProps, SliderRootProps, SliderThumbProps, SliderThumbnailProps, SliderTrackProps, SliderValueProps, StatusAnnouncer, StatusAnnouncerProps, index_parts_d_exports$7 as StatusIndicator, StatusIndicatorRootProps, StatusIndicatorValueProps, Text, TextProps, Thumbnail, ThumbnailProps, index_parts_d_exports$8 as Time, index_parts_d_exports$9 as TimeSlider, TimeSliderChapterState, TimeSliderChapterTitleProps, TimeSliderChapterTitleState, TimeSliderChaptersProps, TimeSliderChaptersState, index_parts_d_exports$10 as Tooltip, TooltipContent, TooltipContextValue, TranslationParams, Translations, Translator, UIComponentProps, UseDoubleTapGestureOptions, UseHotkeyOptions, UseTapGestureOptions, index_parts_d_exports$11 as VolumeIndicator, VolumeIndicatorFillProps, VolumeIndicatorRootProps, VolumeIndicatorValueProps, index_parts_d_exports$12 as VolumeSlider, composeRefs, createI18n, createPlayer, createSelector, createTranslator, findLocaleKeys, getI18nTranslations, hasMetadata, hasRegisteredLocale, isMediaAudioTrackCapable, isMediaBufferCapable, isMediaErrorCapable, isMediaLiveCapable, isMediaPauseCapable, isMediaPlaybackRateCapable, isMediaRemotePlaybackCapable, isMediaSeekCapable, isMediaSourceCapable, isMediaStreamTypeCapable, isMediaTextTrackCapable, isMediaVideoDimensionsCapable, isMediaVideoRenditionCapable, isMediaVolumeCapable, isQuerySelectorAllCapable, mergeProps, onI18nRegistryChange, registerI18n, renderElement, shallowEqual, useAlertDialogContext, useAttachMedia, useAudioTrackOptions, useButton, useCaptionsOptions, useComposedRefs, useContainer, useContainerAttach, useDestroy, useDoubleTapGesture, useErrorDialogContext, useHotkey, useHotkeyShortcut, useLatestRef, useLocale, useMedia, useMediaAttach, useMediaComponent, useMediaInstance, useMenuContext, useOptionalContainer, useOptionalMenuContext, useOptionalPlayer, usePlaybackRateOptions, usePlayer, usePlayerContext, usePopoverContext, useQualityOptions, useSelector, useSlider, useStore, useTapGesture, useTooltipContext, useTranslator };
111
+ export { AirPlayButton, AirPlayButtonProps, index_parts_d_exports as AlertDialog, AlertDialogContextValue, AudioTrackOption, AudioTrackOptionsProps, AudioTrackOptionsResult, AudioTrackRadioGroup, AudioTrackRadioGroupItemProps, AudioTrackRadioGroupItemState, AudioTrackRadioGroupProps, BufferingIndicator, BufferingIndicatorProps, CaptionsButton, CaptionsButtonProps, CaptionsOption, CaptionsOptionsProps, CaptionsOptionsResult, CaptionsRadioGroup, CaptionsRadioGroupItemProps, CaptionsRadioGroupItemState, CaptionsRadioGroupProps, CastButton, CastButtonProps, Comparator, Container, ContainerProps, index_parts_d_exports$1 as Controls, ControlsGroupProps, ControlsRootProps, CreateI18nOptions, CreateI18nResult, CreatePlayerConfig, CreatePlayerResult, index_parts_d_exports$2 as ErrorDialog, ErrorDialogContextValue, FlatTranslations, FullscreenButton, FullscreenButtonProps, Gesture, GestureProps, HTMLProps, Hotkey, HotkeyProps, I18nContext, I18nContextValue, I18nProvider, I18nProviderProps, IndicatorStatus, InputAction, InputIndicatorLabels, LiveButton, LiveButtonProps, Locale, MediaGesture, MediaGestureProps, MediaHotkey, MediaHotkeyProps, index_parts_d_exports$3 as Menu, MenuContextValue, MuteButton, MuteButtonProps, NodeListLike, PiPButton, PiPButtonProps, PlayButton, PlayButtonProps, PlaybackRateButton, PlaybackRateButtonProps, PlaybackRateOption, PlaybackRateOptionsProps, PlaybackRateOptionsResult, PlaybackRateRadioGroup, PlaybackRateRadioGroupItemProps, PlaybackRateRadioGroupItemState, PlaybackRateRadioGroupProps, PlayerContextValue, PlayerProps, index_parts_d_exports$4 as Popover, PopoverContextValue, Poster, PosterProps, QualityOption, QualityOptionsProps, QualityOptionsResult, QualityRadioGroup, QualityRadioGroupItemProps, QualityRadioGroupItemState, QualityRadioGroupProps, RenderFunction, RenderProp, SeekButton, SeekButtonProps, index_parts_d_exports$5 as SeekIndicator, SeekIndicatorRootProps, SeekIndicatorValueProps, Selector, index_parts_d_exports$6 as Slider, SliderBufferProps, SliderFillProps, SliderRootProps, SliderThumbProps, SliderThumbnailProps, SliderTrackProps, SliderValueProps, StatusAnnouncer, StatusAnnouncerProps, index_parts_d_exports$7 as StatusIndicator, StatusIndicatorRootProps, StatusIndicatorValueProps, Text, TextProps, Thumbnail, ThumbnailProps, index_parts_d_exports$8 as Time, index_parts_d_exports$9 as TimeSlider, TimeSliderChapterState, TimeSliderChapterTitleProps, TimeSliderChapterTitleState, TimeSliderChaptersProps, TimeSliderChaptersState, Title, TitleProps, index_parts_d_exports$10 as Tooltip, TooltipContent, TooltipContextValue, TranslationParams, Translations, Translator, UIComponentProps, UseDoubleTapGestureOptions, UseHotkeyOptions, UseTapGestureOptions, index_parts_d_exports$11 as VolumeIndicator, VolumeIndicatorFillProps, VolumeIndicatorRootProps, VolumeIndicatorValueProps, index_parts_d_exports$12 as VolumeSlider, composeRefs, createI18n, createPlayer, createSelector, createTranslator, findLocaleKeys, getI18nTranslations, hasMetadata, hasRegisteredLocale, isMediaAudioTrackCapable, isMediaBufferCapable, isMediaErrorCapable, isMediaLiveCapable, isMediaPauseCapable, isMediaPlaybackRateCapable, isMediaRemotePlaybackCapable, isMediaSeekCapable, isMediaSourceCapable, isMediaStreamTypeCapable, isMediaTextTrackCapable, isMediaVideoDimensionsCapable, isMediaVideoRenditionCapable, isMediaVolumeCapable, isQuerySelectorAllCapable, mergeProps, onI18nRegistryChange, registerI18n, renderElement, shallowEqual, useAlertDialogContext, useAttachMedia, useAudioTrackOptions, useButton, useCaptionsOptions, useComposedRefs, useContainer, useContainerAttach, useDestroy, useDoubleTapGesture, useErrorDialogContext, useHotkey, useHotkeyShortcut, useLatestRef, useLocale, useMedia, useMediaAttach, useMediaComponent, useMediaInstance, useMenuContext, useOptionalContainer, useOptionalMenuContext, useOptionalPlayer, usePlaybackRateOptions, usePlayer, usePlayerContext, usePopoverContext, useQualityOptions, useSelector, useSlider, useStore, useTapGesture, useTooltipContext, useTranslator };
111
112
  }
112
113
  import * as import__videojs_core_dom from "@videojs/core/dom";
113
114
  import * as import__videojs_media_dom from "@videojs/media/dom";
114
115
  //#endregion
115
- export { AirPlayButton, type AirPlayButtonProps, index_parts_d_exports as AlertDialog, type AlertDialogContextValue, type AudioTrackOption, type AudioTrackOptionsProps, type AudioTrackOptionsResult, AudioTrackRadioGroup, type AudioTrackRadioGroupItemProps, type AudioTrackRadioGroupItemState, type AudioTrackRadioGroupProps, BufferingIndicator, type BufferingIndicatorProps, CaptionsButton, type CaptionsButtonProps, type CaptionsOption, type CaptionsOptionsProps, type CaptionsOptionsResult, CaptionsRadioGroup, type CaptionsRadioGroupItemProps, type CaptionsRadioGroupItemState, type CaptionsRadioGroupProps, CastButton, type CastButtonProps, type Comparator, Container, type ContainerProps, index_parts_d_exports$1 as Controls, type ControlsGroupProps, type ControlsRootProps, type CreateI18nOptions, type CreateI18nResult, type CreatePlayerConfig, type CreatePlayerResult, index_parts_d_exports$2 as ErrorDialog, type ErrorDialogContextValue, type FlatTranslations, FullscreenButton, type FullscreenButtonProps, Gesture, type GestureProps, type HTMLProps, Hotkey, type HotkeyProps, I18nContext, type I18nContextValue, I18nProvider, type I18nProviderProps, type IndicatorStatus, type InputAction, type InputIndicatorLabels, LiveButton, type LiveButtonProps, type Locale, MediaGesture, type MediaGestureProps, MediaHotkey, type MediaHotkeyProps, index_parts_d_exports$3 as Menu, type MenuContextValue, MuteButton, type MuteButtonProps, type NodeListLike, PiPButton, type PiPButtonProps, PlayButton, type PlayButtonProps, PlaybackRateButton, type PlaybackRateButtonProps, type PlaybackRateOption, type PlaybackRateOptionsProps, type PlaybackRateOptionsResult, PlaybackRateRadioGroup, type PlaybackRateRadioGroupItemProps, type PlaybackRateRadioGroupItemState, type PlaybackRateRadioGroupProps, type PlayerContextValue, type PlayerProps, index_parts_d_exports$4 as Popover, type PopoverContextValue, Poster, type PosterProps, type QualityOption, type QualityOptionsProps, type QualityOptionsResult, QualityRadioGroup, type QualityRadioGroupItemProps, type QualityRadioGroupItemState, type QualityRadioGroupProps, type RenderFunction, type RenderProp, SeekButton, type SeekButtonProps, index_parts_d_exports$5 as SeekIndicator, type SeekIndicatorRootProps, type SeekIndicatorValueProps, type Selector, index_parts_d_exports$6 as Slider, type SliderBufferProps, type SliderFillProps, type SliderRootProps, type SliderThumbProps, type SliderThumbnailProps, type SliderTrackProps, type SliderValueProps, StatusAnnouncer, type StatusAnnouncerProps, index_parts_d_exports$7 as StatusIndicator, type StatusIndicatorRootProps, type StatusIndicatorValueProps, Text, type TextProps, Thumbnail, type ThumbnailProps, index_parts_d_exports$8 as Time, index_parts_d_exports$9 as TimeSlider, type TimeSliderChapterState, type TimeSliderChapterTitleProps, type TimeSliderChapterTitleState, type TimeSliderChaptersProps, type TimeSliderChaptersState, index_parts_d_exports$10 as Tooltip, type TooltipContent, type TooltipContextValue, type TranslationParams, type Translations, type Translator, type UIComponentProps, type UseDoubleTapGestureOptions, type UseHotkeyOptions, type UseTapGestureOptions, index_parts_d_exports$11 as VolumeIndicator, type VolumeIndicatorFillProps, type VolumeIndicatorRootProps, type VolumeIndicatorValueProps, index_parts_d_exports$12 as VolumeSlider, composeRefs, createI18n, createPlayer, createSelector, createTranslator, findLocaleKeys, getI18nTranslations, hasMetadata, hasRegisteredLocale, index_d_exports, isMediaAudioTrackCapable, isMediaBufferCapable, isMediaErrorCapable, isMediaLiveCapable, isMediaPauseCapable, isMediaPlaybackRateCapable, isMediaRemotePlaybackCapable, isMediaSeekCapable, isMediaSourceCapable, isMediaStreamTypeCapable, isMediaTextTrackCapable, isMediaVideoDimensionsCapable, isMediaVideoRenditionCapable, isMediaVolumeCapable, isQuerySelectorAllCapable, mergeProps, onI18nRegistryChange, registerI18n, renderElement, shallowEqual, useAlertDialogContext, useAttachMedia, useAudioTrackOptions, useButton, useCaptionsOptions, useComposedRefs, useContainer, useContainerAttach, useDestroy, useDoubleTapGesture, useErrorDialogContext, useHotkey, useHotkeyShortcut, useLatestRef, useLocale, useMedia, useMediaAttach, useMediaComponent, useMediaInstance, useMenuContext, useOptionalContainer, useOptionalMenuContext, useOptionalPlayer, usePlaybackRateOptions, usePlayer, usePlayerContext, usePopoverContext, useQualityOptions, useSelector, useSlider, useStore, useTapGesture, useTooltipContext, useTranslator };
116
+ export { AirPlayButton, type AirPlayButtonProps, index_parts_d_exports as AlertDialog, type AlertDialogContextValue, type AudioTrackOption, type AudioTrackOptionsProps, type AudioTrackOptionsResult, AudioTrackRadioGroup, type AudioTrackRadioGroupItemProps, type AudioTrackRadioGroupItemState, type AudioTrackRadioGroupProps, BufferingIndicator, type BufferingIndicatorProps, CaptionsButton, type CaptionsButtonProps, type CaptionsOption, type CaptionsOptionsProps, type CaptionsOptionsResult, CaptionsRadioGroup, type CaptionsRadioGroupItemProps, type CaptionsRadioGroupItemState, type CaptionsRadioGroupProps, CastButton, type CastButtonProps, type Comparator, Container, type ContainerProps, index_parts_d_exports$1 as Controls, type ControlsGroupProps, type ControlsRootProps, type CreateI18nOptions, type CreateI18nResult, type CreatePlayerConfig, type CreatePlayerResult, index_parts_d_exports$2 as ErrorDialog, type ErrorDialogContextValue, type FlatTranslations, FullscreenButton, type FullscreenButtonProps, Gesture, type GestureProps, type HTMLProps, Hotkey, type HotkeyProps, I18nContext, type I18nContextValue, I18nProvider, type I18nProviderProps, type IndicatorStatus, type InputAction, type InputIndicatorLabels, LiveButton, type LiveButtonProps, type Locale, MediaGesture, type MediaGestureProps, MediaHotkey, type MediaHotkeyProps, index_parts_d_exports$3 as Menu, type MenuContextValue, MuteButton, type MuteButtonProps, type NodeListLike, PiPButton, type PiPButtonProps, PlayButton, type PlayButtonProps, PlaybackRateButton, type PlaybackRateButtonProps, type PlaybackRateOption, type PlaybackRateOptionsProps, type PlaybackRateOptionsResult, PlaybackRateRadioGroup, type PlaybackRateRadioGroupItemProps, type PlaybackRateRadioGroupItemState, type PlaybackRateRadioGroupProps, type PlayerContextValue, type PlayerProps, index_parts_d_exports$4 as Popover, type PopoverContextValue, Poster, type PosterProps, type QualityOption, type QualityOptionsProps, type QualityOptionsResult, QualityRadioGroup, type QualityRadioGroupItemProps, type QualityRadioGroupItemState, type QualityRadioGroupProps, type RenderFunction, type RenderProp, SeekButton, type SeekButtonProps, index_parts_d_exports$5 as SeekIndicator, type SeekIndicatorRootProps, type SeekIndicatorValueProps, type Selector, index_parts_d_exports$6 as Slider, type SliderBufferProps, type SliderFillProps, type SliderRootProps, type SliderThumbProps, type SliderThumbnailProps, type SliderTrackProps, type SliderValueProps, StatusAnnouncer, type StatusAnnouncerProps, index_parts_d_exports$7 as StatusIndicator, type StatusIndicatorRootProps, type StatusIndicatorValueProps, Text, type TextProps, Thumbnail, type ThumbnailProps, index_parts_d_exports$8 as Time, index_parts_d_exports$9 as TimeSlider, type TimeSliderChapterState, type TimeSliderChapterTitleProps, type TimeSliderChapterTitleState, type TimeSliderChaptersProps, type TimeSliderChaptersState, Title, type TitleProps, index_parts_d_exports$10 as Tooltip, type TooltipContent, type TooltipContextValue, type TranslationParams, type Translations, type Translator, type UIComponentProps, type UseDoubleTapGestureOptions, type UseHotkeyOptions, type UseTapGestureOptions, index_parts_d_exports$11 as VolumeIndicator, type VolumeIndicatorFillProps, type VolumeIndicatorRootProps, type VolumeIndicatorValueProps, index_parts_d_exports$12 as VolumeSlider, composeRefs, createI18n, createPlayer, createSelector, createTranslator, findLocaleKeys, getI18nTranslations, hasMetadata, hasRegisteredLocale, index_d_exports, isMediaAudioTrackCapable, isMediaBufferCapable, isMediaErrorCapable, isMediaLiveCapable, isMediaPauseCapable, isMediaPlaybackRateCapable, isMediaRemotePlaybackCapable, isMediaSeekCapable, isMediaSourceCapable, isMediaStreamTypeCapable, isMediaTextTrackCapable, isMediaVideoDimensionsCapable, isMediaVideoRenditionCapable, isMediaVolumeCapable, isQuerySelectorAllCapable, mergeProps, onI18nRegistryChange, registerI18n, renderElement, shallowEqual, useAlertDialogContext, useAttachMedia, useAudioTrackOptions, useButton, useCaptionsOptions, useComposedRefs, useContainer, useContainerAttach, useDestroy, useDoubleTapGesture, useErrorDialogContext, useHotkey, useHotkeyShortcut, useLatestRef, useLocale, useMedia, useMediaAttach, useMediaComponent, useMediaInstance, useMenuContext, useOptionalContainer, useOptionalMenuContext, useOptionalPlayer, usePlaybackRateOptions, usePlayer, usePlayerContext, usePopoverContext, useQualityOptions, useSelector, useSlider, useStore, useTapGesture, useTooltipContext, useTranslator };
116
117
  //# sourceMappingURL=index.d.ts.map
package/dist/dev/index.js CHANGED
@@ -56,6 +56,7 @@ import { StatusAnnouncer } from "./ui/status-announcer/status-announcer.js";
56
56
  import { index_parts_exports as index_parts_exports$7 } from "./ui/status-indicator/index.parts.js";
57
57
  import { index_parts_exports as index_parts_exports$8 } from "./ui/time/index.parts.js";
58
58
  import { index_parts_exports as index_parts_exports$9 } from "./ui/time-slider/index.parts.js";
59
+ import { Title } from "./ui/title/title.js";
59
60
  import { index_parts_exports as index_parts_exports$10 } from "./ui/tooltip/index.parts.js";
60
61
  import { index_parts_exports as index_parts_exports$11 } from "./ui/volume-indicator/index.parts.js";
61
62
  import { index_parts_exports as index_parts_exports$12 } from "./ui/volume-slider/index.parts.js";
@@ -67,4 +68,4 @@ import { createSelector, shallowEqual } from "@videojs/store";
67
68
  import { useSelector, useStore } from "@videojs/store/react";
68
69
  export * from "@videojs/core/dom";
69
70
  export * from "@videojs/media/dom";
70
- export { AirPlayButton, index_parts_exports as AlertDialog, AudioTrackRadioGroup, BufferingIndicator, CaptionsButton, CaptionsRadioGroup, CastButton, Container, index_parts_exports$1 as Controls, index_parts_exports$2 as ErrorDialog, FullscreenButton, Gesture, Hotkey, I18nContext, I18nProvider, LiveButton, MediaGesture, MediaHotkey, index_parts_exports$3 as Menu, MuteButton, PiPButton, PlayButton, PlaybackRateButton, PlaybackRateRadioGroup, index_parts_exports$4 as Popover, Poster, QualityRadioGroup, SeekButton, index_parts_exports$5 as SeekIndicator, index_parts_exports$6 as Slider, StatusAnnouncer, index_parts_exports$7 as StatusIndicator, Text, Thumbnail, index_parts_exports$8 as Time, index_parts_exports$9 as TimeSlider, index_parts_exports$10 as Tooltip, index_parts_exports$11 as VolumeIndicator, index_parts_exports$12 as VolumeSlider, composeRefs, createI18n, createPlayer, createSelector, createTranslator, findLocaleKeys, getI18nTranslations, hasMetadata, hasRegisteredLocale, isMediaAudioTrackCapable, isMediaBufferCapable, isMediaErrorCapable, isMediaLiveCapable, isMediaPauseCapable, isMediaPlaybackRateCapable, isMediaRemotePlaybackCapable, isMediaSeekCapable, isMediaSourceCapable, isMediaStreamTypeCapable, isMediaTextTrackCapable, isMediaVideoDimensionsCapable, isMediaVideoRenditionCapable, isMediaVolumeCapable, isQuerySelectorAllCapable, mergeProps, onI18nRegistryChange, registerI18n, renderElement, shallowEqual, useAlertDialogContext, useAttachMedia, useAudioTrackOptions, useButton, useCaptionsOptions, useComposedRefs, useContainer, useContainerAttach, useDestroy, useDoubleTapGesture, useErrorDialogContext, useHotkey, useHotkeyShortcut, useLatestRef, useLocale, useMedia, useMediaAttach, useMediaComponent, useMediaInstance, useMenuContext, useOptionalContainer, useOptionalMenuContext, useOptionalPlayer, usePlaybackRateOptions, usePlayer, usePlayerContext, usePopoverContext, useQualityOptions, useSelector, useSlider, useStore, useTapGesture, useTooltipContext, useTranslator };
71
+ export { AirPlayButton, index_parts_exports as AlertDialog, AudioTrackRadioGroup, BufferingIndicator, CaptionsButton, CaptionsRadioGroup, CastButton, Container, index_parts_exports$1 as Controls, index_parts_exports$2 as ErrorDialog, FullscreenButton, Gesture, Hotkey, I18nContext, I18nProvider, LiveButton, MediaGesture, MediaHotkey, index_parts_exports$3 as Menu, MuteButton, PiPButton, PlayButton, PlaybackRateButton, PlaybackRateRadioGroup, index_parts_exports$4 as Popover, Poster, QualityRadioGroup, SeekButton, index_parts_exports$5 as SeekIndicator, index_parts_exports$6 as Slider, StatusAnnouncer, index_parts_exports$7 as StatusIndicator, Text, Thumbnail, index_parts_exports$8 as Time, index_parts_exports$9 as TimeSlider, Title, index_parts_exports$10 as Tooltip, index_parts_exports$11 as VolumeIndicator, index_parts_exports$12 as VolumeSlider, composeRefs, createI18n, createPlayer, createSelector, createTranslator, findLocaleKeys, getI18nTranslations, hasMetadata, hasRegisteredLocale, isMediaAudioTrackCapable, isMediaBufferCapable, isMediaErrorCapable, isMediaLiveCapable, isMediaPauseCapable, isMediaPlaybackRateCapable, isMediaRemotePlaybackCapable, isMediaSeekCapable, isMediaSourceCapable, isMediaStreamTypeCapable, isMediaTextTrackCapable, isMediaVideoDimensionsCapable, isMediaVideoRenditionCapable, isMediaVolumeCapable, isQuerySelectorAllCapable, mergeProps, onI18nRegistryChange, registerI18n, renderElement, shallowEqual, useAlertDialogContext, useAttachMedia, useAudioTrackOptions, useButton, useCaptionsOptions, useComposedRefs, useContainer, useContainerAttach, useDestroy, useDoubleTapGesture, useErrorDialogContext, useHotkey, useHotkeyShortcut, useLatestRef, useLocale, useMedia, useMediaAttach, useMediaComponent, useMediaInstance, useMenuContext, useOptionalContainer, useOptionalMenuContext, useOptionalPlayer, usePlaybackRateOptions, usePlayer, usePlayerContext, usePopoverContext, useQualityOptions, useSelector, useSlider, useStore, useTapGesture, useTooltipContext, useTranslator };
@@ -0,0 +1,2 @@
1
+ import { ShakaVideo, ShakaVideoProps } from "./media.js";
2
+ export { ShakaVideo, ShakaVideoProps };
@@ -0,0 +1,2 @@
1
+ import { ShakaVideo } from "./media.js";
2
+ export { ShakaVideo };
@@ -0,0 +1,13 @@
1
+ import { ReactNode, VideoHTMLAttributes } from "react";
2
+ import { ShakaMediaProps } from "@videojs/media/dom/shaka";
3
+ //#region src/media/shaka-video/media.d.ts
4
+ interface ShakaVideoProps extends Omit<VideoHTMLAttributes<HTMLVideoElement>, keyof ShakaMediaProps>, Partial<ShakaMediaProps> {
5
+ children?: ReactNode;
6
+ }
7
+ declare const ShakaVideo: import("react").ForwardRefExoticComponent<ShakaVideoProps & import("react").RefAttributes<HTMLVideoElement>>;
8
+ declare namespace ShakaVideo {
9
+ type Props = ShakaVideoProps;
10
+ }
11
+ //#endregion
12
+ export { ShakaVideo, ShakaVideoProps };
13
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","names":[],"sources":["../../../../src/media/shaka-video/media.tsx"],"mappings":";;;UAWiB,wBACP,KAAK,oBAAoB,yBAAyB,kBACxD,QAAQ;EACV,WAAW;;cAGA,4BAAU,0BAAA,kCAAA,cAAA;kBAgBN;OACH,QAAQ"}
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { useComposedRefs } from "../../utils/use-composed-refs.js";
3
+ import { useAttachMedia } from "../../utils/use-attach-media.js";
4
+ import { useMediaInstance } from "../../utils/use-media-instance.js";
5
+ import { useSyncProps } from "../../utils/use-sync-props.js";
6
+ import { forwardRef } from "react";
7
+ import { jsx } from "react/jsx-runtime";
8
+ import { ShakaMedia, shakaMediaDefaultProps } from "@videojs/media/dom/shaka";
9
+ //#region src/media/shaka-video/media.tsx
10
+ const ShakaVideo = forwardRef(function ShakaVideo({ children, ...props }, ref) {
11
+ const media = useMediaInstance(ShakaMedia);
12
+ return /* @__PURE__ */ jsx("video", {
13
+ ref: useComposedRefs(useAttachMedia(media), ref),
14
+ ...useSyncProps(media, props, shakaMediaDefaultProps),
15
+ children
16
+ });
17
+ });
18
+ //#endregion
19
+ export { ShakaVideo };
20
+
21
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","names":[],"sources":["../../../../src/media/shaka-video/media.tsx"],"sourcesContent":["'use client';\n\nimport type { ShakaMediaProps } from '@videojs/media/dom/shaka';\nimport { ShakaMedia, shakaMediaDefaultProps } from '@videojs/media/dom/shaka';\nimport type { ReactNode, VideoHTMLAttributes } from 'react';\nimport { forwardRef } from 'react';\nimport { useAttachMedia } from '../../utils/use-attach-media';\nimport { useComposedRefs } from '../../utils/use-composed-refs';\nimport { useMediaInstance } from '../../utils/use-media-instance';\nimport { useSyncProps } from '../../utils/use-sync-props';\n\nexport interface ShakaVideoProps\n extends Omit<VideoHTMLAttributes<HTMLVideoElement>, keyof ShakaMediaProps>,\n Partial<ShakaMediaProps> {\n children?: ReactNode;\n}\n\nexport const ShakaVideo = forwardRef<HTMLVideoElement, ShakaVideoProps>(function ShakaVideo(\n { children, ...props },\n ref\n) {\n const media = useMediaInstance(ShakaMedia);\n const attachRef = useAttachMedia(media);\n const composedRef = useComposedRefs(attachRef, ref);\n const htmlProps = useSyncProps(media, props, shakaMediaDefaultProps);\n\n return (\n <video ref={composedRef} {...htmlProps}>\n {children}\n </video>\n );\n});\n\nexport namespace ShakaVideo {\n export type Props = ShakaVideoProps;\n}\n"],"mappings":";;;;;;;;;AAiBA,MAAa,aAAa,WAA8C,SAAS,WAC/E,EAAE,UAAU,GAAG,SACf,KACA;CACA,MAAM,QAAQ,iBAAiB,UAAU;CAKzC,OACE,oBAAC,SAAD;EAAO,KAJW,gBADF,eAAe,KACW,GAAG,GAIvB;EAAG,GAHT,aAAa,OAAO,OAAO,sBAGN;EAClC;CACI,CAAA;AAEX,CAAC"}
@@ -408,7 +408,7 @@
408
408
  @media (prefers-reduced-motion: reduce) {
409
409
  .media-minimal-skin .media-button {
410
410
  scale: 1;
411
- transition-property: background-color, outline-offset;
411
+ transition-property: background-color;
412
412
  will-change: auto;
413
413
  }
414
414
  }
@@ -979,7 +979,6 @@
979
979
  transition-timing-function: ease-out;
980
980
  transition-duration: var(--menu-transition-duration);
981
981
  transition-property: translate, filter;
982
- will-change: translate, filter;
983
982
 
984
983
  &:where([data-starting-style], [data-ending-style]) {
985
984
  overflow: hidden;
@@ -1158,7 +1157,6 @@
1158
1157
  transition:
1159
1158
  translate var(--menu-transition-duration) ease-out,
1160
1159
  filter var(--menu-transition-duration) ease-out;
1161
- will-change: translate, filter;
1162
1160
  }
1163
1161
 
1164
1162
  &[data-submenu-expanded="true"] > :not([data-submenu]) {
@@ -399,7 +399,7 @@
399
399
  @media (prefers-reduced-motion: reduce) {
400
400
  .media-default-skin .media-button {
401
401
  scale: 1;
402
- transition-property: background-color, color, outline-offset;
402
+ transition-property: background-color, color;
403
403
  will-change: auto;
404
404
  }
405
405
  }
@@ -971,7 +971,6 @@
971
971
  transition-timing-function: ease-out;
972
972
  transition-duration: var(--menu-transition-duration);
973
973
  transition-property: translate, filter;
974
- will-change: translate, filter;
975
974
 
976
975
  &:where([data-starting-style], [data-ending-style]) {
977
976
  overflow: hidden;
@@ -1155,7 +1154,6 @@
1155
1154
  transition:
1156
1155
  translate var(--menu-transition-duration) ease-out,
1157
1156
  filter var(--menu-transition-duration) ease-out;
1158
- will-change: translate, filter;
1159
1157
  }
1160
1158
 
1161
1159
  &[data-submenu-expanded="true"] > :not([data-submenu]) {
@@ -408,7 +408,7 @@
408
408
  @media (prefers-reduced-motion: reduce) {
409
409
  .media-minimal-skin .media-button {
410
410
  scale: 1;
411
- transition-property: background-color, outline-offset;
411
+ transition-property: background-color;
412
412
  will-change: auto;
413
413
  }
414
414
  }
@@ -979,7 +979,6 @@
979
979
  transition-timing-function: ease-out;
980
980
  transition-duration: var(--menu-transition-duration);
981
981
  transition-property: translate, filter;
982
- will-change: translate, filter;
983
982
 
984
983
  &:where([data-starting-style], [data-ending-style]) {
985
984
  overflow: hidden;
@@ -1158,7 +1157,6 @@
1158
1157
  transition:
1159
1158
  translate var(--menu-transition-duration) ease-out,
1160
1159
  filter var(--menu-transition-duration) ease-out;
1161
- will-change: translate, filter;
1162
1160
  }
1163
1161
 
1164
1162
  &[data-submenu-expanded="true"] > :not([data-submenu]) {
@@ -399,7 +399,7 @@
399
399
  @media (prefers-reduced-motion: reduce) {
400
400
  .media-default-skin .media-button {
401
401
  scale: 1;
402
- transition-property: background-color, color, outline-offset;
402
+ transition-property: background-color, color;
403
403
  will-change: auto;
404
404
  }
405
405
  }
@@ -971,7 +971,6 @@
971
971
  transition-timing-function: ease-out;
972
972
  transition-duration: var(--menu-transition-duration);
973
973
  transition-property: translate, filter;
974
- will-change: translate, filter;
975
974
 
976
975
  &:where([data-starting-style], [data-ending-style]) {
977
976
  overflow: hidden;
@@ -1155,7 +1154,6 @@
1155
1154
  transition:
1156
1155
  translate var(--menu-transition-duration) ease-out,
1157
1156
  filter var(--menu-transition-duration) ease-out;
1158
- will-change: translate, filter;
1159
1157
  }
1160
1158
 
1161
1159
  &[data-submenu-expanded="true"] > :not([data-submenu]) {
@@ -466,7 +466,7 @@
466
466
  @media (prefers-reduced-motion: reduce) {
467
467
  .media-minimal-skin .media-button {
468
468
  scale: 1;
469
- transition-property: background-color, outline-offset;
469
+ transition-property: background-color;
470
470
  will-change: auto;
471
471
  }
472
472
  }
@@ -511,8 +511,7 @@
511
511
  transition: opacity 0.25s;
512
512
  }
513
513
  .media-minimal-skin media-poster:not([data-visible]),
514
- .media-minimal-skin > img:not([data-visible]),
515
- .media-minimal-skin > img[data-visible]:not([data-loaded]) {
514
+ .media-minimal-skin > img:not([data-visible]) {
516
515
  opacity: 0;
517
516
  }
518
517
  .media-minimal-skin media-poster ::slotted(img),
@@ -531,30 +530,6 @@
531
530
  border-radius: inherit;
532
531
  }
533
532
 
534
- /* Blurred placeholder: HTML path targets media-poster::before, React path targets the skin container::before */
535
- .media-minimal-skin media-poster::before,
536
- .media-minimal-skin::before {
537
- position: absolute;
538
- inset: 0;
539
- pointer-events: none;
540
- content: "";
541
- background-image: var(--media-poster-placeholder, none);
542
- background-repeat: no-repeat;
543
- background-position: var(--media-object-position, center);
544
- background-size: var(--media-object-fit, contain);
545
- filter: blur(var(--media-poster-placeholder-blur, 20px));
546
- }
547
-
548
- /* React path: hidden by default, transitions in while poster loads */
549
- .media-minimal-skin::before {
550
- opacity: 0;
551
- transition: opacity 0.25s;
552
- }
553
- /* Show placeholder while the poster is visible but not yet loaded */
554
- .media-minimal-skin:has(img[data-visible]:not([data-loaded]))::before {
555
- opacity: 1;
556
- }
557
-
558
533
  .media-minimal-skin:fullscreen media-poster ::slotted(img),
559
534
  .media-minimal-skin:fullscreen media-poster img,
560
535
  .media-minimal-skin:fullscreen > img {
@@ -1161,7 +1136,6 @@
1161
1136
  transition-timing-function: ease-out;
1162
1137
  transition-duration: var(--menu-transition-duration);
1163
1138
  transition-property: translate, filter;
1164
- will-change: translate, filter;
1165
1139
 
1166
1140
  &:where([data-starting-style], [data-ending-style]) {
1167
1141
  overflow: hidden;
@@ -1340,7 +1314,6 @@
1340
1314
  transition:
1341
1315
  translate var(--menu-transition-duration) ease-out,
1342
1316
  filter var(--menu-transition-duration) ease-out;
1343
- will-change: translate, filter;
1344
1317
  }
1345
1318
 
1346
1319
  &[data-submenu-expanded="true"] > :not([data-submenu]) {
@@ -1896,12 +1869,10 @@
1896
1869
 
1897
1870
  @media (pointer: fine) {
1898
1871
  transition-property: translate, filter, opacity;
1899
- will-change: translate, filter, opacity;
1900
1872
  }
1901
1873
 
1902
1874
  @media (pointer: coarse) {
1903
1875
  transition-property: translate, opacity;
1904
- will-change: translate, opacity;
1905
1876
  }
1906
1877
 
1907
1878
  &:not([data-visible]) {
@@ -170,14 +170,10 @@ function CaptionsTrigger() {
170
170
  });
171
171
  }
172
172
  function MinimalLiveVideoSkin(props) {
173
- const { children, className, renderPoster, placeholder, style, ...rest } = props;
174
- const containerStyle = placeholder ? {
175
- "--media-poster-placeholder": `url(${placeholder})`,
176
- ...style
177
- } : style;
173
+ const { children, className, renderPoster, style, ...rest } = props;
178
174
  return /* @__PURE__ */ jsxs(Container, {
179
175
  className: cn("media-minimal-skin media-minimal-skin--video", className),
180
- style: containerStyle,
176
+ style,
181
177
  ...rest,
182
178
  children: [
183
179
  children,