@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.
- package/dist/components/common/AppCardLink/index.js +2 -1
- package/dist/components/common/BgCard/index.js +2 -1
- package/dist/components/common/BgCard/styles.js +2 -1
- package/dist/components/common/Calendar/index.js +2 -1
- package/dist/components/common/Calendar/index.stories.js +2 -1
- package/dist/components/common/Calendar/styles.js +2 -1
- package/dist/components/common/Divider/index.js +2 -1
- package/dist/components/common/Drawer/index.js +2 -1
- package/dist/components/common/Drawer/index.stories.js +2 -1
- package/dist/components/common/Drawer/styles.js +2 -1
- package/dist/components/common/Dropdown/index.js +2 -1
- package/dist/components/common/Dropdown/styles.js +9 -8
- package/dist/components/common/EntityAutocompleteOptionsDrawer/index.js +2 -1
- package/dist/components/common/EntityAutocompleteOptionsDrawer/index.stories.js +2 -1
- package/dist/components/common/Flag/index.js +2 -1
- package/dist/components/common/Flag/styles.js +2 -1
- package/dist/components/common/InvoiceboxSpinner/index.js +2 -1
- package/dist/components/common/InvoiceboxSpinner/styles.js +2 -1
- package/dist/components/common/PointsLoader/index.js +2 -1
- package/dist/components/common/QRCode/index.js +2 -2
- package/dist/components/common/ReadOnlyLabelValueField/index.js +2 -1
- package/dist/components/common/Scrollbar/index.js +2 -1
- package/dist/components/common/Scrollbar/styles.js +2 -1
- package/dist/components/common/SecondaryButton/index.js +4 -3
- package/dist/components/common/SecondaryButton/styles.js +2 -1
- package/dist/components/common/Skeleton/index.js +2 -1
- package/dist/components/common/Skeleton/styles.js +2 -1
- package/dist/components/common/Toast/index.js +2 -1
- package/dist/components/common/Tooltip/index.js +2 -1
- package/dist/components/common/Typography/index.js +4 -3
- package/dist/components/common/WarningIcon/index.js +2 -1
- package/dist/components/form/Autocomplete/components/Autocomplete/index.js +2 -1
- package/dist/components/form/Autocomplete/components/Autocomplete/index.stories.js +2 -1
- package/dist/components/form/Autocomplete/components/OrganizationAutocompleteItem/index.js +2 -1
- package/dist/components/form/Checkbox/index.js +4 -3
- package/dist/components/form/Checkbox/index.stories.js +2 -1
- package/dist/components/form/CodeInput/index.js +2 -1
- package/dist/components/form/CodeInput/index.stories.js +2 -1
- package/dist/components/form/CountrySelect/components/CountryItem/index.d.ts +2 -1
- package/dist/components/form/CountrySelect/components/CountryItem/index.js +10 -4
- package/dist/components/form/CountrySelect/components/CountryItem/stlyes.d.ts +4 -0
- package/dist/components/form/CountrySelect/components/CountryItem/stlyes.js +18 -7
- package/dist/components/form/CountrySelect/index.d.ts +1 -0
- package/dist/components/form/CountrySelect/index.js +5 -3
- package/dist/components/form/CurrencyInput/CoreCurrencyInput/index.js +2 -1
- package/dist/components/form/CurrencyInput/CoreCurrencyInput/index.stories.js +2 -1
- package/dist/components/form/CurrencyInput/CurrencyInputNumber/index.js +2 -2
- package/dist/components/form/CurrencyInput/CurrencyInputNumber/index.stories.js +2 -1
- package/dist/components/form/CurrencyInput/CurrencyInputString/index.js +2 -2
- package/dist/components/form/CurrencyInput/CurrencyInputString/index.stories.js +2 -1
- package/dist/components/form/DateInput/components/CalendarIcon/index.js +2 -1
- package/dist/components/form/DateInput/components/MobileDrawerDateCalendar/index.js +2 -1
- package/dist/components/form/DateInput/components/MobileDrawerDateCalendar/index.stories.js +2 -1
- package/dist/components/form/DateInput/index.js +2 -1
- package/dist/components/form/DateInput/index.stories.js +2 -1
- package/dist/components/form/DateInput/logic.d.ts +1 -0
- package/dist/components/form/DateInput/logic.js +11 -0
- package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.d.ts +12 -0
- package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.js +83 -0
- package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.stories.d.ts +6 -0
- package/dist/components/form/DateTimeInput/components/MobileDatePicker/index.stories.js +48 -0
- package/dist/components/form/DateTimeInput/components/MobileDatePicker/logic.d.ts +11 -0
- package/dist/components/form/DateTimeInput/components/MobileDatePicker/logic.js +92 -0
- package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.d.ts +4 -0
- package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.js +42 -22
- package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.stories.js +2 -1
- package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/styles.d.ts +1 -2
- package/dist/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/styles.js +4 -8
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/index.d.ts +14 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/index.js +259 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/styles.d.ts +12 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/styles.js +35 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/constants.d.ts +11 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/constants.js +40 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.d.ts +12 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.js +48 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.stories.d.ts +5 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/index.stories.js +47 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/palette.d.ts +9 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/palette.js +17 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/styles.d.ts +12 -0
- package/dist/components/form/DateTimeInput/components/MobileWheelPicker/styles.js +39 -0
- package/dist/components/form/DateTimeInput/components/TimePicker/index.d.ts +1 -0
- package/dist/components/form/DateTimeInput/components/TimePicker/index.js +34 -16
- package/dist/components/form/DateTimeInput/components/TimePicker/index.stories.d.ts +1 -0
- package/dist/components/form/DateTimeInput/components/TimePicker/index.stories.js +31 -17
- package/dist/components/form/DateTimeInput/components/TimePicker/styles.d.ts +0 -4
- package/dist/components/form/DateTimeInput/components/TimePicker/styles.js +2 -13
- package/dist/components/form/DateTimeInput/index.js +22 -4
- package/dist/components/form/DateTimeInput/index.stories.js +2 -1
- package/dist/components/form/InputLabel/index.js +2 -1
- package/dist/components/form/InputLabel/styles.js +2 -1
- package/dist/components/form/ModernPlaceholder/index.js +2 -1
- package/dist/components/form/PhoneInput/index.d.ts +1 -0
- package/dist/components/form/PhoneInput/index.js +2 -1
- package/dist/components/form/PhoneInput/index.stories.js +4 -2
- package/dist/components/form/PhoneInput/phoneInputLogic.d.ts +2 -0
- package/dist/components/form/PhoneInput/types.d.ts +1 -0
- package/dist/components/form/PositiveIntegerInput/index.js +2 -1
- package/dist/components/form/PositiveIntegerInput/index.stories.js +2 -1
- package/dist/components/form/PositiveIntegerInput/styles.js +2 -1
- package/dist/components/form/PureInput/index.js +4 -3
- package/dist/components/form/PureInput/styles.js +2 -2
- package/dist/components/form/ResetButton/index.js +2 -1
- package/dist/components/form/SearchInput/index.js +2 -1
- package/dist/components/form/SearchInput/index.stories.js +2 -1
- package/dist/components/form/Select/components/Input/index.js +2 -1
- package/dist/components/form/Select/components/Loader/index.js +2 -1
- package/dist/components/form/Select/components/MultipleValue/index.js +2 -1
- package/dist/components/form/Select/components/MultipleValue/styles.js +2 -1
- package/dist/components/form/Select/index.js +2 -1
- package/dist/components/form/Select/index.stories.js +2 -1
- package/dist/components/form/Select/styles.js +2 -1
- package/dist/components/form/TagsInput/index.js +2 -1
- package/dist/components/form/TagsInput/index.stories.js +2 -1
- package/dist/components/form/TagsInput/styles.js +2 -2
- package/dist/components/form/TextInput/index.js +2 -1
- package/dist/components/form/TextInput/index.stories.js +2 -1
- package/dist/components/form/Toggle/index.js +4 -3
- package/dist/components/form/Toggle/index.stories.js +2 -1
- package/dist/components/form/Toggle/styles.js +10 -10
- package/dist/components/form/_hooks/useInputStyles.js +2 -1
- package/dist/components/form/common/DrawerHeader/index.d.ts +2 -0
- package/dist/components/form/common/DrawerHeader/index.js +15 -5
- package/dist/components/form/common/DrawerHeader/styles.d.ts +4 -0
- package/dist/components/form/common/DrawerHeader/styles.js +17 -7
- package/dist/esm/components/common/Dropdown/styles.js +7 -7
- package/dist/esm/components/common/QRCode/index.js +2 -2
- package/dist/esm/components/common/SecondaryButton/index.js +2 -2
- package/dist/esm/components/common/Typography/index.js +2 -2
- package/dist/esm/components/form/Checkbox/index.js +2 -2
- package/dist/esm/components/form/CountrySelect/components/CountryItem/index.js +8 -3
- package/dist/esm/components/form/CountrySelect/components/CountryItem/stlyes.js +17 -6
- package/dist/esm/components/form/CountrySelect/index.js +3 -2
- package/dist/esm/components/form/CurrencyInput/CurrencyInputNumber/index.js +2 -2
- package/dist/esm/components/form/CurrencyInput/CurrencyInputString/index.js +2 -2
- package/dist/esm/components/form/DateInput/logic.js +11 -0
- package/dist/esm/components/form/DateTimeInput/components/MobileDatePicker/index.js +74 -0
- package/dist/esm/components/form/DateTimeInput/components/MobileDatePicker/index.stories.js +39 -0
- package/dist/esm/components/form/DateTimeInput/components/MobileDatePicker/logic.js +86 -0
- package/dist/esm/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/index.js +40 -21
- package/dist/esm/components/form/DateTimeInput/components/MobileDrawerDateTimeCalendar/styles.js +3 -7
- package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/index.js +250 -0
- package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/components/WheelColumn/styles.js +28 -0
- package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/constants.js +34 -0
- package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/index.js +32 -0
- package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/index.stories.js +38 -0
- package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/palette.js +10 -0
- package/dist/esm/components/form/DateTimeInput/components/MobileWheelPicker/styles.js +32 -0
- package/dist/esm/components/form/DateTimeInput/components/TimePicker/index.js +32 -15
- package/dist/esm/components/form/DateTimeInput/components/TimePicker/index.stories.js +29 -15
- package/dist/esm/components/form/DateTimeInput/components/TimePicker/styles.js +1 -12
- package/dist/esm/components/form/DateTimeInput/index.js +21 -4
- package/dist/esm/components/form/PhoneInput/index.stories.js +2 -1
- package/dist/esm/components/form/PureInput/index.js +2 -2
- package/dist/esm/components/form/PureInput/styles.js +2 -2
- package/dist/esm/components/form/TagsInput/styles.js +2 -2
- package/dist/esm/components/form/Toggle/index.js +2 -2
- package/dist/esm/components/form/Toggle/styles.js +10 -10
- package/dist/esm/components/form/common/DrawerHeader/index.js +13 -4
- package/dist/esm/components/form/common/DrawerHeader/styles.js +16 -6
- package/dist/esm/palette/context.js +2 -0
- package/dist/esm/palette/provider.js +2 -0
- package/dist/hooks/useUnupdatableHandler/index.stories.js +2 -1
- package/dist/palette/context.d.ts +2 -0
- package/dist/palette/context.js +48 -46
- package/dist/palette/provider.js +50 -47
- package/dist/palette/usePalette.d.ts +1 -0
- package/package.json +1 -1
- package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/index.d.ts +0 -8
- package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/index.js +0 -201
- package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/styles.d.ts +0 -7
- package/dist/components/form/DateTimeInput/components/MobileNumbersColumn/styles.js +0 -27
- package/dist/esm/components/form/DateTimeInput/components/MobileNumbersColumn/index.js +0 -193
- 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 {
|
|
12
|
-
import MobileNumbersColumn from '../MobileNumbersColumn';
|
|
11
|
+
import { MobileWheelPicker, WheelColumn } from '../MobileWheelPicker';
|
|
13
12
|
import { Typography } from '../../../../common/Typography';
|
|
14
|
-
var
|
|
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(
|
|
72
|
-
|
|
73
|
-
}, /*#__PURE__*/React.createElement(
|
|
74
|
-
|
|
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
|
-
|
|
77
|
-
}), /*#__PURE__*/React.createElement(
|
|
78
|
-
|
|
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
|
-
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
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
|
-
|
|
34
|
-
|
|
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();
|