@hanifhan1f/vidstack-react 1.12.30 → 1.12.31

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 (61) hide show
  1. package/dev/chunks/vidstack-3rdEWplD.js +189 -0
  2. package/dev/chunks/vidstack-BRTBRJ_I.js +288 -0
  3. package/dev/chunks/vidstack-C56TjAKZ.js +61 -0
  4. package/dev/chunks/vidstack-C5tZAkKo.js +11694 -0
  5. package/dev/chunks/vidstack-CXjRKTos.js +401 -0
  6. package/dev/chunks/vidstack-C_xw7iZ2.js +34 -0
  7. package/dev/chunks/vidstack-CaaASbOf.js +476 -0
  8. package/dev/chunks/vidstack-D2Bi2Td9.js +1537 -0
  9. package/dev/chunks/vidstack-D95QIbAo.js +551 -0
  10. package/dev/chunks/vidstack-DnmOVAbr.js +643 -0
  11. package/dev/chunks/vidstack-Dnoefs4z.js +180 -0
  12. package/dev/chunks/vidstack-S_S6XDnL.js +375 -0
  13. package/dev/chunks/vidstack-oOGofWSl.js +668 -0
  14. package/dev/chunks/vidstack-vh0BKYWJ.js +84 -0
  15. package/dev/player/vidstack-default-components.js +8 -9
  16. package/dev/player/vidstack-default-icons.js +1 -1
  17. package/dev/player/vidstack-default-layout.js +8 -9
  18. package/dev/player/vidstack-plyr-layout.js +63 -77
  19. package/dev/player/vidstack-remotion.js +6 -6
  20. package/dev/vidstack.js +133 -22
  21. package/package.json +1 -1
  22. package/prod/chunks/vidstack-B0SSIHIv.js +1537 -0
  23. package/prod/chunks/vidstack-B3E9kXKq.js +34 -0
  24. package/prod/chunks/vidstack-BLWRqo3I.js +470 -0
  25. package/prod/chunks/vidstack-BXAOpsiW.js +61 -0
  26. package/prod/chunks/vidstack-BzPma_p3.js +288 -0
  27. package/prod/chunks/vidstack-C48MQkXV.js +11199 -0
  28. package/prod/chunks/vidstack-CKBLQMZi.js +159 -0
  29. package/prod/chunks/vidstack-CwlfLr4v.js +504 -0
  30. package/prod/chunks/vidstack-DVMwXUgY.js +189 -0
  31. package/prod/chunks/vidstack-D_Sd7838.js +663 -0
  32. package/prod/chunks/vidstack-DgsBXr1J.js +84 -0
  33. package/prod/chunks/vidstack-DhSvljmQ.js +375 -0
  34. package/prod/chunks/vidstack-DlPpeEXU.js +545 -0
  35. package/prod/chunks/vidstack-xwdT591E.js +386 -0
  36. package/prod/player/vidstack-default-components.js +8 -9
  37. package/prod/player/vidstack-default-icons.js +1 -1
  38. package/prod/player/vidstack-default-layout.js +8 -9
  39. package/prod/player/vidstack-plyr-layout.js +63 -77
  40. package/prod/player/vidstack-remotion.js +6 -6
  41. package/prod/vidstack.js +204 -22
  42. package/server/chunks/vidstack--ufi23Q6.js +1537 -0
  43. package/server/chunks/vidstack-3hd9uS5U.js +386 -0
  44. package/server/chunks/vidstack-B_l_DXPI.js +61 -0
  45. package/server/chunks/vidstack-Bb44UuL8.js +470 -0
  46. package/server/chunks/vidstack-Bu9QXEz1.js +159 -0
  47. package/server/chunks/vidstack-Cb_tNfNU.js +11199 -0
  48. package/server/chunks/vidstack-D9vUNwri.js +288 -0
  49. package/server/chunks/vidstack-DM-5dPT-.js +663 -0
  50. package/server/chunks/vidstack-DWfS9vAY.js +84 -0
  51. package/server/chunks/vidstack-DY51lx0R.js +189 -0
  52. package/server/chunks/vidstack-VGPw_CQP.js +375 -0
  53. package/server/chunks/vidstack-dz2TmHzm.js +34 -0
  54. package/server/chunks/vidstack-e0ZPAI-d.js +504 -0
  55. package/server/chunks/vidstack-zzooMghu.js +545 -0
  56. package/server/player/vidstack-default-components.js +8 -9
  57. package/server/player/vidstack-default-icons.js +1 -1
  58. package/server/player/vidstack-default-layout.js +8 -9
  59. package/server/player/vidstack-plyr-layout.js +63 -77
  60. package/server/player/vidstack-remotion.js +6 -6
  61. package/server/vidstack.js +204 -22
