@alfalab/core-components-gallery 7.2.3 → 7.3.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 (285) hide show
  1. package/Component.js +51 -7
  2. package/Component.js.map +1 -1
  3. package/components/bottom-button/index.css +5 -5
  4. package/components/bottom-button/index.module.css.js +1 -1
  5. package/components/buttons/index.css +5 -5
  6. package/components/buttons/index.d.ts +3 -1
  7. package/components/buttons/index.js +49 -12
  8. package/components/buttons/index.js.map +1 -1
  9. package/components/buttons/index.module.css.js +1 -1
  10. package/components/header/Component.js +1 -0
  11. package/components/header/Component.js.map +1 -1
  12. package/components/header/index.css +3 -2
  13. package/components/header/index.module.css.js +1 -1
  14. package/components/header/index.module.css.js.map +1 -1
  15. package/components/header-info-block/Component.js +2 -1
  16. package/components/header-info-block/Component.js.map +1 -1
  17. package/components/header-info-block/index.css +4 -4
  18. package/components/header-info-block/index.module.css.js +1 -1
  19. package/components/header-mobile/index.css +6 -6
  20. package/components/header-mobile/index.module.css.js +1 -1
  21. package/components/image-preview/Component.js +2 -1
  22. package/components/image-preview/Component.js.map +1 -1
  23. package/components/image-preview/index.css +20 -20
  24. package/components/image-preview/index.module.css.js +1 -1
  25. package/components/image-preview/index.module.css.js.map +1 -1
  26. package/components/image-viewer/hooks.js +3 -2
  27. package/components/image-viewer/hooks.js.map +1 -1
  28. package/components/image-viewer/index.css +30 -31
  29. package/components/image-viewer/index.module.css.js +1 -1
  30. package/components/image-viewer/index.module.css.js.map +1 -1
  31. package/components/image-viewer/single.js +1 -0
  32. package/components/image-viewer/single.js.map +1 -1
  33. package/components/image-viewer/slide.js +3 -2
  34. package/components/image-viewer/slide.js.map +1 -1
  35. package/components/image-viewer/video/index.css +22 -10
  36. package/components/image-viewer/video/index.js +50 -15
  37. package/components/image-viewer/video/index.js.map +1 -1
  38. package/components/image-viewer/video/index.module.css.js +1 -1
  39. package/components/image-viewer/video/index.module.css.js.map +1 -1
  40. package/components/info-bar/Component.js +1 -0
  41. package/components/info-bar/Component.js.map +1 -1
  42. package/components/info-bar/index.css +3 -3
  43. package/components/info-bar/index.module.css.js +1 -1
  44. package/components/navigation-bar/Component.js +56 -26
  45. package/components/navigation-bar/Component.js.map +1 -1
  46. package/components/navigation-bar/index.css +21 -11
  47. package/components/navigation-bar/index.module.css.js +1 -1
  48. package/components/navigation-bar/index.module.css.js.map +1 -1
  49. package/components/subtitles/index.css +3 -3
  50. package/components/subtitles/index.module.css.js +1 -1
  51. package/constants.d.ts +1 -1
  52. package/constants.js +1 -1
  53. package/constants.js.map +1 -1
  54. package/cssm/Component.js +51 -7
  55. package/cssm/Component.js.map +1 -1
  56. package/cssm/components/buttons/index.d.ts +3 -1
  57. package/cssm/components/buttons/index.js +54 -17
  58. package/cssm/components/buttons/index.js.map +1 -1
  59. package/cssm/components/header/Component.js +1 -0
  60. package/cssm/components/header/Component.js.map +1 -1
  61. package/cssm/components/header/index.module.css +2 -1
  62. package/cssm/components/header-info-block/Component.js +2 -1
  63. package/cssm/components/header-info-block/Component.js.map +1 -1
  64. package/cssm/components/image-preview/Component.js +2 -1
  65. package/cssm/components/image-preview/Component.js.map +1 -1
  66. package/cssm/components/image-preview/index.module.css +3 -3
  67. package/cssm/components/image-viewer/hooks.js +3 -2
  68. package/cssm/components/image-viewer/hooks.js.map +1 -1
  69. package/cssm/components/image-viewer/index.module.css +2 -3
  70. package/cssm/components/image-viewer/single.js +1 -0
  71. package/cssm/components/image-viewer/single.js.map +1 -1
  72. package/cssm/components/image-viewer/slide.js +3 -2
  73. package/cssm/components/image-viewer/slide.js.map +1 -1
  74. package/cssm/components/image-viewer/video/index.js +50 -15
  75. package/cssm/components/image-viewer/video/index.js.map +1 -1
  76. package/cssm/components/image-viewer/video/index.module.css +15 -3
  77. package/cssm/components/info-bar/Component.js +1 -0
  78. package/cssm/components/info-bar/Component.js.map +1 -1
  79. package/cssm/components/navigation-bar/Component.js +56 -26
  80. package/cssm/components/navigation-bar/Component.js.map +1 -1
  81. package/cssm/components/navigation-bar/index.module.css +13 -3
  82. package/cssm/constants.d.ts +1 -1
  83. package/cssm/constants.js +1 -1
  84. package/cssm/constants.js.map +1 -1
  85. package/cssm/hooks/use-custom-subtitles.js +57 -11
  86. package/cssm/hooks/use-custom-subtitles.js.map +1 -1
  87. package/cssm/index.js +1 -0
  88. package/cssm/index.js.map +1 -1
  89. package/cssm/types.d.ts +4 -2
  90. package/cssm/utils/index.d.ts +1 -0
  91. package/cssm/utils/index.js +2 -0
  92. package/cssm/utils/index.js.map +1 -1
  93. package/cssm/utils/modern-download.d.ts +6 -0
  94. package/cssm/utils/modern-download.js +113 -0
  95. package/cssm/utils/modern-download.js.map +1 -0
  96. package/esm/Component.js +51 -7
  97. package/esm/Component.js.map +1 -1
  98. package/esm/components/bottom-button/index.css +5 -5
  99. package/esm/components/bottom-button/index.module.css.js +1 -1
  100. package/esm/components/buttons/index.css +5 -5
  101. package/esm/components/buttons/index.d.ts +3 -1
  102. package/esm/components/buttons/index.js +50 -13
  103. package/esm/components/buttons/index.js.map +1 -1
  104. package/esm/components/buttons/index.module.css.js +1 -1
  105. package/esm/components/header/Component.js +1 -0
  106. package/esm/components/header/Component.js.map +1 -1
  107. package/esm/components/header/index.css +3 -2
  108. package/esm/components/header/index.module.css.js +1 -1
  109. package/esm/components/header/index.module.css.js.map +1 -1
  110. package/esm/components/header-info-block/Component.js +2 -1
  111. package/esm/components/header-info-block/Component.js.map +1 -1
  112. package/esm/components/header-info-block/index.css +4 -4
  113. package/esm/components/header-info-block/index.module.css.js +1 -1
  114. package/esm/components/header-mobile/index.css +6 -6
  115. package/esm/components/header-mobile/index.module.css.js +1 -1
  116. package/esm/components/image-preview/Component.js +2 -1
  117. package/esm/components/image-preview/Component.js.map +1 -1
  118. package/esm/components/image-preview/index.css +20 -20
  119. package/esm/components/image-preview/index.module.css.js +1 -1
  120. package/esm/components/image-preview/index.module.css.js.map +1 -1
  121. package/esm/components/image-viewer/hooks.js +3 -2
  122. package/esm/components/image-viewer/hooks.js.map +1 -1
  123. package/esm/components/image-viewer/index.css +30 -31
  124. package/esm/components/image-viewer/index.module.css.js +1 -1
  125. package/esm/components/image-viewer/index.module.css.js.map +1 -1
  126. package/esm/components/image-viewer/single.js +1 -0
  127. package/esm/components/image-viewer/single.js.map +1 -1
  128. package/esm/components/image-viewer/slide.js +3 -2
  129. package/esm/components/image-viewer/slide.js.map +1 -1
  130. package/esm/components/image-viewer/video/index.css +22 -10
  131. package/esm/components/image-viewer/video/index.js +51 -16
  132. package/esm/components/image-viewer/video/index.js.map +1 -1
  133. package/esm/components/image-viewer/video/index.module.css.js +1 -1
  134. package/esm/components/image-viewer/video/index.module.css.js.map +1 -1
  135. package/esm/components/info-bar/Component.js +1 -0
  136. package/esm/components/info-bar/Component.js.map +1 -1
  137. package/esm/components/info-bar/index.css +3 -3
  138. package/esm/components/info-bar/index.module.css.js +1 -1
  139. package/esm/components/navigation-bar/Component.js +56 -25
  140. package/esm/components/navigation-bar/Component.js.map +1 -1
  141. package/esm/components/navigation-bar/index.css +21 -11
  142. package/esm/components/navigation-bar/index.module.css.js +1 -1
  143. package/esm/components/navigation-bar/index.module.css.js.map +1 -1
  144. package/esm/components/subtitles/index.css +3 -3
  145. package/esm/components/subtitles/index.module.css.js +1 -1
  146. package/esm/constants.d.ts +1 -1
  147. package/esm/constants.js +1 -1
  148. package/esm/constants.js.map +1 -1
  149. package/esm/hooks/use-custom-subtitles.js +57 -11
  150. package/esm/hooks/use-custom-subtitles.js.map +1 -1
  151. package/esm/index.css +9 -9
  152. package/esm/index.js +1 -0
  153. package/esm/index.js.map +1 -1
  154. package/esm/index.module.css.js +1 -1
  155. package/esm/types.d.ts +4 -2
  156. package/esm/utils/index.d.ts +1 -0
  157. package/esm/utils/index.js +1 -0
  158. package/esm/utils/index.js.map +1 -1
  159. package/esm/utils/modern-download.d.ts +6 -0
  160. package/esm/utils/modern-download.js +109 -0
  161. package/esm/utils/modern-download.js.map +1 -0
  162. package/hooks/use-custom-subtitles.js +57 -11
  163. package/hooks/use-custom-subtitles.js.map +1 -1
  164. package/index.css +9 -9
  165. package/index.js +1 -0
  166. package/index.js.map +1 -1
  167. package/index.module.css.js +1 -1
  168. package/modern/Component.js +50 -7
  169. package/modern/Component.js.map +1 -1
  170. package/modern/components/bottom-button/index.css +5 -5
  171. package/modern/components/bottom-button/index.module.css.js +1 -1
  172. package/modern/components/buttons/index.css +5 -5
  173. package/modern/components/buttons/index.d.ts +3 -1
  174. package/modern/components/buttons/index.js +51 -12
  175. package/modern/components/buttons/index.js.map +1 -1
  176. package/modern/components/buttons/index.module.css.js +1 -1
  177. package/modern/components/header/index.css +3 -2
  178. package/modern/components/header/index.module.css.js +1 -1
  179. package/modern/components/header/index.module.css.js.map +1 -1
  180. package/modern/components/header-info-block/Component.js +1 -1
  181. package/modern/components/header-info-block/Component.js.map +1 -1
  182. package/modern/components/header-info-block/index.css +4 -4
  183. package/modern/components/header-info-block/index.module.css.js +1 -1
  184. package/modern/components/header-mobile/index.css +6 -6
  185. package/modern/components/header-mobile/index.module.css.js +1 -1
  186. package/modern/components/image-preview/Component.js +1 -1
  187. package/modern/components/image-preview/Component.js.map +1 -1
  188. package/modern/components/image-preview/index.css +20 -20
  189. package/modern/components/image-preview/index.module.css.js +1 -1
  190. package/modern/components/image-preview/index.module.css.js.map +1 -1
  191. package/modern/components/image-viewer/hooks.js +3 -2
  192. package/modern/components/image-viewer/hooks.js.map +1 -1
  193. package/modern/components/image-viewer/index.css +30 -31
  194. package/modern/components/image-viewer/index.module.css.js +1 -1
  195. package/modern/components/image-viewer/index.module.css.js.map +1 -1
  196. package/modern/components/image-viewer/slide.js +2 -2
  197. package/modern/components/image-viewer/slide.js.map +1 -1
  198. package/modern/components/image-viewer/video/index.css +22 -10
  199. package/modern/components/image-viewer/video/index.js +47 -12
  200. package/modern/components/image-viewer/video/index.js.map +1 -1
  201. package/modern/components/image-viewer/video/index.module.css.js +1 -1
  202. package/modern/components/image-viewer/video/index.module.css.js.map +1 -1
  203. package/modern/components/info-bar/index.css +3 -3
  204. package/modern/components/info-bar/index.module.css.js +1 -1
  205. package/modern/components/navigation-bar/Component.js +55 -25
  206. package/modern/components/navigation-bar/Component.js.map +1 -1
  207. package/modern/components/navigation-bar/index.css +21 -11
  208. package/modern/components/navigation-bar/index.module.css.js +1 -1
  209. package/modern/components/navigation-bar/index.module.css.js.map +1 -1
  210. package/modern/components/subtitles/index.css +3 -3
  211. package/modern/components/subtitles/index.module.css.js +1 -1
  212. package/modern/constants.d.ts +1 -1
  213. package/modern/constants.js +1 -1
  214. package/modern/constants.js.map +1 -1
  215. package/modern/hooks/use-custom-subtitles.js +56 -9
  216. package/modern/hooks/use-custom-subtitles.js.map +1 -1
  217. package/modern/index.css +9 -9
  218. package/modern/index.module.css.js +1 -1
  219. package/modern/types.d.ts +4 -2
  220. package/modern/utils/index.d.ts +1 -0
  221. package/modern/utils/index.js +1 -0
  222. package/modern/utils/index.js.map +1 -1
  223. package/modern/utils/modern-download.d.ts +6 -0
  224. package/modern/utils/modern-download.js +76 -0
  225. package/modern/utils/modern-download.js.map +1 -0
  226. package/moderncssm/Component.js +50 -7
  227. package/moderncssm/Component.js.map +1 -1
  228. package/moderncssm/components/buttons/index.d.ts +3 -1
  229. package/moderncssm/components/buttons/index.js +51 -12
  230. package/moderncssm/components/buttons/index.js.map +1 -1
  231. package/moderncssm/components/header/index.module.css +1 -1
  232. package/moderncssm/components/header-info-block/Component.js +1 -1
  233. package/moderncssm/components/header-info-block/Component.js.map +1 -1
  234. package/moderncssm/components/image-preview/Component.js +1 -1
  235. package/moderncssm/components/image-preview/Component.js.map +1 -1
  236. package/moderncssm/components/image-preview/index.module.css +2 -2
  237. package/moderncssm/components/image-viewer/hooks.js +3 -2
  238. package/moderncssm/components/image-viewer/hooks.js.map +1 -1
  239. package/moderncssm/components/image-viewer/index.module.css +2 -2
  240. package/moderncssm/components/image-viewer/slide.js +2 -2
  241. package/moderncssm/components/image-viewer/slide.js.map +1 -1
  242. package/moderncssm/components/image-viewer/video/index.js +47 -12
  243. package/moderncssm/components/image-viewer/video/index.js.map +1 -1
  244. package/moderncssm/components/image-viewer/video/index.module.css +16 -3
  245. package/moderncssm/components/navigation-bar/Component.js +55 -25
  246. package/moderncssm/components/navigation-bar/Component.js.map +1 -1
  247. package/moderncssm/components/navigation-bar/index.module.css +14 -2
  248. package/moderncssm/constants.d.ts +1 -1
  249. package/moderncssm/constants.js +1 -1
  250. package/moderncssm/constants.js.map +1 -1
  251. package/moderncssm/hooks/use-custom-subtitles.js +56 -9
  252. package/moderncssm/hooks/use-custom-subtitles.js.map +1 -1
  253. package/moderncssm/types.d.ts +4 -2
  254. package/moderncssm/utils/index.d.ts +1 -0
  255. package/moderncssm/utils/index.js +1 -0
  256. package/moderncssm/utils/index.js.map +1 -1
  257. package/moderncssm/utils/modern-download.d.ts +6 -0
  258. package/moderncssm/utils/modern-download.js +76 -0
  259. package/moderncssm/utils/modern-download.js.map +1 -0
  260. package/package.json +2 -2
  261. package/src/Component.tsx +63 -6
  262. package/src/components/buttons/index.tsx +157 -62
  263. package/src/components/header/index.module.css +1 -1
  264. package/src/components/header-info-block/Component.tsx +2 -2
  265. package/src/components/image-preview/Component.tsx +1 -1
  266. package/src/components/image-preview/index.module.css +2 -2
  267. package/src/components/image-viewer/hooks.ts +3 -2
  268. package/src/components/image-viewer/index.module.css +2 -2
  269. package/src/components/image-viewer/slide.tsx +2 -1
  270. package/src/components/image-viewer/video/index.module.css +16 -3
  271. package/src/components/image-viewer/video/index.tsx +62 -13
  272. package/src/components/navigation-bar/Component.tsx +68 -27
  273. package/src/components/navigation-bar/index.module.css +12 -2
  274. package/src/constants.ts +1 -1
  275. package/src/hooks/use-custom-subtitles.ts +72 -12
  276. package/src/types.ts +4 -2
  277. package/src/utils/index.ts +1 -0
  278. package/src/utils/modern-download.ts +107 -0
  279. package/types.d.ts +4 -2
  280. package/utils/index.d.ts +1 -0
  281. package/utils/index.js +2 -0
  282. package/utils/index.js.map +1 -1
  283. package/utils/modern-download.d.ts +6 -0
  284. package/utils/modern-download.js +113 -0
  285. package/utils/modern-download.js.map +1 -0
