@invoicebox/ui 0.1.0-alpha.320 → 0.1.0-alpha.322

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 (175) hide show
  1. package/dist/components/common/AppCardLink/index.js +2 -1
  2. package/dist/components/common/BgCard/index.js +2 -1
  3. package/dist/components/common/BgCard/styles.js +2 -1
  4. package/dist/components/common/Calendar/index.js +2 -1
  5. package/dist/components/common/Calendar/index.stories.js +2 -1
  6. package/dist/components/common/Calendar/styles.js +2 -1
  7. package/dist/components/common/Divider/index.js +2 -1
  8. package/dist/components/common/Drawer/index.js +2 -1
  9. package/dist/components/common/Drawer/index.stories.js +2 -1
  10. package/dist/components/common/Drawer/styles.js +2 -1
  11. package/dist/components/common/Dropdown/index.js +2 -1
  12. package/dist/components/common/Dropdown/styles.js +9 -8
  13. package/dist/components/common/EntityAutocompleteOptionsDrawer/index.js +2 -1
  14. package/dist/components/common/EntityAutocompleteOptionsDrawer/index.stories.js +2 -1
  15. package/dist/components/common/Flag/index.js +2 -1
  16. package/dist/components/common/Flag/styles.js +2 -1
  17. package/dist/components/common/InvoiceboxSpinner/index.js +2 -1
  18. package/dist/components/common/InvoiceboxSpinner/styles.js +2 -1
  19. package/dist/components/common/PointsLoader/index.js +2 -1
  20. package/dist/components/common/QRCode/index.js +2 -2
  21. package/dist/components/common/ReadOnlyLabelValueField/index.js +2 -1
  22. package/dist/components/common/Scrollbar/index.js +2 -1
  23. package/dist/components/common/Scrollbar/styles.js +2 -1
  24. package/dist/components/common/SecondaryButton/index.js +4 -3
  25. package/dist/components/common/SecondaryButton/styles.js +2 -1
  26. package/dist/components/common/Skeleton/index.js +2 -1
  27. package/dist/components/common/Skeleton/styles.js +2 -1
  28. package/dist/components/common/Toast/index.js +2 -1
  29. package/dist/components/common/Tooltip/index.js +2 -1
  30. package/dist/components/common/Typography/index.js +4 -3
  31. package/dist/components/common/WarningIcon/index.js +2 -1
  32. package/dist/components/form/Autocomplete/components/Autocomplete/index.js +2 -1
  33. package/dist/components/form/Autocomplete/components/Autocomplete/index.stories.js +2 -1
  34. package/dist/components/form/Autocomplete/components/OrganizationAutocompleteItem/index.js +2 -1
  35. package/dist/components/form/Checkbox/index.js +4 -3
  36. package/dist/components/form/Checkbox/index.stories.js +2 -1
  37. package/dist/components/form/CodeInput/index.js +2 -1
  38. package/dist/components/form/CodeInput/index.stories.js +2 -1
  39. package/dist/components/form/CountrySelect/components/CountryItem/index.d.ts +2 -1
  40. package/dist/components/form/CountrySelect/components/CountryItem/index.js +10 -4
  41. package/dist/components/form/CountrySelect/components/CountryItem/stlyes.d.ts +4 -0
  42. package/dist/components/form/CountrySelect/components/CountryItem/stlyes.js +18 -7
  43. package/dist/components/form/CountrySelect/index.d.ts +1 -0
  44. package/dist/components/form/CountrySelect/index.js +5 -3
  45. package/dist/components/form/CurrencyInput/CoreCurrencyInput/index.js +2 -1
  46. package/dist/components/form/CurrencyInput/CoreCurrencyInput/index.stories.js +2 -1
  47. package/dist/components/form/CurrencyInput/CurrencyInputNumber/index.js +2 -2
  48. package/dist/components/form/CurrencyInput/CurrencyInputNumber/index.stories.js +2 -1
  49. package/dist/components/form/CurrencyInput/CurrencyInputString/index.js +2 -2
  50. package/dist/components/form/CurrencyInput/CurrencyInputString/index.stories.js +2 -1
  51. package/dist/components/form/DateInput/components/CalendarIcon/index.js +2 -1
  52. package/dist/components/form/DateInput/components/MobileDrawerDateCalendar/index.js +2 -1
  53. package/dist/components/form/DateInput/components/MobileDrawerDateCalendar/index.stories.js +2 -1
  54. package/dist/components/form/DateInput/index.js +2 -1
  55. package/dist/components/form/DateInput/index.stories.js +2 -1
  56. package/dist/components/form/DateInput/logic.d.ts +1 -0
  57. package/dist/components/form/DateInput/logic.js +11 -0
  58. package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.d.ts +12 -0
  59. package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.js +83 -0
  60. package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.stories.d.ts +6 -0
  61. package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.stories.js +48 -0
  62. package/dist/components/form/DateTimeInput/components/MobileDatePicker/logic.d.ts +11 -0
  63. package/dist/components/form/DateTimeInput/components/MobileDatePicker/logic.js +92 -0
  64. package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.d.ts +4 -0
  65. package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.js +42 -22
  66. package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.stories.js +2 -1
  67. package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/styles.d.ts +1 -2
  68. package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/styles.js +4 -8
  69. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/index.d.ts +14 -0
  70. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/index.js +259 -0
  71. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/styles.d.ts +12 -0
  72. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/styles.js +35 -0
  73. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/constants.d.ts +11 -0
  74. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/constants.js +40 -0
  75. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.d.ts +12 -0
  76. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.js +48 -0
  77. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.stories.d.ts +5 -0
  78. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.stories.js +47 -0
  79. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/palette.d.ts +9 -0
  80. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/palette.js +17 -0
  81. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/styles.d.ts +12 -0
  82. package/dist/components/form/DateTimeInput/components/MobileWheelPicker/styles.js +39 -0
  83. package/dist/components/form/DateTimeInput/components/TimePicker/index.d.ts +1 -0
  84. package/dist/components/form/DateTimeInput/components/TimePicker/index.js +34 -16
  85. package/dist/components/form/DateTimeInput/components/TimePicker/index.stories.d.ts +1 -0
  86. package/dist/components/form/DateTimeInput/components/TimePicker/index.stories.js +31 -17
  87. package/dist/components/form/DateTimeInput/components/TimePicker/styles.d.ts +0 -4
  88. package/dist/components/form/DateTimeInput/components/TimePicker/styles.js +2 -13
  89. package/dist/components/form/DateTimeInput/index.js +22 -4
  90. package/dist/components/form/DateTimeInput/index.stories.js +2 -1
  91. package/dist/components/form/InputLabel/index.js +2 -1
  92. package/dist/components/form/InputLabel/styles.js +2 -1
  93. package/dist/components/form/ModernPlaceholder/index.js +2 -1
  94. package/dist/components/form/PhoneInput/index.d.ts +1 -0
  95. package/dist/components/form/PhoneInput/index.js +2 -1
  96. package/dist/components/form/PhoneInput/index.stories.js +4 -2
  97. package/dist/components/form/PhoneInput/phoneInputLogic.d.ts +2 -0
  98. package/dist/components/form/PhoneInput/types.d.ts +1 -0
  99. package/dist/components/form/PositiveIntegerInput/index.js +2 -1
  100. package/dist/components/form/PositiveIntegerInput/index.stories.js +2 -1
  101. package/dist/components/form/PositiveIntegerInput/styles.js +2 -1
  102. package/dist/components/form/PureInput/index.js +4 -3
  103. package/dist/components/form/PureInput/styles.js +2 -2
  104. package/dist/components/form/ResetButton/index.js +2 -1
  105. package/dist/components/form/SearchInput/index.js +2 -1
  106. package/dist/components/form/SearchInput/index.stories.js +2 -1
  107. package/dist/components/form/Select/components/Input/index.js +2 -1
  108. package/dist/components/form/Select/components/Loader/index.js +2 -1
  109. package/dist/components/form/Select/components/MultipleValue/index.js +2 -1
  110. package/dist/components/form/Select/components/MultipleValue/styles.js +2 -1
  111. package/dist/components/form/Select/index.js +2 -1
  112. package/dist/components/form/Select/index.stories.js +2 -1
  113. package/dist/components/form/Select/styles.js +2 -1
  114. package/dist/components/form/TagsInput/index.js +2 -1
  115. package/dist/components/form/TagsInput/index.stories.js +2 -1
  116. package/dist/components/form/TagsInput/styles.js +2 -2
  117. package/dist/components/form/TextInput/index.js +2 -1
  118. package/dist/components/form/TextInput/index.stories.js +2 -1
  119. package/dist/components/form/Toggle/index.js +4 -3
  120. package/dist/components/form/Toggle/index.stories.js +2 -1
  121. package/dist/components/form/Toggle/styles.js +10 -10
  122. package/dist/components/form/_hooks/useInputStyles.js +2 -1
  123. package/dist/components/form/common/DrawerHeader/index.d.ts +2 -0
  124. package/dist/components/form/common/DrawerHeader/index.js +15 -5
  125. package/dist/components/form/common/DrawerHeader/styles.d.ts +4 -0
  126. package/dist/components/form/common/DrawerHeader/styles.js +17 -7
  127. package/dist/esm/components/common/Dropdown/styles.js +7 -7
  128. package/dist/esm/components/common/QRCode/index.js +2 -2
  129. package/dist/esm/components/common/SecondaryButton/index.js +2 -2
  130. package/dist/esm/components/common/Typography/index.js +2 -2
  131. package/dist/esm/components/form/Checkbox/index.js +2 -2
  132. package/dist/esm/components/form/CountrySelect/components/CountryItem/index.js +8 -3
  133. package/dist/esm/components/form/CountrySelect/components/CountryItem/stlyes.js +17 -6
  134. package/dist/esm/components/form/CountrySelect/index.js +3 -2
  135. package/dist/esm/components/form/CurrencyInput/CurrencyInputNumber/index.js +2 -2
  136. package/dist/esm/components/form/CurrencyInput/CurrencyInputString/index.js +2 -2
  137. package/dist/esm/components/form/DateInput/logic.js +11 -0
  138. package/dist/esm/components/form/DateTimeInput/components/MobileDatePicker/index.js +74 -0
  139. package/dist/esm/components/form/DateTimeInput/components/MobileDatePicker/index.stories.js +39 -0
  140. package/dist/esm/components/form/DateTimeInput/components/MobileDatePicker/logic.js +86 -0
  141. package/dist/esm/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.js +40 -21
  142. package/dist/esm/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/styles.js +3 -7
  143. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/index.js +250 -0
  144. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/styles.js +28 -0
  145. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/constants.js +34 -0
  146. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/index.js +32 -0
  147. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/index.stories.js +38 -0
  148. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/palette.js +10 -0
  149. package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/styles.js +32 -0
  150. package/dist/esm/components/form/DateTimeInput/components/TimePicker/index.js +32 -15
  151. package/dist/esm/components/form/DateTimeInput/components/TimePicker/index.stories.js +29 -15
  152. package/dist/esm/components/form/DateTimeInput/components/TimePicker/styles.js +1 -12
  153. package/dist/esm/components/form/DateTimeInput/index.js +21 -4
  154. package/dist/esm/components/form/PhoneInput/index.stories.js +2 -1
  155. package/dist/esm/components/form/PureInput/index.js +2 -2
  156. package/dist/esm/components/form/PureInput/styles.js +2 -2
  157. package/dist/esm/components/form/TagsInput/styles.js +2 -2
  158. package/dist/esm/components/form/Toggle/index.js +2 -2
  159. package/dist/esm/components/form/Toggle/styles.js +10 -10
  160. package/dist/esm/components/form/common/DrawerHeader/index.js +13 -4
  161. package/dist/esm/components/form/common/DrawerHeader/styles.js +16 -6
  162. package/dist/esm/palette/context.js +2 -0
  163. package/dist/esm/palette/provider.js +2 -0
  164. package/dist/hooks/useUnupdatableHandler/index.stories.js +2 -1
  165. package/dist/palette/context.d.ts +2 -0
  166. package/dist/palette/context.js +48 -46
  167. package/dist/palette/provider.js +50 -47
  168. package/dist/palette/usePalette.d.ts +1 -0
  169. package/package.json +1 -1
  170. package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/index.d.ts +0 -8
  171. package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/index.js +0 -201
  172. package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/styles.d.ts +0 -7
  173. package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/styles.js +0 -27
  174. package/dist/esm/components/form/DateTimeInput/components/MobileNumbersColumn/index.js +0 -193
  175. package/dist/esm/components/form/DateTimeInput/components/MobileNumbersColumn/styles.js +0 -19