@@ -0,0 +1,84 @@
1
+ "use client"
2
+
3
+ import * as React from 'react';
4
+ import { listenEvent, EventsController, animationFrameThrottle, effect } from './vidstack-D_bWd66h.js';
5
+ import { useMediaPlayer } from './vidstack-oOGofWSl.js';
6
+
7
+ function useClassName(el, className) {
8
+ React.useEffect(() => {
9
+ if (!el || !className) return;
10
+ const tokens = className.split(" ");
11
+ for (const token of tokens) el.classList.add(token);
12
+ return () => {
13
+ for (const token of tokens) el.classList.remove(token);
14
+ };
15
+ }, [el, className]);
16
+ }
17
+ function useResizeObserver(el, callback) {
18
+ React.useEffect(() => {
19
+ if (!el) return;
20
+ callback();
21
+ const observer = new ResizeObserver(animationFrameThrottle(callback));
22
+ observer.observe(el);
23
+ return () => observer.disconnect();
24
+ }, [el, callback]);
25
+ }
26
+ function useTransitionActive(el) {
27
+ const [isActive, setIsActive] = React.useState(false);
28
+ React.useEffect(() => {
29
+ if (!el) return;
30
+ const events = new EventsController(el).add("transitionstart", () => setIsActive(true)).add("transitionend", () => setIsActive(false));
31
+ return () => events.abort();
32
+ }, [el]);
33
+ return isActive;
34
+ }
35
+ function useMouseEnter(el) {
36
+ const [isMouseEnter, setIsMouseEnter] = React.useState(false);
37
+ React.useEffect(() => {
38
+ if (!el) return;
39
+ const events = new EventsController(el).add("mouseenter", () => setIsMouseEnter(true)).add("mouseleave", () => setIsMouseEnter(false));
40
+ return () => events.abort();
41
+ }, [el]);
42
+ return isMouseEnter;
43
+ }
44
+ function useFocusIn(el) {
45
+ const [isFocusIn, setIsFocusIn] = React.useState(false);
46
+ React.useEffect(() => {
47
+ if (!el) return;
48
+ const events = new EventsController(el).add("focusin", () => setIsFocusIn(true)).add("focusout", () => setIsFocusIn(false));
49
+ return () => events.abort();
50
+ }, [el]);
51
+ return isFocusIn;
52
+ }
53
+ function useActive(el) {
54
+ const isMouseEnter = useMouseEnter(el), isFocusIn = useFocusIn(el), prevMouseEnter = React.useRef(false);
55
+ if (prevMouseEnter.current && !isMouseEnter) return false;
56
+ prevMouseEnter.current = isMouseEnter;
57
+ return isMouseEnter || isFocusIn;
58
+ }
59
+ function useColorSchemePreference() {
60
+ const [colorScheme, setColorScheme] = React.useState("dark");
61
+ React.useEffect(() => {
62
+ const media = window.matchMedia("(prefers-color-scheme: light)");
63
+ function onChange() {
64
+ setColorScheme(media.matches ? "light" : "dark");
65
+ }
66
+ onChange();
67
+ return listenEvent(media, "change", onChange);
68
+ }, []);
69
+ return colorScheme;
70
+ }
71
+
72
+ function useLayoutName(name) {
73
+ const player = useMediaPlayer();
74
+ React.useEffect(() => {
75
+ if (!player) return;
76
+ return effect(() => {
77
+ const el = player.$el;
78
+ el?.setAttribute("data-layout", name);
79
+ return () => el?.removeAttribute("data-layout");
80
+ });
81
+ }, [player]);
82
+ }
83
+
84
+ export { useActive, useClassName, useColorSchemePreference, useLayoutName, useResizeObserver, useTransitionActive };
@@ -1,15 +1,14 @@
1
1
  "use client"
2
2
 
3
- export { DefaultAudioLayout, DefaultBufferingIndicator, DefaultKeyboardDisplay, DefaultMenuButton, DefaultMenuCheckbox, DefaultMenuItem, DefaultMenuRadioGroup, DefaultMenuSection, DefaultMenuSliderItem, DefaultSliderParts, DefaultSliderSteps, DefaultTooltip, DefaultVideoGestures, DefaultVideoLargeLayout, DefaultVideoLayout, DefaultVideoSmallLayout, createRadioOptions } from '../chunks/vidstack-CKsUl4ll.js';
3
+ export { DefaultAudioLayout, DefaultBufferingIndicator, DefaultKeyboardDisplay, DefaultMenuButton, DefaultMenuCheckbox, DefaultMenuItem, DefaultMenuRadioGroup, DefaultMenuSection, DefaultMenuSliderItem, DefaultSliderParts, DefaultSliderSteps, DefaultTooltip, DefaultVideoGestures, DefaultVideoLargeLayout, DefaultVideoLayout, DefaultVideoSmallLayout, createRadioOptions } from '../chunks/vidstack-D2Bi2Td9.js';
4
4
  export { defaultLayoutIcons } from './vidstack-default-icons.js';
5
5
  import 'react';
6
- import '../chunks/vidstack-BalWqr4j.js';
7
- import '../chunks/vidstack-gqKBE4xH.js';
8
- import '../chunks/vidstack-FuCbl228.js';
9
- import 'vidstack';
10
- import '../chunks/vidstack-CqNX679o.js';
6
+ import '../chunks/vidstack-D_bWd66h.js';
7
+ import '../chunks/vidstack-S_S6XDnL.js';
8
+ import '../chunks/vidstack-C5tZAkKo.js';
9
+ import '@floating-ui/dom';
10
+ import '../chunks/vidstack-oOGofWSl.js';
11
11
  import 'react-dom';
12
- import '../chunks/vidstack-DjqYvkVp.js';
13
- import '../chunks/vidstack-DqaqkU4T.js';
14
- import 'vidstack/exports/font.ts';
12
+ import '../chunks/vidstack-vh0BKYWJ.js';
13
+ import '../chunks/vidstack-D-hQD1eE.js';
15
14
  import '../chunks/vidstack-CBF7iUqu.js';
@@ -1,7 +1,7 @@
1
1
  "use client"
2
2
 
3
3
  import * as React from 'react';