@@ -4,10 +4,11 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
6
  var cn = require('classnames');
7
- var throttle = require('lodash/throttle');
7
+ var cssm = require('@alfalab/core-components-shared/cssm');
8
8
  var context = require('../../context.js');
9
9
  var utils = require('../../utils/utils.js');
10
10
  var constants = require('../../utils/constants.js');
11
+ require('tslib');
11
12
  var Component = require('../image-preview/Component.js');
12
13
  var styles = require('./index.module.css');
13
14
 
@@ -15,16 +16,17 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
15
16
 
16
17
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
17
18
  var cn__default = /*#__PURE__*/_interopDefaultCompat(cn);
18
- var throttle__default = /*#__PURE__*/_interopDefaultCompat(throttle);
19
19
  var styles__default = /*#__PURE__*/_interopDefaultCompat(styles);
20
20
 
21
21
  var MIN_SCROLL_STEP = 24;
22
- var SCROLL_SPEED = 2; // Коэффициент скорости прокрутки (можно настроить)
23
- var SCROLL_THRESHOLD = 150; // Расстояние от границы, при котором начинается прокрутка
22
+ var DRAG_CLICK_THRESHOLD = 5;
24
23
  var NavigationBar = function () {
25
24
  var _a;
26
25
  var containerRef = React.useRef(null);
27
- var _b = React.useState(false), isNavMouseDowned = _b[0], setIsNavMouseDowned = _b[1];
26
+ var dragStartXRef = React.useRef(0);
27
+ var dragStartScrollLeftRef = React.useRef(0);
28
+ var suppressClickRef = React.useRef(false);
29
+ var _b = React.useState(false), isDragging = _b[0], setIsDragging = _b[1];
28
30
  var _c = React.useContext(context.GalleryContext), images = _c.images, currentSlideIndex = _c.currentSlideIndex, setCurrentSlideIndex = _c.setCurrentSlideIndex, getSwiper = _c.getSwiper, setPlayingVideo = _c.setPlayingVideo, view = _c.view;
29
31
  var swiper = getSwiper();
30
32
  var handlePreviewSelect = function (index) {
@@ -43,32 +45,57 @@ var NavigationBar = function () {
43
45
  });
44
46
  }
