bobinejs 0.0.0-stage → 0.2.0

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.
package/dist/hls.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Attaches a source the element can't play natively (HLS, DASH, MSE).
3
+ * Return a cleanup function to tear the adapter down when `src` changes.
4
+ */
5
+ type MediaSourceLoader = (media: HTMLMediaElement, src: string) => void | (() => void);
6
+
7
+ /**
8
+ * Plays `.m3u8` streams with hls.js, loaded on demand so it never lands in
9
+ * the main bundle. Native playback is only the fallback for browsers without
10
+ * Media Source Extensions: Chrome 142 and later report native HLS support,
11
+ * but cannot parse common MPEG-TS streams, so `canPlayType` is not a safe
12
+ * test.
13
+ */
14
+ declare const hlsLoader: MediaSourceLoader;
15
+
16
+ export { hlsLoader };
package/dist/hls.js ADDED
@@ -0,0 +1,39 @@
1
+ // ../../lib/media-hls.ts
2
+ var hasMediaSource = () => typeof window !== "undefined" && ("MediaSource" in window || "ManagedMediaSource" in window);
3
+ var hlsLoader = (media, src) => {
4
+ const playNatively = () => {
5
+ media.src = src;
6
+ return () => {
7
+ media.removeAttribute("src");
8
+ media.load();
9
+ };
10
+ };
11
+ if (!/\.m3u8($|\?)/i.test(src) || !hasMediaSource()) return playNatively();
12
+ let disposed = false;
13
+ let destroy;
14
+ import('hls.js').then(({ default: Hls }) => {
15
+ if (disposed) return;
16
+ if (!Hls.isSupported()) {
17
+ destroy = playNatively();
18
+ return;
19
+ }
20
+ const hls = new Hls({ enableWorker: true });
21
+ hls.on(Hls.Events.ERROR, (_, data) => {
22
+ if (!data.fatal) return;
23
+ if (data.type === Hls.ErrorTypes.NETWORK_ERROR) hls.startLoad();
24
+ else if (data.type === Hls.ErrorTypes.MEDIA_ERROR) hls.recoverMediaError();
25
+ else hls.destroy();
26
+ });
27
+ hls.loadSource(src);
28
+ hls.attachMedia(media);
29
+ destroy = () => hls.destroy();
30
+ });
31
+ return () => {
32
+ disposed = true;
33
+ destroy?.();
34
+ };
35
+ };
36
+
37
+ export { hlsLoader };
38
+ //# sourceMappingURL=hls.js.map
39
+ //# sourceMappingURL=hls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/media-hls.ts"],"names":[],"mappings":";AAMA,IAAM,iBAAiB,MACrB,OAAO,WAAW,WAAA,KAAgB,aAAA,IAAiB,UAAU,oBAAA,IAAwB,MAAA,CAAA;AAShF,IAAM,SAAA,GAA+B,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC1D,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,KAAA,CAAM,GAAA,GAAM,GAAA;AACZ,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,CAAM,gBAAgB,KAAK,CAAA;AAC3B,MAAA,KAAA,CAAM,IAAA,EAAK;AAAA,IACb,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,CAAC,gBAAgB,IAAA,CAAK,GAAG,KAAK,CAAC,cAAA,EAAe,EAAG,OAAO,YAAA,EAAa;AAEzE,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,OAAA;AAEJ,EAAA,OAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,EAAE,OAAA,EAAS,KAAI,KAAM;AAC1C,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,IAAI,CAAC,GAAA,CAAI,WAAA,EAAY,EAAG;AACtB,MAAA,OAAA,GAAU,YAAA,EAAa;AACvB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,EAAE,YAAA,EAAc,MAAM,CAAA;AAC1C,IAAA,GAAA,CAAI,GAAG,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,CAAC,GAAG,IAAA,KAAS;AACpC,MAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,MAAA,IAAI,KAAK,IAAA,KAAS,GAAA,CAAI,UAAA,CAAW,aAAA,MAAmB,SAAA,EAAU;AAAA,WAAA,IACrD,KAAK,IAAA,KAAS,GAAA,CAAI,UAAA,CAAW,WAAA,MAAiB,iBAAA,EAAkB;AAAA,eAChE,OAAA,EAAQ;AAAA,IACnB,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,WAAW,GAAG,CAAA;AAClB,IAAA,GAAA,CAAI,YAAY,KAAK,CAAA;AACrB,IAAA,OAAA,GAAU,MAAM,IAAI,OAAA,EAAQ;AAAA,EAC9B,CAAC,CAAA;AAED,EAAA,OAAO,MAAM;AACX,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,OAAA,IAAU;AAAA,EACZ,CAAA;AACF","file":"hls.js","sourcesContent":["import type { MediaSourceLoader } from \"@/components/ui/media\"\r\n\r\n/**\r\n * Media Source Extensions, which hls.js needs. iPhones before iOS 17.1 have\r\n * neither API, and they are the browsers that must play HLS natively.\r\n */\r\nconst hasMediaSource = () =>\r\n typeof window !== \"undefined\" && (\"MediaSource\" in window || \"ManagedMediaSource\" in window)\r\n\r\n/**\r\n * Plays `.m3u8` streams with hls.js, loaded on demand so it never lands in\r\n * the main bundle. Native playback is only the fallback for browsers without\r\n * Media Source Extensions: Chrome 142 and later report native HLS support,\r\n * but cannot parse common MPEG-TS streams, so `canPlayType` is not a safe\r\n * test.\r\n */\r\nexport const hlsLoader: MediaSourceLoader = (media, src) => {\r\n const playNatively = () => {\r\n media.src = src\r\n return () => {\r\n media.removeAttribute(\"src\")\r\n media.load()\r\n }\r\n }\r\n\r\n if (!/\\.m3u8($|\\?)/i.test(src) || !hasMediaSource()) return playNatively()\r\n\r\n let disposed = false\r\n let destroy: (() => void) | undefined\r\n\r\n import(\"hls.js\").then(({ default: Hls }) => {\r\n if (disposed) return\r\n if (!Hls.isSupported()) {\r\n destroy = playNatively()\r\n return\r\n }\r\n const hls = new Hls({ enableWorker: true })\r\n hls.on(Hls.Events.ERROR, (_, data) => {\r\n if (!data.fatal) return\r\n if (data.type === Hls.ErrorTypes.NETWORK_ERROR) hls.startLoad()\r\n else if (data.type === Hls.ErrorTypes.MEDIA_ERROR) hls.recoverMediaError()\r\n else hls.destroy()\r\n })\r\n hls.loadSource(src)\r\n hls.attachMedia(media)\r\n destroy = () => hls.destroy()\r\n })\r\n\r\n return () => {\r\n disposed = true\r\n destroy?.()\r\n }\r\n}\r\n"]}
@@ -0,0 +1,289 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ type MediaTextTrack = {
5
+ label: string;
6
+ language: string;
7
+ kind: "captions" | "subtitles";
8
+ };
9
+ type MediaInfo = {
10
+ title?: string;
11
+ artist?: string;
12
+ album?: string;
13
+ artwork?: {
14
+ src: string;
15
+ sizes?: string;
16
+ type?: string;
17
+ }[];
18
+ };
19
+ type MediaState = {
20
+ paused: boolean;
21
+ ended: boolean;
22
+ started: boolean;
23
+ waiting: boolean;
24
+ currentTime: number;
25
+ duration: number;
26
+ bufferedEnd: number;
27
+ volume: number;
28
+ muted: boolean;
29
+ playbackRate: number;
30
+ fullscreen: boolean;
31
+ pictureInPicture: boolean;
32
+ error: MediaError | null;
33
+ /** False while the element has no source to play. */
34
+ hasSource: boolean;
35
+ /** Caption and subtitle tracks, in document order. */
36
+ textTracks: MediaTextTrack[];
37
+ /** Index into `textTracks`, or -1 when captions are off. */
38
+ textTrack: number;
39
+ /** Text of the cues active right now, one entry per cue. */
40
+ cues: string[];
41
+ };
42
+ type MediaStoreOptions = {
43
+ /** localStorage key used to remember volume, mute and speed. Off by default. */
44
+ persistKey?: string;
45
+ };
46
+ type Listener = () => void;
47
+ /**
48
+ * Framework-agnostic store over any HTMLMediaElement. React bindings,
49
+ * web components, or anything else can subscribe to it.
50
+ */
51
+ declare function createMediaStore({ persistKey }?: MediaStoreOptions): {
52
+ play: () => Promise<void>;
53
+ pause: () => void | undefined;
54
+ toggle: () => void | Promise<void>;
55
+ seek: (time: number) => void;
56
+ seekBy: (delta: number) => void;
57
+ /** Jump to a fraction (0–1) of the duration. */
58
+ seekToRatio: (ratio: number) => void;
59
+ setVolume: (volume: number) => void;
60
+ toggleMute: () => void;
61
+ setPlaybackRate: (rate: number) => void;
62
+ /** Select a caption track by index, or -1 to turn captions off. */
63
+ setTextTrack: (index: number) => void;
64
+ toggleCaptions: () => void;
65
+ /** Reload the current source after an error. */
66
+ retry: () => void;
67
+ setMetadata: (next: MediaInfo | null) => void;
68
+ toggleFullscreen: () => Promise<void>;
69
+ togglePictureInPicture: () => Promise<void>;
70
+ getState: () => MediaState;
71
+ getServerState: () => MediaState;
72
+ getMedia: () => HTMLMediaElement | null;
73
+ subscribe: (listener: Listener) => () => boolean;
74
+ attach: (el: HTMLMediaElement | null) => void;
75
+ setContainer: (el: HTMLElement | null) => void;
76
+ };
77
+ type MediaStore = ReturnType<typeof createMediaStore>;
78
+ /**
79
+ * `m:ss`, or `h:mm:ss` from one hour. Pass the duration as `reference` so
80
+ * every time in a player uses the same fields: `0:00:05` beside `10:00:01`,
81
+ * and the label does not widen when playback passes an hour.
82
+ */
83
+ declare function formatTime(seconds: number, reference?: number): string;
84
+ /** Human-readable message for a MediaError code. */
85
+ declare function describeMediaError(error: MediaError | null): "Playback was aborted." | "A network error stopped the download." | "This media could not be decoded." | "This media couldn't be loaded." | "Something went wrong during playback.";
86
+
87
+ declare function useMediaStore(): {
88
+ play: () => Promise<void>;
89
+ pause: () => void | undefined;
90
+ toggle: () => void | Promise<void>;
91
+ seek: (time: number) => void;
92
+ seekBy: (delta: number) => void;
93
+ seekToRatio: (ratio: number) => void;
94
+ setVolume: (volume: number) => void;
95
+ toggleMute: () => void;
96
+ setPlaybackRate: (rate: number) => void;
97
+ setTextTrack: (index: number) => void;
98
+ toggleCaptions: () => void;
99
+ retry: () => void;
100
+ setMetadata: (next: MediaInfo | null) => void;
101
+ toggleFullscreen: () => Promise<void>;
102
+ togglePictureInPicture: () => Promise<void>;
103
+ getState: () => MediaState;
104
+ getServerState: () => MediaState;
105
+ getMedia: () => HTMLMediaElement | null;
106
+ subscribe: (listener: () => void) => () => boolean;
107
+ attach: (el: HTMLMediaElement | null) => void;
108
+ setContainer: (el: HTMLElement | null) => void;
109
+ };
110
+ declare function useMedia<T>(selector: (state: MediaState) => T): T;
111
+ type MediaRootProps = React.ComponentProps<"div"> & {
112
+ /** Milliseconds of pointer inactivity before controls hide during playback. */
113
+ idleTimeout?: number;
114
+ /** Remember volume, mute and speed in localStorage under this key. */
115
+ persistKey?: string;
116
+ /** Title, artist and artwork for OS media controls (Media Session API). */
117
+ metadata?: MediaInfo;
118
+ /** Enable keyboard shortcuts while focus is inside the player. */
119
+ hotkeys?: boolean;
120
+ /** Small labels over the buttons on hover and keyboard focus, with their shortcut. */
121
+ tooltips?: boolean;
122
+ };
123
+ declare function MediaRoot({ className, idleTimeout, persistKey, metadata, hotkeys, tooltips, onPointerMove, onPointerDown, onPointerLeave, onKeyDown, ref, ...props }: MediaRootProps): react_jsx_runtime.JSX.Element;
124
+ /**
125
+ * Attaches a source the element can't play natively (HLS, DASH, MSE).
126
+ * Return a cleanup function to tear the adapter down when `src` changes.
127
+ */
128
+ type MediaSourceLoader = (media: HTMLMediaElement, src: string) => void | (() => void);
129
+ type MediaElementProps<T> = T & {
130
+ /** Custom source adapter, e.g. `hlsLoader` from `@/lib/media-hls`. */
131
+ loader?: MediaSourceLoader;
132
+ };
133
+ type MediaVideoProps = MediaElementProps<React.ComponentProps<"video">>;
134
+ declare function MediaVideo({ className, ref, src, loader, ...props }: MediaVideoProps): react_jsx_runtime.JSX.Element;
135
+ type MediaAudioProps = MediaElementProps<React.ComponentProps<"audio">>;
136
+ declare function MediaAudio({ ref, src, loader, ...props }: MediaAudioProps): react_jsx_runtime.JSX.Element;
137
+ type MediaTooltipAlign = "start" | "center" | "end";
138
+ type MediaButtonProps = React.ComponentProps<"button"> & {
139
+ /** Tooltip text, shown when the root has `tooltips`. `false` hides it. */
140
+ tooltip?: React.ReactNode;
141
+ /** Shortcut shown beside the tooltip when the root has `hotkeys`. */
142
+ shortcut?: string;
143
+ /** Pin the tooltip to an edge for buttons at either end of a bar. */
144
+ tooltipAlign?: MediaTooltipAlign;
145
+ };
146
+ declare function MediaButton({ className, type, tooltip, shortcut, tooltipAlign, children, ...props }: MediaButtonProps): react_jsx_runtime.JSX.Element;
147
+ declare function MediaPlayButton({ onClick, ...props }: MediaButtonProps): react_jsx_runtime.JSX.Element;
148
+ declare function MediaMuteButton({ onClick, ...props }: MediaButtonProps): react_jsx_runtime.JSX.Element;
149
+ declare function MediaFullscreenButton({ onClick, ...props }: MediaButtonProps): react_jsx_runtime.JSX.Element;
150
+ declare function MediaPictureInPictureButton({ onClick, ...props }: MediaButtonProps): react_jsx_runtime.JSX.Element | null;
151
+ type MediaPlaybackRateButtonProps = MediaButtonProps & {
152
+ /** Speeds a click cycles through, in order. */
153
+ rates?: number[];
154
+ };
155
+ declare function MediaPlaybackRateButton({ rates, className, style, onClick, ...props }: MediaPlaybackRateButtonProps): react_jsx_runtime.JSX.Element;
156
+ /**
157
+ * Bar that reveals while the pointer is active, playback is paused,
158
+ * or keyboard focus is inside the player.
159
+ */
160
+ type MediaControlsProps = React.ComponentProps<"div">;
161
+ declare function MediaControls({ className, ...props }: MediaControlsProps): react_jsx_runtime.JSX.Element;
162
+ type MediaSurfaceProps = React.ComponentProps<"button"> & {
163
+ /** Seconds a double-tap on either half seeks by. 0 disables it. */
164
+ doubleTapSeek?: number;
165
+ /** Double-click with a mouse toggles fullscreen. */
166
+ doubleClickFullscreen?: boolean;
167
+ /** Classes for the "±10s" bubble shown after a double-tap seek. */
168
+ indicatorClassName?: string;
169
+ };
170
+ /**
171
+ * Full-bleed click target under the controls. Click toggles playback; on touch,
172
+ * the first tap reveals controls and a double-tap on either half seeks.
173
+ */
174
+ declare function MediaSurface({ className, doubleTapSeek, doubleClickFullscreen, indicatorClassName, onClick, onDoubleClick, onPointerDown, children, ...props }: MediaSurfaceProps): react_jsx_runtime.JSX.Element;
175
+ type MediaSeekProps = Omit<React.ComponentProps<"div">, "children"> & {
176
+ /** Seconds moved per arrow key press. */
177
+ step?: number;
178
+ /** Show a time tooltip while hovering. */
179
+ preview?: boolean;
180
+ previewClassName?: string;
181
+ };
182
+ declare function MediaSeek({ className, step, preview, previewClassName, ...props }: MediaSeekProps): react_jsx_runtime.JSX.Element;
183
+ type MediaVolumeProps = Omit<React.ComponentProps<"div">, "children"> & {
184
+ /** "vertical" fills from the bottom, for a slider in a popover. */
185
+ orientation?: "horizontal" | "vertical";
186
+ };
187
+ declare function MediaVolume({ orientation, className, ...props }: MediaVolumeProps): react_jsx_runtime.JSX.Element;
188
+ type MediaTimeProps = React.ComponentProps<"span"> & {
189
+ type?: "current" | "duration" | "remaining";
190
+ /** Click to show remaining time and back. "remaining" swaps with elapsed. */
191
+ toggle?: boolean;
192
+ };
193
+ declare function MediaTime({ type, toggle, className, ...props }: MediaTimeProps): react_jsx_runtime.JSX.Element;
194
+ type MediaLoadingProps = React.ComponentProps<"span">;
195
+ declare function MediaLoading({ className, ...props }: MediaLoadingProps): react_jsx_runtime.JSX.Element;
196
+ /**
197
+ * Renders active caption cues. Native rendering is disabled so cues can be
198
+ * styled and can slide above the controls when they appear.
199
+ */
200
+ type MediaCaptionsProps = React.ComponentProps<"div">;
201
+ declare function MediaCaptions({ className, ...props }: MediaCaptionsProps): react_jsx_runtime.JSX.Element | null;
202
+ declare function MediaCaptionsButton({ onClick, ...props }: MediaButtonProps): react_jsx_runtime.JSX.Element | null;
203
+ type MediaSettingsProps = Omit<React.ComponentProps<"div">, "children"> & {
204
+ rates?: number[];
205
+ /** Classes for the floating panel. */
206
+ panelClassName?: string;
207
+ };
208
+ /**
209
+ * Popover with playback speed and caption track choices. Arrow keys move
210
+ * between options; Escape or a click outside closes it.
211
+ */
212
+ declare function MediaSettings({ rates, className, panelClassName, ...props }: MediaSettingsProps): react_jsx_runtime.JSX.Element;
213
+ type MediaErrorMessageProps = Omit<React.ComponentProps<"div">, "children"> & {
214
+ /** Override the default message for a given MediaError. */
215
+ message?: (error: MediaError) => React.ReactNode;
216
+ };
217
+ declare function MediaErrorMessage({ className, message, ...props }: MediaErrorMessageProps): react_jsx_runtime.JSX.Element | null;
218
+
219
+ type VideoTrack = {
220
+ src: string;
221
+ label: string;
222
+ srcLang: string;
223
+ kind?: "captions" | "subtitles";
224
+ default?: boolean;
225
+ };
226
+ type VideoPlayerProps = Omit<React.ComponentProps<"video">, "controls"> & {
227
+ /** Classes for the outer frame. `className` targets the <video> element. */
228
+ frameClassName?: string;
229
+ /** WebVTT caption or subtitle files. */
230
+ tracks?: VideoTrack[];
231
+ /** Adapter for sources the browser can't play natively, e.g. HLS. */
232
+ loader?: MediaSourceLoader;
233
+ /** Shown in OS media controls and lock screens. */
234
+ metadata?: MediaInfo;
235
+ /** Remember volume, mute and speed under this localStorage key. */
236
+ persistKey?: string;
237
+ /** Small labels with shortcuts over the controls on hover and focus. On by default. */
238
+ tooltips?: boolean;
239
+ };
240
+ declare function VideoPlayer({ className, frameClassName, tracks, loader, metadata, persistKey, tooltips, children, crossOrigin, ...props }: VideoPlayerProps): react_jsx_runtime.JSX.Element;
241
+
242
+ type AudioPlayerProps = Omit<React.ComponentProps<"audio">, "controls" | "title"> & {
243
+ title?: React.ReactNode;
244
+ description?: React.ReactNode;
245
+ /** Cover image shown beside the controls and in OS media controls. */
246
+ artwork?: string;
247
+ /** Show a playback speed toggle. Useful for podcasts and voice notes. */
248
+ showSpeed?: boolean;
249
+ /** Small labels with shortcuts over the controls on hover and focus. On by default. */
250
+ tooltips?: boolean;
251
+ /** Classes for the outer frame. `className` targets the <audio> element. */
252
+ frameClassName?: string;
253
+ /** Adapter for sources the browser can't play natively, e.g. HLS. */
254
+ loader?: MediaSourceLoader;
255
+ /** Overrides metadata derived from `title`, `description` and `artwork`. */
256
+ metadata?: MediaInfo;
257
+ /** Remember volume, mute and speed under this localStorage key. */
258
+ persistKey?: string;
259
+ };
260
+ declare function AudioPlayer({ title, description, artwork, showSpeed, tooltips, className, frameClassName, loader, metadata, persistKey, ...props }: AudioPlayerProps): react_jsx_runtime.JSX.Element;
261
+
262
+ type MediaIconProps = React.ComponentProps<"svg">;
263
+ /**
264
+ * Optically centred: the filled area's centroid, not the bounding box, sits
265
+ * on the viewBox centre (x = 12), measured from the rendered shape. A
266
+ * box-centred triangle looks shifted right, because its weight is in the flat
267
+ * left side.
268
+ */
269
+ declare function PlayIcon(props: MediaIconProps): react_jsx_runtime.JSX.Element;
270
+ declare function PauseIcon(props: MediaIconProps): react_jsx_runtime.JSX.Element;
271
+ declare function VolumeIcon({ muted, ...props }: MediaIconProps & {
272
+ muted?: boolean;
273
+ }): react_jsx_runtime.JSX.Element;
274
+ declare function EnterFullscreenIcon(props: MediaIconProps): react_jsx_runtime.JSX.Element;
275
+ declare function ExitFullscreenIcon(props: MediaIconProps): react_jsx_runtime.JSX.Element;
276
+ declare function PictureInPictureIcon(props: MediaIconProps): react_jsx_runtime.JSX.Element;
277
+ /** Outlined when off; filled with knocked-out letters when on. */
278
+ declare function CaptionsIcon({ active, ...props }: MediaIconProps & {
279
+ active?: boolean;
280
+ }): react_jsx_runtime.JSX.Element;
281
+ declare function SettingsIcon(props: MediaIconProps): react_jsx_runtime.JSX.Element;
282
+ declare function RetryIcon(props: MediaIconProps): react_jsx_runtime.JSX.Element;
283
+ declare function CheckIcon(props: MediaIconProps): react_jsx_runtime.JSX.Element;
284
+ declare function SeekIcon({ direction, ...props }: MediaIconProps & {
285
+ direction: "back" | "forward";
286
+ }): react_jsx_runtime.JSX.Element;
287
+
288
+ export { AudioPlayer, CaptionsIcon, CheckIcon, EnterFullscreenIcon, ExitFullscreenIcon, MediaAudio, MediaButton, MediaCaptions, MediaCaptionsButton, MediaControls, MediaErrorMessage, MediaFullscreenButton, MediaLoading, MediaMuteButton, MediaPictureInPictureButton, MediaPlayButton, MediaPlaybackRateButton, MediaRoot, MediaSeek, MediaSettings, MediaSurface, MediaTime, MediaVideo, MediaVolume, PauseIcon, PictureInPictureIcon, PlayIcon, RetryIcon, SeekIcon, SettingsIcon, VideoPlayer, VolumeIcon, createMediaStore, describeMediaError, formatTime, useMedia, useMediaStore };
289
+ export type { AudioPlayerProps, MediaAudioProps, MediaButtonProps, MediaCaptionsProps, MediaControlsProps, MediaErrorMessageProps, MediaIconProps, MediaInfo, MediaLoadingProps, MediaPlaybackRateButtonProps, MediaRootProps, MediaSeekProps, MediaSettingsProps, MediaSourceLoader, MediaState, MediaStore, MediaStoreOptions, MediaSurfaceProps, MediaTextTrack, MediaTimeProps, MediaTooltipAlign, MediaVideoProps, MediaVolumeProps, VideoPlayerProps, VideoTrack };