@@ -0,0 +1,250 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
+ import * as S from './styles';
9
+ import { DRAG_THRESHOLD, FRAME_MS, FRICTION_PER_FRAME, ITEM_HEIGHT, MAX_VELOCITY, MIN_VELOCITY, SETTLE_MS, STALE_DRAG_MS } from '../../constants';
10
+ import { useComponentPalette } from '../../../../../../../palette';
11
+ // Затухание строк по мере удаления от центра — имитация барабана из нативных пикеров.
12
+ var OPACITY_STEPS = [1, 0.75, 0.45, 0.28, 0.18];
13
+ var INCLINE_STEPS = [0, 22, 42, 58, 68];
14
+ var SCALE_STEPS = [1, 0.94, 0.87, 0.82, 0.78];
15
+ var getIndexByScrollTop = function getIndexByScrollTop(scrollTop, count) {
16
+ return Math.min(Math.max(Math.round(scrollTop / ITEM_HEIGHT), 0), Math.max(count - 1, 0));
17
+ };
18
+ var clampVelocity = function clampVelocity(velocity) {
19
+ return Math.min(Math.max(velocity, -MAX_VELOCITY), MAX_VELOCITY);
20
+ };
21
+ export var WheelColumn = function WheelColumn(_ref) {
22
+ var _options$activeIndex;
23
+ var options = _ref.options,
24
+ value = _ref.value,
25
+ onChange = _ref.onChange,
26
+ label = _ref.label,
27
+ _ref$align = _ref.align,
28
+ align = _ref$align === void 0 ? 'center' : _ref$align,
29
+ width = _ref.width;
30
+ var palette = useComponentPalette('mobileWheelPicker');
31
+ var containerRef = useRef(null);
32
+ var rafRef = useRef(null);
33
+ var settleRef = useRef(null);
34
+ var isUserScrollingRef = useRef(false);
35
+ var isMountedRef = useRef(false);
36
+ var dragRef = useRef(null);
37
+ var inertiaRef = useRef(null);
38
+ var isClickSuppressedRef = useRef(false);
39
+ var valueIndex = useMemo(function () {
40
+ var index = options.findIndex(function (option) {
41
+ return option.value === value;
42
+ });
43
+ return index === -1 ? 0 : index;
44
+ }, [options, value]);
45
+ var _useState = useState(valueIndex),
46
+ _useState2 = _slicedToArray(_useState, 2),
47
+ activeIndex = _useState2[0],
48
+ setActiveIndex = _useState2[1];
49
+
50
+ // Подписка на скролл вешается один раз: пересоздание слушателя сбрасывало бы
51
+ // таймер остановки барабана, и onChange мог не долететь до родителя.
52
+ var optionsRef = useRef(options);
53
+ var valueRef = useRef(value);
54
+ var onChangeRef = useRef(onChange);
55
+ useEffect(function () {
56
+ optionsRef.current = options;
57
+ valueRef.current = value;
58
+ onChangeRef.current = onChange;
59
+ });
60
+
61
+ // Подсветка следует за значением, когда его меняют снаружи (например, клампят день после смены месяца).
62
+ useEffect(function () {
63
+ return setActiveIndex(valueIndex);
64
+ }, [valueIndex]);
65
+
66
+ // Доводим барабан до выбранного значения. Пока палец на экране не вмешиваемся,
67
+ // иначе перерисовка родителя дёргала бы скролл из-под пользователя.
68
+ useEffect(function () {
69
+ var container = containerRef.current;
70
+ if (!container || isUserScrollingRef.current) return;
71
+ var top = valueIndex * ITEM_HEIGHT;
72
+ if (Math.abs(container.scrollTop - top) < 1) return;
73
+ container.scrollTo({
74
+ top: top,
75
+ behavior: isMountedRef.current ? 'smooth' : 'auto'
76
+ });
77
+ }, [valueIndex, options.length]);
78
+ useEffect(function () {
79
+ isMountedRef.current = true;
80
+ }, []);
81
+ useEffect(function () {
82
+ var container = containerRef.current;
83
+ if (!container) return undefined;
84
+ var handleScroll = function handleScroll() {
85
+ isUserScrollingRef.current = true;
86
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
87
+ rafRef.current = requestAnimationFrame(function () {
88
+ // setState с тем же индексом React отбрасывает, поэтому перерисовка
89
+ // происходит не на каждый кадр, а только при переходе на новую строку.
90
+ setActiveIndex(getIndexByScrollTop(container.scrollTop, optionsRef.current.length));
91
+ });
92
+ if (settleRef.current) clearTimeout(settleRef.current);
93
+ settleRef.current = setTimeout(function () {
94
+ isUserScrollingRef.current = false;
95
+ var index = getIndexByScrollTop(container.scrollTop, optionsRef.current.length);
96
+ setActiveIndex(index);
97
+ var option = optionsRef.current[index];
98
+ if (option && option.value !== valueRef.current) onChangeRef.current(option.value);
99
+ }, SETTLE_MS);
100
+ };
101
+ container.addEventListener('scroll', handleScroll, {
102
+ passive: true
103
+ });
104
+ return function () {
105
+ container.removeEventListener('scroll', handleScroll);
106
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
107
+ if (settleRef.current) clearTimeout(settleRef.current);
108
+ };
109
+ }, []);
110
+ var stopInertia = useCallback(function () {
111
+ if (!inertiaRef.current) return;
112
+ cancelAnimationFrame(inertiaRef.current);
113
+ inertiaRef.current = null;
114
+ }, []);
115
+ useEffect(function () {
116
+ return stopInertia;
117
+ }, [stopInertia]);
118
+
119
+ // Пока барабан ведёт палец или инерция, залипание выключено: браузер иначе
120
+ // отматывал бы scrollTop обратно к ближайшей строке на каждый кадр.
121
+ var setSnapEnabled = useCallback(function (isEnabled) {
122
+ var container = containerRef.current;
123
+ if (container) container.style.scrollSnapType = isEnabled ? '' : 'none';
124
+ }, []);
125
+
126
+ // Барабан остановился — возвращаем залипание и доводим до строки. onChange
127
+ // отправит общий обработчик скролла, когда доводка закончится.
128
+ var finishDrag = useCallback(function () {
129
+ var container = containerRef.current;
130
+ if (!container) return;
131
+ setSnapEnabled(true);
132
+ var index = getIndexByScrollTop(container.scrollTop, optionsRef.current.length);
133
+ container.scrollTo({
134
+ top: index * ITEM_HEIGHT,
135
+ behavior: 'smooth'
136
+ });
137
+ }, [setSnapEnabled]);
138
+ var startInertia = useCallback(function (initialVelocity) {
139
+ var container = containerRef.current;
140
+ if (!container) return;
141
+ var velocity = initialVelocity;
142
+ var previousTime = performance.now();
143
+ var _step = function step(now) {
144
+ // Кадр мог быть пропущен (вкладка в фоне) — не даём барабану прыгнуть.
145
+ var elapsed = Math.min(now - previousTime, 50);
146
+ previousTime = now;
147
+ var shift = velocity * elapsed;
148
+ var scrollTopBefore = container.scrollTop;
149
+ container.scrollTop = scrollTopBefore - shift;
150
+ velocity *= Math.pow(FRICTION_PER_FRAME, elapsed / FRAME_MS);
151
+
152
+ // scrollTop не сдвинулся, хотя должен был — упёрлись в край списка.
153
+ var isStuck = Math.abs(shift) >= 1 && container.scrollTop === scrollTopBefore;
154
+ if (Math.abs(velocity) < MIN_VELOCITY || isStuck) {
155
+ inertiaRef.current = null;
156
+ finishDrag();
157
+ return;
158
+ }
159
+ inertiaRef.current = requestAnimationFrame(_step);
160
+ };
161
+ inertiaRef.current = requestAnimationFrame(_step);
162
+ }, [finishDrag]);
163
+ var handlePointerDown = useCallback(function (event) {
164
+ var _event$currentTarget$, _event$currentTarget;
165
+ // Толчок по крутящемуся барабану ловит его — как в нативных пикерах.
166
+ stopInertia();
167
+ setSnapEnabled(false);
168
+ isClickSuppressedRef.current = false;
169
+ isUserScrollingRef.current = true;
170
+ dragRef.current = {
171
+ pointerId: event.pointerId,
172
+ startY: event.clientY,
173
+ lastY: event.clientY,
174
+ lastTime: event.timeStamp,
175
+ velocity: 0,
176
+ isMoved: false
177
+ };
178
+ (_event$currentTarget$ = (_event$currentTarget = event.currentTarget).setPointerCapture) === null || _event$currentTarget$ === void 0 || _event$currentTarget$.call(_event$currentTarget, event.pointerId);
179
+ }, [setSnapEnabled, stopInertia]);
180
+ var handlePointerMove = useCallback(function (event) {
181
+ var drag = dragRef.current;
182
+ var container = containerRef.current;
183
+ if (!drag || !container || drag.pointerId !== event.pointerId) return;
184
+ var shift = event.clientY - drag.lastY;
185
+ var elapsed = event.timeStamp - drag.lastTime;
186
+ container.scrollTop -= shift;
187
+
188
+ // Скорость сглаживаем: дрожание пальца в конце жеста иначе гасит бросок.
189
+ if (elapsed > 0) drag.velocity = drag.velocity * 0.7 + shift / elapsed * 0.3;
190
+ if (Math.abs(event.clientY - drag.startY) > DRAG_THRESHOLD) drag.isMoved = true;
191
+ drag.lastY = event.clientY;
192
+ drag.lastTime = event.timeStamp;
193
+ }, []);
194
+ var handlePointerUp = useCallback(function (event) {
195
+ var drag = dragRef.current;
196
+ if (!drag || drag.pointerId !== event.pointerId) return;
197
+ dragRef.current = null;
198
+ isClickSuppressedRef.current = drag.isMoved;
199
+
200
+ // Палец замер перед отпусканием — это доводка, а не бросок.
201
+ var isStale = event.timeStamp - drag.lastTime > STALE_DRAG_MS;
202
+ var velocity = isStale ? 0 : clampVelocity(drag.velocity);
203
+ if (Math.abs(velocity) < MIN_VELOCITY) {
204
+ finishDrag();
205
+ return;
206
+ }
207
+ startInertia(velocity);
208
+ }, [finishDrag, startInertia]);
209
+ var handleItemClick = useCallback(function (index) {
210
+ var _containerRef$current;
211
+ if (isClickSuppressedRef.current) return;
212
+ (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 || _containerRef$current.scrollTo({
213
+ top: index * ITEM_HEIGHT,
214
+ behavior: 'smooth'
215
+ });
216
+ }, []);
217
+ var activeValue = (_options$activeIndex = options[activeIndex]) === null || _options$activeIndex === void 0 ? void 0 : _options$activeIndex.value;
218
+ return /*#__PURE__*/React.createElement(S.Wrapper, {
219
+ ref: containerRef,
220
+ $align: align,
221
+ style: width ? {
222
+ width: width
223
+ } : undefined,
224
+ role: "listbox",
225
+ "aria-label": label,
226
+ tabIndex: -1,
227
+ onPointerDown: handlePointerDown,
228
+ onPointerMove: handlePointerMove,
229
+ onPointerUp: handlePointerUp,
230
+ onPointerCancel: handlePointerUp
231
+ }, options.map(function (option, index) {
232
+ var step = Math.min(Math.abs(index - activeIndex), OPACITY_STEPS.length - 1);
233
+ var isActive = index === activeIndex;
234
+ return /*#__PURE__*/React.createElement(S.Item, {
235
+ key: option.value,
236
+ type: "button",
237
+ role: "option",
238
+ "aria-selected": option.value === activeValue,
239
+ onClick: function onClick() {
240
+ return handleItemClick(index);
241
+ },
242
+ $color: palette.value,
243
+ $colorActive: palette.valueActive,
244
+ $isActive: isActive,
245
+ $opacity: OPACITY_STEPS[step],
246
+ $incline: INCLINE_STEPS[step],
247
+ $scale: SCALE_STEPS[step]
248
+ }, option.label);
249
+ }));
250
+ };
@@ -0,0 +1,28 @@
1
+ import styled from 'styled-components';
2
+ import { reducedMotion } from '../../../../../../../utils/reducedMotion';
3
+ import { EDGE_PADDING, ITEM_HEIGHT } from '../../constants';
4
+ export var Wrapper = styled.div.withConfig({
5
+ displayName: "styles__Wrapper",
6
+ componentId: "sc-xvigbn-0"
7
+ })(["height:100%;flex-shrink:0;box-sizing:border-box;padding:", "px 0;overflow-y:scroll;overscroll-behavior:contain;scroll-snap-type:y mandatory;-webkit-overflow-scrolling:touch;text-align:", ";touch-action:none;user-select:none;-webkit-user-select:none;cursor:grab;&:active{cursor:grabbing;}scrollbar-width:none;-ms-overflow-style:none;&::-webkit-scrollbar{display:none;}"], EDGE_PADDING, function (_ref) {
8
+ var $align = _ref.$align;
9
+ return $align;
10
+ });
11
+ export var Item = styled.button.withConfig({
12
+ displayName: "styles__Item",
13
+ componentId: "sc-xvigbn-1"
14
+ })(["display:block;width:100%;height:", "px;padding:0;margin:0;border:none;background:transparent;cursor:pointer;outline:none;white-space:nowrap;scroll-snap-align:center;font:inherit;text-align:inherit;line-height:", "px;color:", ";opacity:", ";transform:rotateX(", "deg) scale(", ");backface-visibility:hidden;transition:opacity 0.12s ease,transform 0.12s ease,color 0.12s ease;", ""], ITEM_HEIGHT, ITEM_HEIGHT, function (_ref2) {
15
+ var $isActive = _ref2.$isActive,
16
+ $color = _ref2.$color,
17
+ $colorActive = _ref2.$colorActive;
18
+ return $isActive ? $colorActive : $color;
19
+ }, function (_ref3) {
20
+ var $opacity = _ref3.$opacity;
21
+ return $opacity;
22
+ }, function (_ref4) {
23
+ var $incline = _ref4.$incline;
24
+ return $incline;
25
+ }, function (_ref5) {
26
+ var $scale = _ref5.$scale;
27
+ return $scale;
28
+ }, reducedMotion);
@@ -0,0 +1,34 @@
1
+ // Геометрия барабана. Все вычисления скролла завязаны на эти константы:
2
+ // scrollTop выбранного элемента === index * ITEM_HEIGHT (см. getIndexByScrollTop).
3
+ export var ITEM_HEIGHT = 34;
4
+
5
+ // Нечётное число, чтобы выбранный элемент оказался ровно по центру колонки.
6
+ export var VISIBLE_ITEMS = 5;
7
+ export var WHEEL_HEIGHT = ITEM_HEIGHT * VISIBLE_ITEMS;
8
+
9
+ // Сколько пустого места нужно сверху и снизу, чтобы крайние элементы вставали в центр.
10
+ export var EDGE_PADDING = ITEM_HEIGHT * ((VISIBLE_ITEMS - 1) / 2);
11
+
12
+ // Пауза без событий скролла, после которой считаем, что барабан остановился.
13
+ export var SETTLE_MS = 140;
14
+
15
+ // --- Инерция ---
16
+ // Барабан крутится сам после броска. Нативный fling есть только у тач-скролла, поэтому
17
+ // перетаскивание ведём сами: так «толчок» работает и пальцем, и мышью, и одинаково
18
+ // ощущается на всех платформах.
19
+
20
+ // Доля скорости, сохраняемая за кадр при 60fps. Меньше — барабан встаёт резче.
21
+ export var FRICTION_PER_FRAME = 0.94;
22
+ export var FRAME_MS = 1000 / 60;
23
+
24
+ // Скорость в px/ms, ниже которой барабан считаем остановившимся.
25
+ export var MIN_VELOCITY = 0.02;
26
+
27
+ // Потолок броска: без него резкий свайп улетал бы на сотни строк.
28
+ export var MAX_VELOCITY = 4;
29
+
30
+ // Сдвиг в px, после которого жест перестаёт быть кликом по строке.
31
+ export var DRAG_THRESHOLD = 4;
32
+
33
+ // Если перед отпусканием палец простоял дольше — это не бросок, а точная доводка.
34
+ export var STALE_DRAG_MS = 80;
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import * as S from './styles';
3
+ import { useComponentPalette } from '../../../../../palette';
4
+ var getIsIphone = function getIsIphone() {
5
+ return typeof navigator !== 'undefined' && /iPhone/.test(navigator.userAgent);
6
+ };
7
+
8
+ /**
9
+ * Общая «обвязка» барабанного пикера: подсветка выбранной строки по центру и
10
+ * затухание к краям. Внутрь кладутся WheelColumn — по одной на каждую часть значения.
11
+ */
12
+ export var MobileWheelPicker = function MobileWheelPicker(_ref) {
13
+ var children = _ref.children,
14
+ label = _ref.label;
15
+ var palette = useComponentPalette('mobileWheelPicker');
16
+ return /*#__PURE__*/React.createElement(S.Wrapper, {
17
+ $isIphone: getIsIphone(),
18
+ role: "group",
19
+ "aria-label": label
20
+ }, /*#__PURE__*/React.createElement(S.SelectedBand, {
21
+ $bgColor: palette.selectedBg
22
+ }), children, /*#__PURE__*/React.createElement(S.Fade, {
23
+ $isTop: true,
24
+ $from: palette.fadeBg,
25
+ $to: palette.fadeBgTransparent
26
+ }), /*#__PURE__*/React.createElement(S.Fade, {
27
+ $isTop: false,
28
+ $from: palette.fadeBg,
29
+ $to: palette.fadeBgTransparent
30
+ }));
31
+ };
32
+ export { WheelColumn } from './components/WheelColumn';
@@ -0,0 +1,38 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
+ import React, { useState } from 'react';
8
+ import { MobileWheelPicker, WheelColumn } from '.';
9
+ var meta = {
10
+ title: 'form/DateTimeInput/_components/MobileWheelPicker',
11
+ component: MobileWheelPicker,
12
+ tags: ['autodocs']
13
+ };
14
+ export default meta;
15
+ var OPTIONS = new Array(30).fill(0).map(function (item, index) {
16
+ return {
17
+ value: index,
18
+ label: "\u0421\u0442\u0440\u043E\u043A\u0430 ".concat(index)
19
+ };
20
+ });
21
+ export var Default = {
22
+ args: {
23
+ label: 'Пример'
24
+ },
25
+ render: function Render(args) {
26
+ var _useState = useState(0),
27
+ _useState2 = _slicedToArray(_useState, 2),
28
+ value = _useState2[0],
29
+ setValue = _useState2[1];
30
+ return /*#__PURE__*/React.createElement(MobileWheelPicker, args, /*#__PURE__*/React.createElement(WheelColumn, {
31
+ label: 'Пример',
32
+ options: OPTIONS,
33
+ value: value,
34
+ onChange: setValue,
35
+ width: 140
36
+ }));
37
+ }
38
+ };
@@ -0,0 +1,10 @@
1
+ import hexToRgba from '../../../../../utils/hexToRgba';
2
+ export var generateMobileWheelPickerPalette = function generateMobileWheelPickerPalette(abstractPalette) {
3
+ return {
4
+ value: hexToRgba(abstractPalette.primary, 0.6),
5
+ valueActive: abstractPalette.primary,
6
+ selectedBg: hexToRgba(abstractPalette.primary, 0.08),
7
+ fadeBg: abstractPalette.base,
8
+ fadeBgTransparent: hexToRgba(abstractPalette.base, 0)
9
+ };
10
+ };
@@ -0,0 +1,32 @@
1
+ import styled from 'styled-components';
2
+ import { EDGE_PADDING, ITEM_HEIGHT, WHEEL_HEIGHT } from './constants';
3
+ export var Wrapper = styled.div.withConfig({
4
+ displayName: "styles__Wrapper",
5
+ componentId: "sc-14xqdpi-0"
6
+ })(["position:relative;height:", "px;display:flex;justify-content:center;gap:8px;box-sizing:border-box;font-size:23px;font-weight:400;line-height:", "px;font-family:", ";"], WHEEL_HEIGHT, ITEM_HEIGHT, function (_ref) {
7
+ var $isIphone = _ref.$isIphone;
8
+ return $isIphone ? '-apple-system, BlinkMacSystemFont' : "'Roboto', sans-serif";
9
+ });
10
+ export var SelectedBand = styled.div.withConfig({
11
+ displayName: "styles__SelectedBand",
12
+ componentId: "sc-14xqdpi-1"
13
+ })(["position:absolute;top:50%;left:0;right:0;height:", "px;transform:translateY(-50%);border-radius:8px;background-color:", ";pointer-events:none;"], ITEM_HEIGHT, function (_ref2) {
14
+ var $bgColor = _ref2.$bgColor;
15
+ return $bgColor;
16
+ });
17
+ export var Fade = styled.div.withConfig({
18
+ displayName: "styles__Fade",
19
+ componentId: "sc-14xqdpi-2"
20
+ })(["position:absolute;left:0;right:0;height:", "px;pointer-events:none;", " background:linear-gradient( ", ",", ",", " );"], EDGE_PADDING, function (_ref3) {
21
+ var $isTop = _ref3.$isTop;
22
+ return $isTop ? 'top: 0;' : 'bottom: 0;';
23
+ }, function (_ref4) {
24
+ var $isTop = _ref4.$isTop;
25
+ return $isTop ? 'to bottom' : 'to top';
26
+ }, function (_ref5) {
27
+ var $from = _ref5.$from;
28
+ return $from;
29
+ }, function (_ref6) {
30
+ var $to = _ref6.$to;
31
+ return $to;
32
+ });
@@ -8,10 +8,12 @@ import React from 'react';
8
8
  import * as S from './styles';
9
9
  import { useComponentPalette } from '../../../../../palette';
10
10
  import { Scrollbar } from '../../../../common/Scrollbar';
11
- import { useMobile } from '../../../../../hooks/useMedia';
12
- import MobileNumbersColumn from '../MobileNumbersColumn';
11
+ import { MobileWheelPicker, WheelColumn } from '../MobileWheelPicker';
13
12
  import { Typography } from '../../../../common/Typography';
14
- var isIphone = /iPhone/.test(navigator.userAgent);
13
+ var TIME_COLUMN_WIDTH = 70;
14
+ var toTwoDigits = function toTwoDigits(item) {
15
+ return "0".concat(item).slice(-2);
16
+ };
15
17
  var HOURS = new Array(24).fill(0).map(function (item, index) {
16
18
  return index;
17
19
  });
@@ -27,9 +29,10 @@ export var TimePicker = function TimePicker(_ref) {
27
29
  _ref$height = _ref.height,
28
30
  height = _ref$height === void 0 ? 230 : _ref$height,
29
31
  maxTime = _ref.maxTime,
30
- minTime = _ref.minTime;
32
+ minTime = _ref.minTime,
33
+ _ref$isMobile = _ref.isMobile,
34
+ isMobile = _ref$isMobile === void 0 ? false : _ref$isMobile;
31
35
  var palette = useComponentPalette('timePicker');
32
- var isMobile = useMobile();
33
36
  var _value = _slicedToArray(value, 2),
34
37
  hour = _value[0],
35
38
  minute = _value[1];
@@ -68,16 +71,30 @@ export var TimePicker = function TimePicker(_ref) {
68
71
  return !getIsDisabledMinute(minuteItem);
69
72
  });
70
73
  if (isMobile) {
71
- return /*#__PURE__*/React.createElement(S.MobileWrapper, {
72
- $isIphone: isIphone
73
- }, /*#__PURE__*/React.createElement(S.SelectedMask, null), /*#__PURE__*/React.createElement(MobileNumbersColumn, {
74
- numbers: mobileHours,
74
+ return /*#__PURE__*/React.createElement(MobileWheelPicker, {
75
+ label: 'Время'
76
+ }, /*#__PURE__*/React.createElement(WheelColumn, {
77
+ label: 'Часы',
78
+ options: mobileHours.map(function (hourItem) {
79
+ return {
80
+ value: hourItem,
81
+ label: toTwoDigits(hourItem)
82
+ };
83
+ }),
84
+ value: hour,
75
85
  onChange: handleHourChange,
76
- value: hour
77
- }), /*#__PURE__*/React.createElement(MobileNumbersColumn, {
78
- numbers: mobileMinutes,
86
+ width: TIME_COLUMN_WIDTH
87
+ }), /*#__PURE__*/React.createElement(WheelColumn, {
88
+ label: 'Минуты',
89
+ options: mobileMinutes.map(function (minuteItem) {
90
+ return {
91
+ value: minuteItem,
92
+ label: toTwoDigits(minuteItem)
93
+ };
94
+ }),
95
+ value: minute,
79
96
  onChange: handleMinuteChange,
80
- value: minute
97
+ width: TIME_COLUMN_WIDTH
81
98
  }));
82
99
  }
83
100
  return /*#__PURE__*/React.createElement(S.Wrapper, {
@@ -104,7 +121,7 @@ export var TimePicker = function TimePicker(_ref) {
104
121
  disabled: getIsDisabled(hourItem, maxTimeHour ? maxTimeHour : 23, minTimeHour ? minTimeHour : 0)
105
122
  }, /*#__PURE__*/React.createElement(Typography, {
106
123
  variant: 'captionRegular'
107
- }, hourItem.toString().length === 1 ? "0".concat(hourItem) : hourItem));
124
+ }, toTwoDigits(hourItem)));
108
125
  })))), /*#__PURE__*/React.createElement(S.ColumnWrapper, {
109
126
  $borderColor: palette.divider
110
127
  }, /*#__PURE__*/React.createElement(S.Label, {
@@ -127,6 +144,6 @@ export var TimePicker = function TimePicker(_ref) {
127
144
  disabled: getIsDisabledMinute(minuteItem)
128
145
  }, /*#__PURE__*/React.createElement(Typography, {
129
146
  variant: 'captionRegular'
130
- }, minuteItem.toString().length === 1 ? "0".concat(minuteItem) : minuteItem));
147
+ }, toTwoDigits(minuteItem)));
131
148
  })))));
