@skbkontur/react-ui 6.1.1-9752b.0 → 6.1.2-bea94.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/components/Input/Input.d.ts +1 -1
  3. package/components/Input/Input.js.map +1 -1
  4. package/components/TimePicker/TimeClockIcon.d.ts +3 -0
  5. package/components/TimePicker/TimeClockIcon.js +11 -0
  6. package/components/TimePicker/TimeClockIcon.js.map +1 -0
  7. package/components/TimePicker/TimeFragmentsView.d.ts +15 -0
  8. package/components/TimePicker/TimeFragmentsView.js +72 -0
  9. package/components/TimePicker/TimeFragmentsView.js.map +1 -0
  10. package/components/TimePicker/TimeFragmentsView.styles.d.ts +12 -0
  11. package/components/TimePicker/TimeFragmentsView.styles.js +43 -0
  12. package/components/TimePicker/TimeFragmentsView.styles.js.map +1 -0
  13. package/components/TimePicker/TimeInput.d.ts +22 -0
  14. package/components/TimePicker/TimeInput.js +103 -0
  15. package/components/TimePicker/TimeInput.js.map +1 -0
  16. package/components/TimePicker/TimePicker.d.ts +70 -0
  17. package/components/TimePicker/TimePicker.js +506 -0
  18. package/components/TimePicker/TimePicker.js.map +1 -0
  19. package/components/TimePicker/TimePicker.styles.d.ts +14 -0
  20. package/components/TimePicker/TimePicker.styles.js +45 -0
  21. package/components/TimePicker/TimePicker.styles.js.map +1 -0
  22. package/components/TimePicker/TimePickerMobilePopup.d.ts +38 -0
  23. package/components/TimePicker/TimePickerMobilePopup.js +21 -0
  24. package/components/TimePicker/TimePickerMobilePopup.js.map +1 -0
  25. package/components/TimePicker/TimePickerPopup.d.ts +20 -0
  26. package/components/TimePicker/TimePickerPopup.js +18 -0
  27. package/components/TimePicker/TimePickerPopup.js.map +1 -0
  28. package/components/TimePicker/TimePickerSlots.d.ts +17 -0
  29. package/components/TimePicker/TimePickerSlots.js +80 -0
  30. package/components/TimePicker/TimePickerSlots.js.map +1 -0
  31. package/components/TimePicker/helpers/TimePicker.constants.d.ts +22 -0
  32. package/components/TimePicker/helpers/TimePicker.constants.js +31 -0
  33. package/components/TimePicker/helpers/TimePicker.constants.js.map +1 -0
  34. package/components/TimePicker/helpers/TimePicker.editing.d.ts +23 -0
  35. package/components/TimePicker/helpers/TimePicker.editing.js +101 -0
  36. package/components/TimePicker/helpers/TimePicker.editing.js.map +1 -0
  37. package/components/TimePicker/helpers/TimePicker.layout.d.ts +6 -0
  38. package/components/TimePicker/helpers/TimePicker.layout.js +49 -0
  39. package/components/TimePicker/helpers/TimePicker.layout.js.map +1 -0
  40. package/components/TimePicker/helpers/TimePicker.selection.d.ts +5 -0
  41. package/components/TimePicker/helpers/TimePicker.selection.js +23 -0
  42. package/components/TimePicker/helpers/TimePicker.selection.js.map +1 -0
  43. package/components/TimePicker/helpers/TimePicker.shared.d.ts +47 -0
  44. package/components/TimePicker/helpers/TimePicker.shared.js +70 -0
  45. package/components/TimePicker/helpers/TimePicker.shared.js.map +1 -0
  46. package/components/TimePicker/helpers/TimePicker.value.d.ts +23 -0
  47. package/components/TimePicker/helpers/TimePicker.value.js +71 -0
  48. package/components/TimePicker/helpers/TimePicker.value.js.map +1 -0
  49. package/components/TimePicker/helpers/scrollSelectedSlotIntoView.d.ts +4 -0
  50. package/components/TimePicker/helpers/scrollSelectedSlotIntoView.js +24 -0
  51. package/components/TimePicker/helpers/scrollSelectedSlotIntoView.js.map +1 -0
  52. package/components/TimePicker/hooks/useTimePickerDropdown.d.ts +17 -0
  53. package/components/TimePicker/hooks/useTimePickerDropdown.js +62 -0
  54. package/components/TimePicker/hooks/useTimePickerDropdown.js.map +1 -0
  55. package/components/TimePicker/hooks/useTimePickerSelection.d.ts +18 -0
  56. package/components/TimePicker/hooks/useTimePickerSelection.js +66 -0
  57. package/components/TimePicker/hooks/useTimePickerSelection.js.map +1 -0
  58. package/components/TimePicker/hooks/useTimePickerValue.d.ts +18 -0
  59. package/components/TimePicker/hooks/useTimePickerValue.js +58 -0
  60. package/components/TimePicker/hooks/useTimePickerValue.js.map +1 -0
  61. package/components/TimePicker/index.d.ts +2 -0
  62. package/components/TimePicker/index.js +2 -0
  63. package/components/TimePicker/index.js.map +1 -0
  64. package/index.d.ts +1 -0
  65. package/index.js +1 -0
  66. package/index.js.map +1 -1
  67. package/internal/NativeTimeInput/NativeTimeInput.d.ts +16 -0
  68. package/internal/NativeTimeInput/NativeTimeInput.js +25 -0
  69. package/internal/NativeTimeInput/NativeTimeInput.js.map +1 -0
  70. package/internal/NativeTimeInput/NativeTimeInput.styles.d.ts +3 -0
  71. package/internal/NativeTimeInput/NativeTimeInput.styles.js +15 -0
  72. package/internal/NativeTimeInput/NativeTimeInput.styles.js.map +1 -0
  73. package/internal/NativeTimeInput/NativeTimeInput.utils.d.ts +7 -0
  74. package/internal/NativeTimeInput/NativeTimeInput.utils.js +28 -0
  75. package/internal/NativeTimeInput/NativeTimeInput.utils.js.map +1 -0
  76. package/internal/NativeTimeInput/index.d.ts +1 -0
  77. package/internal/NativeTimeInput/index.js +2 -0
  78. package/internal/NativeTimeInput/index.js.map +1 -0
  79. package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.d.ts +2 -0
  80. package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.js +20 -0
  81. package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.js.map +1 -0
  82. package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.d.ts +2 -0
  83. package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.js +20 -0
  84. package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.js.map +1 -0
  85. package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.d.ts +2 -0
  86. package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.js +20 -0
  87. package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.js.map +1 -0
  88. package/internal/themes/BasicTheme.d.ts +34 -0
  89. package/internal/themes/BasicTheme.js +96 -0
  90. package/internal/themes/BasicTheme.js.map +1 -1
  91. package/package.json +5 -1