45
47
  }, []);
46
- var handlePreviewMouseDown = function () {
47
- setIsNavMouseDowned(true);
48
+ var handlePreviewMouseDown = function (e) {
49
+ if (e.button !== 0 || !containerRef.current) {
50
+ return;
51
+ }
52
+ dragStartXRef.current = e.clientX;
53
+ dragStartScrollLeftRef.current = containerRef.current.scrollLeft;
54
+ suppressClickRef.current = false;
55
+ setIsDragging(true);
48
56
  };
49
- var handlePreviewMouseUp = function () {
50
- setIsNavMouseDowned(false);
51
- if (containerRef.current) {
52
- containerRef.current.style.scrollBehavior = 'auto'; // Отключаем плавность для резкой остановки
57
+ var handlePreviewMouseUp = React.useCallback(function () {
58
+ setIsDragging(false);
59
+ }, []);
60
+ var dragTo = React.useCallback(function (clientX) {
61
+ var container = containerRef.current;
62
+ if (!container) {
63
+ return;
64
+ }
65
+ var deltaX = clientX - dragStartXRef.current;
66
+ if (Math.abs(deltaX) > DRAG_CLICK_THRESHOLD) {
67
+ suppressClickRef.current = true;
53
68
  }
69
+ container.scrollLeft = dragStartScrollLeftRef.current - deltaX;
70
+ }, []);
71
+ var handleMouseNavigationMove = function (e) {
72
+ if (!isDragging) {
73
+ return;
74
+ }
75
+ dragTo(e.clientX);
54
76
  };
55
- var handleMouseNavigationMove = throttle__default.default(function (e) {
56
- if (!containerRef.current || !isNavMouseDowned)
77
+ var handleClickCapture = function (e) {
78
+ if (!suppressClickRef.current) {
57
79
  return;
58
- var container = containerRef.current;
59
- var _a = container.getBoundingClientRect(), containerWidth = _a.width, containerLeft = _a.left;
60
- var mouseX = e.clientX;
61
- // Если курсор близко к правой границе
62
- if (mouseX > containerWidth + containerLeft - SCROLL_THRESHOLD) {
63
- var scrollValue = (mouseX - (containerWidth + containerLeft - SCROLL_THRESHOLD)) * SCROLL_SPEED;
64
- container.scrollBy({ left: scrollValue, behavior: 'smooth' });
65
80
  }
66
- // Если курсор близко к левой границе
67
- else if (mouseX < containerLeft + SCROLL_THRESHOLD) {
68
- var scrollValue = (mouseX - (containerLeft + SCROLL_THRESHOLD)) * SCROLL_SPEED;
69
- container.scrollBy({ left: scrollValue, behavior: 'smooth' });
81
+ e.preventDefault();
82
+ e.stopPropagation();
83
+ suppressClickRef.current = false;
84
+ };
85
+ React.useEffect(function () {
86
+ if (!cssm.isClient() || !isDragging) {
87
+ return undefined;
70
88
  }
71
- }, 150);
89
+ var handleDocumentMouseMove = function (event) {
90
+ dragTo(event.clientX);
91
+ };
92
+ document.addEventListener('mousemove', handleDocumentMouseMove);
93
+ document.addEventListener('mouseup', handlePreviewMouseUp);
94
+ return function () {
95
+ document.removeEventListener('mousemove', handleDocumentMouseMove);
96
+ document.removeEventListener('mouseup', handlePreviewMouseUp);
97
+ };
98
+ }, [dragTo, handlePreviewMouseUp, isDragging]);
72
99
  var handlePreviewPosition = React.useCallback(function (preview, containerWidth) {
73
100
  var _a = preview.getBoundingClientRect(), right = _a.right, left = _a.left, x = _a.x;
74
101
  if (view === 'mobile') {
@@ -94,7 +121,10 @@ var NavigationBar = function () {
94
121
  }, [currentSlideIndex, handlePreviewPosition, scroll]);
95
122
  return (
96
123
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
97
- React__default.default.createElement("div", { className: cn__default.default(styles__default.default.component, (_a = {}, _a[styles__default.default.mobile] = view === 'mobile', _a)), ref: containerRef, "data-test-id": constants.TestIds.NAVIGATION_BAR, onMouseDown: handlePreviewMouseDown, onMouseUp: handlePreviewMouseUp, onMouseMove: handleMouseNavigationMove }, images.map(function (image, index) {
124
+ React__default.default.createElement("div", { className: cn__default.default(styles__default.default.component, (_a = {},
125
+ _a[styles__default.default.mobile] = view === 'mobile',
126
+ _a[styles__default.default.dragging] = isDragging,
127
+ _a)), ref: containerRef, "data-test-id": constants.TestIds.NAVIGATION_BAR, onMouseDown: handlePreviewMouseDown, onMouseUp: handlePreviewMouseUp, onMouseMove: handleMouseNavigationMove, onClickCapture: handleClickCapture }, images.map(function (image, index) {
98
128
  var _a;
99
129
  var active = index === currentSlideIndex;
100
130
  return (React__default.default.createElement(Component.ImagePreview, { key: utils.getImageKey(image, index), image: image, active: active, index: index, onSelect: handlePreviewSelect, className: cn__default.default(styles__default.default.preview, (_a = {}, _a[styles__default.default.mobile] = view === 'mobile', _a)) }));
@@ -1 +1 @@
1
- {"version":3,"file":"Component.js","sources":["../../../src/components/navigation-bar/Component.tsx"],"sourcesContent":["import React, { type FC, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport cn from 'classnames';\nimport throttle from 'lodash/throttle';\n\nimport { GalleryContext } from '../../context';\nimport { getImageKey, TestIds } from '../../utils';\nimport { ImagePreview } from '../image-preview';\n\nimport styles from './index.module.css';\n\nconst MIN_SCROLL_STEP = 24;\nconst SCROLL_SPEED = 2; // Коэффициент скорости прокрутки (можно настроить)\nconst SCROLL_THRESHOLD = 150; // Расстояние от границы, при котором начинается прокрутка\n\nexport const NavigationBar: FC = () => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const [isNavMouseDowned, setIsNavMouseDowned] = useState<boolean>(false);\n\n const { images, currentSlideIndex, setCurrentSlideIndex, getSwiper, setPlayingVideo, view } =\n useContext(GalleryContext);\n\n const swiper = getSwiper();\n\n const handlePreviewSelect = (index: number) => {\n setCurrentSlideIndex?.(index);\n\n if (swiper) {\n setPlayingVideo(true);\n swiper.slideTo(index);\n }\n };\n\n const scroll = useCallback((scrollValue: number) => {\n if (containerRef.current) {\n containerRef.current.scroll({\n top: 0,\n left: containerRef.current.scrollLeft + scrollValue,\n behavior: 'smooth',\n });\n }\n }, []);\n\n const handlePreviewMouseDown = () => {\n setIsNavMouseDowned(true);\n };\n\n const handlePreviewMouseUp = () => {\n setIsNavMouseDowned(false);\n if (containerRef.current) {\n containerRef.current.style.scrollBehavior = 'auto'; // Отключаем плавность для резкой остановки\n }\n };\n\n const handleMouseNavigationMove = throttle((e: React.MouseEvent<HTMLDivElement>) => {\n if (!containerRef.current || !isNavMouseDowned) return;\n\n const container = containerRef.current;\n const { width: containerWidth, left: containerLeft } = container.getBoundingClientRect();\n const mouseX = e.clientX;\n\n // Если курсор близко к правой границе\n if (mouseX > containerWidth + containerLeft - SCROLL_THRESHOLD) {\n const scrollValue =\n (mouseX - (containerWidth + containerLeft - SCROLL_THRESHOLD)) * SCROLL_SPEED;\n\n container.scrollBy({ left: scrollValue, behavior: 'smooth' });\n }\n // Если курсор близко к левой границе\n else if (mouseX < containerLeft + SCROLL_THRESHOLD) {\n const scrollValue = (mouseX - (containerLeft + SCROLL_THRESHOLD)) * SCROLL_SPEED;\n\n container.scrollBy({ left: scrollValue, behavior: 'smooth' });\n }\n }, 150);\n\n const handlePreviewPosition = useCallback(\n (preview: Element, containerWidth: number) => {\n const { right, left, x } = preview.getBoundingClientRect();\n\n if (view === 'mobile') {\n scroll(x - containerWidth / 2 + MIN_SCROLL_STEP); // Передвигаем в центр активное превью\n }\n\n if (right > containerWidth) {\n const scrollValue = right - containerWidth + MIN_SCROLL_STEP;\n\n scroll(scrollValue);\n } else if (left < 0) {\n const scrollValue = left - MIN_SCROLL_STEP;\n\n scroll(scrollValue);\n }\n },\n [scroll, view],\n );\n\n useEffect(() => {\n if (containerRef.current) {\n const { width: containerWidth } = containerRef.current.getBoundingClientRect();\n\n const activePreview = containerRef.current.children[currentSlideIndex];\n\n if (activePreview) {\n handlePreviewPosition(activePreview, containerWidth);\n }\n }\n }, [currentSlideIndex, handlePreviewPosition, scroll]);\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n className={cn(styles.component, { [styles.mobile]: view === 'mobile' })}\n ref={containerRef}\n data-test-id={TestIds.NAVIGATION_BAR}\n onMouseDown={handlePreviewMouseDown}\n onMouseUp={handlePreviewMouseUp}\n onMouseMove={handleMouseNavigationMove}\n >\n {images.map((image, index) => {\n const active = index === currentSlideIndex;\n\n return (\n <ImagePreview\n key={getImageKey(image, index)}\n image={image}\n active={active}\n index={index}\n onSelect={handlePreviewSelect}\n className={cn(styles.preview, { [styles.mobile]: view === 'mobile' })}\n />\n );\n })}\n </div>\n );\n};\n"],"names":["useRef","useState","useContext","GalleryContext","useCallback","throttle","useEffect","React","cn","styles","TestIds","ImagePreview","getImageKey"],"mappings":"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"}
1
+ {"version":3,"file":"Component.js","sources":["../../../src/components/navigation-bar/Component.tsx"],"sourcesContent":["import React, { type FC, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport cn from 'classnames';\n\nimport { isClient } from '@alfalab/core-components-shared';\n\nimport { GalleryContext } from '../../context';\nimport { getImageKey, TestIds } from '../../utils';\nimport { ImagePreview } from '../image-preview';\n\nimport styles from './index.module.css';\n\nconst MIN_SCROLL_STEP = 24;\nconst DRAG_CLICK_THRESHOLD = 5;\n\nexport const NavigationBar: FC = () => {\n const containerRef = useRef<HTMLDivElement>(null);\n const dragStartXRef = useRef<number>(0);\n const dragStartScrollLeftRef = useRef<number>(0);\n const suppressClickRef = useRef<boolean>(false);\n\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const { images, currentSlideIndex, setCurrentSlideIndex, getSwiper, setPlayingVideo, view } =\n useContext(GalleryContext);\n\n const swiper = getSwiper();\n\n const handlePreviewSelect = (index: number) => {\n setCurrentSlideIndex?.(index);\n\n if (swiper) {\n setPlayingVideo(true);\n swiper.slideTo(index);\n }\n };\n\n const scroll = useCallback((scrollValue: number) => {\n if (containerRef.current) {\n containerRef.current.scroll({\n top: 0,\n left: containerRef.current.scrollLeft + scrollValue,\n behavior: 'smooth',\n });\n }\n }, []);\n\n const handlePreviewMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.button !== 0 || !containerRef.current) {\n return;\n }\n\n dragStartXRef.current = e.clientX;\n dragStartScrollLeftRef.current = containerRef.current.scrollLeft;\n suppressClickRef.current = false;\n setIsDragging(true);\n };\n\n const handlePreviewMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const dragTo = useCallback((clientX: number) => {\n const container = containerRef.current;\n\n if (!container) {\n return;\n }\n\n const deltaX = clientX - dragStartXRef.current;\n\n if (Math.abs(deltaX) > DRAG_CLICK_THRESHOLD) {\n suppressClickRef.current = true;\n }\n\n container.scrollLeft = dragStartScrollLeftRef.current - deltaX;\n }, []);\n\n const handleMouseNavigationMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!isDragging) {\n return;\n }\n\n dragTo(e.clientX);\n };\n\n const handleClickCapture = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!suppressClickRef.current) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n suppressClickRef.current = false;\n };\n\n useEffect(() => {\n if (!isClient() || !isDragging) {\n return undefined;\n }\n\n const handleDocumentMouseMove = (event: MouseEvent) => {\n dragTo(event.clientX);\n };\n\n document.addEventListener('mousemove', handleDocumentMouseMove);\n document.addEventListener('mouseup', handlePreviewMouseUp);\n\n return () => {\n document.removeEventListener('mousemove', handleDocumentMouseMove);\n document.removeEventListener('mouseup', handlePreviewMouseUp);\n };\n }, [dragTo, handlePreviewMouseUp, isDragging]);\n\n const handlePreviewPosition = useCallback(\n (preview: Element, containerWidth: number) => {\n const { right, left, x } = preview.getBoundingClientRect();\n\n if (view === 'mobile') {\n scroll(x - containerWidth / 2 + MIN_SCROLL_STEP); // Передвигаем в центр активное превью\n }\n\n if (right > containerWidth) {\n const scrollValue = right - containerWidth + MIN_SCROLL_STEP;\n\n scroll(scrollValue);\n } else if (left < 0) {\n const scrollValue = left - MIN_SCROLL_STEP;\n\n scroll(scrollValue);\n }\n },\n [scroll, view],\n );\n\n useEffect(() => {\n if (containerRef.current) {\n const { width: containerWidth } = containerRef.current.getBoundingClientRect();\n\n const activePreview = containerRef.current.children[currentSlideIndex];\n\n if (activePreview) {\n handlePreviewPosition(activePreview, containerWidth);\n }\n }\n }, [currentSlideIndex, handlePreviewPosition, scroll]);\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n className={cn(styles.component, {\n [styles.mobile]: view === 'mobile',\n [styles.dragging]: isDragging,\n })}\n ref={containerRef}\n data-test-id={TestIds.NAVIGATION_BAR}\n onMouseDown={handlePreviewMouseDown}\n onMouseUp={handlePreviewMouseUp}\n onMouseMove={handleMouseNavigationMove}\n onClickCapture={handleClickCapture}\n >\n {images.map((image, index) => {\n const active = index === currentSlideIndex;\n\n return (\n <ImagePreview\n key={getImageKey(image, index)}\n image={image}\n active={active}\n index={index}\n onSelect={handlePreviewSelect}\n className={cn(styles.preview, { [styles.mobile]: view === 'mobile' })}\n />\n );\n })}\n </div>\n );\n};\n"],"names":["useRef","useState","useContext","GalleryContext","useCallback","useEffect","isClient","React","cn","styles","TestIds","ImagePreview","getImageKey"],"mappings":";;;;;;;;;;;;;;;;;;;;AAWA,IAAM,eAAe,GAAG,EAAE;AAC1B,IAAM,oBAAoB,GAAG,CAAC;AAEjB,IAAA,aAAa,GAAO,YAAA;;AAC7B,IAAA,IAAM,YAAY,GAAGA,YAAM,CAAiB,IAAI,CAAC;AACjD,IAAA,IAAM,aAAa,GAAGA,YAAM,CAAS,CAAC,CAAC;AACvC,IAAA,IAAM,sBAAsB,GAAGA,YAAM,CAAS,CAAC,CAAC;AAChD,IAAA,IAAM,gBAAgB,GAAGA,YAAM,CAAU,KAAK,CAAC;IAEzC,IAAA,EAAA,GAA8BC,cAAQ,CAAU,KAAK,CAAC,EAArD,UAAU,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,aAAa,GAAA,EAAA,CAAA,CAAA,CAA4B;IAEtD,IAAA,EAAA,GACFC,gBAAU,CAACC,sBAAc,CAAC,EADtB,MAAM,GAAA,EAAA,CAAA,MAAA,EAAE,iBAAiB,GAAA,EAAA,CAAA,iBAAA,EAAE,oBAAoB,GAAA,EAAA,CAAA,oBAAA,EAAE,SAAS,GAAA,EAAA,CAAA,SAAA,EAAE,eAAe,GAAA,EAAA,CAAA,eAAA,EAAE,IAAI,GAAA,EAAA,CAAA,IAC3D;AAE9B,IAAA,IAAM,MAAM,GAAG,SAAS,EAAE;IAE1B,IAAM,mBAAmB,GAAG,UAAC,KAAa,EAAA;AACtC,QAAA,oBAAoB,aAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAG,KAAK,CAAC;QAE7B,IAAI,MAAM,EAAE;YACR,eAAe,CAAC,IAAI,CAAC;AACrB,YAAA,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;;AAE7B,KAAC;AAED,IAAA,IAAM,MAAM,GAAGC,iBAAW,CAAC,UAAC,WAAmB,EAAA;AAC3C,QAAA,IAAI,YAAY,CAAC,OAAO,EAAE;AACtB,YAAA,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC;AACxB,gBAAA,GAAG,EAAE,CAAC;AACN,gBAAA,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,GAAG,WAAW;AACnD,gBAAA,QAAQ,EAAE,QAAQ;AACrB,aAAA,CAAC;;KAET,EAAE,EAAE,CAAC;IAEN,IAAM,sBAAsB,GAAG,UAAC,CAAmC,EAAA;QAC/D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACzC;;AAGJ,QAAA,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO;QACjC,sBAAsB,CAAC,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU;AAChE,QAAA,gBAAgB,CAAC,OAAO,GAAG,KAAK;QAChC,aAAa,CAAC,IAAI,CAAC;AACvB,KAAC;IAED,IAAM,oBAAoB,GAAGA,iBAAW,CAAC,YAAA;QACrC,aAAa,CAAC,KAAK,CAAC;KACvB,EAAE,EAAE,CAAC;AAEN,IAAA,IAAM,MAAM,GAAGA,iBAAW,CAAC,UAAC,OAAe,EAAA;AACvC,QAAA,IAAM,SAAS,GAAG,YAAY,CAAC,OAAO;QAEtC,IAAI,CAAC,SAAS,EAAE;YACZ;;AAGJ,QAAA,IAAM,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC,OAAO;QAE9C,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,oBAAoB,EAAE;AACzC,YAAA,gBAAgB,CAAC,OAAO,GAAG,IAAI;;QAGnC,SAAS,CAAC,UAAU,GAAG,sBAAsB,CAAC,OAAO,GAAG,MAAM;KACjE,EAAE,EAAE,CAAC;IAEN,IAAM,yBAAyB,GAAG,UAAC,CAAmC,EAAA;QAClE,IAAI,CAAC,UAAU,EAAE;YACb;;AAGJ,QAAA,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,KAAC;IAED,IAAM,kBAAkB,GAAG,UAAC,CAAmC,EAAA;AAC3D,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE;YAC3B;;QAGJ,CAAC,CAAC,cAAc,EAAE;QAClB,CAAC,CAAC,eAAe,EAAE;AACnB,QAAA,gBAAgB,CAAC,OAAO,GAAG,KAAK;AACpC,KAAC;AAED,IAAAC,eAAS,CAAC,YAAA;AACN,QAAA,IAAI,CAACC,aAAQ,EAAE,IAAI,CAAC,UAAU,EAAE;AAC5B,YAAA,OAAO,SAAS;;QAGpB,IAAM,uBAAuB,GAAG,UAAC,KAAiB,EAAA;AAC9C,YAAA,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;AACzB,SAAC;AAED,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,uBAAuB,CAAC;AAC/D,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,oBAAoB,CAAC;QAE1D,OAAO,YAAA;AACH,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,uBAAuB,CAAC;AAClE,YAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,oBAAoB,CAAC;AACjE,SAAC;KACJ,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC;AAE9C,IAAA,IAAM,qBAAqB,GAAGF,iBAAW,CACrC,UAAC,OAAgB,EAAE,cAAsB,EAAA;AAC/B,QAAA,IAAA,EAAqB,GAAA,OAAO,CAAC,qBAAqB,EAAE,EAAlD,KAAK,GAAA,EAAA,CAAA,KAAA,EAAE,IAAI,GAAA,EAAA,CAAA,IAAA,EAAE,CAAC,OAAoC;AAE1D,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;YACnB,MAAM,CAAC,CAAC,GAAG,cAAc,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC;;AAGrD,QAAA,IAAI,KAAK,GAAG,cAAc,EAAE;AACxB,YAAA,IAAM,WAAW,GAAG,KAAK,GAAG,cAAc,GAAG,eAAe;YAE5D,MAAM,CAAC,WAAW,CAAC;;AAChB,aAAA,IAAI,IAAI,GAAG,CAAC,EAAE;AACjB,YAAA,IAAM,WAAW,GAAG,IAAI,GAAG,eAAe;YAE1C,MAAM,CAAC,WAAW,CAAC;;AAE3B,KAAC,EACD,CAAC,MAAM,EAAE,IAAI,CAAC,CACjB;AAED,IAAAC,eAAS,CAAC,YAAA;AACN,QAAA,IAAI,YAAY,CAAC,OAAO,EAAE;YACd,IAAO,cAAc,GAAK,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAA,KAAjD;YAE7B,IAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAEtE,IAAI,aAAa,EAAE;AACf,gBAAA,qBAAqB,CAAC,aAAa,EAAE,cAAc,CAAC;;;KAG/D,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAEtD;;AAEI,IAAAE,sBAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EACI,SAAS,EAAEC,mBAAE,CAACC,uBAAM,CAAC,SAAS,GAAA,EAAA,GAAA,EAAA;AAC1B,YAAA,EAAA,CAACA,uBAAM,CAAC,MAAM,CAAG,GAAA,IAAI,KAAK,QAAQ;AAClC,YAAA,EAAA,CAACA,uBAAM,CAAC,QAAQ,CAAA,GAAG,UAAU;AAC/B,YAAA,EAAA,EAAA,EACF,GAAG,EAAE,YAAY,EAAA,cAAA,EACHC,iBAAO,CAAC,cAAc,EACpC,WAAW,EAAE,sBAAsB,EACnC,SAAS,EAAE,oBAAoB,EAC/B,WAAW,EAAE,yBAAyB,EACtC,cAAc,EAAE,kBAAkB,EAAA,EAEjC,MAAM,CAAC,GAAG,CAAC,UAAC,KAAK,EAAE,KAAK,EAAA;;AACrB,QAAA,IAAM,MAAM,GAAG,KAAK,KAAK,iBAAiB;QAE1C,QACIH,qCAACI,sBAAY,EAAA,EACT,GAAG,EAAEC,iBAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAEJ,mBAAE,CAACC,uBAAM,CAAC,OAAO,GAAA,EAAA,GAAA,EAAA,EAAI,GAACA,uBAAM,CAAC,MAAM,CAAG,GAAA,IAAI,KAAK,QAAQ,EAAA,EAAA,EAAG,EACvE,CAAA;KAET,CAAC,CACA;AAEd;;;;"}
@@ -6,7 +6,7 @@
6
6
  --gap-4: 4px;
7
7
  --gap-8: 8px;
8
8
  --gap-12: 12px;
9
- --gap-24: 24px;
9
+ --gap-32: 32px;
10
10
  }
11
11
  .component {
12
12
  display: flex;
@@ -16,13 +16,23 @@
16
16
  flex-shrink: 0;
17
17
  overflow-x: auto;
18
18
  box-sizing: border-box;
19
- padding: var(--gap-12) var(--gap-24);
19
+ padding: var(--gap-12) var(--gap-32);
20
20
  scrollbar-width: none;
21
21
  background-color: var(--color-static-neutral-0-inverted);
22
+ cursor: grab;
23
+ -webkit-user-select: none;
24
+ -moz-user-select: none;
25
+ user-select: none;
22
26
  }
23
27
  .component.mobile {
24
- padding: var(--gap-8) var(--gap-24);
28
+ padding: var(--gap-8);
25
29
  }
30
+ .component.dragging {
31
+ cursor: grabbing;
32
+ }
33
+ .component.dragging * {
34
+ cursor: grabbing;
35
+ }
26
36
  .component::-webkit-scrollbar {
27
37
  display: none;
28
38
  }
@@ -1,4 +1,4 @@
1
- export declare const SWIPE_THRESHOLD = -250;
1
+ export declare const SWIPE_THRESHOLD = 250;
2
2
  export declare const PREVIEW_WIDTH_MOBILE = 46;
3
3
  export declare const PREVIEW_HEIGHT_MOBILE = 46;
4
4
  export declare const PREVIEW_WIDTH_DESKTOP = 56;
package/cssm/constants.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var SWIPE_THRESHOLD = -250;
5
+ var SWIPE_THRESHOLD = 250;
6
6
  var PREVIEW_WIDTH_MOBILE = 46;
7
7
  var PREVIEW_HEIGHT_MOBILE = 46;
8
8
  var PREVIEW_WIDTH_DESKTOP = 56;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["export const SWIPE_THRESHOLD = -250;\n\nexport const PREVIEW_WIDTH_MOBILE = 46;\nexport const PREVIEW_HEIGHT_MOBILE = 46;\n\nexport const PREVIEW_WIDTH_DESKTOP = 56;\nexport const PREVIEW_HEIGHT_DESKTOP = 56;\n\nexport const PREVIEW_VIDEO_MULTIPLIER = 12;\n"],"names":[],"mappings":";;;;AAAa,IAAA,eAAe,GAAG;AAExB,IAAM,oBAAoB,GAAG;AAC7B,IAAM,qBAAqB,GAAG;AAE9B,IAAM,qBAAqB,GAAG;AAC9B,IAAM,sBAAsB,GAAG;AAE/B,IAAM,wBAAwB,GAAG;;;;;;;;;"}
1
+ {"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["export const SWIPE_THRESHOLD = 250;\n\nexport const PREVIEW_WIDTH_MOBILE = 46;\nexport const PREVIEW_HEIGHT_MOBILE = 46;\n\nexport const PREVIEW_WIDTH_DESKTOP = 56;\nexport const PREVIEW_HEIGHT_DESKTOP = 56;\n\nexport const PREVIEW_VIDEO_MULTIPLIER = 12;\n"],"names":[],"mappings":";;;;AAAO,IAAM,eAAe,GAAG;AAExB,IAAM,oBAAoB,GAAG;AAC7B,IAAM,qBAAqB,GAAG;AAE9B,IAAM,qBAAqB,GAAG;AAC9B,IAAM,sBAAsB,GAAG;AAE/B,IAAM,wBAAwB,GAAG;;;;;;;;;"}
@@ -2,11 +2,10 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var tslib = require('tslib');
6
5
  var React = require('react');
7
6
  var context = require('../context.js');
8
7
 
9
- var SUBTITLES_ANIMATION_SPEED = 0.5;
8
+ var SUBTITLES_FADE_DURATION_SECONDS = 0.5;
10
9
  var useCustomSubtitles = function () {
11
10
  var _a;
12
11
  var getCurrentImageMeta = React.useContext(context.GalleryContext).getCurrentImageMeta;
@@ -15,24 +14,71 @@ var useCustomSubtitles = function () {
15
14
  var _c = React.useState(''), currentSub = _c[0], setCurrentSub = _c[1];
16
15
  var player = (_a = meta === null || meta === void 0 ? void 0 : meta.player) === null || _a === void 0 ? void 0 : _a.current;
17
16
  React.useEffect(function () {
18
- var intervalId = setInterval(function () {
19
- var _a;
20
- if (!player) {
21
- return;
17
+ if (!player) {
18
+ return undefined;
19
+ }
20
+ var textTracks = player.textTracks;
21
+ var textTrack;
22
+ var hideTimeoutId;
23
+ var clearHideTimeout = function () {
24
+ if (hideTimeoutId !== undefined) {
25
+ clearTimeout(hideTimeoutId);
26
+ hideTimeoutId = undefined;
22
27
  }
23
- var textTrack = tslib.__spreadArray([], (Array.from(player.textTracks) || []), true).find(function (track) { return track.kind === 'subtitles'; });
28
+ };
29
+ var syncSubtitles = function () {
30
+ var _a;
31
+ clearHideTimeout();
24
32
  var activeCue = (_a = textTrack === null || textTrack === void 0 ? void 0 : textTrack.activeCues) === null || _a === void 0 ? void 0 : _a[0];
25
33
  if (!(activeCue === null || activeCue === void 0 ? void 0 : activeCue.text)) {
26
34
  setShowSub(false);
27
35
  return;
28
36
  }
29
- var isVisible = (player === null || player === void 0 ? void 0 : player.currentTime) >= activeCue.startTime &&
30
- (player === null || player === void 0 ? void 0 : player.currentTime) <= activeCue.endTime - SUBTITLES_ANIMATION_SPEED;
37
+ var fadeStartTime = activeCue.endTime - SUBTITLES_FADE_DURATION_SECONDS;
38
+ var isVisible = player.currentTime <= fadeStartTime;
31
39
  setCurrentSub(activeCue.text);
32
40
  setShowSub(isVisible);
33
- });
41
+ if (!isVisible || player.paused || player.playbackRate <= 0) {
42
+ return;
43
+ }
44
+ var timeUntilFadeMs = ((fadeStartTime - player.currentTime) / player.playbackRate) * 1000;
45
+ hideTimeoutId = setTimeout(function () {
46
+ setShowSub(false);
47
+ }, timeUntilFadeMs);
48
+ };
49
+ var connectTextTrack = function () {
50
+ var nextTextTrack = Array.from(textTracks).find(function (track) { return track.kind === 'subtitles'; });
51
+ if (nextTextTrack === textTrack) {
52
+ syncSubtitles();
53
+ return;
54
+ }
55
+ textTrack === null || textTrack === void 0 ? void 0 : textTrack.removeEventListener('cuechange', syncSubtitles);
56
+ textTrack = nextTextTrack;
57
+ textTrack === null || textTrack === void 0 ? void 0 : textTrack.addEventListener('cuechange', syncSubtitles);
58
+ syncSubtitles();
59
+ };
60
+ player.addEventListener('play', syncSubtitles);
61
+ player.addEventListener('playing', syncSubtitles);
62
+ player.addEventListener('pause', clearHideTimeout);
63
+ player.addEventListener('waiting', clearHideTimeout);
64
+ player.addEventListener('seeking', clearHideTimeout);
65
+ player.addEventListener('seeked', syncSubtitles);
66
+ player.addEventListener('ratechange', syncSubtitles);
67
+ textTracks.addEventListener('addtrack', connectTextTrack);
68
+ textTracks.addEventListener('change', connectTextTrack);
69
+ connectTextTrack();
34
70
  return function () {
35
- clearInterval(intervalId);
71
+ clearHideTimeout();
72
+ textTrack === null || textTrack === void 0 ? void 0 : textTrack.removeEventListener('cuechange', syncSubtitles);
73
+ player.removeEventListener('play', syncSubtitles);
74
+ player.removeEventListener('playing', syncSubtitles);
75
+ player.removeEventListener('pause', clearHideTimeout);
76
+ player.removeEventListener('waiting', clearHideTimeout);
77
+ player.removeEventListener('seeking', clearHideTimeout);
78
+ player.removeEventListener('seeked', syncSubtitles);
79
+ player.removeEventListener('ratechange', syncSubtitles);
80
+ textTracks.removeEventListener('addtrack', connectTextTrack);
81
+ textTracks.removeEventListener('change', connectTextTrack);
36
82
  };
37
83
  }, [player]);
38
84
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"use-custom-subtitles.js","sources":["../../src/hooks/use-custom-subtitles.ts"],"sourcesContent":["import { useContext, useEffect, useState } from 'react';\n\nimport { GalleryContext } from '../context';\n\nconst SUBTITLES_ANIMATION_SPEED = 0.5;\n\nexport const useCustomSubtitles = () => {\n const { getCurrentImageMeta } = useContext(GalleryContext);\n\n const meta = getCurrentImageMeta();\n\n const [showSub, setShowSub] = useState(false);\n const [currentSub, setCurrentSub] = useState('');\n\n const player = meta?.player?.current;\n\n useEffect(() => {\n const intervalId = setInterval(() => {\n if (!player) {\n return;\n }\n\n const textTrack = [...(Array.from(player.textTracks) || [])].find(\n (track) => track.kind === 'subtitles',\n );\n const activeCue = textTrack?.activeCues?.[0] as VTTCue | undefined;\n\n if (!activeCue?.text) {\n setShowSub(false);\n\n return;\n }\n\n const isVisible =\n player?.currentTime >= activeCue.startTime &&\n player?.currentTime <= activeCue.endTime - SUBTITLES_ANIMATION_SPEED;\n\n setCurrentSub(activeCue.text);\n setShowSub(isVisible);\n });\n\n return () => {\n clearInterval(intervalId);\n };\n }, [player]);\n\n return {\n showSub,\n currentSub,\n };\n};\n"],"names":["useContext","GalleryContext","useState","useEffect","__spreadArray"],"mappings":";;;;;;;;AAIA,IAAM,yBAAyB,GAAG,GAAG;AAExB,IAAA,kBAAkB,GAAG,YAAA;;AACtB,IAAA,IAAA,mBAAmB,GAAKA,gBAAU,CAACC,sBAAc,CAAC,oBAA/B;AAE3B,IAAA,IAAM,IAAI,GAAG,mBAAmB,EAAE;IAE5B,IAAA,EAAA,GAAwBC,cAAQ,CAAC,KAAK,CAAC,EAAtC,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,UAAU,GAAA,EAAA,CAAA,CAAA,CAAmB;IACvC,IAAA,EAAA,GAA8BA,cAAQ,CAAC,EAAE,CAAC,EAAzC,UAAU,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,aAAa,GAAA,EAAA,CAAA,CAAA,CAAgB;AAEhD,IAAA,IAAM,MAAM,GAAG,CAAA,EAAA,GAAA,IAAI,KAAJ,IAAA,IAAA,IAAI,KAAJ,MAAA,GAAA,MAAA,GAAA,IAAI,CAAE,MAAM,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,OAAO;AAEpC,IAAAC,eAAS,CAAC,YAAA;QACN,IAAM,UAAU,GAAG,WAAW,CAAC,YAAA;;YAC3B,IAAI,CAAC,MAAM,EAAE;gBACT;;AAGJ,YAAA,IAAM,SAAS,GAAGC,mBAAI,CAAA,EAAA,GAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,IAAA,CAAA,CAAA,IAAI,CAC7D,UAAC,KAAK,EAAA,EAAK,OAAA,KAAK,CAAC,IAAI,KAAK,WAAW,CAA1B,EAA0B,CACxC;AACD,YAAA,IAAM,SAAS,GAAG,CAAA,EAAA,GAAA,SAAS,KAAT,IAAA,IAAA,SAAS,KAAT,MAAA,GAAA,MAAA,GAAA,SAAS,CAAE,UAAU,MAAG,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,CAAC,CAAuB;YAElE,IAAI,EAAC,SAAS,KAAT,IAAA,IAAA,SAAS,KAAT,MAAA,GAAA,MAAA,GAAA,SAAS,CAAE,IAAI,CAAA,EAAE;gBAClB,UAAU,CAAC,KAAK,CAAC;gBAEjB;;AAGJ,YAAA,IAAM,SAAS,GACX,CAAA,MAAM,KAAN,IAAA,IAAA,MAAM,KAAN,MAAA,GAAA,MAAA,GAAA,MAAM,CAAE,WAAW,KAAI,SAAS,CAAC,SAAS;AAC1C,gBAAA,CAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,WAAW,KAAI,SAAS,CAAC,OAAO,GAAG,yBAAyB;AAExE,YAAA,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC;YAC7B,UAAU,CAAC,SAAS,CAAC;AACzB,SAAC,CAAC;QAEF,OAAO,YAAA;YACH,aAAa,CAAC,UAAU,CAAC;AAC7B,SAAC;AACL,KAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAEZ,OAAO;AACH,QAAA,OAAO,EAAA,OAAA;AACP,QAAA,UAAU,EAAA,UAAA;KACb;AACL;;;;"}
1
+ {"version":3,"file":"use-custom-subtitles.js","sources":["../../src/hooks/use-custom-subtitles.ts"],"sourcesContent":["import { useContext, useEffect, useState } from 'react';\n\nimport { GalleryContext } from '../context';\n\nconst SUBTITLES_FADE_DURATION_SECONDS = 0.5;\n\nexport const useCustomSubtitles = () => {\n const { getCurrentImageMeta } = useContext(GalleryContext);\n\n const meta = getCurrentImageMeta();\n\n const [showSub, setShowSub] = useState(false);\n const [currentSub, setCurrentSub] = useState('');\n\n const player = meta?.player?.current;\n\n useEffect(() => {\n if (!player) {\n return undefined;\n }\n\n const { textTracks } = player;\n\n let textTrack: TextTrack | undefined;\n let hideTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const clearHideTimeout = () => {\n if (hideTimeoutId !== undefined) {\n clearTimeout(hideTimeoutId);\n hideTimeoutId = undefined;\n }\n };\n\n const syncSubtitles = () => {\n clearHideTimeout();\n\n const activeCue = textTrack?.activeCues?.[0] as VTTCue | undefined;\n\n if (!activeCue?.text) {\n setShowSub(false);\n\n return;\n }\n\n const fadeStartTime = activeCue.endTime - SUBTITLES_FADE_DURATION_SECONDS;\n const isVisible = player.currentTime <= fadeStartTime;\n\n setCurrentSub(activeCue.text);\n setShowSub(isVisible);\n\n if (!isVisible || player.paused || player.playbackRate <= 0) {\n return;\n }\n\n const timeUntilFadeMs =\n ((fadeStartTime - player.currentTime) / player.playbackRate) * 1000;\n\n hideTimeoutId = setTimeout(() => {\n setShowSub(false);\n }, timeUntilFadeMs);\n };\n\n const connectTextTrack = () => {\n const nextTextTrack = Array.from(textTracks).find(\n (track) => track.kind === 'subtitles',\n );\n\n if (nextTextTrack === textTrack) {\n syncSubtitles();\n\n return;\n }\n\n textTrack?.removeEventListener('cuechange', syncSubtitles);\n textTrack = nextTextTrack;\n textTrack?.addEventListener('cuechange', syncSubtitles);\n syncSubtitles();\n };\n\n player.addEventListener('play', syncSubtitles);\n player.addEventListener('playing', syncSubtitles);\n player.addEventListener('pause', clearHideTimeout);\n player.addEventListener('waiting', clearHideTimeout);\n player.addEventListener('seeking', clearHideTimeout);\n player.addEventListener('seeked', syncSubtitles);\n player.addEventListener('ratechange', syncSubtitles);\n textTracks.addEventListener('addtrack', connectTextTrack);\n textTracks.addEventListener('change', connectTextTrack);\n\n connectTextTrack();\n\n return () => {\n clearHideTimeout();\n textTrack?.removeEventListener('cuechange', syncSubtitles);\n player.removeEventListener('play', syncSubtitles);\n player.removeEventListener('playing', syncSubtitles);\n player.removeEventListener('pause', clearHideTimeout);\n player.removeEventListener('waiting', clearHideTimeout);\n player.removeEventListener('seeking', clearHideTimeout);\n player.removeEventListener('seeked', syncSubtitles);\n player.removeEventListener('ratechange', syncSubtitles);\n textTracks.removeEventListener('addtrack', connectTextTrack);\n textTracks.removeEventListener('change', connectTextTrack);\n };\n }, [player]);\n\n return {\n showSub,\n currentSub,\n };\n};\n"],"names":["useContext","GalleryContext","useState","useEffect"],"mappings":"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"}
package/cssm/index.js CHANGED
@@ -4,6 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var Component = require('./Component.js');
6
6
  var constants = require('./utils/constants.js');
7
+ require('tslib');
7
8
 
8
9
 
9
10
 
package/cssm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
package/cssm/types.d.ts CHANGED
@@ -40,9 +40,11 @@ export type ImageMeta = {
40
40
  height: number;
41
41
  broken?: boolean;
42
42
  player?: never;
43
+ loaded?: boolean;
43
44
  } | {
44
- width?: never;
45
- height?: never;
45
+ width?: number;
46
+ height?: number;
46
47
  broken?: boolean;
47
48
  player: RefObject<HTMLVideoElement>;
49
+ loaded?: boolean;
48
50
  };
@@ -1,3 +1,4 @@
1
1
  export * from './split-filename';
2
2
  export * from './utils';
3
3
  export * from './constants';
4
+ export * from './modern-download';
@@ -5,6 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var splitFilename = require('./split-filename.js');
6
6
  var utils = require('./utils.js');
7
7
  var constants = require('./constants.js');
8
+ var modernDownload = require('./modern-download.js');
8
9
 
9
10
 
10
11
 
@@ -16,4 +17,5 @@ exports.getImageKey = utils.getImageKey;
16
17
  exports.isSmallImage = utils.isSmallImage;
17
18
  exports.isVideo = utils.isVideo;
18
19
  exports.TestIds = constants.TestIds;
20
+ exports.downloadFile = modernDownload.downloadFile;
19
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,6 @@
1
+ export interface DownloadOptions {
2
+ url: string;
3
+ fileName?: string;
4
+ fileType?: string;
5
+ }
6
+ export declare const downloadFile: ({ url, fileName, fileType, }: DownloadOptions) => Promise<void>;
@@ -0,0 +1,113 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+
7
+ var downloadWithBlob = function (blob, fileName) {
8
+ var url = URL.createObjectURL(blob);
9
+ var link = document.createElement('a');
10
+ link.href = url;
11
+ link.download = fileName;
12
+ document.body.appendChild(link);
13
+ link.click();
14
+ document.body.removeChild(link);
15
+ setTimeout(function () { return URL.revokeObjectURL(url); }, 100);
16
+ };
17
+ var downloadWithLink = function (url, fileName) {
18
+ var link = document.createElement('a');
19
+ link.href = url;
20
+ link.download = fileName;
21
+ link.target = '_blank';
22
+ link.rel = 'noopener noreferrer';
23
+ document.body.appendChild(link);
24
+ link.click();
25
+ document.body.removeChild(link);
26
+ };
27
+ var canUseBlobDownload = function () {
28
+ return typeof fetch === 'function' &&
29
+ typeof URL.createObjectURL === 'function' &&
30
+ typeof URL.revokeObjectURL === 'function';
31
+ };
32
+ var canUseFileShare = function () {
33
+ return typeof File === 'function' &&
34
+ typeof navigator !== 'undefined' &&
35
+ typeof navigator.share === 'function' &&
36
+ typeof navigator.canShare === 'function';
37
+ };
38
+ var canShareFiles = function (files) {
39
+ return canUseFileShare() && navigator.canShare({ files: files });
40
+ };
41
+ var getBlob = function (url) { return tslib.__awaiter(void 0, void 0, void 0, function () {
42
+ var response;
43
+ return tslib.__generator(this, function (_a) {
44
+ switch (_a.label) {
45
+ case 0: return [4 /*yield*/, fetch(url)];
46
+ case 1:
47
+ response = _a.sent();
48
+ if (!response.ok) {
49
+ throw new Error('Network error');
50
+ }
51
+ return [2 /*return*/, response.blob()];
52
+ }
53
+ });
54
+ }); };
55
+ var isAbortError = function (error) {
56
+ return typeof DOMException !== 'undefined' &&
57
+ error instanceof DOMException &&
58
+ error.name === 'AbortError';
59
+ };
60
+ var downloadFile = function (_a) { return tslib.__awaiter(void 0, [_a], void 0, function (_b) {
61
+ var blob, file, error_1, blob;
62
+ var url = _b.url, _d = _b.fileName, fileName = _d === void 0 ? 'download' : _d, fileType = _b.fileType;
63
+ return tslib.__generator(this, function (_e) {
64
+ switch (_e.label) {
65
+ case 0:
66
+ if (!canUseBlobDownload()) {
67
+ downloadWithLink(url, fileName);
68
+ return [2 /*return*/];
69
+ }
70
+ if (!(canUseFileShare() && canShareFiles([new File([], fileName, { type: fileType })]))) return [3 /*break*/, 5];
71
+ _e.label = 1;
72
+ case 1:
73
+ _e.trys.push([1, 4, , 5]);
74
+ return [4 /*yield*/, getBlob(url)];
75
+ case 2:
76
+ blob = _e.sent();
77
+ file = new File([blob], fileName, { type: blob.type || fileType });
78
+ if (!canShareFiles([file])) {
79
+ downloadWithBlob(blob, fileName);
80
+ return [2 /*return*/];
81
+ }
82
+ return [4 /*yield*/, navigator.share({
83
+ files: [file],
84
+ title: "\u0421\u043A\u0430\u0447\u0430\u0442\u044C ".concat(fileName),
85
+ })];
86
+ case 3:
87
+ _e.sent();
88
+ return [2 /*return*/];
89
+ case 4:
90
+ error_1 = _e.sent();
91
+ if (isAbortError(error_1)) {
92
+ return [2 /*return*/];
93
+ }
94
+ downloadWithLink(url, fileName);
95
+ return [2 /*return*/];
96
+ case 5:
97
+ _e.trys.push([5, 7, , 8]);
98
+ return [4 /*yield*/, getBlob(url)];
99
+ case 6:
100
+ blob = _e.sent();
101
+ downloadWithBlob(blob, fileName);
102
+ return [3 /*break*/, 8];
103
+ case 7:
104
+ _e.sent();
105
+ downloadWithLink(url, fileName);
106
+ return [3 /*break*/, 8];
107
+ case 8: return [2 /*return*/];
108
+ }
109
+ });
110
+ }); };
111
+
112
+ exports.downloadFile = downloadFile;
113
+ //# sourceMappingURL=modern-download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modern-download.js","sources":["../../src/utils/modern-download.ts"],"sourcesContent":["const downloadWithBlob = (blob: Blob, fileName: string): void => {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n setTimeout(() => URL.revokeObjectURL(url), 100);\n};\n\nconst downloadWithLink = (url: string, fileName: string): void => {\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\nconst canUseBlobDownload = (): boolean =>\n typeof fetch === 'function' &&\n typeof URL.createObjectURL === 'function' &&\n typeof URL.revokeObjectURL === 'function';\n\nconst canUseFileShare = (): boolean =>\n typeof File === 'function' &&\n typeof navigator !== 'undefined' &&\n typeof navigator.share === 'function' &&\n typeof navigator.canShare === 'function';\n\nconst canShareFiles = (files: File[]): boolean =>\n canUseFileShare() && navigator.canShare({ files });\n\nconst getBlob = async (url: string): Promise<Blob> => {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error('Network error');\n }\n\n return response.blob();\n};\n\nconst isAbortError = (error: unknown): boolean =>\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException &&\n error.name === 'AbortError';\n\nexport interface DownloadOptions {\n url: string;\n fileName?: string;\n fileType?: string;\n}\n\nexport const downloadFile = async ({\n url,\n fileName = 'download',\n fileType,\n}: DownloadOptions): Promise<void> => {\n if (!canUseBlobDownload()) {\n downloadWithLink(url, fileName);\n\n return;\n }\n\n if (canUseFileShare() && canShareFiles([new File([], fileName, { type: fileType })])) {\n try {\n const blob = await getBlob(url);\n\n const file = new File([blob], fileName, { type: blob.type || fileType });\n\n if (!canShareFiles([file])) {\n downloadWithBlob(blob, fileName);\n\n return;\n }\n\n await navigator.share({\n files: [file],\n title: `Скачать ${fileName}`,\n });\n\n return;\n } catch (error) {\n if (isAbortError(error)) {\n return;\n }\n\n downloadWithLink(url, fileName);\n\n return;\n }\n }\n\n try {\n const blob = await getBlob(url);\n\n downloadWithBlob(blob, fileName);\n } catch {\n downloadWithLink(url, fileName);\n }\n};\n"],"names":["__awaiter"],"mappings":"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"}