@homecode/ui 5.4.1 → 5.5.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.
Files changed (100) hide show
  1. package/dist/esm/index.js +1 -0
  2. package/dist/esm/src/components/Autocomplete/Autocomplete.js +3 -2
  3. package/dist/esm/src/components/Gallery/Gallery.js +5 -6
  4. package/dist/esm/src/components/Gallery/Gallery.styl.js +1 -1
  5. package/dist/esm/src/components/Icon/icons/index.js +2 -0
  6. package/dist/esm/src/components/Icon/icons/volume.svg.js +15 -0
  7. package/dist/esm/src/components/Icon/icons/volumeOff.svg.js +15 -0
  8. package/dist/esm/src/components/InputFile/InputFile.js +3 -2
  9. package/dist/esm/src/components/Slider/Slider.js +53 -10
  10. package/dist/esm/src/components/Slider/Slider.styl.js +2 -2
  11. package/dist/esm/src/components/Tabs/Tabs.js +3 -1
  12. package/dist/esm/src/components/VideoPlayer/VideoPlayer.helpers.js +82 -0
  13. package/dist/esm/src/components/VideoPlayer/VideoPlayer.js +348 -0
  14. package/dist/esm/src/components/VideoPlayer/VideoPlayer.styl.js +7 -0
  15. package/dist/esm/types/src/components/AssistiveText/AssistiveText.d.ts +1 -1
  16. package/dist/esm/types/src/components/Autocomplete/Autocomplete.d.ts +1 -1
  17. package/dist/esm/types/src/components/Button/Button.d.ts +1 -1
  18. package/dist/esm/types/src/components/ButtonGroup/ButtonGroup.d.ts +1 -1
  19. package/dist/esm/types/src/components/Calendar/Calendar.d.ts +1 -1
  20. package/dist/esm/types/src/components/Card/Card.d.ts +7 -7
  21. package/dist/esm/types/src/components/Chip/Chip.d.ts +1 -1
  22. package/dist/esm/types/src/components/DatePicker/DatePicker.d.ts +1 -1
  23. package/dist/esm/types/src/components/DatePickerInput/DatePickerInput.d.ts +1 -1
  24. package/dist/esm/types/src/components/DateTime/DateTime.d.ts +1 -1
  25. package/dist/esm/types/src/components/Dialogue/Dialogue.d.ts +1 -1
  26. package/dist/esm/types/src/components/Draggable/Draggable.d.ts +1 -1
  27. package/dist/esm/types/src/components/DropZone/DropZone.d.ts +1 -1
  28. package/dist/esm/types/src/components/Expand/Expand.d.ts +1 -1
  29. package/dist/esm/types/src/components/Flex/Flex.d.ts +1 -1
  30. package/dist/esm/types/src/components/Form/Form.d.ts +1 -1
  31. package/dist/esm/types/src/components/Form/SubmitButtons/SubmitButtons.d.ts +1 -1
  32. package/dist/esm/types/src/components/Gallery/Dots/Dots.d.ts +1 -1
  33. package/dist/esm/types/src/components/Gallery/Gallery.d.ts +1 -1
  34. package/dist/esm/types/src/components/Icon/Icon.d.ts +1 -1
  35. package/dist/esm/types/src/components/Icon/Icon.example.d.ts +1 -1
  36. package/dist/esm/types/src/components/Icon/icons/index.d.ts +2 -0
  37. package/dist/esm/types/src/components/InputFile/InputFile.d.ts +3 -3
  38. package/dist/esm/types/src/components/InputFile/Item/Item.d.ts +1 -1
  39. package/dist/esm/types/src/components/Label/Label.d.ts +1 -1
  40. package/dist/esm/types/src/components/LangSelector/LangSelector.d.ts +1 -1
  41. package/dist/esm/types/src/components/Lazy/Lazy.d.ts +1 -1
  42. package/dist/esm/types/src/components/LightBox/LightBox.d.ts +1 -1
  43. package/dist/esm/types/src/components/Notifications/Notifications.d.ts +1 -1
  44. package/dist/esm/types/src/components/Paranja/Paranja.d.ts +1 -1
  45. package/dist/esm/types/src/components/Popup/Popup.d.ts +3 -3
  46. package/dist/esm/types/src/components/PopupMenu/PopupMenu.d.ts +1 -1
  47. package/dist/esm/types/src/components/Portal/Portal.d.ts +2 -1
  48. package/dist/esm/types/src/components/Progress/Progress.d.ts +1 -1
  49. package/dist/esm/types/src/components/ProgressCircular/ProgressCircular.d.ts +1 -1
  50. package/dist/esm/types/src/components/RequiredStar/RequiredStar.d.ts +1 -1
  51. package/dist/esm/types/src/components/Router/Link/Link.d.ts +1 -1
  52. package/dist/esm/types/src/components/Router/Router.d.ts +1 -1
  53. package/dist/esm/types/src/components/Select/Select.d.ts +9 -9
  54. package/dist/esm/types/src/components/Select/Select2.d.ts +1 -1
  55. package/dist/esm/types/src/components/Shimmer/Shimmer.d.ts +1 -1
  56. package/dist/esm/types/src/components/Slider/Slider.d.ts +1 -1
  57. package/dist/esm/types/src/components/Slider/Slider.types.d.ts +9 -3
  58. package/dist/esm/types/src/components/Spinner/Spinner.d.ts +1 -1
  59. package/dist/esm/types/src/components/Table/Table.d.ts +4 -4
  60. package/dist/esm/types/src/components/Tabs/Tabs.d.ts +1 -1
  61. package/dist/esm/types/src/components/Text/Text.d.ts +6 -6
  62. package/dist/esm/types/src/components/TextShimmer/TextShimmer.d.ts +1 -1
  63. package/dist/esm/types/src/components/TextWithDeferTooltip/TextWithDeferTooltip.d.ts +1 -1
  64. package/dist/esm/types/src/components/Theme/Theme.d.ts +1 -1
  65. package/dist/esm/types/src/components/Theme/ThemeProvider.d.ts +1 -1
  66. package/dist/esm/types/src/components/Toggle/Toggle.d.ts +1 -1
  67. package/dist/esm/types/src/components/Tooltip/Tooltip.d.ts +1 -1
  68. package/dist/esm/types/src/components/Tooltip/TooltipCore.d.ts +1 -1
  69. package/dist/esm/types/src/components/Tooltip/TooltipOverTrigger.d.ts +1 -1
  70. package/dist/esm/types/src/components/Tooltip/TooltipProvider.d.ts +1 -1
  71. package/dist/esm/types/src/components/Tooltip/TooltipSimple.d.ts +1 -1
  72. package/dist/esm/types/src/components/VH/VH.d.ts +1 -1
  73. package/dist/esm/types/src/components/VideoPlayer/VideoPlayer.d.ts +3 -0
  74. package/dist/esm/types/src/components/VideoPlayer/VideoPlayer.helpers.d.ts +23 -0
  75. package/dist/esm/types/src/components/VideoPlayer/VideoPlayer.types.d.ts +12 -0
  76. package/dist/esm/types/src/components/Virtualized/Cards/Cards.d.ts +2 -2
  77. package/dist/esm/types/src/components/Virtualized/List/List.d.ts +2 -2
  78. package/dist/esm/types/src/components/Virtualized/List/ListScroll.d.ts +1 -1
  79. package/dist/esm/types/src/components/Virtualized/Table/Table.d.ts +2 -2
  80. package/dist/esm/types/src/components/index.d.ts +1 -0
  81. package/dist/esm/types/src/services/i18n.d.ts +1 -1
  82. package/dist/esm/types/src/tiptap/slash-mention/SlashSuggestionList.d.ts +1 -1
  83. package/graphify-out/.graphify_labels.json +6 -11
  84. package/graphify-out/2026-07-18/.graphify_labels.json +217 -0
  85. package/graphify-out/2026-07-18/GRAPH_REPORT.md +1007 -0
  86. package/graphify-out/2026-07-18/cost.json +12 -0
  87. package/graphify-out/2026-07-18/graph.json +70772 -0
  88. package/graphify-out/2026-07-18/manifest.json +2342 -0
  89. package/graphify-out/GRAPH_REPORT.md +193 -221
  90. package/graphify-out/cache/ast/0d0d438582d5ce7adfc4db8f33ce31428bb9f5f1259e61481276d15876fd9673.json +1 -0
  91. package/graphify-out/cache/ast/494bb27524c0e6571e692c3092e4526a7d2c362cf8dd879d1ca7fea05e63ce5a.json +1 -0
  92. package/graphify-out/cache/ast/6315f77346a8bd9fd00e6325e2c9feba16677838f4b1979d65d0bf198afe222e.json +1 -0
  93. package/graphify-out/cache/ast/7c14f07fe0bd2a58d9b0f18c64bcb4309c22a94ab7d8d0b4816fbab57236cc00.json +1 -0
  94. package/graphify-out/cache/ast/9fa55f86bff0deafa27fe7f690ea34d0e13429d1a0fd14c464b9fb9ee1265896.json +1 -0
  95. package/graphify-out/cache/ast/dd4c6a81e7b8e9865855fb84e0c822fc53e30f0f3c90cb4166edc3352fbe04a7.json +1 -0
  96. package/graphify-out/cache/stat-index.json +1 -1
  97. package/graphify-out/graph.html +4 -4
  98. package/graphify-out/graph.json +4884 -3505
  99. package/graphify-out/manifest.json +118 -53
  100. package/package.json +6 -3
