@videojs/react 10.0.0-alpha.7 → 10.0.0-alpha.9
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/default/index.js +11 -7
- package/dist/default/media/hls-video/index.js +4 -3
- package/dist/default/media/hls-video/index.js.map +1 -1
- package/dist/default/player/create-player.js +3 -2
- package/dist/default/player/create-player.js.map +1 -1
- package/dist/default/presets/video/error-dialog.js +51 -0
- package/dist/default/presets/video/error-dialog.js.map +1 -0
- package/dist/default/presets/video/minimal-skin.css +18 -26
- package/dist/default/presets/video/minimal-skin.js +11 -30
- package/dist/default/presets/video/minimal-skin.js.map +1 -1
- package/dist/default/presets/video/minimal-skin.tailwind.js +10 -29
- package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/presets/video/skin.css +18 -25
- package/dist/default/presets/video/skin.js +11 -30
- package/dist/default/presets/video/skin.js.map +1 -1
- package/dist/default/presets/video/skin.tailwind.js +11 -30
- package/dist/default/presets/video/skin.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/video/default.tailwind.js +3 -3
- package/dist/default/skins/dist/default/video/default.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/video/minimal.tailwind.js +3 -3
- package/dist/default/skins/dist/default/video/minimal.tailwind.js.map +1 -1
- package/dist/default/ui/alert-dialog/alert-dialog-close.js +31 -0
- package/dist/default/ui/alert-dialog/alert-dialog-close.js.map +1 -0
- package/dist/default/ui/alert-dialog/alert-dialog-description.js +16 -0
- package/dist/default/ui/alert-dialog/alert-dialog-description.js.map +1 -0
- package/dist/default/ui/alert-dialog/alert-dialog-popup.js +32 -0
- package/dist/default/ui/alert-dialog/alert-dialog-popup.js.map +1 -0
- package/dist/default/ui/alert-dialog/alert-dialog-root.js +59 -0
- package/dist/default/ui/alert-dialog/alert-dialog-root.js.map +1 -0
- package/dist/default/ui/alert-dialog/alert-dialog-title.js +16 -0
- package/dist/default/ui/alert-dialog/alert-dialog-title.js.map +1 -0
- package/dist/default/ui/alert-dialog/context.js +16 -0
- package/dist/default/ui/alert-dialog/context.js.map +1 -0
- package/dist/default/ui/alert-dialog/index.js +4 -0
- package/dist/default/ui/alert-dialog/index.parts.js +19 -0
- package/dist/default/ui/alert-dialog/index.parts.js.map +1 -0
- package/dist/default/ui/captions-button/captions-button.js +10 -27
- package/dist/default/ui/captions-button/captions-button.js.map +1 -1
- package/dist/default/ui/create-context-part.js +7 -2
- package/dist/default/ui/create-context-part.js.map +1 -1
- package/dist/default/ui/hooks/use-slider.js +6 -17
- package/dist/default/ui/hooks/use-slider.js.map +1 -1
- package/dist/default/ui/popover/popover-arrow.js +1 -1
- package/dist/default/ui/popover/popover-popup.js +4 -2
- package/dist/default/ui/popover/popover-popup.js.map +1 -1
- package/dist/default/ui/popover/popover-root.js +3 -2
- package/dist/default/ui/popover/popover-root.js.map +1 -1
- package/dist/default/ui/popover/popover-trigger.js +4 -5
- package/dist/default/ui/popover/popover-trigger.js.map +1 -1
- package/dist/default/ui/slider/index.parts.js +4 -0
- package/dist/default/ui/slider/index.parts.js.map +1 -1
- package/dist/default/ui/slider/slider-preview.js +40 -0
- package/dist/default/ui/slider/slider-preview.js.map +1 -0
- package/dist/default/ui/slider/slider-thumbnail.js +20 -0
- package/dist/default/ui/slider/slider-thumbnail.js.map +1 -0
- package/dist/default/ui/thumbnail/thumbnail.js +3 -5
- package/dist/default/ui/thumbnail/thumbnail.js.map +1 -1
- package/dist/default/ui/time-slider/index.parts.js +2 -0
- package/dist/default/ui/time-slider/index.parts.js.map +1 -1
- package/dist/default/ui/tooltip/context.js +16 -0
- package/dist/default/ui/tooltip/context.js.map +1 -0
- package/dist/default/ui/tooltip/group-context.js +15 -0
- package/dist/default/ui/tooltip/group-context.js.map +1 -0
- package/dist/default/ui/tooltip/index.js +4 -0
- package/dist/default/ui/tooltip/index.parts.js +19 -0
- package/dist/default/ui/tooltip/index.parts.js.map +1 -0
- package/dist/default/ui/tooltip/tooltip-arrow.js +17 -0
- package/dist/default/ui/tooltip/tooltip-arrow.js.map +1 -0
- package/dist/default/ui/tooltip/tooltip-popup.js +97 -0
- package/dist/default/ui/tooltip/tooltip-popup.js.map +1 -0
- package/dist/default/ui/tooltip/tooltip-provider.js +28 -0
- package/dist/default/ui/tooltip/tooltip-provider.js.map +1 -0
- package/dist/default/ui/tooltip/tooltip-root.js +71 -0
- package/dist/default/ui/tooltip/tooltip-root.js.map +1 -0
- package/dist/default/ui/tooltip/tooltip-trigger.js +42 -0
- package/dist/default/ui/tooltip/tooltip-trigger.js.map +1 -0
- package/dist/default/ui/volume-slider/index.parts.js +2 -0
- package/dist/default/ui/volume-slider/index.parts.js.map +1 -1
- package/dist/default/ui/volume-slider/volume-slider-root.js +4 -4
- package/dist/default/ui/volume-slider/volume-slider-root.js.map +1 -1
- package/dist/default/utils/use-destroy.js +33 -0
- package/dist/default/utils/use-destroy.js.map +1 -0
- package/dist/dev/index.d.ts +15 -8
- package/dist/dev/index.js +11 -7
- package/dist/dev/media/hls-video/index.d.ts.map +1 -1
- package/dist/dev/media/hls-video/index.js +4 -3
- package/dist/dev/media/hls-video/index.js.map +1 -1
- package/dist/dev/player/create-player.d.ts.map +1 -1
- package/dist/dev/player/create-player.js +3 -2
- package/dist/dev/player/create-player.js.map +1 -1
- package/dist/dev/presets/video/error-dialog.js +51 -0
- package/dist/dev/presets/video/error-dialog.js.map +1 -0
- package/dist/dev/presets/video/minimal-skin.css +18 -26
- package/dist/dev/presets/video/minimal-skin.d.ts.map +1 -1
- package/dist/dev/presets/video/minimal-skin.js +11 -30
- package/dist/dev/presets/video/minimal-skin.js.map +1 -1
- package/dist/dev/presets/video/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/presets/video/minimal-skin.tailwind.js +10 -29
- package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/presets/video/skin.css +18 -25
- package/dist/dev/presets/video/skin.d.ts.map +1 -1
- package/dist/dev/presets/video/skin.js +11 -30
- package/dist/dev/presets/video/skin.js.map +1 -1
- package/dist/dev/presets/video/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/presets/video/skin.tailwind.js +11 -30
- package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
- package/dist/dev/skins/dist/default/video/default.tailwind.js +3 -3
- package/dist/dev/skins/dist/default/video/default.tailwind.js.map +1 -1
- package/dist/dev/skins/dist/default/video/minimal.tailwind.js +3 -3
- package/dist/dev/skins/dist/default/video/minimal.tailwind.js.map +1 -1
- package/dist/dev/ui/alert-dialog/alert-dialog-close.d.ts +14 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-close.d.ts.map +1 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-close.js +31 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-close.js.map +1 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-description.d.ts +14 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-description.d.ts.map +1 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-description.js +16 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-description.js.map +1 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-popup.d.ts +14 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-popup.d.ts.map +1 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-popup.js +32 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-popup.js.map +1 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-root.d.ts +24 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-root.d.ts.map +1 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-root.js +59 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-root.js.map +1 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-title.d.ts +14 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-title.d.ts.map +1 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-title.js +16 -0
- package/dist/dev/ui/alert-dialog/alert-dialog-title.js.map +1 -0
- package/dist/dev/ui/alert-dialog/context.d.ts +15 -0
- package/dist/dev/ui/alert-dialog/context.d.ts.map +1 -0
- package/dist/dev/ui/alert-dialog/context.js +16 -0
- package/dist/dev/ui/alert-dialog/context.js.map +1 -0
- package/dist/dev/ui/alert-dialog/index.d.ts +3 -0
- package/dist/dev/ui/alert-dialog/index.js +4 -0
- package/dist/dev/ui/alert-dialog/index.parts.d.ts +13 -0
- package/dist/dev/ui/alert-dialog/index.parts.d.ts.map +1 -0
- package/dist/dev/ui/alert-dialog/index.parts.js +19 -0
- package/dist/dev/ui/alert-dialog/index.parts.js.map +1 -0
- package/dist/dev/ui/captions-button/captions-button.d.ts +6 -27
- package/dist/dev/ui/captions-button/captions-button.d.ts.map +1 -1
- package/dist/dev/ui/captions-button/captions-button.js +10 -27
- package/dist/dev/ui/captions-button/captions-button.js.map +1 -1
- package/dist/dev/ui/captions-button/index.d.ts +2 -2
- package/dist/dev/ui/create-context-part.js +7 -2
- package/dist/dev/ui/create-context-part.js.map +1 -1
- package/dist/dev/ui/hooks/use-slider.d.ts.map +1 -1
- package/dist/dev/ui/hooks/use-slider.js +6 -17
- package/dist/dev/ui/hooks/use-slider.js.map +1 -1
- package/dist/dev/ui/popover/popover-arrow.js +1 -1
- package/dist/dev/ui/popover/popover-popup.d.ts.map +1 -1
- package/dist/dev/ui/popover/popover-popup.js +4 -2
- package/dist/dev/ui/popover/popover-popup.js.map +1 -1
- package/dist/dev/ui/popover/popover-root.d.ts.map +1 -1
- package/dist/dev/ui/popover/popover-root.js +3 -2
- package/dist/dev/ui/popover/popover-root.js.map +1 -1
- package/dist/dev/ui/popover/popover-trigger.js +4 -5
- package/dist/dev/ui/popover/popover-trigger.js.map +1 -1
- package/dist/dev/ui/slider/index.parts.d.ts +3 -1
- package/dist/dev/ui/slider/index.parts.js +4 -0
- package/dist/dev/ui/slider/index.parts.js.map +1 -1
- package/dist/dev/ui/slider/slider-preview.d.ts +18 -0
- package/dist/dev/ui/slider/slider-preview.d.ts.map +1 -0
- package/dist/dev/ui/slider/slider-preview.js +40 -0
- package/dist/dev/ui/slider/slider-preview.js.map +1 -0
- package/dist/dev/ui/slider/slider-thumbnail.d.ts +14 -0
- package/dist/dev/ui/slider/slider-thumbnail.d.ts.map +1 -0
- package/dist/dev/ui/slider/slider-thumbnail.js +20 -0
- package/dist/dev/ui/slider/slider-thumbnail.js.map +1 -0
- package/dist/dev/ui/thumbnail/thumbnail.d.ts.map +1 -1
- package/dist/dev/ui/thumbnail/thumbnail.js +3 -5
- package/dist/dev/ui/thumbnail/thumbnail.js.map +1 -1
- package/dist/dev/ui/time-slider/index.parts.d.ts +2 -1
- package/dist/dev/ui/time-slider/index.parts.js +2 -0
- package/dist/dev/ui/time-slider/index.parts.js.map +1 -1
- package/dist/dev/ui/tooltip/context.d.ts +17 -0
- package/dist/dev/ui/tooltip/context.d.ts.map +1 -0
- package/dist/dev/ui/tooltip/context.js +16 -0
- package/dist/dev/ui/tooltip/context.js.map +1 -0
- package/dist/dev/ui/tooltip/group-context.js +15 -0
- package/dist/dev/ui/tooltip/group-context.js.map +1 -0
- package/dist/dev/ui/tooltip/index.d.ts +3 -0
- package/dist/dev/ui/tooltip/index.js +4 -0
- package/dist/dev/ui/tooltip/index.parts.d.ts +13 -0
- package/dist/dev/ui/tooltip/index.parts.d.ts.map +1 -0
- package/dist/dev/ui/tooltip/index.parts.js +19 -0
- package/dist/dev/ui/tooltip/index.parts.js.map +1 -0
- package/dist/dev/ui/tooltip/tooltip-arrow.d.ts +15 -0
- package/dist/dev/ui/tooltip/tooltip-arrow.d.ts.map +1 -0
- package/dist/dev/ui/tooltip/tooltip-arrow.js +17 -0
- package/dist/dev/ui/tooltip/tooltip-arrow.js.map +1 -0
- package/dist/dev/ui/tooltip/tooltip-popup.d.ts +15 -0
- package/dist/dev/ui/tooltip/tooltip-popup.d.ts.map +1 -0
- package/dist/dev/ui/tooltip/tooltip-popup.js +97 -0
- package/dist/dev/ui/tooltip/tooltip-popup.js.map +1 -0
- package/dist/dev/ui/tooltip/tooltip-provider.d.ts +19 -0
- package/dist/dev/ui/tooltip/tooltip-provider.d.ts.map +1 -0
- package/dist/dev/ui/tooltip/tooltip-provider.js +28 -0
- package/dist/dev/ui/tooltip/tooltip-provider.js.map +1 -0
- package/dist/dev/ui/tooltip/tooltip-root.d.ts +30 -0
- package/dist/dev/ui/tooltip/tooltip-root.d.ts.map +1 -0
- package/dist/dev/ui/tooltip/tooltip-root.js +71 -0
- package/dist/dev/ui/tooltip/tooltip-root.js.map +1 -0
- package/dist/dev/ui/tooltip/tooltip-trigger.d.ts +15 -0
- package/dist/dev/ui/tooltip/tooltip-trigger.d.ts.map +1 -0
- package/dist/dev/ui/tooltip/tooltip-trigger.js +42 -0
- package/dist/dev/ui/tooltip/tooltip-trigger.js.map +1 -0
- package/dist/dev/ui/volume-slider/index.parts.d.ts +2 -1
- package/dist/dev/ui/volume-slider/index.parts.js +2 -0
- package/dist/dev/ui/volume-slider/index.parts.js.map +1 -1
- package/dist/dev/ui/volume-slider/volume-slider-root.js +4 -4
- package/dist/dev/ui/volume-slider/volume-slider-root.js.map +1 -1
- package/dist/dev/utils/use-destroy.js +33 -0
- package/dist/dev/utils/use-destroy.js.map +1 -0
- package/package.json +37 -10
- package/dist/default/ui/error-dialog/error-dialog.js +0 -54
- package/dist/default/ui/error-dialog/error-dialog.js.map +0 -1
- package/dist/default/ui/error-dialog/index.js +0 -3
- package/dist/dev/ui/error-dialog/error-dialog.d.ts +0 -35
- package/dist/dev/ui/error-dialog/error-dialog.d.ts.map +0 -1
- package/dist/dev/ui/error-dialog/error-dialog.js +0 -54
- package/dist/dev/ui/error-dialog/error-dialog.js.map +0 -1
- package/dist/dev/ui/error-dialog/index.d.ts +0 -2
- package/dist/dev/ui/error-dialog/index.js +0 -3
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { UIComponentProps } from "../../utils/types.js";
|
|
2
|
+
import * as react from "react";
|
|
3
|
+
import { TooltipState } from "@videojs/core";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/tooltip/tooltip-popup.d.ts
|
|
6
|
+
interface TooltipPopupProps extends UIComponentProps<'div', TooltipState> {}
|
|
7
|
+
/** Container for the tooltip content. Positioned relative to the trigger using CSS anchor positioning with a JavaScript fallback. */
|
|
8
|
+
declare const TooltipPopup: react.ForwardRefExoticComponent<Omit<TooltipPopupProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
|
|
9
|
+
declare namespace TooltipPopup {
|
|
10
|
+
type Props = TooltipPopupProps;
|
|
11
|
+
type State = TooltipState;
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { TooltipPopup, TooltipPopupProps };
|
|
15
|
+
//# sourceMappingURL=tooltip-popup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-popup.d.ts","names":[],"sources":["../../../../src/ui/tooltip/tooltip-popup.tsx"],"mappings":";;;;;UAciB,iBAAA,SAA0B,gBAAA,QAAwB,YAAA;;cAKtD,YAAA,EAAY,KAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,iBAAA,WAAA,KAAA,CAAA,aAAA,CAAA,cAAA;AAAA,kBA6HR,YAAA;EAAA,KACH,KAAA,GAAQ,iBAAA;EAAA,KACR,KAAA,GAAQ,YAAA;AAAA"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useComposedRefs } from "../../utils/use-composed-refs.js";
|
|
4
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
5
|
+
import { useTooltipContext } from "./context.js";
|
|
6
|
+
import { getAnchorPositionStyle, resolveOffsets } from "@videojs/core/dom";
|
|
7
|
+
import { forwardRef, useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
8
|
+
import { TooltipCSSVars } from "@videojs/core";
|
|
9
|
+
import { supportsAnchorPositioning } from "@videojs/utils/dom";
|
|
10
|
+
|
|
11
|
+
//#region src/ui/tooltip/tooltip-popup.tsx
|
|
12
|
+
const POPUP_RESET = {
|
|
13
|
+
position: "fixed",
|
|
14
|
+
inset: "auto",
|
|
15
|
+
margin: 0
|
|
16
|
+
};
|
|
17
|
+
/** Container for the tooltip content. Positioned relative to the trigger using CSS anchor positioning with a JavaScript fallback. */
|
|
18
|
+
const TooltipPopup = forwardRef(function TooltipPopup({ render, className, style, ...elementProps }, forwardedRef) {
|
|
19
|
+
const { core, tooltip, state, stateAttrMap, anchorName, popupId } = useTooltipContext();
|
|
20
|
+
const internalRef = useRef(null);
|
|
21
|
+
const composedRef = useComposedRefs(forwardedRef, useCallback((el) => {
|
|
22
|
+
tooltip.setPopupElement(el);
|
|
23
|
+
if (el && supportsAnchorPositioning()) el.style.setProperty("position-anchor", `--${anchorName}`);
|
|
24
|
+
}, [tooltip, anchorName]), internalRef);
|
|
25
|
+
const posOpts = useMemo(() => ({
|
|
26
|
+
side: state.side,
|
|
27
|
+
align: state.align
|
|
28
|
+
}), [state.side, state.align]);
|
|
29
|
+
const anchorStyle = useMemo(() => {
|
|
30
|
+
if (!supportsAnchorPositioning()) return null;
|
|
31
|
+
const { positionAnchor: _, ...rest } = getAnchorPositionStyle(anchorName, posOpts, void 0, void 0, void 0, void 0, TooltipCSSVars);
|
|
32
|
+
return rest;
|
|
33
|
+
}, [anchorName, posOpts]);
|
|
34
|
+
const [manualStyle, setManualStyle] = useState(null);
|
|
35
|
+
useLayoutEffect(() => {
|
|
36
|
+
if (supportsAnchorPositioning()) return;
|
|
37
|
+
if (!state.open) {
|
|
38
|
+
setManualStyle(null);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
function measure() {
|
|
42
|
+
const triggerEl = tooltip.triggerElement;
|
|
43
|
+
const popupEl = internalRef.current;
|
|
44
|
+
if (!triggerEl || !popupEl) return;
|
|
45
|
+
setManualStyle(getAnchorPositionStyle(anchorName, posOpts, triggerEl.getBoundingClientRect(), popupEl.getBoundingClientRect(), document.documentElement.getBoundingClientRect(), resolveOffsets(popupEl, TooltipCSSVars), TooltipCSSVars));
|
|
46
|
+
}
|
|
47
|
+
measure();
|
|
48
|
+
let rafId = 0;
|
|
49
|
+
function reposition() {
|
|
50
|
+
cancelAnimationFrame(rafId);
|
|
51
|
+
rafId = requestAnimationFrame(measure);
|
|
52
|
+
}
|
|
53
|
+
window.addEventListener("scroll", reposition, {
|
|
54
|
+
capture: true,
|
|
55
|
+
passive: true
|
|
56
|
+
});
|
|
57
|
+
window.addEventListener("resize", reposition);
|
|
58
|
+
return () => {
|
|
59
|
+
cancelAnimationFrame(rafId);
|
|
60
|
+
window.removeEventListener("scroll", reposition, true);
|
|
61
|
+
window.removeEventListener("resize", reposition);
|
|
62
|
+
};
|
|
63
|
+
}, [
|
|
64
|
+
state.open,
|
|
65
|
+
anchorName,
|
|
66
|
+
posOpts,
|
|
67
|
+
tooltip
|
|
68
|
+
]);
|
|
69
|
+
const positioningStyle = anchorStyle ?? manualStyle ?? POPUP_RESET;
|
|
70
|
+
if (!state.open) return null;
|
|
71
|
+
const { onFocusOut, ...restPopupProps } = tooltip.popupProps;
|
|
72
|
+
return renderElement("div", {
|
|
73
|
+
render,
|
|
74
|
+
className,
|
|
75
|
+
style
|
|
76
|
+
}, {
|
|
77
|
+
state,
|
|
78
|
+
stateAttrMap,
|
|
79
|
+
ref: composedRef,
|
|
80
|
+
props: [
|
|
81
|
+
{
|
|
82
|
+
id: popupId,
|
|
83
|
+
style: positioningStyle,
|
|
84
|
+
...core.getPopupAttrs(state)
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
...restPopupProps,
|
|
88
|
+
onBlur: onFocusOut
|
|
89
|
+
},
|
|
90
|
+
elementProps
|
|
91
|
+
]
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
//#endregion
|
|
96
|
+
export { TooltipPopup };
|
|
97
|
+
//# sourceMappingURL=tooltip-popup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-popup.js","names":[],"sources":["../../../../src/ui/tooltip/tooltip-popup.tsx"],"sourcesContent":["'use client';\n\nimport type { TooltipState } from '@videojs/core';\nimport { TooltipCSSVars } from '@videojs/core';\nimport { getAnchorPositionStyle, resolveOffsets } from '@videojs/core/dom';\nimport { supportsAnchorPositioning } from '@videojs/utils/dom';\nimport type { CSSProperties } from 'react';\nimport { forwardRef, useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { useComposedRefs } from '../../utils/use-composed-refs';\nimport { renderElement } from '../../utils/use-render';\nimport { useTooltipContext } from './context';\n\nexport interface TooltipPopupProps extends UIComponentProps<'div', TooltipState> {}\n\nconst POPUP_RESET: CSSProperties = { position: 'fixed', inset: 'auto', margin: 0 };\n\n/** Container for the tooltip content. Positioned relative to the trigger using CSS anchor positioning with a JavaScript fallback. */\nexport const TooltipPopup = forwardRef<HTMLDivElement, TooltipPopupProps>(function TooltipPopup(\n { render, className, style, ...elementProps },\n forwardedRef\n) {\n const { core, tooltip, state, stateAttrMap, anchorName, popupId } = useTooltipContext();\n const internalRef = useRef<HTMLDivElement>(null);\n\n const popupRef = useCallback(\n (el: HTMLDivElement | null) => {\n tooltip.setPopupElement(el);\n if (el && supportsAnchorPositioning()) {\n el.style.setProperty('position-anchor', `--${anchorName}`);\n }\n },\n [tooltip, anchorName]\n );\n\n const composedRef = useComposedRefs(forwardedRef, popupRef, internalRef);\n\n // --- Positioning ---\n\n const posOpts = useMemo(() => ({ side: state.side, align: state.align }), [state.side, state.align]);\n\n // CSS Anchor Positioning — computed from state, no measurement needed.\n // `position-anchor` is set imperatively in the ref callback above\n // because React's style prop silently drops unrecognised CSS properties.\n const anchorStyle = useMemo(() => {\n if (!supportsAnchorPositioning()) return null;\n const { positionAnchor: _, ...rest } = getAnchorPositionStyle(\n anchorName,\n posOpts,\n undefined,\n undefined,\n undefined,\n undefined,\n TooltipCSSVars\n );\n return rest as CSSProperties;\n }, [anchorName, posOpts]);\n\n // Manual fallback — measure rects after layout, before paint.\n const [manualStyle, setManualStyle] = useState<CSSProperties | null>(null);\n\n useLayoutEffect(() => {\n if (supportsAnchorPositioning()) return;\n if (!state.open) {\n setManualStyle(null);\n return;\n }\n\n function measure(): void {\n const triggerEl = tooltip.triggerElement;\n const popupEl = internalRef.current;\n if (!triggerEl || !popupEl) return;\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const popupRect = popupEl.getBoundingClientRect();\n const boundaryRect = document.documentElement.getBoundingClientRect();\n const offsets = resolveOffsets(popupEl, TooltipCSSVars);\n\n setManualStyle(\n getAnchorPositionStyle(\n anchorName,\n posOpts,\n triggerRect,\n popupRect,\n boundaryRect,\n offsets,\n TooltipCSSVars\n ) as CSSProperties\n );\n }\n\n measure();\n\n // Recompute on scroll/resize so the tooltip tracks its trigger.\n let rafId = 0;\n function reposition(): void {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(measure);\n }\n\n window.addEventListener('scroll', reposition, { capture: true, passive: true });\n window.addEventListener('resize', reposition);\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }, [state.open, anchorName, posOpts, tooltip]);\n\n // Anchor path uses computed styles; manual path uses measured styles;\n // fallback resets UA [popover] defaults until positioning is computed.\n const positioningStyle = anchorStyle ?? manualStyle ?? POPUP_RESET;\n\n // --- Visibility ---\n\n if (!state.open) {\n return null;\n }\n\n // Remap DOM focus events to React synthetic event names.\n const { onFocusOut, ...restPopupProps } = tooltip.popupProps;\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap,\n ref: composedRef,\n props: [\n {\n id: popupId,\n style: positioningStyle,\n ...core.getPopupAttrs(state),\n },\n { ...restPopupProps, onBlur: onFocusOut },\n elementProps,\n ],\n }\n );\n});\n\nexport namespace TooltipPopup {\n export type Props = TooltipPopupProps;\n export type State = TooltipState;\n}\n"],"mappings":";;;;;;;;;;;AAgBA,MAAM,cAA6B;CAAE,UAAU;CAAS,OAAO;CAAQ,QAAQ;CAAG;;AAGlF,MAAa,eAAe,WAA8C,SAAS,aACjF,EAAE,QAAQ,WAAW,OAAO,GAAG,gBAC/B,cACA;CACA,MAAM,EAAE,MAAM,SAAS,OAAO,cAAc,YAAY,YAAY,mBAAmB;CACvF,MAAM,cAAc,OAAuB,KAAK;CAYhD,MAAM,cAAc,gBAAgB,cAVnB,aACd,OAA8B;AAC7B,UAAQ,gBAAgB,GAAG;AAC3B,MAAI,MAAM,2BAA2B,CACnC,IAAG,MAAM,YAAY,mBAAmB,KAAK,aAAa;IAG9D,CAAC,SAAS,WAAW,CACtB,EAE2D,YAAY;CAIxE,MAAM,UAAU,eAAe;EAAE,MAAM,MAAM;EAAM,OAAO,MAAM;EAAO,GAAG,CAAC,MAAM,MAAM,MAAM,MAAM,CAAC;CAKpG,MAAM,cAAc,cAAc;AAChC,MAAI,CAAC,2BAA2B,CAAE,QAAO;EACzC,MAAM,EAAE,gBAAgB,GAAG,GAAG,SAAS,uBACrC,YACA,SACA,QACA,QACA,QACA,QACA,eACD;AACD,SAAO;IACN,CAAC,YAAY,QAAQ,CAAC;CAGzB,MAAM,CAAC,aAAa,kBAAkB,SAA+B,KAAK;AAE1E,uBAAsB;AACpB,MAAI,2BAA2B,CAAE;AACjC,MAAI,CAAC,MAAM,MAAM;AACf,kBAAe,KAAK;AACpB;;EAGF,SAAS,UAAgB;GACvB,MAAM,YAAY,QAAQ;GAC1B,MAAM,UAAU,YAAY;AAC5B,OAAI,CAAC,aAAa,CAAC,QAAS;AAO5B,kBACE,uBACE,YACA,SARgB,UAAU,uBAAuB,EACnC,QAAQ,uBAAuB,EAC5B,SAAS,gBAAgB,uBAAuB,EACrD,eAAe,SAAS,eAAe,EAUnD,eACD,CACF;;AAGH,WAAS;EAGT,IAAI,QAAQ;EACZ,SAAS,aAAmB;AAC1B,wBAAqB,MAAM;AAC3B,WAAQ,sBAAsB,QAAQ;;AAGxC,SAAO,iBAAiB,UAAU,YAAY;GAAE,SAAS;GAAM,SAAS;GAAM,CAAC;AAC/E,SAAO,iBAAiB,UAAU,WAAW;AAE7C,eAAa;AACX,wBAAqB,MAAM;AAC3B,UAAO,oBAAoB,UAAU,YAAY,KAAK;AACtD,UAAO,oBAAoB,UAAU,WAAW;;IAEjD;EAAC,MAAM;EAAM;EAAY;EAAS;EAAQ,CAAC;CAI9C,MAAM,mBAAmB,eAAe,eAAe;AAIvD,KAAI,CAAC,MAAM,KACT,QAAO;CAIT,MAAM,EAAE,YAAY,GAAG,mBAAmB,QAAQ;AAElD,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA;EACA,KAAK;EACL,OAAO;GACL;IACE,IAAI;IACJ,OAAO;IACP,GAAG,KAAK,cAAc,MAAM;IAC7B;GACD;IAAE,GAAG;IAAgB,QAAQ;IAAY;GACzC;GACD;EACF,CACF;EACD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { TooltipGroupProps } from "@videojs/core";
|
|
3
|
+
|
|
4
|
+
//#region src/ui/tooltip/tooltip-provider.d.ts
|
|
5
|
+
interface TooltipProviderProps extends TooltipGroupProps {
|
|
6
|
+
children?: ReactNode;
|
|
7
|
+
}
|
|
8
|
+
declare function TooltipProvider({
|
|
9
|
+
delay,
|
|
10
|
+
closeDelay,
|
|
11
|
+
timeout,
|
|
12
|
+
children
|
|
13
|
+
}: TooltipProviderProps): ReactNode;
|
|
14
|
+
declare namespace TooltipProvider {
|
|
15
|
+
type Props = TooltipProviderProps;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { TooltipProvider, TooltipProviderProps };
|
|
19
|
+
//# sourceMappingURL=tooltip-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-provider.d.ts","names":[],"sources":["../../../../src/ui/tooltip/tooltip-provider.tsx"],"mappings":";;;;UAQiB,oBAAA,SAA6B,iBAAA;EAC5C,QAAA,GAAW,SAAA;AAAA;AAAA,iBAGG,eAAA,CAAA;EAAkB,KAAA;EAAO,UAAA;EAAY,OAAA;EAAS;AAAA,GAAY,oBAAA,GAAuB,SAAA;AAAA,kBAOhF,eAAA;EAAA,KACH,KAAA,GAAQ,oBAAA;AAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { TooltipGroupContextProvider } from "./group-context.js";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
import { TooltipGroupCore } from "@videojs/core";
|
|
7
|
+
|
|
8
|
+
//#region src/ui/tooltip/tooltip-provider.tsx
|
|
9
|
+
function TooltipProvider({ delay, closeDelay, timeout, children }) {
|
|
10
|
+
const [group] = useState(() => new TooltipGroupCore({
|
|
11
|
+
delay,
|
|
12
|
+
closeDelay,
|
|
13
|
+
timeout
|
|
14
|
+
}));
|
|
15
|
+
group.setProps({
|
|
16
|
+
delay,
|
|
17
|
+
closeDelay,
|
|
18
|
+
timeout
|
|
19
|
+
});
|
|
20
|
+
return /* @__PURE__ */ jsx(TooltipGroupContextProvider, {
|
|
21
|
+
value: { group },
|
|
22
|
+
children
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//#endregion
|
|
27
|
+
export { TooltipProvider };
|
|
28
|
+
//# sourceMappingURL=tooltip-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-provider.js","names":[],"sources":["../../../../src/ui/tooltip/tooltip-provider.tsx"],"sourcesContent":["'use client';\n\nimport { TooltipGroupCore, type TooltipGroupProps } from '@videojs/core';\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\n\nimport { TooltipGroupContextProvider } from './group-context';\n\nexport interface TooltipProviderProps extends TooltipGroupProps {\n children?: ReactNode;\n}\n\nexport function TooltipProvider({ delay, closeDelay, timeout, children }: TooltipProviderProps): ReactNode {\n const [group] = useState(() => new TooltipGroupCore({ delay, closeDelay, timeout }));\n group.setProps({ delay, closeDelay, timeout });\n\n return <TooltipGroupContextProvider value={{ group }}>{children}</TooltipGroupContextProvider>;\n}\n\nexport namespace TooltipProvider {\n export type Props = TooltipProviderProps;\n}\n"],"mappings":";;;;;;;;AAYA,SAAgB,gBAAgB,EAAE,OAAO,YAAY,SAAS,YAA6C;CACzG,MAAM,CAAC,SAAS,eAAe,IAAI,iBAAiB;EAAE;EAAO;EAAY;EAAS,CAAC,CAAC;AACpF,OAAM,SAAS;EAAE;EAAO;EAAY;EAAS,CAAC;AAE9C,QAAO,oBAAC;EAA4B,OAAO,EAAE,OAAO;EAAG;GAAuC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { TooltipChangeDetails } from "@videojs/core/dom";
|
|
2
|
+
import { ReactNode } from "react";
|
|
3
|
+
import { TooltipProps } from "@videojs/core";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/tooltip/tooltip-root.d.ts
|
|
6
|
+
interface TooltipRootProps extends TooltipProps {
|
|
7
|
+
/** Called when the tooltip open state changes (fires immediately, before animations). */
|
|
8
|
+
onOpenChange?: (open: boolean, details: TooltipChangeDetails) => void;
|
|
9
|
+
/** Called after open/close animations complete. */
|
|
10
|
+
onOpenChangeComplete?: (open: boolean) => void;
|
|
11
|
+
children?: ReactNode;
|
|
12
|
+
}
|
|
13
|
+
declare function TooltipRoot({
|
|
14
|
+
open: controlledOpen,
|
|
15
|
+
defaultOpen,
|
|
16
|
+
onOpenChange: onOpenChangeProp,
|
|
17
|
+
onOpenChangeComplete: onOpenChangeCompleteProp,
|
|
18
|
+
delay,
|
|
19
|
+
closeDelay,
|
|
20
|
+
disableHoverablePopup,
|
|
21
|
+
disabled,
|
|
22
|
+
children,
|
|
23
|
+
...coreProps
|
|
24
|
+
}: TooltipRootProps): ReactNode;
|
|
25
|
+
declare namespace TooltipRoot {
|
|
26
|
+
type Props = TooltipRootProps;
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { TooltipRoot, TooltipRootProps };
|
|
30
|
+
//# sourceMappingURL=tooltip-root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-root.d.ts","names":[],"sources":["../../../../src/ui/tooltip/tooltip-root.tsx"],"mappings":";;;;;UAaiB,gBAAA,SAAyB,YAAA;;EAExC,YAAA,IAAgB,IAAA,WAAe,OAAA,EAAS,oBAAA;EAFR;EAIhC,oBAAA,IAAwB,IAAA;EACxB,QAAA,GAAW,SAAA;AAAA;AAAA,iBAGG,WAAA,CAAA;EACd,IAAA,EAAM,cAAA;EACN,WAAA;EACA,YAAA,EAAc,gBAAA;EACd,oBAAA,EAAsB,wBAAA;EACtB,KAAA;EACA,UAAA;EACA,qBAAA;EACA,QAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,gBAAA,GAAmB,SAAA;AAAA,kBAyEL,WAAA;EAAA,KACH,KAAA,GAAQ,gBAAA;AAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useLatestRef } from "../../utils/use-latest-ref.js";
|
|
4
|
+
import { useSafeId } from "../../utils/use-safe-id.js";
|
|
5
|
+
import { TooltipContextProvider } from "./context.js";
|
|
6
|
+
import { useTooltipGroup } from "./group-context.js";
|
|
7
|
+
import { createTooltip, createTransition } from "@videojs/core/dom";
|
|
8
|
+
import { useSnapshot } from "@videojs/store/react";
|
|
9
|
+
import { useEffect, useState } from "react";
|
|
10
|
+
import { jsx } from "react/jsx-runtime";
|
|
11
|
+
import { TooltipCore, TooltipDataAttrs } from "@videojs/core";
|
|
12
|
+
|
|
13
|
+
//#region src/ui/tooltip/tooltip-root.tsx
|
|
14
|
+
function TooltipRoot({ open: controlledOpen, defaultOpen = TooltipCore.defaultProps.defaultOpen, onOpenChange: onOpenChangeProp, onOpenChangeComplete: onOpenChangeCompleteProp, delay = TooltipCore.defaultProps.delay, closeDelay = TooltipCore.defaultProps.closeDelay, disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup, disabled = TooltipCore.defaultProps.disabled, children, ...coreProps }) {
|
|
15
|
+
const [core] = useState(() => new TooltipCore(coreProps));
|
|
16
|
+
core.setProps(coreProps);
|
|
17
|
+
const isControlled = controlledOpen !== void 0;
|
|
18
|
+
const groupFromContext = useTooltipGroup();
|
|
19
|
+
const onOpenChangeRef = useLatestRef(onOpenChangeProp);
|
|
20
|
+
const onOpenChangeCompleteRef = useLatestRef(onOpenChangeCompleteProp);
|
|
21
|
+
const delayRef = useLatestRef(delay);
|
|
22
|
+
const closeDelayRef = useLatestRef(closeDelay);
|
|
23
|
+
const disableHoverablePopupRef = useLatestRef(disableHoverablePopup);
|
|
24
|
+
const disabledRef = useLatestRef(disabled);
|
|
25
|
+
const groupRef = useLatestRef(groupFromContext);
|
|
26
|
+
const [tooltip] = useState(() => {
|
|
27
|
+
const instance = createTooltip({
|
|
28
|
+
transition: createTransition(),
|
|
29
|
+
onOpenChange: (nextOpen, details) => {
|
|
30
|
+
onOpenChangeRef.current?.(nextOpen, details);
|
|
31
|
+
},
|
|
32
|
+
onOpenChangeComplete: (nextOpen) => {
|
|
33
|
+
onOpenChangeCompleteRef.current?.(nextOpen);
|
|
34
|
+
},
|
|
35
|
+
delay: () => delayRef.current,
|
|
36
|
+
closeDelay: () => closeDelayRef.current,
|
|
37
|
+
disableHoverablePopup: () => disableHoverablePopupRef.current,
|
|
38
|
+
disabled: () => disabledRef.current,
|
|
39
|
+
group: () => groupRef.current
|
|
40
|
+
});
|
|
41
|
+
if (!isControlled && defaultOpen) instance.open();
|
|
42
|
+
return instance;
|
|
43
|
+
});
|
|
44
|
+
const anchorName = useSafeId();
|
|
45
|
+
const popupId = useSafeId("tooltip-");
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (controlledOpen === void 0) return;
|
|
48
|
+
const { active: inputOpen } = tooltip.input.current;
|
|
49
|
+
if (controlledOpen === inputOpen) return;
|
|
50
|
+
if (controlledOpen) tooltip.open();
|
|
51
|
+
else tooltip.close();
|
|
52
|
+
}, [controlledOpen, tooltip]);
|
|
53
|
+
useEffect(() => () => tooltip.destroy(), [tooltip]);
|
|
54
|
+
const input = useSnapshot(tooltip.input);
|
|
55
|
+
core.setInput(input);
|
|
56
|
+
return /* @__PURE__ */ jsx(TooltipContextProvider, {
|
|
57
|
+
value: {
|
|
58
|
+
core,
|
|
59
|
+
tooltip,
|
|
60
|
+
state: core.getState(),
|
|
61
|
+
stateAttrMap: TooltipDataAttrs,
|
|
62
|
+
anchorName,
|
|
63
|
+
popupId
|
|
64
|
+
},
|
|
65
|
+
children
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//#endregion
|
|
70
|
+
export { TooltipRoot };
|
|
71
|
+
//# sourceMappingURL=tooltip-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-root.js","names":[],"sources":["../../../../src/ui/tooltip/tooltip-root.tsx"],"sourcesContent":["'use client';\n\nimport { type TooltipProps as CoreTooltipProps, TooltipCore, TooltipDataAttrs } from '@videojs/core';\nimport { createTooltip, createTransition, type TooltipChangeDetails } from '@videojs/core/dom';\nimport { useSnapshot } from '@videojs/store/react';\nimport type { ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\n\nimport { useLatestRef } from '../../utils/use-latest-ref';\nimport { useSafeId } from '../../utils/use-safe-id';\nimport { TooltipContextProvider } from './context';\nimport { useTooltipGroup } from './group-context';\n\nexport interface TooltipRootProps extends CoreTooltipProps {\n /** Called when the tooltip open state changes (fires immediately, before animations). */\n onOpenChange?: (open: boolean, details: TooltipChangeDetails) => void;\n /** Called after open/close animations complete. */\n onOpenChangeComplete?: (open: boolean) => void;\n children?: ReactNode;\n}\n\nexport function TooltipRoot({\n open: controlledOpen,\n defaultOpen = TooltipCore.defaultProps.defaultOpen,\n onOpenChange: onOpenChangeProp,\n onOpenChangeComplete: onOpenChangeCompleteProp,\n delay = TooltipCore.defaultProps.delay,\n closeDelay = TooltipCore.defaultProps.closeDelay,\n disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup,\n disabled = TooltipCore.defaultProps.disabled,\n children,\n ...coreProps\n}: TooltipRootProps): ReactNode {\n const [core] = useState(() => new TooltipCore(coreProps));\n core.setProps(coreProps);\n\n const isControlled = controlledOpen !== undefined;\n\n const groupFromContext = useTooltipGroup();\n\n // Keep refs that always point to the latest values so the\n // createTooltip closure never reads stale props.\n const onOpenChangeRef = useLatestRef(onOpenChangeProp);\n const onOpenChangeCompleteRef = useLatestRef(onOpenChangeCompleteProp);\n const delayRef = useLatestRef(delay);\n const closeDelayRef = useLatestRef(closeDelay);\n const disableHoverablePopupRef = useLatestRef(disableHoverablePopup);\n const disabledRef = useLatestRef(disabled);\n const groupRef = useLatestRef(groupFromContext);\n\n const [tooltip] = useState(() => {\n const instance = createTooltip({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: TooltipChangeDetails) => {\n onOpenChangeRef.current?.(nextOpen, details);\n },\n onOpenChangeComplete: (nextOpen: boolean) => {\n onOpenChangeCompleteRef.current?.(nextOpen);\n },\n delay: () => delayRef.current,\n closeDelay: () => closeDelayRef.current,\n disableHoverablePopup: () => disableHoverablePopupRef.current,\n disabled: () => disabledRef.current,\n group: () => groupRef.current,\n });\n\n // Apply defaultOpen on creation (uncontrolled only)\n if (!isControlled && defaultOpen) {\n instance.open();\n }\n\n return instance;\n });\n\n const anchorName = useSafeId();\n const popupId = useSafeId('tooltip-');\n\n // Sync controlled open prop -> internal input state.\n useEffect(() => {\n if (controlledOpen === undefined) return;\n\n const { active: inputOpen } = tooltip.input.current;\n if (controlledOpen === inputOpen) return;\n\n if (controlledOpen) {\n tooltip.open();\n } else {\n tooltip.close();\n }\n }, [controlledOpen, tooltip]);\n\n // Cleanup on unmount\n useEffect(() => () => tooltip.destroy(), [tooltip]);\n\n const input = useSnapshot(tooltip.input);\n core.setInput(input);\n const state = core.getState();\n\n return (\n <TooltipContextProvider value={{ core, tooltip, state, stateAttrMap: TooltipDataAttrs, anchorName, popupId }}>\n {children}\n </TooltipContextProvider>\n );\n}\n\nexport namespace TooltipRoot {\n export type Props = TooltipRootProps;\n}\n"],"mappings":";;;;;;;;;;;;;AAqBA,SAAgB,YAAY,EAC1B,MAAM,gBACN,cAAc,YAAY,aAAa,aACvC,cAAc,kBACd,sBAAsB,0BACtB,QAAQ,YAAY,aAAa,OACjC,aAAa,YAAY,aAAa,YACtC,wBAAwB,YAAY,aAAa,uBACjD,WAAW,YAAY,aAAa,UACpC,UACA,GAAG,aAC2B;CAC9B,MAAM,CAAC,QAAQ,eAAe,IAAI,YAAY,UAAU,CAAC;AACzD,MAAK,SAAS,UAAU;CAExB,MAAM,eAAe,mBAAmB;CAExC,MAAM,mBAAmB,iBAAiB;CAI1C,MAAM,kBAAkB,aAAa,iBAAiB;CACtD,MAAM,0BAA0B,aAAa,yBAAyB;CACtE,MAAM,WAAW,aAAa,MAAM;CACpC,MAAM,gBAAgB,aAAa,WAAW;CAC9C,MAAM,2BAA2B,aAAa,sBAAsB;CACpE,MAAM,cAAc,aAAa,SAAS;CAC1C,MAAM,WAAW,aAAa,iBAAiB;CAE/C,MAAM,CAAC,WAAW,eAAe;EAC/B,MAAM,WAAW,cAAc;GAC7B,YAAY,kBAAkB;GAC9B,eAAe,UAAmB,YAAkC;AAClE,oBAAgB,UAAU,UAAU,QAAQ;;GAE9C,uBAAuB,aAAsB;AAC3C,4BAAwB,UAAU,SAAS;;GAE7C,aAAa,SAAS;GACtB,kBAAkB,cAAc;GAChC,6BAA6B,yBAAyB;GACtD,gBAAgB,YAAY;GAC5B,aAAa,SAAS;GACvB,CAAC;AAGF,MAAI,CAAC,gBAAgB,YACnB,UAAS,MAAM;AAGjB,SAAO;GACP;CAEF,MAAM,aAAa,WAAW;CAC9B,MAAM,UAAU,UAAU,WAAW;AAGrC,iBAAgB;AACd,MAAI,mBAAmB,OAAW;EAElC,MAAM,EAAE,QAAQ,cAAc,QAAQ,MAAM;AAC5C,MAAI,mBAAmB,UAAW;AAElC,MAAI,eACF,SAAQ,MAAM;MAEd,SAAQ,OAAO;IAEhB,CAAC,gBAAgB,QAAQ,CAAC;AAG7B,uBAAsB,QAAQ,SAAS,EAAE,CAAC,QAAQ,CAAC;CAEnD,MAAM,QAAQ,YAAY,QAAQ,MAAM;AACxC,MAAK,SAAS,MAAM;AAGpB,QACE,oBAAC;EAAuB,OAAO;GAAE;GAAM;GAAS,OAHpC,KAAK,UAAU;GAG4B,cAAc;GAAkB;GAAY;GAAS;EACzG;GACsB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { UIComponentProps } from "../../utils/types.js";
|
|
2
|
+
import * as react from "react";
|
|
3
|
+
import { TooltipState } from "@videojs/core";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/tooltip/tooltip-trigger.d.ts
|
|
6
|
+
interface TooltipTriggerProps extends UIComponentProps<'button', TooltipState> {}
|
|
7
|
+
/** Element that triggers the tooltip on hover and focus. Renders a `<button>` element. */
|
|
8
|
+
declare const TooltipTrigger: react.ForwardRefExoticComponent<Omit<TooltipTriggerProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
|
|
9
|
+
declare namespace TooltipTrigger {
|
|
10
|
+
type Props = TooltipTriggerProps;
|
|
11
|
+
type State = TooltipState;
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { TooltipTrigger, TooltipTriggerProps };
|
|
15
|
+
//# sourceMappingURL=tooltip-trigger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-trigger.d.ts","names":[],"sources":["../../../../src/ui/tooltip/tooltip-trigger.tsx"],"mappings":";;;;;UAUiB,mBAAA,SAA4B,gBAAA,WAA2B,YAAA;;cAG3D,cAAA,EAAc,KAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,mBAAA,WAAA,KAAA,CAAA,aAAA,CAAA,iBAAA;AAAA,kBAwCV,cAAA;EAAA,KACH,KAAA,GAAQ,mBAAA;EAAA,KACR,KAAA,GAAQ,YAAA;AAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
4
|
+
import { useTooltipContext } from "./context.js";
|
|
5
|
+
import { forwardRef, useCallback } from "react";
|
|
6
|
+
import { supportsAnchorPositioning } from "@videojs/utils/dom";
|
|
7
|
+
|
|
8
|
+
//#region src/ui/tooltip/tooltip-trigger.tsx
|
|
9
|
+
/** Element that triggers the tooltip on hover and focus. Renders a `<button>` element. */
|
|
10
|
+
const TooltipTrigger = forwardRef(function TooltipTrigger({ render, className, style, ...elementProps }, forwardedRef) {
|
|
11
|
+
const { core, tooltip, state, stateAttrMap, anchorName, popupId } = useTooltipContext();
|
|
12
|
+
const triggerRef = useCallback((el) => {
|
|
13
|
+
tooltip.setTriggerElement(el);
|
|
14
|
+
if (el && supportsAnchorPositioning()) el.style.setProperty("anchor-name", `--${anchorName}`);
|
|
15
|
+
}, [tooltip, anchorName]);
|
|
16
|
+
const { onFocusIn, onFocusOut, ...restTriggerProps } = tooltip.triggerProps;
|
|
17
|
+
return renderElement("button", {
|
|
18
|
+
render,
|
|
19
|
+
className,
|
|
20
|
+
style
|
|
21
|
+
}, {
|
|
22
|
+
state,
|
|
23
|
+
stateAttrMap,
|
|
24
|
+
ref: [forwardedRef, triggerRef],
|
|
25
|
+
props: [
|
|
26
|
+
{
|
|
27
|
+
type: "button",
|
|
28
|
+
...core.getTriggerAttrs(state, popupId)
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
...restTriggerProps,
|
|
32
|
+
onFocus: onFocusIn,
|
|
33
|
+
onBlur: onFocusOut
|
|
34
|
+
},
|
|
35
|
+
elementProps
|
|
36
|
+
]
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
//#endregion
|
|
41
|
+
export { TooltipTrigger };
|
|
42
|
+
//# sourceMappingURL=tooltip-trigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-trigger.js","names":[],"sources":["../../../../src/ui/tooltip/tooltip-trigger.tsx"],"sourcesContent":["'use client';\n\nimport type { TooltipState } from '@videojs/core';\nimport { supportsAnchorPositioning } from '@videojs/utils/dom';\nimport { forwardRef, useCallback } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { useTooltipContext } from './context';\n\nexport interface TooltipTriggerProps extends UIComponentProps<'button', TooltipState> {}\n\n/** Element that triggers the tooltip on hover and focus. Renders a `<button>` element. */\nexport const TooltipTrigger = forwardRef<HTMLButtonElement, TooltipTriggerProps>(function TooltipTrigger(\n { render, className, style, ...elementProps },\n forwardedRef\n) {\n const { core, tooltip, state, stateAttrMap, anchorName, popupId } = useTooltipContext();\n\n const triggerRef = useCallback(\n (el: HTMLButtonElement | null) => {\n tooltip.setTriggerElement(el);\n if (el && supportsAnchorPositioning()) {\n el.style.setProperty('anchor-name', `--${anchorName}`);\n }\n },\n [tooltip, anchorName]\n );\n\n // Remap DOM focus events to React synthetic event names.\n // createTooltip() uses onFocusIn/onFocusOut (matching DOM focusin/focusout),\n // but React maps those to onFocus/onBlur.\n const { onFocusIn, onFocusOut, ...restTriggerProps } = tooltip.triggerProps;\n\n return renderElement(\n 'button',\n { render, className, style },\n {\n state,\n stateAttrMap,\n ref: [forwardedRef, triggerRef],\n props: [\n {\n type: 'button' as const,\n ...core.getTriggerAttrs(state, popupId),\n },\n { ...restTriggerProps, onFocus: onFocusIn, onBlur: onFocusOut },\n elementProps,\n ],\n }\n );\n});\n\nexport namespace TooltipTrigger {\n export type Props = TooltipTriggerProps;\n export type State = TooltipState;\n}\n"],"mappings":";;;;;;;;;AAaA,MAAa,iBAAiB,WAAmD,SAAS,eACxF,EAAE,QAAQ,WAAW,OAAO,GAAG,gBAC/B,cACA;CACA,MAAM,EAAE,MAAM,SAAS,OAAO,cAAc,YAAY,YAAY,mBAAmB;CAEvF,MAAM,aAAa,aAChB,OAAiC;AAChC,UAAQ,kBAAkB,GAAG;AAC7B,MAAI,MAAM,2BAA2B,CACnC,IAAG,MAAM,YAAY,eAAe,KAAK,aAAa;IAG1D,CAAC,SAAS,WAAW,CACtB;CAKD,MAAM,EAAE,WAAW,YAAY,GAAG,qBAAqB,QAAQ;AAE/D,QAAO,cACL,UACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA;EACA,KAAK,CAAC,cAAc,WAAW;EAC/B,OAAO;GACL;IACE,MAAM;IACN,GAAG,KAAK,gBAAgB,OAAO,QAAQ;IACxC;GACD;IAAE,GAAG;IAAkB,SAAS;IAAW,QAAQ;IAAY;GAC/D;GACD;EACF,CACF;EACD"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SliderFill, SliderFillProps } from "../slider/slider-fill.js";
|
|
2
|
+
import { SliderPreview, SliderPreviewProps } from "../slider/slider-preview.js";
|
|
2
3
|
import { SliderThumb, SliderThumbProps } from "../slider/slider-thumb.js";
|
|
3
4
|
import { SliderTrack, SliderTrackProps } from "../slider/slider-track.js";
|
|
4
5
|
import { SliderValue, SliderValueProps } from "../slider/slider-value.js";
|
|
@@ -7,7 +8,7 @@ import { VolumeSliderRoot, VolumeSliderRootProps } from "./volume-slider-root.js
|
|
|
7
8
|
|
|
8
9
|
//#region src/ui/volume-slider/index.parts.d.ts
|
|
9
10
|
declare namespace index_parts_d_exports {
|
|
10
|
-
export { SliderFill as Fill, SliderFillProps as FillProps, VolumeSliderRoot as Root, VolumeSliderRootProps as RootProps, SliderThumb as Thumb, SliderThumbProps as ThumbProps, SliderTrack as Track, SliderTrackProps as TrackProps, SliderValue as Value, SliderValueProps as ValueProps };
|
|
11
|
+
export { SliderFill as Fill, SliderFillProps as FillProps, SliderPreview as Preview, SliderPreviewProps as PreviewProps, VolumeSliderRoot as Root, VolumeSliderRootProps as RootProps, SliderThumb as Thumb, SliderThumbProps as ThumbProps, SliderTrack as Track, SliderTrackProps as TrackProps, SliderValue as Value, SliderValueProps as ValueProps };
|
|
11
12
|
}
|
|
12
13
|
//#endregion
|
|
13
14
|
export { index_parts_d_exports };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { SliderFill } from "../slider/slider-fill.js";
|
|
3
|
+
import { SliderPreview } from "../slider/slider-preview.js";
|
|
3
4
|
import { SliderThumb } from "../slider/slider-thumb.js";
|
|
4
5
|
import { SliderTrack } from "../slider/slider-track.js";
|
|
5
6
|
import { SliderValue } from "../slider/slider-value.js";
|
|
@@ -8,6 +9,7 @@ import { VolumeSliderRoot } from "./volume-slider-root.js";
|
|
|
8
9
|
//#region src/ui/volume-slider/index.parts.ts
|
|
9
10
|
var index_parts_exports = /* @__PURE__ */ __exportAll({
|
|
10
11
|
Fill: () => SliderFill,
|
|
12
|
+
Preview: () => SliderPreview,
|
|
11
13
|
Root: () => VolumeSliderRoot,
|
|
12
14
|
Thumb: () => SliderThumb,
|
|
13
15
|
Track: () => SliderTrack,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.parts.js","names":[],"sources":["../../../../src/ui/volume-slider/index.parts.ts"],"sourcesContent":["export {\n Fill,\n type FillProps,\n Thumb,\n type ThumbProps,\n Track,\n type TrackProps,\n Value,\n type ValueProps,\n} from '../slider/index.parts';\nexport { VolumeSliderRoot as Root, type VolumeSliderRootProps as RootProps } from './volume-slider-root';\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.parts.js","names":[],"sources":["../../../../src/ui/volume-slider/index.parts.ts"],"sourcesContent":["export {\n Fill,\n type FillProps,\n Preview,\n type PreviewProps,\n Thumb,\n type ThumbProps,\n Track,\n type TrackProps,\n Value,\n type ValueProps,\n} from '../slider/index.parts';\nexport { VolumeSliderRoot as Root, type VolumeSliderRootProps as RootProps } from './volume-slider-root';\n"],"mappings":""}
|
|
@@ -15,8 +15,8 @@ const noopVolume = {
|
|
|
15
15
|
volume: 0,
|
|
16
16
|
muted: false,
|
|
17
17
|
volumeAvailability: "unsupported",
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
setVolume: () => 0,
|
|
19
|
+
toggleMuted: () => false
|
|
20
20
|
};
|
|
21
21
|
const VolumeSliderRoot = forwardRef(function VolumeSliderRoot(componentProps, forwardedRef) {
|
|
22
22
|
const { render, className, style, label, orientation, step = VolumeSliderCore.defaultProps.step, largeStep = VolumeSliderCore.defaultProps.largeStep, disabled, thumbAlignment, onDragStart, onDragEnd, ...elementProps } = componentProps;
|
|
@@ -45,10 +45,10 @@ const VolumeSliderRoot = forwardRef(function VolumeSliderRoot(componentProps, fo
|
|
|
45
45
|
adjustPercent: (rawPercent, thumbSize, trackSize) => core.adjustPercentForAlignment(rawPercent, thumbSize, trackSize),
|
|
46
46
|
getCSSVars: getSliderCSSVars,
|
|
47
47
|
onValueChange: (percent) => {
|
|
48
|
-
volumeRef.current?.
|
|
48
|
+
volumeRef.current?.setVolume(percent / 100);
|
|
49
49
|
},
|
|
50
50
|
onValueCommit: (percent) => {
|
|
51
|
-
volumeRef.current?.
|
|
51
|
+
volumeRef.current?.setVolume(percent / 100);
|
|
52
52
|
},
|
|
53
53
|
onDragStart,
|
|
54
54
|
onDragEnd
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"volume-slider-root.js","names":[],"sources":["../../../../src/ui/volume-slider/volume-slider-root.tsx"],"sourcesContent":["'use client';\n\nimport { SliderDataAttrs, VolumeSliderCore } from '@videojs/core';\nimport { getSliderCSSVars, logMissingFeature, selectVolume } from '@videojs/core/dom';\nimport { forwardRef, useState } from 'react';\n\nimport { usePlayer } from '../../player/context';\nimport type { UIComponentProps } from '../../utils/types';\nimport { useLatestRef } from '../../utils/use-latest-ref';\nimport { renderElement } from '../../utils/use-render';\nimport { useSlider } from '../hooks/use-slider';\nimport { SliderProvider } from '../slider/context';\n\nconst noopVolume = {\n volume: 0,\n muted: false,\n volumeAvailability: 'unsupported' as const,\n
|
|
1
|
+
{"version":3,"file":"volume-slider-root.js","names":[],"sources":["../../../../src/ui/volume-slider/volume-slider-root.tsx"],"sourcesContent":["'use client';\n\nimport { SliderDataAttrs, VolumeSliderCore } from '@videojs/core';\nimport { getSliderCSSVars, logMissingFeature, selectVolume } from '@videojs/core/dom';\nimport { forwardRef, useState } from 'react';\n\nimport { usePlayer } from '../../player/context';\nimport type { UIComponentProps } from '../../utils/types';\nimport { useLatestRef } from '../../utils/use-latest-ref';\nimport { renderElement } from '../../utils/use-render';\nimport { useSlider } from '../hooks/use-slider';\nimport { SliderProvider } from '../slider/context';\n\nconst noopVolume = {\n volume: 0,\n muted: false,\n volumeAvailability: 'unsupported' as const,\n setVolume: () => 0,\n toggleMuted: () => false,\n};\n\nexport interface VolumeSliderRootProps extends UIComponentProps<'div', VolumeSliderCore.State>, VolumeSliderCore.Props {\n onDragStart?: (() => void) | undefined;\n onDragEnd?: (() => void) | undefined;\n}\n\nexport const VolumeSliderRoot = forwardRef<HTMLDivElement, VolumeSliderRootProps>(\n function VolumeSliderRoot(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n label,\n orientation,\n step = VolumeSliderCore.defaultProps.step,\n largeStep = VolumeSliderCore.defaultProps.largeStep,\n disabled,\n thumbAlignment,\n onDragStart,\n onDragEnd,\n ...elementProps\n } = componentProps;\n\n const volume = usePlayer(selectVolume);\n\n const [core] = useState(() => new VolumeSliderCore());\n core.setProps({ label, orientation, step, largeStep, disabled, thumbAlignment });\n\n // Keep a ref to the latest volume state for callbacks.\n const volumeRef = useLatestRef(volume);\n\n const { state, cssVars, rootRef, thumbRef, rootProps, thumbProps } = useSlider<VolumeSliderCore.State>({\n computeState: (input) => {\n core.setInput(input);\n core.setMedia(volume ?? noopVolume);\n return core.getState();\n },\n getPercent: () => (volume ? volume.volume * 100 : 0),\n getStepPercent: () => core.getStepPercent(),\n getLargeStepPercent: () => core.getLargeStepPercent(),\n orientation,\n disabled,\n adjustPercent: (rawPercent, thumbSize, trackSize) =>\n core.adjustPercentForAlignment(rawPercent, thumbSize, trackSize),\n getCSSVars: getSliderCSSVars,\n onValueChange: (percent) => {\n volumeRef.current?.setVolume(percent / 100);\n },\n onValueCommit: (percent) => {\n volumeRef.current?.setVolume(percent / 100);\n },\n onDragStart,\n onDragEnd,\n });\n\n if (!volume) {\n if (__DEV__) logMissingFeature('VolumeSlider', 'volume');\n return null;\n }\n\n return (\n <SliderProvider\n value={{\n state,\n pointerValue: core.valueFromPercent(state.pointerPercent),\n thumbRef,\n thumbProps,\n stateAttrMap: SliderDataAttrs,\n getAttrs: (sliderState) => core.getAttrs(sliderState as VolumeSliderCore.State),\n formatValue: (value) => `${Math.round(value)}%`,\n }}\n >\n {renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: SliderDataAttrs,\n ref: [forwardedRef, rootRef],\n props: [{ style: cssVars }, rootProps, elementProps],\n }\n )}\n </SliderProvider>\n );\n }\n);\n\nexport namespace VolumeSliderRoot {\n export type Props = VolumeSliderRootProps;\n export type State = VolumeSliderCore.State;\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,MAAM,aAAa;CACjB,QAAQ;CACR,OAAO;CACP,oBAAoB;CACpB,iBAAiB;CACjB,mBAAmB;CACpB;AAOD,MAAa,mBAAmB,WAC9B,SAAS,iBAAiB,gBAAgB,cAAc;CACtD,MAAM,EACJ,QACA,WACA,OACA,OACA,aACA,OAAO,iBAAiB,aAAa,MACrC,YAAY,iBAAiB,aAAa,WAC1C,UACA,gBACA,aACA,WACA,GAAG,iBACD;CAEJ,MAAM,SAAS,UAAU,aAAa;CAEtC,MAAM,CAAC,QAAQ,eAAe,IAAI,kBAAkB,CAAC;AACrD,MAAK,SAAS;EAAE;EAAO;EAAa;EAAM;EAAW;EAAU;EAAgB,CAAC;CAGhF,MAAM,YAAY,aAAa,OAAO;CAEtC,MAAM,EAAE,OAAO,SAAS,SAAS,UAAU,WAAW,eAAe,UAAkC;EACrG,eAAe,UAAU;AACvB,QAAK,SAAS,MAAM;AACpB,QAAK,SAAS,UAAU,WAAW;AACnC,UAAO,KAAK,UAAU;;EAExB,kBAAmB,SAAS,OAAO,SAAS,MAAM;EAClD,sBAAsB,KAAK,gBAAgB;EAC3C,2BAA2B,KAAK,qBAAqB;EACrD;EACA;EACA,gBAAgB,YAAY,WAAW,cACrC,KAAK,0BAA0B,YAAY,WAAW,UAAU;EAClE,YAAY;EACZ,gBAAgB,YAAY;AAC1B,aAAU,SAAS,UAAU,UAAU,IAAI;;EAE7C,gBAAgB,YAAY;AAC1B,aAAU,SAAS,UAAU,UAAU,IAAI;;EAE7C;EACA;EACD,CAAC;AAEF,KAAI,CAAC,QAAQ;AACE,oBAAkB,gBAAgB,SAAS;AACxD,SAAO;;AAGT,QACE,oBAAC;EACC,OAAO;GACL;GACA,cAAc,KAAK,iBAAiB,MAAM,eAAe;GACzD;GACA;GACA,cAAc;GACd,WAAW,gBAAgB,KAAK,SAAS,YAAsC;GAC/E,cAAc,UAAU,GAAG,KAAK,MAAM,MAAM,CAAC;GAC9C;YAEA,cACC,OACA;GAAE;GAAQ;GAAW;GAAO,EAC5B;GACE;GACA,cAAc;GACd,KAAK,CAAC,cAAc,QAAQ;GAC5B,OAAO;IAAC,EAAE,OAAO,SAAS;IAAE;IAAW;IAAa;GACrD,CACF;GACc;EAGtB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/utils/use-destroy.ts
|
|
6
|
+
/**
|
|
7
|
+
* Destroy an instance on unmount, deferring destruction to survive React
|
|
8
|
+
* StrictMode's simulated unmount/re-mount cycle.
|
|
9
|
+
*
|
|
10
|
+
* StrictMode runs effects, then immediately runs cleanup, then re-runs
|
|
11
|
+
* effects — all synchronously. By deferring `destroy()` to a macrotask,
|
|
12
|
+
* the re-mount effect can cancel it before it fires.
|
|
13
|
+
*
|
|
14
|
+
* @param instance - Object with a `destroy()` method.
|
|
15
|
+
* @param setup - Optional setup called on first mount. Skipped on StrictMode
|
|
16
|
+
* re-mount since the previous setup was never torn down.
|
|
17
|
+
*/
|
|
18
|
+
function useDestroy(instance, setup) {
|
|
19
|
+
const pendingRef = useRef(null);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (pendingRef.current !== null) {
|
|
22
|
+
clearTimeout(pendingRef.current);
|
|
23
|
+
pendingRef.current = null;
|
|
24
|
+
} else setup?.();
|
|
25
|
+
return () => {
|
|
26
|
+
pendingRef.current = setTimeout(() => instance.destroy(), 0);
|
|
27
|
+
};
|
|
28
|
+
}, [instance, setup]);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { useDestroy };
|
|
33
|
+
//# sourceMappingURL=use-destroy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-destroy.js","names":[],"sources":["../../../src/utils/use-destroy.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\n\ninterface Destroyable {\n destroy(): void;\n}\n\n/**\n * Destroy an instance on unmount, deferring destruction to survive React\n * StrictMode's simulated unmount/re-mount cycle.\n *\n * StrictMode runs effects, then immediately runs cleanup, then re-runs\n * effects — all synchronously. By deferring `destroy()` to a macrotask,\n * the re-mount effect can cancel it before it fires.\n *\n * @param instance - Object with a `destroy()` method.\n * @param setup - Optional setup called on first mount. Skipped on StrictMode\n * re-mount since the previous setup was never torn down.\n */\nexport function useDestroy(instance: Destroyable, setup?: () => void): void {\n const pendingRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (pendingRef.current !== null) {\n clearTimeout(pendingRef.current);\n pendingRef.current = null;\n } else {\n setup?.();\n }\n\n return () => {\n pendingRef.current = setTimeout(() => instance.destroy(), 0);\n };\n }, [instance, setup]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,SAAgB,WAAW,UAAuB,OAA0B;CAC1E,MAAM,aAAa,OAA6C,KAAK;AAErE,iBAAgB;AACd,MAAI,WAAW,YAAY,MAAM;AAC/B,gBAAa,WAAW,QAAQ;AAChC,cAAW,UAAU;QAErB,UAAS;AAGX,eAAa;AACX,cAAW,UAAU,iBAAiB,SAAS,SAAS,EAAE,EAAE;;IAE7D,CAAC,UAAU,MAAM,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@videojs/react",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "10.0.0-alpha.
|
|
4
|
+
"version": "10.0.0-alpha.9",
|
|
5
5
|
"description": "React library for building media players",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"repository": {
|
|
@@ -27,20 +27,47 @@
|
|
|
27
27
|
"development": "./dist/dev/media/*/index.js",
|
|
28
28
|
"default": "./dist/default/media/*/index.js"
|
|
29
29
|
},
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
|
|
30
|
+
"./video": {
|
|
31
|
+
"types": "./dist/dev/presets/video/index.d.ts",
|
|
32
|
+
"development": "./dist/dev/presets/video/index.js",
|
|
33
|
+
"default": "./dist/default/presets/video/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./video/*.css": "./dist/default/presets/video/*.css",
|
|
36
|
+
"./video/*": {
|
|
37
|
+
"types": "./dist/dev/presets/video/*.d.ts",
|
|
38
|
+
"development": "./dist/dev/presets/video/*.js",
|
|
39
|
+
"default": "./dist/default/presets/video/*.js"
|
|
40
|
+
},
|
|
41
|
+
"./audio": {
|
|
42
|
+
"types": "./dist/dev/presets/audio/index.d.ts",
|
|
43
|
+
"development": "./dist/dev/presets/audio/index.js",
|
|
44
|
+
"default": "./dist/default/presets/audio/index.js"
|
|
45
|
+
},
|
|
46
|
+
"./audio/*.css": "./dist/default/presets/audio/*.css",
|
|
47
|
+
"./audio/*": {
|
|
48
|
+
"types": "./dist/dev/presets/audio/*.d.ts",
|
|
49
|
+
"development": "./dist/dev/presets/audio/*.js",
|
|
50
|
+
"default": "./dist/default/presets/audio/*.js"
|
|
51
|
+
},
|
|
52
|
+
"./background": {
|
|
53
|
+
"types": "./dist/dev/presets/background/index.d.ts",
|
|
54
|
+
"development": "./dist/dev/presets/background/index.js",
|
|
55
|
+
"default": "./dist/default/presets/background/index.js"
|
|
56
|
+
},
|
|
57
|
+
"./background/*.css": "./dist/default/presets/background/*.css",
|
|
58
|
+
"./background/*": {
|
|
59
|
+
"types": "./dist/dev/presets/background/*.d.ts",
|
|
60
|
+
"development": "./dist/dev/presets/background/*.js",
|
|
61
|
+
"default": "./dist/default/presets/background/*.js"
|
|
35
62
|
}
|
|
36
63
|
},
|
|
37
64
|
"peerDependencies": {
|
|
38
65
|
"react": ">=16.8.0"
|
|
39
66
|
},
|
|
40
67
|
"dependencies": {
|
|
41
|
-
"@videojs/core": "10.0.0-alpha.
|
|
42
|
-
"@videojs/
|
|
43
|
-
"@videojs/
|
|
68
|
+
"@videojs/core": "10.0.0-alpha.9",
|
|
69
|
+
"@videojs/utils": "10.0.0-alpha.9",
|
|
70
|
+
"@videojs/store": "10.0.0-alpha.9"
|
|
44
71
|
},
|
|
45
72
|
"devDependencies": {
|
|
46
73
|
"@testing-library/react": "^16.3.0",
|
|
@@ -52,7 +79,7 @@
|
|
|
52
79
|
"typescript": "^5.9.3",
|
|
53
80
|
"vitest": "^3.2.4",
|
|
54
81
|
"@videojs/skins": "10.0.0-alpha.4",
|
|
55
|
-
"@videojs/icons": "10.0.0-alpha.
|
|
82
|
+
"@videojs/icons": "10.0.0-alpha.9"
|
|
56
83
|
},
|
|
57
84
|
"publishConfig": {
|
|
58
85
|
"access": "public"
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { renderElement } from "../../utils/use-render.js";
|
|
4
|
-
import { forwardRef, useEffect, useRef, useState } from "react";
|
|
5
|
-
|
|
6
|
-
//#region src/ui/error-dialog/error-dialog.tsx
|
|
7
|
-
/**
|
|
8
|
-
* Displays an error dialog when media playback encounters an error.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```tsx
|
|
12
|
-
* <ErrorDialog />
|
|
13
|
-
*
|
|
14
|
-
* <ErrorDialog
|
|
15
|
-
* render={(props, state) => (
|
|
16
|
-
* <div {...props}>Something went wrong</div>
|
|
17
|
-
* )}
|
|
18
|
-
* />
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
|
-
const ErrorDialog = forwardRef(function ErrorDialog(componentProps, forwardedRef) {
|
|
22
|
-
const { render, className, style, ...elementProps } = componentProps;
|
|
23
|
-
const dialogRef = useRef(null);
|
|
24
|
-
const [hasError, setHasError] = useState(false);
|
|
25
|
-
useEffect(() => {
|
|
26
|
-
const handle = setTimeout(() => {}, 2e3);
|
|
27
|
-
return () => clearTimeout(handle);
|
|
28
|
-
}, []);
|
|
29
|
-
useEffect(() => {
|
|
30
|
-
if (!hasError) return;
|
|
31
|
-
requestAnimationFrame(() => {
|
|
32
|
-
dialogRef.current?.focus();
|
|
33
|
-
});
|
|
34
|
-
}, [hasError]);
|
|
35
|
-
return renderElement("div", {
|
|
36
|
-
render,
|
|
37
|
-
className,
|
|
38
|
-
style
|
|
39
|
-
}, {
|
|
40
|
-
state: {
|
|
41
|
-
visible: hasError,
|
|
42
|
-
onDismiss: () => setHasError(false)
|
|
43
|
-
},
|
|
44
|
-
ref: [forwardedRef, dialogRef],
|
|
45
|
-
props: [{
|
|
46
|
-
role: "alertdialog",
|
|
47
|
-
tabIndex: -1
|
|
48
|
-
}, elementProps]
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
//#endregion
|
|
53
|
-
export { ErrorDialog };
|
|
54
|
-
//# sourceMappingURL=error-dialog.js.map
|