132
149
  };
@@ -1,3 +1,9 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
1
7
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
8
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
3
9
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -13,20 +19,28 @@ var meta = {
13
19
  tags: ['autodocs']
14
20
  };
15
21
  export default meta;
22
+ var Render = function Render(props) {
23
+ var _useState = useState([11, 0]),
24
+ _useState2 = _slicedToArray(_useState, 2),
25
+ time = _useState2[0],
26
+ setTime = _useState2[1];
27
+ return /*#__PURE__*/React.createElement(TimePicker, _extends({}, props, {
28
+ value: time,
29
+ onChange: setTime
30
+ }));
31
+ };
32
+ var commonArgs = {
33
+ height: 300,
34
+ minTime: [10, 30],
35
+ maxTime: [22, 15]
36
+ };
16
37
  export var Default = {
17
- args: {
18
- height: 300,
19
- minTime: [10, 30],
20
- maxTime: [22, 15]
21
- },
22
- render: function Render(props) {
23
- var _useState = useState([11, 0]),
24
- _useState2 = _slicedToArray(_useState, 2),
25
- time = _useState2[0],
26
- setTime = _useState2[1];
27
- return /*#__PURE__*/React.createElement(TimePicker, _extends({}, props, {
28
- value: time,
29
- onChange: setTime
30
- }));
31
- }
38
+ args: commonArgs,
39
+ render: Render
40
+ };
41
+ export var Mobile = {
42
+ args: _objectSpread(_objectSpread({}, commonArgs), {}, {
43
+ isMobile: true
44
+ }),
45
+ render: Render
32
46
  };