package/dist/esm/index.js CHANGED
@@ -55,6 +55,7 @@ export { H1, H2, H3, H4, H5, H6 } from './src/components/Text/Text.js';
55
55
  export { Theme } from './src/components/Theme/Theme.js';
56
56
  export { ThemeProvider, useTheme } from './src/components/Theme/ThemeProvider.js';
57
57
  export { VH } from './src/components/VH/VH.js';
58
+ export { VideoPlayer } from './src/components/VideoPlayer/VideoPlayer.js';
58
59
  export { default as Virtualized } from './src/components/Virtualized/Virtualized.js';
59
60
  export { default as VirtualizedList } from './src/components/Virtualized/List/List.js';
60
61
  export { default as VirtualizedListScroll } from './src/components/Virtualized/List/ListScroll.js';
@@ -40,6 +40,9 @@ 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';
44
47
  import '../Heading/Heading.js';
45
48
  import '../InputFile/InputFile.styl.js';
@@ -54,7 +57,6 @@ import '../Notifications/store.js';
54
57
  import '../Notifications/Notifications.styl.js';
55
58
  import '../PopupMenu/PopupMenu.styl.js';
56
59
  import '../Progress/Progress.styl.js';
57
- import '../ProgressCircular/ProgressCircular.styl.js';
58
60
  import '../PromptComposer/PromptComposer.js';