@@ -0,0 +1,70 @@
1
+ import React from 'react';
2
+ import type { AriaAttributes, HTMLAttributes, ReactNode } from 'react';
3
+ import type { CommonProps } from '../../internal/CommonWrapper/index.js';
4
+ import type { SizeProp } from '../../lib/types/props.js';
5
+ import type { TimeFormat, TimeSlot } from './helpers/TimePicker.shared.js';
6
+ export interface TimePickerProps extends CommonProps, Pick<AriaAttributes, 'aria-describedby' | 'aria-label'>, Pick<HTMLAttributes<HTMLElement>, 'id'> {
7
+ /** Устанавливает формат времени @default minute */
8
+ format?: TimeFormat;
9
+ /** Определяет массив объектов со слотами в формате TimeSlot */
10
+ slots?: TimeSlot[];
11
+ /** Задает нижнюю границу времени. Слоты за границей становятся disabled */
12
+ minTime?: string;
13
+ /** Задает верхнюю границу времени. Слоты за границей становятся disabled */
14
+ maxTime?: string;
15
+ /** Значение поля @param value 'hh:mm:[:ss]' */
16
+ value?: string;
17
+ /** Устанавливает фокус на поле ввода после окончания загрузки страницы @default false */
18
+ autoFocus?: boolean;
19
+ /** Делает компонент недоступным. */
20
+ disabled?: boolean;
21
+ /** Переводит контрол в состояние валидации 'ошибка'. */
22
+ error?: boolean;
23
+ /** Переводит контрол в состояние валидации 'предупреждение'. */
24
+ warning?: boolean;
25
+ /** Включает нативный системный выбор времени на мобильных устройствах */
26
+ useMobileNativeTimePicker?: boolean;
27
+ /** Расположение выпадающего меню */
28
+ menuPos?: 'top' | 'bottom';
29
+ /** Выравнивание выпадающего меню */
30
+ menuAlign?: 'left' | 'right';
31
+ /** Ширина выпадающего меню. По умолчанию — минимум ширина поля ввода, расширяется по контенту. */
32
+ menuWidth?: string | number;
33
+ /** Задает ширину поля. */
34
+ width?: string | number;
35
+ /** Переопределяет иконку или скрывает, если передать `null`. */
36
+ rightIcon?: React.ReactNode | (() => React.ReactNode);
37
+ /** Устанавливает суффикс после значения и перед иконкой. */
38
+ suffix?: ReactNode;
39
+ /** Размер поля ввода и выпадающего меню */
40
+ size?: SizeProp;
41
+ /** Задает функцию, которая вызывается при клике на контрол. */
42
+ onClick?(event: React.MouseEvent<HTMLElement>): void;
43
+ /** Событие изменения значения `value` в поле @param value - 'hh:mm:[:ss]' */
44
+ onValueChange?(value: string): void;
45
+ /** Задает функцию, которая вызывается при потере фокуса. */
46
+ onBlur?(event: React.FocusEvent<HTMLElement>): void;
47
+ /** Задает функцию, которая вызывается при получении фокуса. */
48
+ onFocus?(event: React.FocusEvent<HTMLElement>): void;
49
+ /** Задает функцию, которая вызывается при нажатии кнопки на клавиатуре. */
50
+ onKeyDown?(event: React.KeyboardEvent<HTMLElement>): void;
51
+ /** Задает функцию, которая вызывается при вставке значения. */
52
+ onPaste?(event: React.ClipboardEvent<HTMLElement>): void;
53
+ }
54
+ export interface TimePickerRef {
55
+ /** Устанавливает фокус на поле ввода */
56
+ focus(): void;
57
+ /** Снимает фокус с поля ввода */
58
+ blur(): void;
59
+ /** Закрывает выпадающее меню */
60
+ close(): void;
61
+ /** Запускает анимацию blink у поля ввода времени */
62
+ blink(): void;
63
+ /** Возвращает DOM-узел поля ввода */
64
+ getNode(): HTMLElement | null;
65
+ /** Возвращает корневой DOM-узел компонента */
66
+ getRootNode(): HTMLElement | null;
67
+ }
68
+ export type TimePicker = TimePickerRef;
69
+ /** Поле с временем помогает вводить время с клавиатуры или выбирать его с помощью мыши */
70
+ export declare const TimePicker: import("../../lib/forwardRefAndName.js").ReactUIComponentWithRef<TimePickerRef, TimePickerProps> & Record<never, never>;
@@ -0,0 +1,506 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ import React, { useCallback, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState, } from 'react';
24
+ import { CommonWrapper } from '../../internal/CommonWrapper/index.js';
25
+ import { NativeTimeInput } from '../../internal/NativeTimeInput/index.js';
26
+ import { isIOS, isMobile } from '../../lib/client.js';
27
+ import { isKeyArrowDown, isKeyArrowLeft, isKeyArrowRight, isKeyArrowUp, isKeyBackspace, isKeyChar, isKeyDelete, isKeyEnter, isKeyEscape, isKeySpace, isKeyTab, isModShift, isShortcutSelectAll, } from '../../lib/events/keyboard/identifiers.js';
28
+ import { forwardRefAndName } from '../../lib/forwardRefAndName.js';
29
+ import { useStyles } from '../../lib/renderEnvironment/index.js';
30
+ import { ThemeContext } from '../../lib/theming/ThemeContext.js';
31
+ import { getRandomID } from '../../lib/utils.js';
32
+ import { scrollSelectedSlotIntoView } from './helpers/scrollSelectedSlotIntoView.js';
33
+ import { DIGIT_REGEXP, EMPTY_SEGMENT, EMPTY_VALUE, TimePickerDataTids } from './helpers/TimePicker.constants.js';
34
+ import { commitTimeSegmentOnLeave, deleteTimeSegmentDigit, formatDigitToTimeSegment, shiftTimeSegmentValue, } from './helpers/TimePicker.editing.js';
35
+ import { getTimePickerPopupMaxHeight } from './helpers/TimePicker.layout.js';
36
+ import { getNextTimeSegment, getPreviousTimeSegment } from './helpers/TimePicker.selection.js';
37
+ import { getEmptyDisplayValue, isTimeDisplayEmpty, isTimeValueOutOfRange, normalizeTimeValue, parsePastedTimeValue, replaceTimeSegment, } from './helpers/TimePicker.value.js';
38
+ import { useTimePickerDropdown } from './hooks/useTimePickerDropdown.js';
39
+ import { useTimePickerSelection } from './hooks/useTimePickerSelection.js';
40
+ import { useTimePickerValue } from './hooks/useTimePickerValue.js';
41
+ import { TimeInput } from './TimeInput.js';
42
+ import { getStyles } from './TimePicker.styles.js';
43
+ import { TimePickerMobilePopup } from './TimePickerMobilePopup.js';
44
+ import { TimePickerPopup } from './TimePickerPopup.js';
45
+ /** Поле с временем помогает вводить время с клавиатуры или выбирать его с помощью мыши */
46
+ export var TimePicker = forwardRefAndName('TimePicker', function (props, ref) {
47
+ var _a;
48
+ var disabled = props.disabled, _b = props.useMobileNativeTimePicker, useMobileNativeTimePicker = _b === void 0 ? false : _b, _c = props.format, format = _c === void 0 ? 'minute' : _c, _d = props.size, size = _d === void 0 ? 'small' : _d, slots = props.slots, menuPos = props.menuPos, menuAlign = props.menuAlign, menuWidth = props.menuWidth, minTime = props.minTime, maxTime = props.maxTime, rightIcon = props.rightIcon, suffix = props.suffix, value = props.value, onValueChange = props.onValueChange, onFocus = props.onFocus, onBlur = props.onBlur, onClick = props.onClick, onKeyDown = props.onKeyDown, onPaste = props.onPaste, inputProps = __rest(props, ["disabled", "useMobileNativeTimePicker", "format", "size", "slots", "menuPos", "menuAlign", "menuWidth", "minTime", "maxTime", "rightIcon", "suffix", "value", "onValueChange", "onFocus", "onBlur", "onClick", "onKeyDown", "onPaste"]);
49
+ var theme = useContext(ThemeContext);
50
+ var styles = useStyles(getStyles);
51
+ var _e = useState(false), isInputFocused = _e[0], setIsInputFocused = _e[1];
52
+ var inputRef = useRef(null);
53
+ var mobileInputRef = useRef(null);
54
+ var nativeInputRef = useRef(null);
55
+ var rootRef = useRef(null);
56
+ var slotRefs = useRef(new Map());
57
+ var isMouseFocusRef = useRef(false);
58
+ var isMouseDownOnFragmentRef = useRef(false);
59
+ var mouseDownSegmentRef = useRef(null);
60
+ var popupIdRef = useRef(TimePickerDataTids.popup + getRandomID());
61
+ var _f = useState(false), isMobileDevice = _f[0], setIsMobileDevice = _f[1];
62
+ var _g = useState(false), canUseMobileNativeTimePicker = _g[0], setCanUseMobileNativeTimePicker = _g[1];
63
+ var _h = useTimePickerValue({ isInputFocused: isInputFocused, format: format, value: value, onValueChange: onValueChange }), editingValue = _h.editingValue, editingValueRef = _h.editingValueRef, setEditingValue = _h.setEditingValue, updateEditingValue = _h.updateEditingValue, commitEditingValue = _h.commitEditingValue, clearEditingValue = _h.clearEditingValue;
64
+ var hasDropdown = ((_a = slots === null || slots === void 0 ? void 0 : slots.length) !== null && _a !== void 0 ? _a : 0) > 0;
65
+ var resolvedSlots = useMemo(function () {
66
+ return (slots !== null && slots !== void 0 ? slots : []).map(function (slot) { return (__assign(__assign({}, slot), { disabled: Boolean(slot.disabled) || isTimeValueOutOfRange(slot.value, format, minTime, maxTime) })); });
67
+ }, [maxTime, minTime, format, slots]);
68
+ var popupMaxHeight = getTimePickerPopupMaxHeight(size, theme);
69
+ var ariaPlaceholder = format === 'minute' ? 'чч:мм' : 'чч:мм:сс';
70
+ var normalizedValue = normalizeTimeValue(editingValue, format);
71
+ var selectedSlotIndex = resolvedSlots.findIndex(function (slot) { return normalizeTimeValue(slot.value, format) === normalizedValue; });
72
+ var canUseMobileDropdownTimePicker = hasDropdown && isMobileDevice && !canUseMobileNativeTimePicker;
73
+ var displayValue = editingValue;
74
+ if (isInputFocused) {
75
+ displayValue = editingValue === EMPTY_VALUE ? getEmptyDisplayValue(format) : editingValue;
76
+ }
77
+ else if (isTimeDisplayEmpty(editingValue)) {
78
+ displayValue = EMPTY_VALUE;
79
+ }
80
+ var resetMouseInteractionState = useCallback(function () {
81
+ isMouseFocusRef.current = false;
82
+ isMouseDownOnFragmentRef.current = false;
83
+ mouseDownSegmentRef.current = null;
84
+ }, []);
85
+ var normalizeCurrentSegmentIfNeeded = useCallback(function (segment) {
86
+ var nextDisplayValue = commitTimeSegmentOnLeave(editingValue === EMPTY_VALUE ? getEmptyDisplayValue(format) : editingValue, segment, format);
87
+ updateEditingValue(nextDisplayValue);
88
+ }, [editingValue, format, updateEditingValue]);
89
+ var openNativeTimePicker = useCallback(function () {
90
+ var _a, _b;
91
+ if (!canUseMobileNativeTimePicker || disabled) {
92
+ return;
93
+ }
94
+ if (isIOS) {
95
+ (_a = nativeInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
96
+ }
97
+ else {
98
+ (_b = nativeInputRef.current) === null || _b === void 0 ? void 0 : _b.click();
99
+ }
100
+ }, [canUseMobileNativeTimePicker, disabled]);
101
+ var _j = useTimePickerDropdown({
102
+ disabled: disabled,
103
+ hasDropdown: hasDropdown,
104
+ slots: resolvedSlots,
105
+ selectedSlotIndex: selectedSlotIndex >= 0 ? selectedSlotIndex : null,
106
+ }), isDropdownOpened = _j.isDropdownOpened, highlightedSlotIndex = _j.highlightedSlotIndex, openDropdown = _j.openDropdown, closeDropdown = _j.closeDropdown, resetHighlightedSlot = _j.resetHighlightedSlot, tryNavigateSlots = _j.tryNavigateSlots;
107
+ var popupId = popupIdRef.current;
108
+ var activeDescendantId = hasDropdown && highlightedSlotIndex !== null ? "".concat(popupId, "-slot-").concat(highlightedSlotIndex) : undefined;
109
+ var getActiveInput = useCallback(function () { return (canUseMobileDropdownTimePicker && isDropdownOpened ? mobileInputRef.current : inputRef.current); }, [canUseMobileDropdownTimePicker, isDropdownOpened]);
110
+ var _k = useTimePickerSelection({
111
+ isInputFocused: isInputFocused,
112
+ format: format,
113
+ displayValue: displayValue,
114
+ getInput: getActiveInput,
115
+ }), selection = _k.selection, selectedSegment = _k.selectedSegment, selectSegment = _k.selectSegment, selectAll = _k.selectAll, syncSelectionWithDOM = _k.syncSelectionWithDOM;
116
+ var closeOpenedDropdown = useCallback(function () {
117
+ if (canUseMobileDropdownTimePicker && isDropdownOpened) {
118
+ setIsInputFocused(false);
119
+ resetMouseInteractionState();
120
+ if (isTimeDisplayEmpty(editingValueRef.current)) {
121
+ clearEditingValue();
122
+ }
123
+ else {
124
+ commitEditingValue();
125
+ }
126
+ }
127
+ closeDropdown();
128
+ }, [
129
+ canUseMobileDropdownTimePicker,
130
+ clearEditingValue,
131
+ closeDropdown,
132
+ commitEditingValue,
133
+ editingValueRef,
134
+ isDropdownOpened,
135
+ resetMouseInteractionState,
136
+ ]);
137
+ var selectSlot = useCallback(function (slot) {
138
+ if (slot.disabled) {
139
+ return;
140
+ }
141
+ if (canUseMobileDropdownTimePicker) {
142
+ setIsInputFocused(false);
143
+ resetMouseInteractionState();
144
+ }
145
+ updateEditingValue(slot.value);
146
+ closeDropdown();
147
+ }, [canUseMobileDropdownTimePicker, closeDropdown, resetMouseInteractionState, updateEditingValue]);
148
+ var isSelectHighlightedSlot = useCallback(function () {
149
+ if (highlightedSlotIndex === null) {
150
+ return false;
151
+ }
152
+ var slot = resolvedSlots[highlightedSlotIndex];
153
+ if (!slot || slot.disabled) {
154
+ return true;
155
+ }
156
+ selectSlot(slot);
157
+ return true;
158
+ }, [highlightedSlotIndex, resolvedSlots, selectSlot]);
159
+ var focusInput = useCallback(function () {
160
+ var _a;
161
+ (_a = getActiveInput()) === null || _a === void 0 ? void 0 : _a.focus();
162
+ }, [getActiveInput]);
163
+ var blurInput = useCallback(function () {
164
+ var _a;
165
+ (_a = getActiveInput()) === null || _a === void 0 ? void 0 : _a.blur();
166
+ }, [getActiveInput]);
167
+ var closeInputDropdown = useCallback(function () {
168
+ closeOpenedDropdown();
169
+ }, [closeOpenedDropdown]);
170
+ var blinkInput = useCallback(function () {
171
+ var _a;
172
+ (_a = getActiveInput()) === null || _a === void 0 ? void 0 : _a.blink();
173
+ }, [getActiveInput]);
174
+ useImperativeHandle(ref, function () { return ({
175
+ focus: focusInput,
176
+ blur: blurInput,
177
+ blink: blinkInput,
178
+ close: closeInputDropdown,
179
+ getNode: function () { var _a, _b; return (_b = (_a = getActiveInput()) === null || _a === void 0 ? void 0 : _a.getNode()) !== null && _b !== void 0 ? _b : null; },
180
+ getRootNode: function () { return rootRef.current; },
181
+ }); }, [blinkInput, blurInput, closeInputDropdown, focusInput, getActiveInput]);
182
+ useLayoutEffect(function () {
183
+ if (!isDropdownOpened) {
184
+ return;
185
+ }
186
+ var selectedIndex = highlightedSlotIndex !== null && highlightedSlotIndex !== void 0 ? highlightedSlotIndex : selectedSlotIndex;
187
+ if (selectedIndex < 0) {
188
+ return;
189
+ }
190
+ var targetNode = slotRefs.current.get(selectedIndex);
191
+ if (targetNode) {
192
+ scrollSelectedSlotIntoView(targetNode);
193
+ }
194
+ }, [highlightedSlotIndex, isDropdownOpened, selectedSlotIndex]);
195
+ useEffect(function () {
196
+ if (disabled && isDropdownOpened) {
197
+ closeOpenedDropdown();
198
+ }
199
+ }, [closeOpenedDropdown, disabled, isDropdownOpened]);
200
+ useEffect(function () {
201
+ setIsMobileDevice(Boolean(isMobile));
202
+ setCanUseMobileNativeTimePicker(useMobileNativeTimePicker && Boolean(isMobile));
203
+ }, [useMobileNativeTimePicker]);
204
+ var handleCloseMobileDropdown = useCallback(function () {
205
+ closeOpenedDropdown();
206
+ }, [closeOpenedDropdown]);
207
+ var handleFocusBySource = function (event, isMobilePopupInput) {
208
+ if (canUseMobileNativeTimePicker) {
209
+ openNativeTimePicker();
210
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
211
+ return;
212
+ }
213
+ if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {
214
+ openDropdown();
215
+ return;
216
+ }
217
+ setIsInputFocused(true);
218
+ openDropdown();
219
+ if (isMouseDownOnFragmentRef.current && !isInputFocused) {
220
+ if (isTimeDisplayEmpty(editingValueRef.current)) {
221
+ selectSegment('hours');
222
+ }
223
+ else if (mouseDownSegmentRef.current) {
224
+ selectSegment(mouseDownSegmentRef.current);
225
+ }
226
+ }
227
+ else {
228
+ selectSegment('hours');
229
+ }
230
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
231
+ };
232
+ var handleFocus = function (event) { return handleFocusBySource(event, false); };
233
+ var handleMobileFocus = function (event) { return handleFocusBySource(event, true); };
234
+ var handleBlurBySource = function (event, isMobilePopupInput) {
235
+ if (canUseMobileNativeTimePicker) {
236
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
237
+ return;
238
+ }
239
+ if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {
240
+ return;
241
+ }
242
+ setIsInputFocused(false);
243
+ resetMouseInteractionState();
244
+ if (isMobilePopupInput) {
245
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
246
+ return;
247
+ }
248
+ closeDropdown();
249
+ if (isTimeDisplayEmpty(editingValueRef.current)) {
250
+ clearEditingValue();
251
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
252
+ return;
253
+ }
254
+ commitEditingValue();
255
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
256
+ };
257
+ var handleBlur = function (event) { return handleBlurBySource(event, false); };
258
+ var handleMobileBlur = function (event) { return handleBlurBySource(event, true); };
259
+ var handleClickBySource = function (event, isMobilePopupInput) {
260
+ if (canUseMobileNativeTimePicker) {
261
+ openNativeTimePicker();
262
+ onClick === null || onClick === void 0 ? void 0 : onClick(event);
263
+ return;
264
+ }
265
+ if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {
266
+ openDropdown();
267
+ onClick === null || onClick === void 0 ? void 0 : onClick(event);
268
+ return;
269
+ }
270
+ openDropdown();
271
+ onClick === null || onClick === void 0 ? void 0 : onClick(event);
272
+ };
273
+ var handleClick = function (event) { return handleClickBySource(event, false); };
274
+ var handleMobileClick = function (event) { return handleClickBySource(event, true); };
275
+ var handleMouseDownCaptureBySource = function (event, isMobilePopupInput) {
276
+ var _a, _b;
277
+ if (canUseMobileNativeTimePicker || (canUseMobileDropdownTimePicker && !isMobilePopupInput)) {
278
+ return;
279
+ }
280
+ var currentInputRef = isMobilePopupInput ? mobileInputRef : inputRef;
281
+ var segment = (_b = (_a = currentInputRef.current) === null || _a === void 0 ? void 0 : _a.getSegment(event.target)) !== null && _b !== void 0 ? _b : null;
282
+ var isFragment = segment !== null;
283
+ if (isInputFocused && !isFragment) {
284
+ event.preventDefault();
285
+ }
286
+ isMouseFocusRef.current = !isInputFocused;
287
+ isMouseDownOnFragmentRef.current = isFragment;
288
+ mouseDownSegmentRef.current = segment;
289
+ };
290
+ var handleMouseDownCapture = function (event) {
291
+ return handleMouseDownCaptureBySource(event, false);
292
+ };
293
+ var handleMobileMouseDownCapture = function (event) {
294
+ return handleMouseDownCaptureBySource(event, true);
295
+ };
296
+ var handleMouseUpBySource = function (_event, isMobilePopupInput) {
297
+ if (disabled || canUseMobileNativeTimePicker || (canUseMobileDropdownTimePicker && !isMobilePopupInput)) {
298
+ return;
299
+ }
300
+ syncSelectionWithDOM();
301
+ };
302
+ var handleMouseUp = function (event) { return handleMouseUpBySource(event, false); };
303
+ var handleMobileMouseUp = function (event) { return handleMouseUpBySource(event, true); };
304
+ var handleSelectSegmentByMouseBySource = function (segment, isMobilePopupInput) {
305
+ if (canUseMobileNativeTimePicker) {
306
+ openNativeTimePicker();
307
+ return;
308
+ }
309
+ if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {
310
+ openDropdown();
311
+ return;
312
+ }
313
+ openDropdown();
314
+ if (disabled) {
315
+ return;
316
+ }
317
+ if (!(isMouseFocusRef.current && isTimeDisplayEmpty(editingValueRef.current)) && selectedSegment !== segment) {
318
+ normalizeCurrentSegmentIfNeeded(selectedSegment);
319
+ selectSegment(segment);
320
+ }
321
+ resetMouseInteractionState();
322
+ };
323
+ var handleSelectSegmentByMouse = function (segment) { return handleSelectSegmentByMouseBySource(segment, false); };
324
+ var handleMobileSelectSegmentByMouse = function (segment) { return handleSelectSegmentByMouseBySource(segment, true); };
325
+ var handleKeyDownBySource = function (event, isMobilePopupInput) {
326
+ var _a, _b, _c, _d, _e, _f;
327
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
328
+ if (event.defaultPrevented || disabled) {
329
+ return;
330
+ }
331
+ if (canUseMobileNativeTimePicker) {
332
+ openNativeTimePicker();
333
+ return;
334
+ }
335
+ if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {
336
+ openDropdown();
337
+ return;
338
+ }
339
+ if (isShortcutSelectAll(event)) {
340
+ event.preventDefault();
341
+ selectAll();
342
+ return;
343
+ }
344
+ if (event.altKey || event.ctrlKey || event.metaKey) {
345
+ return;
346
+ }
347
+ var currentDisplayValue = displayValue;
348
+ var currentSegment = selectedSegment;
349
+ var hasAllSelectionInState = selection === 'all';
350
+ var hasAllSelectionInDOM = (_b = (_a = getActiveInput()) === null || _a === void 0 ? void 0 : _a.isAllSelected()) !== null && _b !== void 0 ? _b : false;
351
+ var shouldHandleAsAllSelection = hasAllSelectionInState || hasAllSelectionInDOM;
352
+ if (hasAllSelectionInDOM && !hasAllSelectionInState) {
353
+ syncSelectionWithDOM();
354
+ }
355
+ if (shouldHandleAsAllSelection && (isKeyBackspace(event) || isKeyDelete(event))) {
356
+ event.preventDefault();
357
+ updateEditingValue(getEmptyDisplayValue(format));
358
+ selectSegment('hours');
359
+ return;
360
+ }
361
+ if (DIGIT_REGEXP.test(event.key)) {
362
+ event.preventDefault();
363
+ resetHighlightedSlot();
364
+ var nextDigitInputValue = shouldHandleAsAllSelection ? getEmptyDisplayValue(format) : currentDisplayValue;
365
+ var nextDigitInputSegment = shouldHandleAsAllSelection ? 'hours' : currentSegment;
366
+ var result = formatDigitToTimeSegment(nextDigitInputValue, nextDigitInputSegment, event.key, format);
367
+ if (result.shouldBlink) {
368
+ (_c = getActiveInput()) === null || _c === void 0 ? void 0 : _c.blink();
369
+ return;
370
+ }
371
+ updateEditingValue(result.nextValue);
372
+ selectSegment(result.selectedSegment);
373
+ return;
374
+ }
375
+ if (isKeyArrowLeft(event)) {
376
+ event.preventDefault();
377
+ normalizeCurrentSegmentIfNeeded(currentSegment);
378
+ selectSegment((_d = getPreviousTimeSegment(currentSegment)) !== null && _d !== void 0 ? _d : currentSegment);
379
+ return;
380
+ }
381
+ if (isModShift(isKeyTab)(event)) {
382
+ var previousSegment = getPreviousTimeSegment(currentSegment);
383
+ if (previousSegment) {
384
+ event.preventDefault();
385
+ normalizeCurrentSegmentIfNeeded(currentSegment);
386
+ selectSegment(previousSegment);
387
+ }
388
+ return;
389
+ }
390
+ if (isKeyArrowRight(event)) {
391
+ event.preventDefault();
392
+ normalizeCurrentSegmentIfNeeded(currentSegment);
393
+ selectSegment((_e = getNextTimeSegment(currentSegment, format)) !== null && _e !== void 0 ? _e : currentSegment);
394
+ return;
395
+ }
396
+ if (isKeyTab(event)) {
397
+ var nextSegment = getNextTimeSegment(currentSegment, format);
398
+ if (nextSegment) {
399
+ event.preventDefault();
400
+ normalizeCurrentSegmentIfNeeded(currentSegment);
401
+ selectSegment(nextSegment);
402
+ }
403
+ return;
404
+ }
405
+ if (isKeyArrowUp(event) || isKeyArrowDown(event)) {
406
+ event.preventDefault();
407
+ var slotStep = isKeyArrowUp(event) ? -1 : 1;
408
+ if (tryNavigateSlots(slotStep)) {
409
+ return;
410
+ }
411
+ var step = isKeyArrowUp(event) ? 1 : -1;
412
+ updateEditingValue(shiftTimeSegmentValue(currentDisplayValue, currentSegment, step, format));
413
+ selectSegment(currentSegment);
414
+ return;
415
+ }
416
+ if (isKeyBackspace(event)) {
417
+ event.preventDefault();
418
+ var nextDisplayValue = deleteTimeSegmentDigit(currentDisplayValue, currentSegment, format);
419
+ var nextSegment = currentSegment;
420
+ if (nextDisplayValue === currentDisplayValue) {
421
+ var previousSegment = getPreviousTimeSegment(currentSegment);
422
+ if (previousSegment) {
423
+ nextSegment = previousSegment;
424
+ nextDisplayValue = deleteTimeSegmentDigit(currentDisplayValue, previousSegment, format);
425
+ }
426
+ }
427
+ updateEditingValue(nextDisplayValue);
428
+ selectSegment(nextSegment);
429
+ return;
430
+ }
431
+ if (isKeyDelete(event)) {
432
+ event.preventDefault();
433
+ updateEditingValue(replaceTimeSegment(currentDisplayValue, currentSegment, EMPTY_SEGMENT, format));
434
+ selectSegment(currentSegment);
435
+ return;
436
+ }
437
+ if (isKeyEscape(event)) {
438
+ if (isDropdownOpened) {
439
+ event.preventDefault();
440
+ closeDropdown();
441
+ }
442
+ return;
443
+ }
444
+ if (isKeyEnter(event)) {
445
+ if (isSelectHighlightedSlot()) {
446
+ event.preventDefault();
447
+ }
448
+ return;
449
+ }
450
+ if (isKeySpace(event)) {
451
+ event.preventDefault();
452
+ var nextSegment = getNextTimeSegment(currentSegment, format);
453
+ var nextDisplayValue = commitTimeSegmentOnLeave(currentDisplayValue, currentSegment, format);
454
+ updateEditingValue(nextDisplayValue);
455
+ if (nextSegment) {
456
+ selectSegment(nextSegment);
457
+ }
458
+ else {
459
+ selectSegment(currentSegment);
460
+ }
461
+ return;
462
+ }
463
+ if (isKeyChar(event)) {
464
+ event.preventDefault();
465
+ (_f = getActiveInput()) === null || _f === void 0 ? void 0 : _f.blink();
466
+ }
467
+ };
468
+ var handleKeyDown = function (event) { return handleKeyDownBySource(event, false); };
469
+ var handleMobileKeyDown = function (event) { return handleKeyDownBySource(event, true); };
470
+ var handlePasteBySource = function (event, isMobilePopupInput) {
471
+ var _a, _b;
472
+ onPaste === null || onPaste === void 0 ? void 0 : onPaste(event);
473
+ if (event.defaultPrevented || disabled) {
474
+ return;
475
+ }
476
+ if (canUseMobileNativeTimePicker || (canUseMobileDropdownTimePicker && !isMobilePopupInput)) {
477
+ return;
478
+ }
479
+ var pastedValue = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.getData('text');
480
+ var nextDisplayValue = parsePastedTimeValue(pastedValue, format);
481
+ event.preventDefault();
482
+ if (isTimeDisplayEmpty(nextDisplayValue)) {
483
+ (_b = getActiveInput()) === null || _b === void 0 ? void 0 : _b.blink();
484
+ return;
485
+ }
486
+ updateEditingValue(nextDisplayValue);
487
+ selectSegment('hours');
488
+ };
489
+ var handlePaste = function (event) { return handlePasteBySource(event, false); };
490
+ var handleMobilePaste = function (event) { return handlePasteBySource(event, true); };
491
+ var handleNativeValueChange = useCallback(function (nextValue) {
492
+ setEditingValue(nextValue);
493
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(nextValue);
494
+ }, [onValueChange, setEditingValue]);
495
+ return (React.createElement(CommonWrapper, __assign({}, props),
496
+ React.createElement("span", { ref: rootRef, className: styles.root(), "data-tid": TimePickerDataTids.root },
497
+ React.createElement(TimeInput, __assign({}, inputProps, { "data-tid": TimePickerDataTids.input, ref: inputRef, disabled: disabled, hasDropdown: hasDropdown, size: size, format: format, rightIcon: rightIcon, suffix: suffix, value: displayValue, "aria-haspopup": hasDropdown ? 'listbox' : undefined, "aria-expanded": hasDropdown && isDropdownOpened ? true : undefined, "aria-controls": hasDropdown && isDropdownOpened ? popupId : undefined, "aria-activedescendant": activeDescendantId, "aria-placeholder": ariaPlaceholder, onClick: handleClick, onBlur: handleBlur, onFocus: handleFocus, onMouseDownCapture: handleMouseDownCapture, onMouseUp: handleMouseUp, onKeyDown: handleKeyDown, onSelectSegment: handleSelectSegmentByMouse, onPaste: handlePaste })),
498
+ canUseMobileNativeTimePicker && (React.createElement(NativeTimeInput, { "data-tid": TimePickerDataTids.nativeInput, disabled: disabled, ref: nativeInputRef, format: format, minTime: minTime, maxTime: maxTime, value: editingValue, onValueChange: handleNativeValueChange })),
499
+ canUseMobileDropdownTimePicker && isDropdownOpened && (React.createElement(TimePickerMobilePopup, { id: popupId, opened: isDropdownOpened, value: displayValue, inputRef: mobileInputRef, disabled: disabled, format: format, size: size, rightIcon: rightIcon, suffix: suffix, resolvedSlots: resolvedSlots, highlightedSlotIndex: highlightedSlotIndex, normalizedValue: normalizedValue, slotRefs: slotRefs, error: props.error, warning: props.warning, "aria-describedby": props['aria-describedby'], "aria-label": props['aria-label'], "aria-placeholder": ariaPlaceholder, onFocus: handleMobileFocus, onBlur: handleMobileBlur, onClick: handleMobileClick, onKeyDown: handleMobileKeyDown, onMouseDownCapture: handleMobileMouseDownCapture, onMouseUp: handleMobileMouseUp, onPaste: handleMobilePaste, onSelectSegment: handleMobileSelectSegmentByMouse, onSelectSlot: selectSlot, onCloseRequest: handleCloseMobileDropdown })),
500
+ hasDropdown &&
501
+ !canUseMobileNativeTimePicker &&
502
+ !canUseMobileDropdownTimePicker &&
503
+ isDropdownOpened &&
504
+ rootRef.current && (React.createElement(TimePickerPopup, { id: popupId, anchorElement: rootRef.current, menuPos: menuPos, menuAlign: menuAlign, menuWidth: menuWidth, popupMaxHeight: popupMaxHeight, format: format, size: size, resolvedSlots: resolvedSlots, highlightedSlotIndex: highlightedSlotIndex, normalizedValue: normalizedValue, slotRefs: slotRefs, onSelectSlot: selectSlot })))));
505
+ });
506
+ //# sourceMappingURL=TimePicker.js.map