@@ -40,15 +40,4 @@ export var ValueWrapper = styled.button.withConfig({
40
40
  }, function (_ref6) {
41
41
  var $colorDisabled = _ref6.$colorDisabled;
42
42
  return $colorDisabled;
43
- });
44
- export var MobileWrapper = styled.div.withConfig({
45
- displayName: "styles__MobileWrapper",
46
- componentId: "sc-okz9lx-5"
47
- })(["height:178px;width:140px;display:flex;font-size:23px;font-weight:400;line-height:28px;color:#3c3c4399;position:relative;font-family:", ";"], function (_ref7) {
48
- var $isIphone = _ref7.$isIphone;
49
- return $isIphone ? '-apple-system, BlinkMacSystemFont' : "'Roboto', sans-serif";
50
- });
51
- export var SelectedMask = styled.div.withConfig({
52
- displayName: "styles__SelectedMask",
53
- componentId: "sc-okz9lx-6"
54
- })(["position:absolute;top:50%;left:0;right:0;height:34px;background-color:#74748014;z-index:10;transform:translateY(-50%);flex-shrink:0;border-radius:8px;pointer-events:none;"]);
43
+ });
@@ -5,7 +5,7 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
5
5
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
6
6
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
7
7
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
8
- import React, { useCallback, useId, useRef, useState } from 'react';
8
+ import React, { useCallback, useId, useMemo, useRef, useState } from 'react';
9
9
  import { useComponentPalette } from '../../../palette';