59
61
  import '@tiptap/extensions';
60
62
  import '@tiptap/react';
@@ -64,7 +66,6 @@ import '../RadioGroup/RadioGroupContext.js';
64
66
  import '../RadioButton/RadioButton.styl.js';
65
67
  import '../RadioGroup/RadioGroup.styl.js';
66
68
  import '../Router/Router.js';
67
- import '../Slider/Slider.styl.js';
68
69
  import '../Table/Table.styl.js';
69
70
  import '../Tabs/Tabs.styl.js';
70
71
  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 [loaded, setLoaded] = useState(false);
42
- const videoRef = useRef(null);
42
+ const wrapRef = useRef(null);
43
43
  useEffect(() => {
44
- const video = videoRef.current;
45
- if (!video || isActive)
44
+ if (isActive)
46
45
  return;
47
- video.pause();
46
+ wrapRef.current?.querySelector('video')?.pause();
48
47
  }, [isActive, src]);
49
- return (jsxs("div", { className: cn(S.item, S.videoItem), children: [jsx("video", { ref: videoRef, src: src, controls: true, playsInline: true, className: S.video, onLoadedData: () => setLoaded(true) }), !loaded && jsx(Spinner, { size: size })] }));
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%;-o-object-fit:contain;object-fit:contain}.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}}";
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
 
@@ -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,6 +44,9 @@ 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';
48
51
  import '../Heading/Heading.js';
49
52
  import '../../services/i18n.js';
@@ -53,7 +56,6 @@ import '../Notifications/store.js';
53
56
  import '../Notifications/Notifications.styl.js';
54
57
  import '../PopupMenu/PopupMenu.styl.js';
55
58
  import '../Progress/Progress.styl.js';
56
- import '../ProgressCircular/ProgressCircular.styl.js';
57
59
  import '../PromptComposer/PromptComposer.js';
58
60
  import '@tiptap/extensions';
59
61
  import '@tiptap/react';
@@ -64,7 +66,6 @@ import '../RadioGroup/RadioGroupContext.js';
64
66
  import '../RadioButton/RadioButton.styl.js';
65
67
  import '../RadioGroup/RadioGroup.styl.js';
66
68
  import '../Router/Router.js';
67
- import '../Slider/Slider.styl.js';
68
69
  import '../Table/Table.styl.js';
69
70
  import '../Tabs/Tabs.styl.js';
70
71
  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 Slider({ className, label, value, min = 0, max = 100, step, size = 'm', disabled = false, showGhost = false, markers, markerClassName, onMarkerClick, onChange, onInput, markerTooltipProps = {}, ...inputProps }) {
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 progressPct = valueToPct(value, min, max);
16
- const updateGhostFromPointer = useCallback((clientX) => {
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
- 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 ? e => updateGhostFromPointer(e.clientX) : undefined, onPointerMove: showGhost ? e => updateGhostFromPointer(e.clientX) : undefined, onPointerLeave: showGhost ? clearGhost : undefined, children: [jsxs("div", { className: S.trackRow, children: [jsx("input", { type: "range", className: S.control, style: { '--progress': progressPct }, value: value, min: min, max: max, step: step, disabled: disabled, onInput: e => {
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?.(Number(e.currentTarget.value), e);
32
- }, ...inputProps }), showGhost && ghostRatio !== null && !disabled ? (jsx("span", { className: S.ghost, style: { left: `${ghostRatio * 100}%` }, "aria-hidden": true })) : null] }), markers?.length ? (jsx("div", { className: S.markersRow, children: markers.map((marker, index) => {
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
- return (jsx("span", { className: S.markerWrap, style: { left: valueToPct(marker.value, min, max) }, children: marker.label ? (jsx(Tooltip, { direction: "bottom", ...markerTooltipProps, content: marker.label, children: markerButton })) : (markerButton) }, marker.key ?? index));
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","disabled":"Slider_disabled__jz0lx","control":"Slider_control__vtxup","hasLabel":"Slider_hasLabel__Epyqi","label":"Slider_label__Gi7GI","trackWrap":"Slider_trackWrap__PX861","hasMarkers":"Slider_hasMarkers__YfnMG","trackRow":"Slider_trackRow__hbQdR","markersRow":"Slider_markersRow__l-yga","markerWrap":"Slider_markerWrap__6hLJN","marker":"Slider_marker__vtOv9","ghost":"Slider_ghost__tfPtm","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"};
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' ? content() : content;
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 };