4
- import { Icon$34, Icon$35, Icon$27, Icon$26, Icon$60, Icon$61, Icon$39, Icon$40, Icon$105, Icon$104, Icon$54, Icon$59, Icon$62, Icon$19, Icon$56, Icon$33, Icon$8, Icon$13, Icon$88, Icon$63, Icon$16, Icon$53, Icon$22, Icon$11, Icon$0, Icon$31, Icon$81, Icon$77, Icon$74, Icon$24, Icon$5 } from '../chunks/vidstack-BalWqr4j.js';
4
+ import { Icon$34, Icon$35, Icon$27, Icon$26, Icon$60, Icon$61, Icon$39, Icon$40, Icon$105, Icon$104, Icon$54, Icon$59, Icon$62, Icon$19, Icon$56, Icon$33, Icon$8, Icon$13, Icon$88, Icon$63, Icon$16, Icon$53, Icon$22, Icon$11, Icon$0, Icon$31, Icon$81, Icon$77, Icon$74, Icon$24, Icon$5 } from '../chunks/vidstack-D_bWd66h.js';
5
5
  import { Icon } from '../chunks/vidstack-CBF7iUqu.js';
6
6
 
7
7
  function createIcon(paths) {
@@ -1,15 +1,14 @@
1
1
  "use client"
2
2
 
3
- export { DefaultAudioLayout, DefaultBufferingIndicator, DefaultKeyboardDisplay, DefaultLayoutContext, DefaultMenuButton, DefaultMenuCheckbox, DefaultMenuItem, DefaultMenuRadioGroup, DefaultMenuSection, DefaultMenuSliderItem, DefaultSliderParts, DefaultSliderSteps, DefaultTooltip, DefaultVideoGestures, DefaultVideoLargeLayout, DefaultVideoLayout, DefaultVideoSmallLayout, createRadioOptions, i18n, useDefaultLayoutContext, useDefaultLayoutWord } from '../chunks/vidstack-CKsUl4ll.js';
3
+ export { DefaultAudioLayout, DefaultBufferingIndicator, DefaultKeyboardDisplay, DefaultLayoutContext, DefaultMenuButton, DefaultMenuCheckbox, DefaultMenuItem, DefaultMenuRadioGroup, DefaultMenuSection, DefaultMenuSliderItem, DefaultSliderParts, DefaultSliderSteps, DefaultTooltip, DefaultVideoGestures, DefaultVideoLargeLayout, DefaultVideoLayout, DefaultVideoSmallLayout, createRadioOptions, i18n, useDefaultLayoutContext, useDefaultLayoutWord } from '../chunks/vidstack-D2Bi2Td9.js';
4
4
  export { defaultLayoutIcons } from './vidstack-default-icons.js';
5
5
  import 'react';
6
- import '../chunks/vidstack-BalWqr4j.js';
7
- import '../chunks/vidstack-gqKBE4xH.js';
8
- import '../chunks/vidstack-FuCbl228.js';
9
- import 'vidstack';
10
- import '../chunks/vidstack-CqNX679o.js';
6
+ import '../chunks/vidstack-D_bWd66h.js';
7
+ import '../chunks/vidstack-S_S6XDnL.js';
8
+ import '../chunks/vidstack-C5tZAkKo.js';
9
+ import '@floating-ui/dom';
10
+ import '../chunks/vidstack-oOGofWSl.js';
11
11
  import 'react-dom';
12
- import '../chunks/vidstack-DjqYvkVp.js';
13
- import '../chunks/vidstack-DqaqkU4T.js';
14
- import 'vidstack/exports/font.ts';
12
+ import '../chunks/vidstack-vh0BKYWJ.js';
13
+ import '../chunks/vidstack-D-hQD1eE.js';
15
14
  import '../chunks/vidstack-CBF7iUqu.js';
@@ -1,89 +1,75 @@
1
1
  "use client"
2
2
 
3
- import { IS_SERVER, useMediaState, Primitive, isRemotionSrc } from '../chunks/vidstack-FuCbl228.js';
3
+ import { useMediaState, Primitive, IS_SERVER, isRemotionSrc, getDownloadFile } from '../chunks/vidstack-C5tZAkKo.js';
4
4
  import * as React from 'react';
5
- import { isString, isBoolean, uppercaseFirstChar, isUndefined, signal, composeRefs, useSignal, isNumber, listenEvent } from '../chunks/vidstack-BalWqr4j.js';
6
- import { usePlyrLayoutClasses, isKeyboardEvent, isKeyboardClick } from 'vidstack';
7
- import { useMediaContext, PlayButton, Root, Img, Gesture, AirPlayButton, CaptionButton, FullscreenButton, PIPButton, SeekButton, Root$1, Value, Preview, Thumbnail, LiveButton, Time, appendParamsToURL, Root$2, Button, Items, useAudioOptions, Root$3, Item, useCaptionOptions, MuteButton, Root$4 } from '../chunks/vidstack-CqNX679o.js';
8
- import { useMediaRemote, useVideoQualityOptions, usePlaybackRateOptions } from '../chunks/vidstack-PREbBNMG.js';
9
- import { useLayoutName, useClassName } from '../chunks/vidstack-DjqYvkVp.js';
10
- import { RemotionThumbnail, RemotionPoster, RemotionSliderThumbnail } from '../chunks/vidstack-DqaqkU4T.js';
5
+ import { effect, createDisposalBin, uppercaseFirstChar, isUndefined, signal, composeRefs, useSignal, isNumber, listenEvent, isString, isKeyboardEvent, isKeyboardClick } from '../chunks/vidstack-D_bWd66h.js';
6
+ import { useMediaContext, PlayButton, Root, Img, Gesture, AirPlayButton, CaptionButton, FullscreenButton, PIPButton, SeekButton, Root$1, Value, Preview, Thumbnail, LiveButton, Time, appendParamsToURL, Root$2, Button, Items, useAudioOptions, Root$3, Item, useCaptionOptions, MuteButton, Root$4 } from '../chunks/vidstack-oOGofWSl.js';
7
+ import { useMediaRemote, useVideoQualityOptions, usePlaybackRateOptions } from '../chunks/vidstack-3rdEWplD.js';
8
+ import { useLayoutName, useClassName } from '../chunks/vidstack-vh0BKYWJ.js';
9
+ import { RemotionThumbnail, RemotionPoster, RemotionSliderThumbnail } from '../chunks/vidstack-D-hQD1eE.js';
11
10
  export { plyrLayoutIcons } from './vidstack-plyr-icons.js';
11
+ import '@floating-ui/dom';
12
12
  import 'react-dom';
13
13
  import '../chunks/vidstack-CBF7iUqu.js';
14
14
 
15
- IS_SERVER ? "" : navigator?.userAgent.toLowerCase() || "";
16
- function canPlayHLSNatively(video) {
17
- if (IS_SERVER) return false;
18
- if (!video) video = document.createElement("video");
19
- return video.canPlayType("application/vnd.apple.mpegurl").length > 0;
20
- }
21
-
22
- const AUDIO_EXTENSIONS = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx|flac)($|\?)/i;
23
- const AUDIO_TYPES = /* @__PURE__ */ new Set([
24
- "audio/mpeg",
25
- "audio/ogg",
26
- "audio/3gp",
27
- "audio/mp3",
28
- "audio/webm",
29
- "audio/flac",
30
- "audio/m4a",
31
- "audio/m4b",
32
- "audio/mp4a",
33
- "audio/mp4"
34
- ]);
35
- const VIDEO_EXTENSIONS = /\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\d+]+)?($|\?)/i;
36
- const VIDEO_TYPES = /* @__PURE__ */ new Set([
37
- "video/mp4",
38
- "video/webm",
39
- "video/3gp",
40
- "video/ogg",
41
- "video/avi",
42
- "video/mpeg"
43
- ]);
44
- const HLS_VIDEO_EXTENSIONS = /\.(m3u8)($|\?)/i;
45
- const HLS_VIDEO_TYPES = /* @__PURE__ */ new Set([
46
- // Apple sanctioned
47
- "application/vnd.apple.mpegurl",
48
- // Apple sanctioned for backwards compatibility
49
- "audio/mpegurl",
50
- // Very common
51
- "audio/x-mpegurl",
52
- // Very common
53
- "application/x-mpegurl",
54
- // Included for completeness
55
- "video/x-mpegurl",
56
- "video/mpegurl",
57
- "application/mpegurl"
58
- ]);
59
- function isAudioSrc({ src, type }) {
60
- return isString(src) ? AUDIO_EXTENSIONS.test(src) || AUDIO_TYPES.has(type) || src.startsWith("blob:") && type === "audio/object" : type === "audio/object";
61
- }
62
- function isVideoSrc(src) {
63
- return isString(src.src) ? VIDEO_EXTENSIONS.test(src.src) || VIDEO_TYPES.has(src.type) || src.src.startsWith("blob:") && src.type === "video/object" || isHLSSrc(src) && (IS_SERVER || canPlayHLSNatively()) : src.type === "video/object";
64
- }
65
- function isHLSSrc({ src, type }) {
66
- return isString(src) && HLS_VIDEO_EXTENSIONS.test(src) || HLS_VIDEO_TYPES.has(type);
67
- }
68
-
69
- function getDownloadFile({
70
- title,
71
- src,
72
- download
73
- }) {
74
- const url = isBoolean(download) || download === "" ? src.src : isString(download) ? download : download?.url;
75
- if (!isValidFileDownload({ url, src, download })) return null;
76
- return {
77
- url,
78
- name: !isBoolean(download) && !isString(download) && download?.filename || title.toLowerCase() || "media"
15
+ function usePlyrLayoutClasses(el, media) {
16
+ const {
17
+ canAirPlay,
18
+ canFullscreen,
19
+ canPictureInPicture,
20
+ controlsHidden,
21
+ currentTime,
22
+ fullscreen,
23
+ hasCaptions,
24
+ isAirPlayConnected,
25
+ paused,
26
+ pictureInPicture,
27
+ playing,
28
+ pointer,
29
+ poster,
30
+ textTrack,
31
+ viewType,
32
+ waiting
33
+ } = media.$state;
34
+ el.classList.add("plyr");
35
+ el.classList.add("plyr--full-ui");
36
+ const classes = {
37
+ "plyr--airplay-active": isAirPlayConnected,
38
+ "plyr--airplay-supported": canAirPlay,
39
+ "plyr--fullscreen-active": fullscreen,
40
+ "plyr--fullscreen-enabled": canFullscreen,
41
+ "plyr--hide-controls": controlsHidden,
42
+ "plyr--is-touch": () => pointer() === "coarse",
43
+ "plyr--loading": waiting,
44
+ "plyr--paused": paused,
45
+ "plyr--pip-active": pictureInPicture,
46
+ "plyr--pip-enabled": canPictureInPicture,
47
+ "plyr--playing": playing,
48
+ "plyr__poster-enabled": poster,
49
+ "plyr--stopped": () => paused() && currentTime() === 0,
50
+ "plyr--captions-active": textTrack,
51
+ "plyr--captions-enabled": hasCaptions
79
52
  };
53
+ const disposal = createDisposalBin();
54
+ for (const token of Object.keys(classes)) {
55
+ disposal.add(effect(() => void el.classList.toggle(token, !!classes[token]())));
56
+ }
57
+ disposal.add(
58
+ effect(() => {
59
+ const token = `plyr--${viewType()}`;
60
+ el.classList.add(token);
61
+ return () => el.classList.remove(token);
62
+ }),
63
+ effect(() => {
64
+ const { $provider } = media, type = $provider()?.type, token = `plyr--${isHTMLProvider(type) ? "html5" : type}`;
65
+ el.classList.toggle(token, !!type);
66
+ return () => el.classList.remove(token);
67
+ })
68
+ );
69
+ return () => disposal.empty();
80
70
  }
81
- function isValidFileDownload({
82
- url,
83
- src,
84
- download
85
- }) {
86
- return isString(url) && (download && download !== true || isAudioSrc(src) || isVideoSrc(src));
71
+ function isHTMLProvider(type) {
72
+ return type === "audio" || type === "video";
87
73
  }
88
74
 
89
75
  const PlyrLayoutContext = React.createContext({});
@@ -1,12 +1,12 @@
1
1
  "use client"
2
2
 
3
3
  import * as React from 'react';
4
- import { createDisposalBin, animationFrameThrottle, noop } from '../chunks/vidstack-BalWqr4j.js';
4
+ import { createDisposalBin, animationFrameThrottle, noop } from '../chunks/vidstack-D_bWd66h.js';
5
5
  import { Internals, random } from 'remotion';
6
- import { IS_SERVER, useMediaState, isRemotionSrc, Primitive, useSliderState } from '../chunks/vidstack-FuCbl228.js';
7
- export { isRemotionProvider } from '../chunks/vidstack-FuCbl228.js';
8
- import { RemotionThumbnail as RemotionThumbnail$1, RemotionSliderThumbnail as RemotionSliderThumbnail$1, RemotionPoster as RemotionPoster$1 } from '../chunks/vidstack-DqaqkU4T.js';
9
- import 'vidstack';
6
+ import { IS_SERVER, useMediaState, isRemotionSrc, Primitive, useSliderState } from '../chunks/vidstack-C5tZAkKo.js';
7
+ export { isRemotionProvider } from '../chunks/vidstack-C5tZAkKo.js';
8
+ import { RemotionThumbnail as RemotionThumbnail$1, RemotionSliderThumbnail as RemotionSliderThumbnail$1, RemotionPoster as RemotionPoster$1 } from '../chunks/vidstack-D-hQD1eE.js';
9
+ import '@floating-ui/dom';
10
10
 
11
11
  class RemotionLayoutEngine {
12
12
  #src = null;
@@ -338,7 +338,7 @@ class RemotionProviderLoader {
338
338
  return "video";
339
339
  }
340
340
  async load(ctx) {
341
- return new (await import('../chunks/vidstack-D3ZXOE4d.js')).RemotionProvider(this.target, ctx);
341
+ return new (await import('../chunks/vidstack-DnmOVAbr.js')).RemotionProvider(this.target, ctx);
342
342
  }
343
343
  }
344
344
 
package/dev/vidstack.js CHANGED
@@ -1,25 +1,136 @@
1
1
  "use client"
2
2
 
3
- export * from 'vidstack/exports/core.ts';
4
- export * from 'vidstack/exports/events.ts';
5
- export * from 'vidstack/exports/foundation.ts';
6
- export * from 'vidstack/exports/maverick.ts';
7
- export * from 'vidstack/exports/providers.ts';
8
- export * from 'vidstack/exports/utils.ts';
9
- export { DEFAULT_AUDIO_GAINS, DEFAULT_PLAYBACK_RATES, sliderState } from 'vidstack/exports/components.ts';
10
- import { Primitive, MediaPlayerInstance, MediaProviderInstance, isRemotionProvider, ToggleButtonInstance, PosterInstance, useMediaState } from './chunks/vidstack-FuCbl228.js';
11
- export { AirPlayButtonInstance, AudioGainSliderInstance, CaptionButtonInstance, CaptionsInstance, ControlsGroupInstance, ControlsInstance, FullscreenButtonInstance, GestureInstance, GoogleCastButtonInstance, LiveButtonInstance, MediaAnnouncerInstance, MenuButtonInstance, MenuInstance, MenuItemInstance, MenuItemsInstance, MenuPortalInstance, MuteButtonInstance, PIPButtonInstance, PlayButtonInstance, QualitySliderInstance, RadioGroupInstance, RadioInstance, SeekButtonInstance, SliderChaptersInstance, SliderInstance, SliderPreviewInstance, SliderThumbnailInstance, SliderValueInstance, SliderVideoInstance, SpeedSliderInstance, ThumbnailInstance, TimeInstance, TimeSliderInstance, TooltipContentInstance, TooltipInstance, TooltipTriggerInstance, VolumeSliderInstance, useMediaStore, useSliderState, useSliderStore } from './chunks/vidstack-FuCbl228.js';
3
+ import { TextTrackSymbol, RadioGroupController, useMediaContext, menuContext, Primitive, MediaPlayerInstance, MediaProviderInstance, isRemotionProvider, mediaState, TextTrack, ToggleButtonInstance, PosterInstance, useMediaState, ThumbnailsLoader, updateSliderPreviewPlacement } from './chunks/vidstack-C5tZAkKo.js';
4
+ export { ARIAKeyShortcuts, AUDIO_EXTENSIONS, AUDIO_TYPES, AirPlayButtonInstance, AudioGainSliderInstance, AudioProviderLoader, AudioTrackList, CaptionButtonInstance, CaptionsInstance, ControlsGroupInstance, ControlsInstance, DASHProviderLoader, DASH_VIDEO_EXTENSIONS, DASH_VIDEO_TYPES, FullscreenButtonInstance, FullscreenController, GestureInstance, GoogleCastButtonInstance, HLSProviderLoader, HLS_VIDEO_EXTENSIONS, HLS_VIDEO_TYPES, List, LiveButtonInstance, LocalMediaStorage, Logger, MEDIA_KEY_SHORTCUTS, MediaAnnouncerInstance, MediaControls, MediaRemoteControl, MenuButtonInstance, MenuInstance, MenuItemInstance, MenuItemsInstance, MenuPortalInstance, MuteButtonInstance, PIPButtonInstance, PlayButtonInstance, QualitySliderInstance, RadioGroupInstance, RadioInstance, ScreenOrientationController, SeekButtonInstance, SliderChaptersInstance, SliderInstance, SliderPreviewInstance, SliderThumbnailInstance, SliderValueInstance, SliderVideoInstance, SpeedSliderInstance, TextRenderers, TextTrackList, ThumbnailInstance, TimeInstance, TimeRange, TimeSliderInstance, TooltipContentInstance, TooltipInstance, TooltipTriggerInstance, VIDEO_EXTENSIONS, VIDEO_TYPES, VideoProviderLoader, VideoQualityList, VimeoProviderLoader, VolumeSliderInstance, YouTubeProviderLoader, boundTime, canChangeVolume, canFullscreen, canGoogleCastSrc, canOrientScreen, canPlayHLSNatively, canRotateScreen, canUsePictureInPicture, canUseVideoPresentation, findActiveCue, formatSpokenTime, formatTime, getDownloadFile, getTimeRangesEnd, getTimeRangesStart, isAudioProvider, isAudioSrc, isCueActive, isDASHProvider, isDASHSrc, isGoogleCastProvider, isHLSProvider, isHLSSrc, isHTMLAudioElement, isHTMLIFrameElement, isHTMLMediaElement, isHTMLVideoElement, isMediaStream, isTrackCaptionKind, isVideoProvider, isVideoQualitySrc, isVideoSrc, isVimeoProvider, isYouTubeProvider, mediaContext, normalizeTimeIntervals, parseJSONCaptionsFile, sliderState, softResetMediaState, sortVideoQualities, updateTimeIntervals, useMediaStore, useSliderState, useSliderStore, watchActiveTextTrack, watchCueTextChange } from './chunks/vidstack-C5tZAkKo.js';
12
5
  import * as React from 'react';
13
- import { createReactComponent, useStateContext, useSignal, isString, composeRefs, useSignalRecord, effect, useReactScope, signal, EventsController } from './chunks/vidstack-BalWqr4j.js';
14
- import { createSignal, useScoped } from './chunks/vidstack-gqKBE4xH.js';
15
- export { audioGainSlider as AudioGainSlider, Captions, ChapterTitle, controls as Controls, GoogleCastButton, MediaAnnouncer, qualitySlider as QualitySlider, speedSlider as SpeedSlider, spinner as Spinner, Title, tooltip as Tooltip, useActiveTextCues, useActiveTextTrack, useChapterOptions, useChapterTitle, useTextCues } from './chunks/vidstack-gqKBE4xH.js';
16
- import { mediaState, TextTrack, ThumbnailsLoader, updateSliderPreviewPlacement, DEFAULT_AUDIO_GAINS } from 'vidstack';
17
- import { useMediaContext } from './chunks/vidstack-CqNX679o.js';
18
- export { AirPlayButton, CaptionButton, FullscreenButton, Gesture, LiveButton, menu as Menu, MuteButton, PIPButton, PlayButton, radioGroup as RadioGroup, SeekButton, slider as Slider, thumbnail as Thumbnail, Time, timeSlider as TimeSlider, volumeSlider as VolumeSlider, useAudioOptions, useCaptionOptions, useMediaPlayer } from './chunks/vidstack-CqNX679o.js';
6
+ import { isString, EventsController, DOMEvent, prop, method, Component, hasProvidedContext, useContext, effect, createReactComponent, useStateContext, useSignal, composeRefs, useSignalRecord, useReactScope, signal } from './chunks/vidstack-D_bWd66h.js';
7
+ export { appendTriggerEvent, findTriggerEvent, hasTriggerEvent, isKeyboardClick, isKeyboardEvent, isPointerEvent, walkTriggerEventChain } from './chunks/vidstack-D_bWd66h.js';
8
+ import { createSignal, useScoped } from './chunks/vidstack-S_S6XDnL.js';
9
+ export { audioGainSlider as AudioGainSlider, Captions, ChapterTitle, controls as Controls, GoogleCastButton, MediaAnnouncer, qualitySlider as QualitySlider, speedSlider as SpeedSlider, spinner as Spinner, Title, tooltip as Tooltip, useActiveTextCues, useActiveTextTrack, useChapterOptions, useChapterTitle, useTextCues } from './chunks/vidstack-S_S6XDnL.js';
10
+ import { useMediaContext as useMediaContext$1 } from './chunks/vidstack-oOGofWSl.js';
11
+ export { AirPlayButton, CaptionButton, FullscreenButton, Gesture, LiveButton, menu as Menu, MuteButton, PIPButton, PlayButton, radioGroup as RadioGroup, SeekButton, slider as Slider, thumbnail as Thumbnail, Time, timeSlider as TimeSlider, volumeSlider as VolumeSlider, useAudioOptions, useCaptionOptions, useMediaPlayer } from './chunks/vidstack-oOGofWSl.js';
19
12
  import { Icon } from './chunks/vidstack-CBF7iUqu.js';
20
- export { useMediaRemote, usePlaybackRateOptions, useVideoQualityOptions } from './chunks/vidstack-PREbBNMG.js';
13
+ export { DEFAULT_PLAYBACK_RATES, useMediaRemote, usePlaybackRateOptions, useVideoQualityOptions } from './chunks/vidstack-3rdEWplD.js';
14
+ import '@floating-ui/dom';
21
15
  import 'react-dom';
22
16
 
17
+ class LibASSTextRenderer {
18
+ constructor(loader, config) {
19
+ this.loader = loader;
20
+ this.config = config;
21
+ }
22
+ priority = 1;
23
+ #instance = null;
24
+ #track = null;
25
+ #typeRE = /(ssa|ass)$/;
26
+ canRender(track, video) {
27
+ return !!video && !!track.src && (isString(track.type) && this.#typeRE.test(track.type) || this.#typeRE.test(track.src));
28
+ }
29
+ attach(video) {
30
+ if (!video) return;
31
+ this.loader().then(async (mod) => {
32
+ this.#instance = new mod.default({
33
+ ...this.config,
34
+ video,
35
+ subUrl: this.#track?.src || ""
36
+ });
37
+ new EventsController(this.#instance).add("ready", () => {
38
+ const canvas = this.#instance?._canvas;
39
+ if (canvas) canvas.style.pointerEvents = "none";
40
+ }).add("error", (event) => {
41
+ if (!this.#track) return;
42
+ this.#track[TextTrackSymbol.readyState] = 3;
43
+ this.#track.dispatchEvent(
44
+ new DOMEvent("error", {
45
+ trigger: event,
46
+ detail: event.error
47
+ })
48
+ );
49
+ });
50
+ });
51
+ }
52
+ changeTrack(track) {
53
+ if (!track || track.readyState === 3) {
54
+ this.#freeTrack();
55
+ } else if (this.#track !== track) {
56
+ this.#instance?.setTrackByUrl(track.src);
57
+ this.#track = track;
58
+ }
59
+ }
60
+ detach() {
61
+ this.#freeTrack();
62
+ }
63
+ #freeTrack() {
64
+ this.#instance?.freeTrack();
65
+ this.#track = null;
66
+ }
67
+ }
68
+
69
+ const DEFAULT_AUDIO_GAINS = [1, 1.25, 1.5, 1.75, 2, 2.5, 3, 4];
70
+ class AudioGainRadioGroup extends Component {
71
+ static props = {
72
+ normalLabel: "Disabled",
73
+ gains: DEFAULT_AUDIO_GAINS
74
+ };
75
+ #media;
76
+ #menu;
77
+ #controller;
78
+ get value() {
79
+ return this.#controller.value;
80
+ }
81
+ get disabled() {
82
+ const { gains } = this.$props, { canSetAudioGain } = this.#media.$state;
83
+ return !canSetAudioGain() || gains().length === 0;
84
+ }
85
+ constructor() {
86
+ super();
87
+ this.#controller = new RadioGroupController();
88
+ this.#controller.onValueChange = this.#onValueChange.bind(this);
89
+ }
90
+ onSetup() {
91
+ this.#media = useMediaContext();
92
+ if (hasProvidedContext(menuContext)) {
93
+ this.#menu = useContext(menuContext);
94
+ }
95
+ }
96
+ onConnect(el) {
97
+ effect(this.#watchValue.bind(this));
98
+ effect(this.#watchHintText.bind(this));
99
+ effect(this.#watchControllerDisabled.bind(this));
100
+ }
101
+ getOptions() {
102
+ const { gains, normalLabel } = this.$props;
103
+ return gains().map((gain) => ({
104
+ label: gain === 1 || gain === null ? normalLabel : String(gain * 100) + "%",
105
+ value: gain.toString()
106
+ }));
107
+ }
108
+ #watchValue() {
109
+ this.#controller.value = this.#getValue();
110
+ }
111
+ #watchHintText() {
112
+ const { normalLabel } = this.$props, { audioGain } = this.#media.$state, gain = audioGain();
113
+ this.#menu?.hint.set(gain === 1 || gain == null ? normalLabel() : String(gain * 100) + "%");
114
+ }
115
+ #watchControllerDisabled() {
116
+ this.#menu?.disable(this.disabled);
117
+ }
118
+ #getValue() {
119
+ const { audioGain } = this.#media.$state;
120
+ return audioGain()?.toString() ?? "1";
121
+ }
122
+ #onValueChange(value, trigger) {
123
+ if (this.disabled) return;
124
+ const gain = +value;
125
+ this.#media.remote.changeAudioGain(gain, trigger);
126
+ this.dispatch("change", { detail: gain, trigger });
127
+ }
128
+ }
129
+ const audiogainradiogroup__proto = AudioGainRadioGroup.prototype;
130
+ prop(audiogainradiogroup__proto, "value");
131
+ prop(audiogainradiogroup__proto, "disabled");
132
+ method(audiogainradiogroup__proto, "getOptions");
133
+
23
134
  const playerCallbacks = [
24
135
  "onAbort",
25
136
  "onAudioTrackChange",
@@ -114,10 +225,10 @@ const MediaProvider = React.forwardRef(
114
225
  );
115
226
  MediaProvider.displayName = "MediaProvider";
116
227
  function MediaOutlet({ provider, mediaProps, iframeProps }) {
117
- const { sources, crossOrigin, poster, remotePlaybackInfo, nativeControls, viewType } = useStateContext(mediaState), { loader } = provider.$state, { $provider: $$provider, $providerSetup: $$providerSetup } = useMediaContext(), $sources = useSignal(sources), $nativeControls = useSignal(nativeControls), $crossOrigin = useSignal(crossOrigin), $poster = useSignal(poster), $loader = useSignal(loader), $provider = useSignal($$provider), $providerSetup = useSignal($$providerSetup), $remoteInfo = useSignal(remotePlaybackInfo), $mediaType = $loader?.mediaType(), $viewType = useSignal(viewType), isAudioView = $viewType === "audio", isYouTubeEmbed = $loader?.name === "youtube", isVimeoEmbed = $loader?.name === "vimeo", isEmbed = isYouTubeEmbed || isVimeoEmbed, isRemotion = $loader?.name === "remotion", isGoogleCast = $loader?.name === "google-cast", [googleCastIconPaths, setGoogleCastIconPaths] = React.useState(""), [hasMounted, setHasMounted] = React.useState(false);
228
+ const { sources, crossOrigin, poster, remotePlaybackInfo, nativeControls, viewType } = useStateContext(mediaState), { loader } = provider.$state, { $provider: $$provider, $providerSetup: $$providerSetup } = useMediaContext$1(), $sources = useSignal(sources), $nativeControls = useSignal(nativeControls), $crossOrigin = useSignal(crossOrigin), $poster = useSignal(poster), $loader = useSignal(loader), $provider = useSignal($$provider), $providerSetup = useSignal($$providerSetup), $remoteInfo = useSignal(remotePlaybackInfo), $mediaType = $loader?.mediaType(), $viewType = useSignal(viewType), isAudioView = $viewType === "audio", isYouTubeEmbed = $loader?.name === "youtube", isVimeoEmbed = $loader?.name === "vimeo", isEmbed = isYouTubeEmbed || isVimeoEmbed, isRemotion = $loader?.name === "remotion", isGoogleCast = $loader?.name === "google-cast", [googleCastIconPaths, setGoogleCastIconPaths] = React.useState(""), [hasMounted, setHasMounted] = React.useState(false);
118
229
  React.useEffect(() => {
119
230
  if (!isGoogleCast || googleCastIconPaths) return;
120
- import('./chunks/vidstack-BalWqr4j.js').then(function (n) { return n.chromecast; }).then((mod) => {
231
+ import('./chunks/vidstack-D_bWd66h.js').then(function (n) { return n.chromecast; }).then((mod) => {
121
232
  setGoogleCastIconPaths(mod.default);
122
233
  });
123
234
  }, [isGoogleCast]);
@@ -181,7 +292,7 @@ function MediaOutlet({ provider, mediaProps, iframeProps }) {
181
292
  MediaOutlet.displayName = "MediaOutlet";
182
293
 
183
294
  function createTextTrack(init) {
184
- const media = useMediaContext(), track = React.useMemo(() => new TextTrack(init), Object.values(init));
295
+ const media = useMediaContext$1(), track = React.useMemo(() => new TextTrack(init), Object.values(init));
185
296
  React.useEffect(() => {
186
297
  media.textTracks.add(track);
187
298
  return () => void media.textTracks.remove(track);
@@ -318,7 +429,7 @@ function useStore(ctor, ref) {
318
429
  }
319
430
 
320
431
  function useMediaProvider() {
321
- const [provider, setProvider] = React.useState(null), context = useMediaContext();
432
+ const [provider, setProvider] = React.useState(null), context = useMediaContext$1();
322
433
  if (!context) {
323
434
  throw Error(
324
435
  "[vidstack] no media context was found - was this called outside of `<MediaPlayer>`?"
@@ -441,7 +552,7 @@ function useAudioGainOptions({
441
552
  gains = DEFAULT_AUDIO_GAINS,
442
553
  disabledLabel = "disabled"
443
554
  } = {}) {
444
- const media = useMediaContext(), { audioGain, canSetAudioGain } = media.$state;
555
+ const media = useMediaContext$1(), { audioGain, canSetAudioGain } = media.$state;
445
556
  useSignal(audioGain);
446
557
  useSignal(canSetAudioGain);
447
558
  return React.useMemo(() => {
@@ -473,4 +584,4 @@ function useAudioGainOptions({
473
584
  }, [gains]);
474
585
  }
475
586
 
476
- export { caption as Caption, Icon, MediaPlayer, MediaPlayerInstance, MediaProvider, MediaProviderInstance, Poster, PosterInstance, ToggleButton, ToggleButtonInstance, Track, createTextTrack, useActiveThumbnail, useAudioGainOptions, useMediaContext, useMediaProvider, useMediaState, useSliderPreview, useState, useStore, useThumbnails };
587
+ export { caption as Caption, DEFAULT_AUDIO_GAINS, Icon, LibASSTextRenderer, MediaPlayer, MediaPlayerInstance, MediaProvider, MediaProviderInstance, Poster, PosterInstance, TextTrack, ToggleButton, ToggleButtonInstance, Track, createTextTrack, mediaState, useActiveThumbnail, useAudioGainOptions, useMediaContext$1 as useMediaContext, useMediaProvider, useMediaState, useSliderPreview, useState, useStore, useThumbnails };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hanifhan1f/vidstack-react",
3
3
  "description": "UI component library for building high-quality, accessible video and audio experiences on the web.",
4
- "version": "1.12.30",
4
+ "version": "1.12.31",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "types": "index.d.ts",