10
10
  import { useOutsideClick } from '../../../hooks/useOutsideClick';
11
11
  import { useInputFocus } from '../../../hooks/useInputFocus';
@@ -24,14 +24,14 @@ import { MobileDrawerDateTimeCalendar } from './components/MobileDrawerDateTimeC
24
24
  import { useInputStyles } from '../_hooks/useInputStyles';
25
25
  export var DateTimeInput = function DateTimeInput(_ref) {
26
26
  var onChange = _ref.onChange,
27
- value = _ref.value,
27
+ valueProp = _ref.value,
28
28
  hasError = _ref.hasError,
29
29
  name = _ref.name,
30
30
  onBlur = _ref.onBlur,
31
31
  onFocus = _ref.onFocus,
32
32
  label = _ref.label,
33
- minDate = _ref.minDate,
34
- maxDate = _ref.maxDate,
33
+ minDateProp = _ref.minDate,
34
+ maxDateProp = _ref.maxDate,
35
35
  size = _ref.size,
36
36
  dropdownProps = _ref.dropdownProps,
37
37
  placeholder = _ref.placeholder,
@@ -44,6 +44,23 @@ export var DateTimeInput = function DateTimeInput(_ref) {
44
44
  id = _ref.id;
45
45
  var palette = useComponentPalette('dateTimeInput');
46
46
  var inputRef = useRef(null);
47
+
48
+ // Внутри компонента ходят только даты минутной точности: и выбранное значение, и
49
+ // границы. Иначе minDate вида `new Date()` не даёт сохранить ближайшую допустимую
50
+ // минуту — 15:12:00 сравнивается с 15:12:37. Мемоизация нужна, чтобы новая ссылка
51
+ // не пересобирала списки барабанов на каждый рендер.
52
+ /* eslint-disable react-hooks/exhaustive-deps */
53
+ var value = useMemo(function () {
54
+ return valueProp ? logic.dropSeconds(valueProp) : null;
55
+ }, [valueProp === null || valueProp === void 0 ? void 0 : valueProp.getTime()]);
56
+ var minDate = useMemo(function () {
57
+ return minDateProp ? logic.dropSeconds(minDateProp) : undefined;
58
+ }, [minDateProp === null || minDateProp === void 0 ? void 0 : minDateProp.getTime()]);
59
+ var maxDate = useMemo(function () {
60
+ return maxDateProp ? logic.dropSeconds(maxDateProp) : undefined;
61
+ }, [maxDateProp === null || maxDateProp === void 0 ? void 0 : maxDateProp.getTime()]);
62
+ /* eslint-enable react-hooks/exhaustive-deps */
63
+
47
64
  var fallbackId = useId();
48
65
  var inputId = id !== null && id !== void 0 ? id : fallbackId;
49
66
  var isMobile = useMobile();
@@ -145,7 +145,8 @@ export var MultiCountryWithUnknown = {
145
145
  value: 'BLR'
146
146
  }, {
147
147
  label: 'Другая',
148
- value: 'UNKNOWN'
148
+ value: 'UNKNOWN',
149
+ hint: 'Выберите если вашей страны нет в списке'
149
150
  }]
150
151
  }),
151
152
  render: Component