@homecode/ui 5.4.1 → 5.6.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/esm/index.js +2 -0
- package/dist/esm/src/components/Autocomplete/Autocomplete.js +4 -2
- package/dist/esm/src/components/Gallery/Gallery.js +5 -6
- package/dist/esm/src/components/Gallery/Gallery.styl.js +1 -1
- package/dist/esm/src/components/GridLayout/GridLayout.js +15 -0
- package/dist/esm/src/components/GridLayout/GridLayout.styl.js +7 -0
- package/dist/esm/src/components/Icon/icons/index.js +2 -0
- package/dist/esm/src/components/Icon/icons/volume.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/volumeOff.svg.js +15 -0
- package/dist/esm/src/components/InputFile/InputFile.js +4 -2
- package/dist/esm/src/components/Slider/Slider.js +53 -10
- package/dist/esm/src/components/Slider/Slider.styl.js +2 -2
- package/dist/esm/src/components/Tabs/Tabs.js +3 -1
- package/dist/esm/src/components/VideoPlayer/VideoPlayer.helpers.js +82 -0
- package/dist/esm/src/components/VideoPlayer/VideoPlayer.js +348 -0
- package/dist/esm/src/components/VideoPlayer/VideoPlayer.styl.js +7 -0
- package/dist/esm/types/src/components/AssistiveText/AssistiveText.d.ts +1 -1
- package/dist/esm/types/src/components/Autocomplete/Autocomplete.d.ts +1 -1
- package/dist/esm/types/src/components/Button/Button.d.ts +1 -1
- package/dist/esm/types/src/components/ButtonGroup/ButtonGroup.d.ts +1 -1
- package/dist/esm/types/src/components/Calendar/Calendar.d.ts +1 -1
- package/dist/esm/types/src/components/Card/Card.d.ts +7 -7
- package/dist/esm/types/src/components/Chip/Chip.d.ts +1 -1
- package/dist/esm/types/src/components/DatePicker/DatePicker.d.ts +1 -1
- package/dist/esm/types/src/components/DatePickerInput/DatePickerInput.d.ts +1 -1
- package/dist/esm/types/src/components/DateTime/DateTime.d.ts +1 -1
- package/dist/esm/types/src/components/Dialogue/Dialogue.d.ts +1 -1
- package/dist/esm/types/src/components/Draggable/Draggable.d.ts +1 -1
- package/dist/esm/types/src/components/DropZone/DropZone.d.ts +1 -1
- package/dist/esm/types/src/components/Expand/Expand.d.ts +1 -1
- package/dist/esm/types/src/components/Flex/Flex.d.ts +1 -1
- package/dist/esm/types/src/components/Form/Form.d.ts +1 -1
- package/dist/esm/types/src/components/Form/SubmitButtons/SubmitButtons.d.ts +1 -1
- package/dist/esm/types/src/components/Gallery/Dots/Dots.d.ts +1 -1
- package/dist/esm/types/src/components/Gallery/Gallery.d.ts +1 -1
- package/dist/esm/types/src/components/GridLayout/GridLayout.d.ts +3 -0
- package/dist/esm/types/src/components/GridLayout/GridLayout.types.d.ts +8 -0
- package/dist/esm/types/src/components/Icon/Icon.d.ts +1 -1
- package/dist/esm/types/src/components/Icon/Icon.example.d.ts +1 -1
- package/dist/esm/types/src/components/Icon/icons/index.d.ts +2 -0
- package/dist/esm/types/src/components/InputFile/InputFile.d.ts +3 -3
- package/dist/esm/types/src/components/InputFile/Item/Item.d.ts +1 -1
- package/dist/esm/types/src/components/Label/Label.d.ts +1 -1
- package/dist/esm/types/src/components/LangSelector/LangSelector.d.ts +1 -1
- package/dist/esm/types/src/components/Lazy/Lazy.d.ts +1 -1
- package/dist/esm/types/src/components/LightBox/LightBox.d.ts +1 -1
- package/dist/esm/types/src/components/Notifications/Notifications.d.ts +1 -1
- package/dist/esm/types/src/components/Paranja/Paranja.d.ts +1 -1
- package/dist/esm/types/src/components/Popup/Popup.d.ts +3 -3
- package/dist/esm/types/src/components/PopupMenu/PopupMenu.d.ts +1 -1
- package/dist/esm/types/src/components/Portal/Portal.d.ts +2 -1
- package/dist/esm/types/src/components/Progress/Progress.d.ts +1 -1
- package/dist/esm/types/src/components/ProgressCircular/ProgressCircular.d.ts +1 -1
- package/dist/esm/types/src/components/RequiredStar/RequiredStar.d.ts +1 -1
- package/dist/esm/types/src/components/Router/Link/Link.d.ts +1 -1
- package/dist/esm/types/src/components/Router/Router.d.ts +1 -1
- package/dist/esm/types/src/components/Select/Select.d.ts +9 -9
- package/dist/esm/types/src/components/Select/Select2.d.ts +1 -1
- package/dist/esm/types/src/components/Shimmer/Shimmer.d.ts +1 -1
- package/dist/esm/types/src/components/Slider/Slider.d.ts +1 -1
- package/dist/esm/types/src/components/Slider/Slider.types.d.ts +9 -3
- package/dist/esm/types/src/components/Spinner/Spinner.d.ts +1 -1
- package/dist/esm/types/src/components/Table/Table.d.ts +4 -4
- package/dist/esm/types/src/components/Tabs/Tabs.d.ts +1 -1
- package/dist/esm/types/src/components/Text/Text.d.ts +6 -6
- package/dist/esm/types/src/components/TextShimmer/TextShimmer.d.ts +1 -1
- package/dist/esm/types/src/components/TextWithDeferTooltip/TextWithDeferTooltip.d.ts +1 -1
- package/dist/esm/types/src/components/Theme/Theme.d.ts +1 -1
- package/dist/esm/types/src/components/Theme/ThemeProvider.d.ts +1 -1
- package/dist/esm/types/src/components/Toggle/Toggle.d.ts +1 -1
- package/dist/esm/types/src/components/Tooltip/Tooltip.d.ts +1 -1
- package/dist/esm/types/src/components/Tooltip/TooltipCore.d.ts +1 -1
- package/dist/esm/types/src/components/Tooltip/TooltipOverTrigger.d.ts +1 -1
- package/dist/esm/types/src/components/Tooltip/TooltipProvider.d.ts +1 -1
- package/dist/esm/types/src/components/Tooltip/TooltipSimple.d.ts +1 -1
- package/dist/esm/types/src/components/VH/VH.d.ts +1 -1
- package/dist/esm/types/src/components/VideoPlayer/VideoPlayer.d.ts +3 -0
- package/dist/esm/types/src/components/VideoPlayer/VideoPlayer.helpers.d.ts +23 -0
- package/dist/esm/types/src/components/VideoPlayer/VideoPlayer.types.d.ts +12 -0
- package/dist/esm/types/src/components/Virtualized/Cards/Cards.d.ts +2 -2
- package/dist/esm/types/src/components/Virtualized/List/List.d.ts +2 -2
- package/dist/esm/types/src/components/Virtualized/List/ListScroll.d.ts +1 -1
- package/dist/esm/types/src/components/Virtualized/Table/Table.d.ts +2 -2
- package/dist/esm/types/src/components/index.d.ts +2 -0
- package/dist/esm/types/src/services/i18n.d.ts +1 -1
- package/dist/esm/types/src/tiptap/slash-mention/SlashSuggestionList.d.ts +1 -1
- package/graphify-out/.graphify_labels.json +29 -4
- package/graphify-out/2026-07-18/.graphify_labels.json +217 -0
- package/graphify-out/2026-07-18/GRAPH_REPORT.md +1007 -0
- package/graphify-out/2026-07-18/cost.json +12 -0
- package/graphify-out/2026-07-18/graph.json +70772 -0
- package/graphify-out/2026-07-18/manifest.json +2342 -0
- package/graphify-out/2026-07-19/.graphify_labels.json +198 -0
- package/graphify-out/2026-07-19/GRAPH_REPORT.md +938 -0
- package/graphify-out/2026-07-19/cost.json +12 -0
- package/graphify-out/2026-07-19/graph.json +70862 -0
- package/graphify-out/2026-07-19/manifest.json +2342 -0
- package/graphify-out/GRAPH_REPORT.md +259 -179
- package/graphify-out/cache/ast/0d0d438582d5ce7adfc4db8f33ce31428bb9f5f1259e61481276d15876fd9673.json +1 -0
- package/graphify-out/cache/ast/494bb27524c0e6571e692c3092e4526a7d2c362cf8dd879d1ca7fea05e63ce5a.json +1 -0
- package/graphify-out/cache/ast/6315f77346a8bd9fd00e6325e2c9feba16677838f4b1979d65d0bf198afe222e.json +1 -0
- package/graphify-out/cache/ast/7c14f07fe0bd2a58d9b0f18c64bcb4309c22a94ab7d8d0b4816fbab57236cc00.json +1 -0
- package/graphify-out/cache/ast/8766e44866b3d8e85f93a934d6365f18e57ed6f69f1363461804de9ba9a03f55.json +1 -0
- package/graphify-out/cache/ast/9fa55f86bff0deafa27fe7f690ea34d0e13429d1a0fd14c464b9fb9ee1265896.json +1 -0
- package/graphify-out/cache/ast/dd4c6a81e7b8e9865855fb84e0c822fc53e30f0f3c90cb4166edc3352fbe04a7.json +1 -0
- package/graphify-out/cache/ast/ea772d333147535e64c8857d1a1c87cc6dde7c165dfb275fe6b3a6e871421ee6.json +1 -0
- package/graphify-out/cache/stat-index.json +1 -1
- package/graphify-out/graph.html +4 -4
- package/graphify-out/graph.json +5465 -3803
- package/graphify-out/manifest.json +146 -56
- package/package.json +8 -4
package/dist/esm/index.js
CHANGED
|
@@ -17,6 +17,7 @@ export { Expand } from './src/components/Expand/Expand.js';
|
|
|
17
17
|
export { Flex } from './src/components/Flex/Flex.js';
|
|
18
18
|
export { Form } from './src/components/Form/Form.js';
|
|
19
19
|
export { Gallery, normalizeGalleryItem } from './src/components/Gallery/Gallery.js';
|
|
20
|
+
export { GridLayout } from './src/components/GridLayout/GridLayout.js';
|
|
20
21
|
export { Heading } from './src/components/Heading/Heading.js';
|
|
21
22
|
export { Icon } from './src/components/Icon/Icon.js';
|
|
22
23
|
export { Input } from './src/components/Input/Input.js';
|
|
@@ -55,6 +56,7 @@ export { H1, H2, H3, H4, H5, H6 } from './src/components/Text/Text.js';
|
|
|
55
56
|
export { Theme } from './src/components/Theme/Theme.js';
|
|
56
57
|
export { ThemeProvider, useTheme } from './src/components/Theme/ThemeProvider.js';
|
|
57
58
|
export { VH } from './src/components/VH/VH.js';
|
|
59
|
+
export { VideoPlayer } from './src/components/VideoPlayer/VideoPlayer.js';
|
|
58
60
|
export { default as Virtualized } from './src/components/Virtualized/Virtualized.js';
|
|
59
61
|
export { default as VirtualizedList } from './src/components/Virtualized/List/List.js';
|
|
60
62
|
export { default as VirtualizedListScroll } from './src/components/Virtualized/List/ListScroll.js';
|
|
@@ -40,7 +40,11 @@ import '../Flex/Flex.styl.js';
|
|
|
40
40
|
import '../Form/Form.styl.js';
|
|
41
41
|
import '../Form/Validator.js';
|
|
42
42
|
import '../Form/SubmitButtons/SubmitButtons.styl.js';
|
|
43
|
+
import '../ProgressCircular/ProgressCircular.styl.js';
|
|
44
|
+
import '../Slider/Slider.styl.js';
|
|
45
|
+
import '../VideoPlayer/VideoPlayer.styl.js';
|
|
43
46
|
import '../Gallery/Gallery.styl.js';
|
|
47
|
+
import '../GridLayout/GridLayout.styl.js';
|
|
44
48
|
import '../Heading/Heading.js';
|
|
45
49
|
import '../InputFile/InputFile.styl.js';
|
|
46
50
|
import '../InputFile/Item/Item.styl.js';
|
|
@@ -54,7 +58,6 @@ import '../Notifications/store.js';
|
|
|
54
58
|
import '../Notifications/Notifications.styl.js';
|
|
55
59
|
import '../PopupMenu/PopupMenu.styl.js';
|
|
56
60
|
import '../Progress/Progress.styl.js';
|
|
57
|
-
import '../ProgressCircular/ProgressCircular.styl.js';
|
|
58
61
|
import '../PromptComposer/PromptComposer.js';
|
|
59
62
|
import '@tiptap/extensions';
|
|
60
63
|
import '@tiptap/react';
|
|
@@ -64,7 +67,6 @@ import '../RadioGroup/RadioGroupContext.js';
|
|
|
64
67
|
import '../RadioButton/RadioButton.styl.js';
|
|
65
68
|
import '../RadioGroup/RadioGroup.styl.js';
|
|
66
69
|
import '../Router/Router.js';
|
|
67
|
-
import '../Slider/Slider.styl.js';
|
|
68
70
|
import '../Table/Table.styl.js';
|
|
69
71
|
import '../Tabs/Tabs.styl.js';
|
|
70
72
|
import '../TextShimmer/TextShimmer.js';
|
|
@@ -7,6 +7,7 @@ import cn from 'classnames';
|
|
|
7
7
|
import { Button } from '../Button/Button.js';
|
|
8
8
|
import { Icon } from '../Icon/Icon.js';
|
|
9
9
|
import { Spinner } from '../Spinner/Spinner.js';
|
|
10
|
+
import { VideoPlayer } from '../VideoPlayer/VideoPlayer.js';
|
|
10
11
|
import throttle from '../../tools/throttle.js';
|
|
11
12
|
import { circularSlice } from '../../tools/array.js';
|
|
12
13
|
import { omit } from '../../tools/object.js';
|
|
@@ -38,15 +39,13 @@ function Arr({ className, size, icon, ...rest }) {
|
|
|
38
39
|
return (jsx(Button, { className: cn(S.arr, className), size: size, variant: "clear", ...rest, children: jsx(Icon, { type: icon, size: size }) }));
|
|
39
40
|
}
|
|
40
41
|
function VideoItem({ src, size, isActive, }) {
|
|
41
|
-
const
|
|
42
|
-
const videoRef = useRef(null);
|
|
42
|
+
const wrapRef = useRef(null);
|
|
43
43
|
useEffect(() => {
|
|
44
|
-
|
|
45
|
-
if (!video || isActive)
|
|
44
|
+
if (isActive)
|
|
46
45
|
return;
|
|
47
|
-
video
|
|
46
|
+
wrapRef.current?.querySelector('video')?.pause();
|
|
48
47
|
}, [isActive, src]);
|
|
49
|
-
return (
|
|
48
|
+
return (jsx("div", { ref: wrapRef, className: cn(S.item, S.videoItem), children: jsx(VideoPlayer, { src: src, size: size, storageKey: `Gallery:${src}`, className: S.video }) }));
|
|
50
49
|
}
|
|
51
50
|
function Item({ src, kind, size, isActive, }) {
|
|
52
51
|
const [loaded, setLoaded] = useState(false);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import styleInject from '../../../node_modules/style-inject/dist/style-inject.es.js';
|
|
2
2
|
|
|
3
|
-
var css_248z = ".Gallery_item__P4qTJ,.Gallery_root__-Crit{height:100%;width:100%}.Gallery_root__-Crit{overflow:hidden;position:relative}.Gallery_inner__4FAPt{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;height:100%;position:absolute;touch-action:none;transform:translate3d(-33.33333%,0,0);width:calc(300% + 1px)}.Gallery_single__Wfd9h .Gallery_inner__4FAPt{transform:none;width:100%}.Gallery_single__Wfd9h .Gallery_item__P4qTJ{width:100%}.Gallery_inner__4FAPt.Gallery_left__zrrmv,.Gallery_inner__4FAPt.Gallery_right__dpZ-m{transition:transform 0s ease-out;transition-duration:.2s}.Gallery_inner__4FAPt.Gallery_left__zrrmv{transform:translateZ(0)!important}.Gallery_inner__4FAPt.Gallery_right__dpZ-m{transform:translate3d(-66.66667%,0,0)!important}.Gallery_inner__4FAPt.Gallery_initialBounce__nZnKd{animation:Gallery_bounce__buqva 1s ease-out}.Gallery_item__P4qTJ{align-items:center;background-position:50%;background-repeat:no-repeat;background-size:contain;display:flex;justify-content:center;width:33.33333%}.Gallery_cover__ZGx5X .Gallery_item__P4qTJ{background-size:cover}.Gallery_item__P4qTJ>img{opacity:0;pointer-events:none;position:absolute}.Gallery_brokenImage__Bj3O-{height:50%;opacity:.2;width:50%}.Gallery_videoItem__06r39 .Gallery_video__vKK23{max-height:100%;max-width:100
|
|
3
|
+
var css_248z = ".Gallery_item__P4qTJ,.Gallery_root__-Crit{height:100%;width:100%}.Gallery_root__-Crit{overflow:hidden;position:relative}.Gallery_inner__4FAPt{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;height:100%;position:absolute;touch-action:none;transform:translate3d(-33.33333%,0,0);width:calc(300% + 1px)}.Gallery_single__Wfd9h .Gallery_inner__4FAPt{transform:none;width:100%}.Gallery_single__Wfd9h .Gallery_item__P4qTJ{width:100%}.Gallery_inner__4FAPt.Gallery_left__zrrmv,.Gallery_inner__4FAPt.Gallery_right__dpZ-m{transition:transform 0s ease-out;transition-duration:.2s}.Gallery_inner__4FAPt.Gallery_left__zrrmv{transform:translateZ(0)!important}.Gallery_inner__4FAPt.Gallery_right__dpZ-m{transform:translate3d(-66.66667%,0,0)!important}.Gallery_inner__4FAPt.Gallery_initialBounce__nZnKd{animation:Gallery_bounce__buqva 1s ease-out}.Gallery_item__P4qTJ{align-items:center;background-position:50%;background-repeat:no-repeat;background-size:contain;display:flex;justify-content:center;width:33.33333%}.Gallery_cover__ZGx5X .Gallery_item__P4qTJ{background-size:cover}.Gallery_item__P4qTJ>img{opacity:0;pointer-events:none;position:absolute}.Gallery_brokenImage__Bj3O-{height:50%;opacity:.2;width:50%}.Gallery_videoItem__06r39 .Gallery_video__vKK23{max-height:100%;max-width:100%}.Gallery_arr__knicI{background:transparent!important;height:100%;min-height:100%;opacity:0;padding:10%;position:absolute;top:0;transition:opacity .1s ease-out;z-index:1}.Gallery_arr__knicI.Gallery_left__zrrmv{justify-content:flex-start;left:0}.Gallery_arr__knicI.Gallery_right__dpZ-m{justify-content:flex-end;right:0;width:77%}.Gallery_arr__knicI:hover{opacity:1}@keyframes Gallery_bounce__buqva{0%{left:0}50%{left:-20%}80%{left:10%}to{left:0}}";
|
|
4
4
|
var S = {"root":"Gallery_root__-Crit","item":"Gallery_item__P4qTJ","inner":"Gallery_inner__4FAPt","single":"Gallery_single__Wfd9h","left":"Gallery_left__zrrmv","right":"Gallery_right__dpZ-m","initialBounce":"Gallery_initialBounce__nZnKd","bounce":"Gallery_bounce__buqva","cover":"Gallery_cover__ZGx5X","brokenImage":"Gallery_brokenImage__Bj3O-","videoItem":"Gallery_videoItem__06r39","video":"Gallery_video__vKK23","arr":"Gallery_arr__knicI"};
|
|
5
5
|
styleInject(css_248z);
|
|
6
6
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import cn from 'classnames';
|
|
3
|
+
import S from './GridLayout.styl.js';
|
|
4
|
+
|
|
5
|
+
function GridLayout({ children, colWidth = 300, gap = 'var(--p-2)', className, as: asProp, }) {
|
|
6
|
+
const As = asProp ?? 'div';
|
|
7
|
+
return (jsx(As, { className: cn(S.root, className), style: {
|
|
8
|
+
maxWidth: '100%',
|
|
9
|
+
gap,
|
|
10
|
+
display: 'grid',
|
|
11
|
+
gridTemplateColumns: `repeat(auto-fit, minmax(${colWidth}px, 1fr))`,
|
|
12
|
+
}, children: children }));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { GridLayout };
|
|
@@ -88,6 +88,8 @@ export { default as star } from './star.svg.js';
|
|
|
88
88
|
export { default as stop } from './stop.svg.js';
|
|
89
89
|
export { default as stopInCircle } from './stopInCircle.svg.js';
|
|
90
90
|
export { default as syncArrows } from './syncArrows.svg.js';
|
|
91
|
+
export { default as volume } from './volume.svg.js';
|
|
92
|
+
export { default as volumeOff } from './volumeOff.svg.js';
|
|
91
93
|
export { default as table } from './table.svg.js';
|
|
92
94
|
export { default as telegram } from './telegram.svg.js';
|
|
93
95
|
export { default as tool } from './tool.svg.js';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
var _path;
|
|
4
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
5
|
+
var SvgVolume = function SvgVolume(props) {
|
|
6
|
+
return /*#__PURE__*/React.createElement("svg", _extends({
|
|
7
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
8
|
+
fill: "currentColor",
|
|
9
|
+
viewBox: "0 0 24 24"
|
|
10
|
+
}, props), _path || (_path = /*#__PURE__*/React.createElement("path", {
|
|
11
|
+
d: "M3 9v6h4l5 5V4L7 9H3zm13.5 3A4.5 4.5 0 0 0 14 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"
|
|
12
|
+
})));
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { SvgVolume as default };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
var _path;
|
|
4
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
5
|
+
var SvgVolumeOff = function SvgVolumeOff(props) {
|
|
6
|
+
return /*#__PURE__*/React.createElement("svg", _extends({
|
|
7
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
8
|
+
fill: "currentColor",
|
|
9
|
+
viewBox: "0 0 24 24"
|
|
10
|
+
}, props), _path || (_path = /*#__PURE__*/React.createElement("path", {
|
|
11
|
+
d: "M16.5 12A4.5 4.5 0 0 0 14 7.97v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51A8.796 8.796 0 0 0 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3 3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06a8.99 8.99 0 0 0 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4 9.91 6.09 12 8.18V4z"
|
|
12
|
+
})));
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { SvgVolumeOff as default };
|
|
@@ -44,7 +44,11 @@ import '../Flex/Flex.styl.js';
|
|
|
44
44
|
import '../Form/Form.styl.js';
|
|
45
45
|
import '../Form/Validator.js';
|
|
46
46
|
import '../Form/SubmitButtons/SubmitButtons.styl.js';
|
|
47
|
+
import '../ProgressCircular/ProgressCircular.styl.js';
|
|
48
|
+
import '../Slider/Slider.styl.js';
|
|
49
|
+
import '../VideoPlayer/VideoPlayer.styl.js';
|
|
47
50
|
import '../Gallery/Gallery.styl.js';
|
|
51
|
+
import '../GridLayout/GridLayout.styl.js';
|
|
48
52
|
import '../Heading/Heading.js';
|
|
49
53
|
import '../../services/i18n.js';
|
|
50
54
|
import '../LightBox/LightBox.styl.js';
|
|
@@ -53,7 +57,6 @@ import '../Notifications/store.js';
|
|
|
53
57
|
import '../Notifications/Notifications.styl.js';
|
|
54
58
|
import '../PopupMenu/PopupMenu.styl.js';
|
|
55
59
|
import '../Progress/Progress.styl.js';
|
|
56
|
-
import '../ProgressCircular/ProgressCircular.styl.js';
|
|
57
60
|
import '../PromptComposer/PromptComposer.js';
|
|
58
61
|
import '@tiptap/extensions';
|
|
59
62
|
import '@tiptap/react';
|
|
@@ -64,7 +67,6 @@ import '../RadioGroup/RadioGroupContext.js';
|
|
|
64
67
|
import '../RadioButton/RadioButton.styl.js';
|
|
65
68
|
import '../RadioGroup/RadioGroup.styl.js';
|
|
66
69
|
import '../Router/Router.js';
|
|
67
|
-
import '../Slider/Slider.styl.js';
|
|
68
70
|
import '../Table/Table.styl.js';
|
|
69
71
|
import '../Tabs/Tabs.styl.js';
|
|
70
72
|
import '../TextShimmer/TextShimmer.js';
|
|
@@ -9,27 +9,66 @@ const valueToPct = (value, min, max) => {
|
|
|
9
9
|
const range = max - min;
|
|
10
10
|
return range > 0 ? `${((value - min) / range) * 100}%` : '0%';
|
|
11
11
|
};
|
|
12
|
-
function
|
|
12
|
+
function assignRef(ref, value) {
|
|
13
|
+
if (!ref)
|
|
14
|
+
return;
|
|
15
|
+
if (typeof ref === 'function')
|
|
16
|
+
ref(value);
|
|
17
|
+
else
|
|
18
|
+
ref.current = value;
|
|
19
|
+
}
|
|
20
|
+
function Slider({ className, label, value, defaultValue, inputRef, min = 0, max = 100, step, size = 'm', disabled = false, showGhost = false, vertical = false, markers, markerClassName, onMarkerClick, onChange, onInput, markerTooltipProps = {}, ...inputProps }) {
|
|
13
21
|
const trackWrapRef = useRef(null);
|
|
22
|
+
const localInputRef = useRef(null);
|
|
14
23
|
const [ghostRatio, setGhostRatio] = useState(null);
|
|
15
|
-
const
|
|
16
|
-
const
|
|
24
|
+
const isControlled = value !== undefined;
|
|
25
|
+
const setInputRef = useCallback((el) => {
|
|
26
|
+
localInputRef.current = el;
|
|
27
|
+
assignRef(inputRef, el);
|
|
28
|
+
}, [inputRef]);
|
|
29
|
+
const getProgressPct = () => {
|
|
30
|
+
if (isControlled)
|
|
31
|
+
return valueToPct(value, min, max);
|
|
32
|
+
const live = localInputRef.current?.valueAsNumber;
|
|
33
|
+
if (Number.isFinite(live))
|
|
34
|
+
return valueToPct(live, min, max);
|
|
35
|
+
return valueToPct(defaultValue ?? min, min, max);
|
|
36
|
+
};
|
|
37
|
+
const updateGhostFromPointer = useCallback((clientX, clientY) => {
|
|
17
38
|
if (disabled || !showGhost)
|
|
18
39
|
return;
|
|
19
40
|
const wrap = trackWrapRef.current;
|
|
20
41
|
if (!wrap)
|
|
21
42
|
return;
|
|
22
|
-
const { left, width } = wrap.getBoundingClientRect();
|
|
43
|
+
const { left, top, width, height } = wrap.getBoundingClientRect();
|
|
44
|
+
if (vertical) {
|
|
45
|
+
if (height <= 0)
|
|
46
|
+
return;
|
|
47
|
+
// writing-mode vertical-lr + direction rtl → max at top
|
|
48
|
+
setGhostRatio(clamp(1 - (clientY - top) / height, 0, 1));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
23
51
|
if (width <= 0)
|
|
24
52
|
return;
|
|
25
53
|
setGhostRatio(clamp((clientX - left) / width, 0, 1));
|
|
26
|
-
}, [disabled, showGhost]);
|
|
54
|
+
}, [disabled, showGhost, vertical]);
|
|
27
55
|
const clearGhost = useCallback(() => setGhostRatio(null), []);
|
|
28
|
-
const classes = cn(S.root, S[`size-${size}`], disabled && S.disabled, label && S.hasLabel, className);
|
|
29
|
-
|
|
56
|
+
const classes = cn(S.root, S[`size-${size}`], vertical && S.vertical, disabled && S.disabled, label && S.hasLabel, className);
|
|
57
|
+
const ghostStyle = vertical
|
|
58
|
+
? { bottom: `${(ghostRatio ?? 0) * 100}%` }
|
|
59
|
+
: { left: `${(ghostRatio ?? 0) * 100}%` };
|
|
60
|
+
return (jsxs("div", { className: classes, children: [label ? jsx("span", { className: S.label, children: label }) : null, jsxs("div", { ref: trackWrapRef, className: cn(S.trackWrap, markers?.length ? S.hasMarkers : null), onPointerEnter: showGhost
|
|
61
|
+
? e => updateGhostFromPointer(e.clientX, e.clientY)
|
|
62
|
+
: undefined, onPointerMove: showGhost
|
|
63
|
+
? e => updateGhostFromPointer(e.clientX, e.clientY)
|
|
64
|
+
: undefined, onPointerLeave: showGhost ? clearGhost : undefined, children: [jsxs("div", { className: S.trackRow, children: [jsx("input", { type: "range", className: S.control, style: { '--progress': getProgressPct() }, ref: setInputRef, ...(isControlled
|
|
65
|
+
? { value }
|
|
66
|
+
: { defaultValue: defaultValue ?? min }), min: min, max: max, step: step, disabled: disabled, "aria-orientation": vertical ? 'vertical' : 'horizontal', onInput: e => {
|
|
67
|
+
const next = Number(e.currentTarget.value);
|
|
68
|
+
e.currentTarget.style.setProperty('--progress', valueToPct(next, min, max));
|
|
30
69
|
onInput?.(e);
|
|
31
|
-
onChange?.(
|
|
32
|
-
}, ...inputProps }), showGhost && ghostRatio !== null && !disabled ? (jsx("span", { className: S.ghost, style:
|
|
70
|
+
onChange?.(next, e);
|
|
71
|
+
}, ...(vertical ? { orient: 'vertical' } : null), ...inputProps }), showGhost && ghostRatio !== null && !disabled ? (jsx("span", { className: S.ghost, style: ghostStyle, "aria-hidden": true })) : null] }), markers?.length ? (jsx("div", { className: S.markersRow, children: markers.map((marker, index) => {
|
|
33
72
|
const markerButton = (jsx("button", { type: "button", className: cn(S.marker, markerClassName), "aria-label": typeof marker.label === 'string' ? marker.label : undefined, disabled: disabled, onPointerDown: e => {
|
|
34
73
|
e.stopPropagation();
|
|
35
74
|
}, onClick: e => {
|
|
@@ -37,7 +76,11 @@ function Slider({ className, label, value, min = 0, max = 100, step, size = 'm',
|
|
|
37
76
|
if (!disabled)
|
|
38
77
|
onMarkerClick?.(marker.value);
|
|
39
78
|
} }));
|
|
40
|
-
|
|
79
|
+
const markerPos = valueToPct(marker.value, min, max);
|
|
80
|
+
const markerStyle = vertical
|
|
81
|
+
? { bottom: markerPos }
|
|
82
|
+
: { left: markerPos };
|
|
83
|
+
return (jsx("span", { className: S.markerWrap, style: markerStyle, children: marker.label ? (jsx(Tooltip, { direction: "bottom", ...markerTooltipProps, content: marker.label, children: markerButton })) : (markerButton) }, marker.key ?? index));
|
|
41
84
|
}) })) : null] })] }));
|
|
42
85
|
}
|
|
43
86
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import styleInject from '../../../node_modules/style-inject/dist/style-inject.es.js';
|
|
2
2
|
|
|
3
|
-
var css_248z = ".Slider_root__hLZtd{color:var(--accent-color);position:relative;width:100%}.Slider_disabled__jz0lx{opacity:.4;pointer-events:none}.Slider_disabled__jz0lx .Slider_control__vtxup[disabled]{opacity:1}.Slider_hasLabel__Epyqi{align-items:center;display:flex;gap:var(--p-2)}.Slider_label__Gi7GI{color:inherit;font-size:inherit;white-space:nowrap}.Slider_trackWrap__PX861{display:flex;flex:1;flex-direction:column;min-width:0;position:relative}.Slider_hasMarkers__YfnMG{gap:var(--p-1)}.Slider_trackRow__hbQdR{align-items:center;display:flex;position:relative;width:100%}.Slider_markersRow__l-yga{flex-shrink:0;height:0;position:absolute;width:100%;z-index:2}.Slider_markerWrap__6hLJN{pointer-events:auto;position:absolute;top:-3px}.Slider_marker__vtOv9{background:var(--accent-color);border:none;border-radius:50%;box-shadow:0 0 0 1px var(--decent-color-alpha-800);cursor:pointer;display:block;height:var(--marker-size);margin:0;padding:0;position:relative;width:var(--marker-size)}.Slider_marker__vtOv9:before{border-radius:50%;content:\"\";display:block;height:40px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:40px}.Slider_marker__vtOv9:hover{background:var(--active-color)}.Slider_marker__vtOv9:disabled{cursor:default;opacity:.5}.Slider_control__vtxup{--track-radius:50px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;box-shadow:inset 0 0 0 2px none;box-sizing:border-box;cursor:pointer;height:var(--thumb-size);margin:0;padding:0;position:relative;transition:.2s ease-out;transition-property:background-color,box-shadow,opacity;width:100%;z-index:2}.Slider_control__vtxup:focus,.Slider_control__vtxup:hover{background-color:var(--active-color-alpha-100)}.Slider_control__vtxup[disabled]{background-color:var(--accent-color-alpha-100);opacity:.4;pointer-events:none}.Slider_control__vtxup:focus,.Slider_control__vtxup:hover{background:transparent!important}.Slider_control__vtxup:focus{box-shadow:inset 0 0 0 2px none}.Slider_control__vtxup::-webkit-slider-runnable-track{background:linear-gradient(to right,var(--active-color) 0,var(--active-color) var(--progress),var(--accent-color-alpha-100) var(--progress),var(--accent-color-alpha-100) 100%);border-radius:var(--track-radius);height:var(--track-height)}.Slider_control__vtxup::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background:var(--active-color);border-radius:50%;box-shadow:0 1px 3px rgba(0,0,0,.2);cursor:pointer;height:var(--thumb-size);margin-top:calc((var(--track-height) - var(--thumb-size))/2);width:var(--thumb-size)}.Slider_control__vtxup::-moz-range-track{background:var(--accent-color-alpha-100);border-radius:var(--track-radius);height:var(--track-height)}.Slider_control__vtxup::-moz-range-progress{background:var(--active-color);border-radius:var(--track-radius);height:var(--track-height)}.Slider_control__vtxup::-moz-range-thumb{background:var(--active-color);border:none;border-radius:50%;box-shadow:0 1px 3px rgba(0,0,0,.2);cursor:pointer;height:var(--thumb-size);width:var(--thumb-size)}.Slider_ghost__tfPtm{background:var(--accent-color);border-radius:50%;height:var(--ghost-size);left:0;opacity:.45;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);width:var(--ghost-size);z-index:2}.Slider_size-xs__v6UDK{--track-height:1px;--thumb-size:10px;--ghost-size:10px;--marker-size:6px;font-size:12px}.Slider_size-s__8hGSO{--track-height:2px;--thumb-size:12px;--ghost-size:12px;--marker-size:7px;font-size:14px}.Slider_size-s__8hGSO .Slider_markersRow__l-yga{top:-1px}.Slider_size-m__Dj7LT{--track-height:8px;--thumb-size:16px;--ghost-size:16px;--marker-size:12px;font-size:16px}.Slider_size-m__Dj7LT .Slider_markersRow__l-yga{top:1px}.Slider_size-l__Qi6tI{--track-height:12px;--thumb-size:20px;--ghost-size:20px;--marker-size:16px;font-size:18px}.Slider_size-l__Qi6tI .Slider_markersRow__l-yga{top:4px}.Slider_size-xl__85Gcz{--track-height:16px;--thumb-size:24px;--ghost-size:24px;--marker-size:20px;font-size:20px}.Slider_size-xl__85Gcz .Slider_markersRow__l-yga{top:5px}";
|
|
4
|
-
var S = {"root":"Slider_root__hLZtd","
|
|
3
|
+
var css_248z = ".Slider_root__hLZtd{color:var(--accent-color);position:relative;width:100%}.Slider_vertical__ZWdnf{display:flex;flex-direction:column;height:100%;min-height:0;width:auto}.Slider_vertical__ZWdnf.Slider_hasLabel__Epyqi{align-items:stretch;flex-direction:column}.Slider_vertical__ZWdnf .Slider_trackWrap__PX861{flex:1;height:100%;min-height:0;min-width:0;width:auto}.Slider_vertical__ZWdnf .Slider_trackRow__hbQdR{flex:1;height:100%;justify-content:center;min-height:0;width:auto}.Slider_vertical__ZWdnf .Slider_control__vtxup{direction:rtl;height:100%;width:var(--thumb-size);writing-mode:vertical-lr}.Slider_vertical__ZWdnf .Slider_control__vtxup::-webkit-slider-runnable-track{background:linear-gradient(to top,var(--active-color) 0,var(--active-color) var(--progress),var(--accent-color-alpha-100) var(--progress),var(--accent-color-alpha-100) 100%);height:100%;width:var(--track-height)}.Slider_vertical__ZWdnf .Slider_control__vtxup::-webkit-slider-thumb{margin-left:calc((var(--track-height) - var(--thumb-size))/2);margin-top:0}.Slider_vertical__ZWdnf .Slider_control__vtxup::-moz-range-progress,.Slider_vertical__ZWdnf .Slider_control__vtxup::-moz-range-track{height:100%;width:var(--track-height)}.Slider_vertical__ZWdnf .Slider_ghost__tfPtm{left:50%;top:auto;transform:translate(-50%,50%)}.Slider_vertical__ZWdnf .Slider_markersRow__l-yga{height:100%;left:auto;top:0;width:0}.Slider_vertical__ZWdnf .Slider_markerWrap__6hLJN{left:-3px;top:auto}.Slider_disabled__jz0lx{opacity:.4;pointer-events:none}.Slider_disabled__jz0lx .Slider_control__vtxup[disabled]{opacity:1}.Slider_hasLabel__Epyqi{align-items:center;display:flex;gap:var(--p-2)}.Slider_label__Gi7GI{color:inherit;font-size:inherit;white-space:nowrap}.Slider_trackWrap__PX861{display:flex;flex:1;flex-direction:column;min-width:0;position:relative}.Slider_hasMarkers__YfnMG{gap:var(--p-1)}.Slider_trackRow__hbQdR{align-items:center;display:flex;position:relative;width:100%}.Slider_markersRow__l-yga{flex-shrink:0;height:0;position:absolute;width:100%;z-index:2}.Slider_markerWrap__6hLJN{pointer-events:auto;position:absolute;top:-3px}.Slider_marker__vtOv9{background:var(--accent-color);border:none;border-radius:50%;box-shadow:0 0 0 1px var(--decent-color-alpha-800);cursor:pointer;display:block;height:var(--marker-size);margin:0;padding:0;position:relative;width:var(--marker-size)}.Slider_marker__vtOv9:before{border-radius:50%;content:\"\";display:block;height:40px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:40px}.Slider_marker__vtOv9:hover{background:var(--active-color)}.Slider_marker__vtOv9:disabled{cursor:default;opacity:.5}.Slider_control__vtxup{--track-radius:50px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;box-shadow:inset 0 0 0 2px none;box-sizing:border-box;cursor:pointer;height:var(--thumb-size);margin:0;padding:0;position:relative;transition:.2s ease-out;transition-property:background-color,box-shadow,opacity;width:100%;z-index:2}.Slider_control__vtxup:focus,.Slider_control__vtxup:hover{background-color:var(--active-color-alpha-100)}.Slider_control__vtxup[disabled]{background-color:var(--accent-color-alpha-100);opacity:.4;pointer-events:none}.Slider_control__vtxup:focus,.Slider_control__vtxup:hover{background:transparent!important}.Slider_control__vtxup:focus{box-shadow:inset 0 0 0 2px none}.Slider_control__vtxup::-webkit-slider-runnable-track{background:linear-gradient(to right,var(--active-color) 0,var(--active-color) var(--progress),var(--accent-color-alpha-100) var(--progress),var(--accent-color-alpha-100) 100%);border-radius:var(--track-radius);height:var(--track-height)}.Slider_control__vtxup::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background:var(--active-color);border-radius:50%;box-shadow:0 1px 3px rgba(0,0,0,.2);cursor:pointer;height:var(--thumb-size);margin-top:calc((var(--track-height) - var(--thumb-size))/2);width:var(--thumb-size)}.Slider_control__vtxup::-moz-range-track{background:var(--accent-color-alpha-100);border-radius:var(--track-radius);height:var(--track-height)}.Slider_control__vtxup::-moz-range-progress{background:var(--active-color);border-radius:var(--track-radius);height:var(--track-height)}.Slider_control__vtxup::-moz-range-thumb{background:var(--active-color);border:none;border-radius:50%;box-shadow:0 1px 3px rgba(0,0,0,.2);cursor:pointer;height:var(--thumb-size);width:var(--thumb-size)}.Slider_ghost__tfPtm{background:var(--accent-color);border-radius:50%;height:var(--ghost-size);left:0;opacity:.45;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);width:var(--ghost-size);z-index:2}.Slider_size-xs__v6UDK{--track-height:1px;--thumb-size:10px;--ghost-size:10px;--marker-size:6px;font-size:12px}.Slider_size-s__8hGSO{--track-height:2px;--thumb-size:12px;--ghost-size:12px;--marker-size:7px;font-size:14px}.Slider_size-s__8hGSO .Slider_markersRow__l-yga{top:-1px}.Slider_size-m__Dj7LT{--track-height:8px;--thumb-size:16px;--ghost-size:16px;--marker-size:12px;font-size:16px}.Slider_size-m__Dj7LT .Slider_markersRow__l-yga{top:1px}.Slider_size-l__Qi6tI{--track-height:12px;--thumb-size:20px;--ghost-size:20px;--marker-size:16px;font-size:18px}.Slider_size-l__Qi6tI .Slider_markersRow__l-yga{top:4px}.Slider_size-xl__85Gcz{--track-height:16px;--thumb-size:24px;--ghost-size:24px;--marker-size:20px;font-size:20px}.Slider_size-xl__85Gcz .Slider_markersRow__l-yga{top:5px}";
|
|
4
|
+
var S = {"root":"Slider_root__hLZtd","vertical":"Slider_vertical__ZWdnf","hasLabel":"Slider_hasLabel__Epyqi","trackWrap":"Slider_trackWrap__PX861","trackRow":"Slider_trackRow__hbQdR","control":"Slider_control__vtxup","ghost":"Slider_ghost__tfPtm","markersRow":"Slider_markersRow__l-yga","markerWrap":"Slider_markerWrap__6hLJN","disabled":"Slider_disabled__jz0lx","label":"Slider_label__Gi7GI","hasMarkers":"Slider_hasMarkers__YfnMG","marker":"Slider_marker__vtOv9","size-xs":"Slider_size-xs__v6UDK","size-s":"Slider_size-s__8hGSO","size-m":"Slider_size-m__Dj7LT","size-l":"Slider_size-l__Qi6tI","size-xl":"Slider_size-xl__85Gcz"};
|
|
5
5
|
styleInject(css_248z);
|
|
6
6
|
|
|
7
7
|
export { S as default };
|
|
@@ -29,7 +29,9 @@ function Tabs(props) {
|
|
|
29
29
|
const tabsButtons = items.map((params) => {
|
|
30
30
|
const { id, label, forceRender, content, contentClassName: currContentClassName, ...rest } = params;
|
|
31
31
|
const isActive = activeId === id;
|
|
32
|
-
const tabContent = typeof content === 'function'
|
|
32
|
+
const tabContent = typeof content === 'function'
|
|
33
|
+
? content()
|
|
34
|
+
: content;
|
|
33
35
|
if (renderAll || forceRender || isActive) {
|
|
34
36
|
tabsContent.push(jsx("div", { className: cn(contentClassName, currContentClassName, !isActive && S.inactive), children: tabContent }, id));
|
|
35
37
|
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import LS from '../../tools/localStorage.js';
|
|
2
|
+
|
|
3
|
+
const SEEK_MAX_SEC = 5;
|
|
4
|
+
const SEEK_DURATION_RATIO = 0.1;
|
|
5
|
+
const VOLUME_STEP = 0.1;
|
|
6
|
+
const VOLUME_POPUP_HIDE_MS = 500;
|
|
7
|
+
const KEYBOARD_DEBOUNCE_MS = 30;
|
|
8
|
+
const TIME_PERSIST_DEBOUNCE_MS = 500;
|
|
9
|
+
const DOUBLE_TAP_MS = 300;
|
|
10
|
+
/** Keyboard seek step: min(5s, 10% of duration). */
|
|
11
|
+
function getSeekDelta(duration) {
|
|
12
|
+
if (!Number.isFinite(duration) || duration <= 0)
|
|
13
|
+
return SEEK_MAX_SEC;
|
|
14
|
+
return Math.min(SEEK_MAX_SEC, duration * SEEK_DURATION_RATIO);
|
|
15
|
+
}
|
|
16
|
+
function timeToProgressPct(time, duration) {
|
|
17
|
+
if (!Number.isFinite(duration) || duration <= 0)
|
|
18
|
+
return '0%';
|
|
19
|
+
return `${(clamp(time, 0, duration) / duration) * 100}%`;
|
|
20
|
+
}
|
|
21
|
+
function getStorageKey(src, storageKey) {
|
|
22
|
+
return storageKey ?? `VideoPlayer:${src}`;
|
|
23
|
+
}
|
|
24
|
+
function loadStorage(key) {
|
|
25
|
+
const stored = LS.get(key);
|
|
26
|
+
if (!stored || typeof stored !== 'object')
|
|
27
|
+
return {};
|
|
28
|
+
return stored;
|
|
29
|
+
}
|
|
30
|
+
function saveStorage(key, data) {
|
|
31
|
+
const prev = loadStorage(key);
|
|
32
|
+
LS.set(key, { ...prev, ...data });
|
|
33
|
+
}
|
|
34
|
+
function formatTime(seconds) {
|
|
35
|
+
if (!Number.isFinite(seconds) || seconds < 0)
|
|
36
|
+
return '0:00';
|
|
37
|
+
const total = Math.floor(seconds);
|
|
38
|
+
const h = Math.floor(total / 3600);
|
|
39
|
+
const m = Math.floor((total % 3600) / 60);
|
|
40
|
+
const s = total % 60;
|
|
41
|
+
const mm = h > 0 ? String(m).padStart(2, '0') : String(m);
|
|
42
|
+
const ss = String(s).padStart(2, '0');
|
|
43
|
+
return h > 0 ? `${h}:${mm}:${ss}` : `${mm}:${ss}`;
|
|
44
|
+
}
|
|
45
|
+
function getBufferedPercent(video) {
|
|
46
|
+
if (!video || !video.duration || !video.buffered.length)
|
|
47
|
+
return 0;
|
|
48
|
+
try {
|
|
49
|
+
const end = video.buffered.end(video.buffered.length - 1);
|
|
50
|
+
return Math.min(100, Math.max(0, (end / video.duration) * 100));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function isEditableTarget(target) {
|
|
57
|
+
if (!(target instanceof HTMLElement))
|
|
58
|
+
return false;
|
|
59
|
+
const tag = target.tagName;
|
|
60
|
+
return (tag === 'INPUT' ||
|
|
61
|
+
tag === 'TEXTAREA' ||
|
|
62
|
+
tag === 'SELECT' ||
|
|
63
|
+
target.isContentEditable);
|
|
64
|
+
}
|
|
65
|
+
function clamp(value, min, max) {
|
|
66
|
+
return Math.min(max, Math.max(min, value));
|
|
67
|
+
}
|
|
68
|
+
/** Leading debounce: run immediately, then ignore calls for `ms`. */
|
|
69
|
+
function leadingDebounce(fn, ms) {
|
|
70
|
+
let locked = false;
|
|
71
|
+
return ((...args) => {
|
|
72
|
+
if (locked)
|
|
73
|
+
return;
|
|
74
|
+
locked = true;
|
|
75
|
+
fn(...args);
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
locked = false;
|
|
78
|
+
}, ms);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export { DOUBLE_TAP_MS, KEYBOARD_DEBOUNCE_MS, SEEK_DURATION_RATIO, SEEK_MAX_SEC, TIME_PERSIST_DEBOUNCE_MS, VOLUME_POPUP_HIDE_MS, VOLUME_STEP, clamp, formatTime, getBufferedPercent, getSeekDelta, getStorageKey, isEditableTarget, leadingDebounce, loadStorage, saveStorage, timeToProgressPct };
|