@skbkontur/react-ui 6.1.7-65057.0 → 6.1.7-8e9d5.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 (64) hide show
  1. package/components/TimePicker/TimePicker.d.ts +36 -29
  2. package/components/TimePicker/TimePicker.js +234 -132
  3. package/components/TimePicker/TimePicker.js.map +1 -1
  4. package/components/TimePicker/TimePicker.styles.d.ts +2 -2
  5. package/components/TimePicker/TimePicker.styles.js +4 -4
  6. package/components/TimePicker/TimePicker.styles.js.map +1 -1
  7. package/components/TimePicker/TimePickerItems.d.ts +5 -1
  8. package/components/TimePicker/TimePickerItems.js +16 -13
  9. package/components/TimePicker/TimePickerItems.js.map +1 -1
  10. package/components/TimePicker/TimePickerMobilePopup.d.ts +5 -2
  11. package/components/TimePicker/TimePickerMobilePopup.js +3 -3
  12. package/components/TimePicker/TimePickerMobilePopup.js.map +1 -1
  13. package/components/TimePicker/TimePickerPopup.d.ts +5 -1
  14. package/components/TimePicker/TimePickerPopup.js +2 -2
  15. package/components/TimePicker/TimePickerPopup.js.map +1 -1
  16. package/components/TimePicker/helpers/TimePicker.constants.d.ts +3 -1
  17. package/components/TimePicker/helpers/TimePicker.constants.js +3 -7
  18. package/components/TimePicker/helpers/TimePicker.constants.js.map +1 -1
  19. package/components/TimePicker/helpers/TimePicker.editing.d.ts +1 -5
  20. package/components/TimePicker/helpers/TimePicker.editing.js +8 -35
  21. package/components/TimePicker/helpers/TimePicker.editing.js.map +1 -1
  22. package/components/TimePicker/helpers/TimePicker.shared.d.ts +15 -24
  23. package/components/TimePicker/helpers/TimePicker.shared.js +13 -27
  24. package/components/TimePicker/helpers/TimePicker.shared.js.map +1 -1
  25. package/components/TimePicker/helpers/TimePicker.value.d.ts +3 -13
  26. package/components/TimePicker/helpers/TimePicker.value.js +13 -43
  27. package/components/TimePicker/helpers/TimePicker.value.js.map +1 -1
  28. package/components/TimePicker/helpers/scrollSelectedItemIntoView.d.ts +2 -0
  29. package/components/TimePicker/helpers/scrollSelectedItemIntoView.js +2 -0
  30. package/components/TimePicker/helpers/scrollSelectedItemIntoView.js.map +1 -1
  31. package/components/TimePicker/helpers/validateTimePicker.js +2 -4
  32. package/components/TimePicker/helpers/validateTimePicker.js.map +1 -1
  33. package/components/TimePicker/hooks/useTimePickerDropdown.js +9 -25
  34. package/components/TimePicker/hooks/useTimePickerDropdown.js.map +1 -1
  35. package/components/TimePicker/hooks/useTimePickerSource.d.ts +3 -1
  36. package/components/TimePicker/hooks/useTimePickerSource.js +14 -6
  37. package/components/TimePicker/hooks/useTimePickerSource.js.map +1 -1
  38. package/components/TimePicker/hooks/useTimePickerValue.d.ts +9 -4
  39. package/components/TimePicker/hooks/useTimePickerValue.js +22 -23
  40. package/components/TimePicker/hooks/useTimePickerValue.js.map +1 -1
  41. package/components/TimePicker/index.d.ts +1 -1
  42. package/components/TimePicker/index.js.map +1 -1
  43. package/components/TimePicker/locale/locales/en.js +2 -0
  44. package/components/TimePicker/locale/locales/en.js.map +1 -1
  45. package/components/TimePicker/locale/locales/ru.js +2 -0
  46. package/components/TimePicker/locale/locales/ru.js.map +1 -1
  47. package/components/TimePicker/locale/types.d.ts +2 -0
  48. package/components/TimePicker/locale/types.js.map +1 -1
  49. package/internal/NativeTimeInput/NativeTimeInput.d.ts +4 -0
  50. package/internal/NativeTimeInput/NativeTimeInput.js +7 -2
  51. package/internal/NativeTimeInput/NativeTimeInput.js.map +1 -1
  52. package/internal/NativeTimeInput/NativeTimeInput.utils.d.ts +2 -0
  53. package/internal/NativeTimeInput/NativeTimeInput.utils.js +4 -8
  54. package/internal/NativeTimeInput/NativeTimeInput.utils.js.map +1 -1
  55. package/internal/TimeInput/TimeFragments.d.ts +0 -1
  56. package/internal/TimeInput/TimeFragments.js +30 -8
  57. package/internal/TimeInput/TimeFragments.js.map +1 -1
  58. package/internal/TimeInput/TimeFragments.styles.d.ts +15 -0
  59. package/internal/TimeInput/TimeFragments.styles.js +39 -9
  60. package/internal/TimeInput/TimeFragments.styles.js.map +1 -1
  61. package/internal/TimeInput/TimeInput.d.ts +0 -1
  62. package/internal/TimeInput/TimeInput.js +0 -1
  63. package/internal/TimeInput/TimeInput.js.map +1 -1
  64. package/package.json +1 -1
@@ -22,23 +22,25 @@ var __rest = (this && this.__rest) || function (s, e) {
22
22
  };
23
23
  import React, { useCallback, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState, } from 'react';
24
24
  import { CommonWrapper } from '../../internal/CommonWrapper/index.js';
25
+ import { extractCommonProps } from '../../internal/CommonWrapper/utils/extractCommonProps.js';
25
26
  import { LoadingIcon } from '../../internal/icons2022/LoadingIcon.js';
26
27
  import { NativeTimeInput } from '../../internal/NativeTimeInput/index.js';
27
28
  import { TimeInput } from '../../internal/TimeInput/index.js';
28
- import { isIOS, isMobile } from '../../lib/client.js';
29
+ import { isIOS } from '../../lib/client.js';
29
30
  import { isKeyArrowDown, isKeyArrowLeft, isKeyArrowRight, isKeyArrowUp, isKeyBackspace, isKeyChar, isKeyDelete, isKeyEnter, isKeyEscape, isKeySpace, isKeyTab, isModShift, isShortcutSelectAll, } from '../../lib/events/keyboard/identifiers.js';
30
31
  import { forwardRefAndName } from '../../lib/forwardRefAndName.js';
31
32
  import { useLocaleForControl } from '../../lib/locale/useLocaleForControl.js';
32
33
  import { useStyles } from '../../lib/renderEnvironment/index.js';
33
34
  import { ThemeContext } from '../../lib/theming/ThemeContext.js';
34
35
  import { getRandomID } from '../../lib/utils.js';
36
+ import { useResponsiveLayout } from '../ResponsiveLayout/index.js';
35
37
  import { scrollSelectedItemIntoView } from './helpers/scrollSelectedItemIntoView.js';
36
38
  import { DIGIT_REGEXP, EMPTY_SEGMENT, EMPTY_VALUE, TimePickerDataTids } from './helpers/TimePicker.constants.js';
37
39
  import { commitTimeSegmentOnLeave, deleteTimeSegmentDigit, formatDigitToTimeSegment, shiftTimeSegmentValue, } from './helpers/TimePicker.editing.js';
38
40
  import { getTimePickerPopupMaxHeight } from './helpers/TimePicker.layout.js';
39
41
  import { getNextTimeSegment, getPreviousTimeSegment } from './helpers/TimePicker.selection.js';
40
42
  import { isNavigableMenuElement, isTimeItem, isTimeItemObject, isTimeMenuItem, timeValueToItem, } from './helpers/TimePicker.shared.js';
41
- import { dedupeTimeItems, filterTimeItems, getEmptyDisplayValue, getTimeFilterQuery, getTimeValueString, isTimeDisplayEmpty, normalizeTimeValue, parsePastedTimeValue, replaceTimeSegment, resolveTimeItems, } from './helpers/TimePicker.value.js';
43
+ import { filterTimeItems, getEmptyDisplayValue, getTimeFilterQuery, getTimeValueString, isTimeDisplayEmpty, normalizeTimeValue, parsePastedTimeValue, replaceTimeSegment, resolveTimeItems, } from './helpers/TimePicker.value.js';
42
44
  import { validateTimePicker } from './helpers/validateTimePicker.js';
43
45
  import { useTimePickerDropdown } from './hooks/useTimePickerDropdown.js';
44
46
  import { useTimePickerSelection } from './hooks/useTimePickerSelection.js';
@@ -56,28 +58,43 @@ var EMPTY_MENU_ITEMS = [];
56
58
  */
57
59
  export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (props, ref) {
58
60
  var _a;
59
- var disabled = props.disabled, _b = props.useMobileNativeTimePicker, useMobileNativeTimePicker = _b === void 0 ? false : _b, _c = props.format, format = _c === void 0 ? 'HH:mm' : _c, _d = props.size, size = _d === void 0 ? 'small' : _d, source = props.source, renderItem = props.renderItem, menuPos = props.menuPos, menuAlign = props.menuAlign, menuWidth = props.menuWidth, minTime = props.minTime, maxTime = props.maxTime, rightIcon = props.rightIcon, suffix = props.suffix, corners = props.corners, value = props.value, valueToItem = props.valueToItem, onValueChange = props.onValueChange, onInputValueChange = props.onInputValueChange, onUnexpectedInput = props.onUnexpectedInput, onFocus = props.onFocus, onBlur = props.onBlur, onClick = props.onClick, onKeyDown = props.onKeyDown, onPaste = props.onPaste, inputProps = __rest(props, ["disabled", "useMobileNativeTimePicker", "format", "size", "source", "renderItem", "menuPos", "menuAlign", "menuWidth", "minTime", "maxTime", "rightIcon", "suffix", "corners", "value", "valueToItem", "onValueChange", "onInputValueChange", "onUnexpectedInput", "onFocus", "onBlur", "onClick", "onKeyDown", "onPaste"]);
61
+ // `className`, `style` и data-атрибуты применяет `CommonWrapper` к корневому элементу,
62
+ // поэтому в поле ввода они не должны уехать повторно.
63
+ var _b = extractCommonProps(props), notCommonProps = _b[1];
64
+ var disabled = notCommonProps.disabled, _c = notCommonProps.useMobileNativeTimePicker, useMobileNativeTimePicker = _c === void 0 ? false : _c, _d = notCommonProps.format, format = _d === void 0 ? 'HH:mm' : _d, _e = notCommonProps.size, size = _e === void 0 ? 'small' : _e, source = notCommonProps.source, renderItem = notCommonProps.renderItem, menuPos = notCommonProps.menuPos, menuAlign = notCommonProps.menuAlign, menuWidth = notCommonProps.menuWidth, minTime = notCommonProps.minTime, maxTime = notCommonProps.maxTime, rightIcon = notCommonProps.rightIcon, suffix = notCommonProps.suffix, corners = notCommonProps.corners, value = notCommonProps.value, valueToItem = notCommonProps.valueToItem, onValueChange = notCommonProps.onValueChange, onInputValueChange = notCommonProps.onInputValueChange, onUnexpectedInput = notCommonProps.onUnexpectedInput, onFocus = notCommonProps.onFocus, onBlur = notCommonProps.onBlur, onClick = notCommonProps.onClick, onKeyDown = notCommonProps.onKeyDown, onPaste = notCommonProps.onPaste, inputProps = __rest(notCommonProps, ["disabled", "useMobileNativeTimePicker", "format", "size", "source", "renderItem", "menuPos", "menuAlign", "menuWidth", "minTime", "maxTime", "rightIcon", "suffix", "corners", "value", "valueToItem", "onValueChange", "onInputValueChange", "onUnexpectedInput", "onFocus", "onBlur", "onClick", "onKeyDown", "onPaste"]);
60
65
  var theme = useContext(ThemeContext);
61
66
  var styles = useStyles(getStyles);
62
67
  var locale = useLocaleForControl('TimePicker', TimePickerLocaleHelper);
63
- var _e = useState(false), isInputFocused = _e[0], setIsInputFocused = _e[1];
68
+ var _f = useState(false), isInputFocused = _f[0], setIsInputFocused = _f[1];
64
69
  var inputRef = useRef(null);
65
70
  var mobileInputRef = useRef(null);
66
71
  var nativeInputRef = useRef(null);
67
72
  var rootRef = useRef(null);
68
73
  var itemRefs = useRef(new Map());
69
74
  var isMouseFocusRef = useRef(false);
70
- var isMouseDownOnFragmentRef = useRef(false);
75
+ /** Сегмент, по которому нажали мышью, или `null`, если нажали мимо сегментов. */
71
76
  var mouseDownSegmentRef = useRef(null);
72
77
  var mobileBlurEventRef = useRef(null);
73
78
  var shouldSkipOpenOnFocusRef = useRef(false);
79
+ /**
80
+ * Контрол считает себя сфокусированным: о фокусе сообщено наружу, а сессия ввода не закончена.
81
+ * Внутри одной сессии фокус может переезжать между полем и инпутом мобильного попапа —
82
+ * например вместе со сменой верстки, — и такой переезд не начинает сессию заново.
83
+ */
84
+ var isControlFocusedRef = useRef(false);
85
+ /** Фокус, который контрол сам переводит в скрытый нативный инпут, открывая системный пикер. */
86
+ var isMovingFocusToNativePickerRef = useRef(false);
74
87
  var popupIdRef = useRef(TimePickerDataTids.popup + getRandomID());
75
- var _f = useState(false), isMobileDevice = _f[0], setIsMobileDevice = _f[1];
76
- var _g = useState(false), canUseMobileNativeTimePicker = _g[0], setCanUseMobileNativeTimePicker = _g[1];
88
+ /**
89
+ * Мобильная версия включается медиавыражением темы, как в ComboBox:
90
+ * поле переключается между мобильной и десктопной версией вместе с версткой страницы.
91
+ */
92
+ var isMobileLayout = useResponsiveLayout().isMobile;
93
+ var canUseMobileNativeTimePicker = useMobileNativeTimePicker && isMobileLayout;
77
94
  var isSourceFunction = typeof source === 'function';
78
95
  var hasDropdown = isSourceFunction || (Array.isArray(source) && source.length > 0);
79
- var _h = useState(false), isDropdownOpened = _h[0], setIsDropdownOpened = _h[1];
80
- var _j = useState(false), isEditedAfterOpen = _j[0], setIsEditedAfterOpen = _j[1];
96
+ var _g = useState(false), isDropdownOpened = _g[0], setIsDropdownOpened = _g[1];
97
+ var _h = useState(false), isEditedAfterOpen = _h[0], setIsEditedAfterOpen = _h[1];
81
98
  /**
82
99
  * Форма элементов функции-источника: последняя, о которой компонент знает.
83
100
  * Форма запоминается, потому что элементы функции очищаются при закрытии меню,
@@ -94,18 +111,53 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
94
111
  var shouldBuildItemAsObjectRef = useRef(false);
95
112
  var valueToItemRef = useRef(valueToItem);
96
113
  valueToItemRef.current = valueToItem;
97
- var handleCommitValue = useCallback(function (committedValue, item) {
114
+ var handleCommitValue = useCallback(function (nextValue, item) {
98
115
  var _a, _b;
99
116
  if (!onValueChange) {
100
117
  return;
101
118
  }
102
- if (committedValue === EMPTY_VALUE) {
103
- onValueChange(null, EMPTY_VALUE);
119
+ if (nextValue === EMPTY_VALUE) {
120
+ // Пустое значение повторяет форму элементов: у объектов элемента нет, а строка остается строкой.
121
+ onValueChange(shouldBuildItemAsObjectRef.current ? null : EMPTY_VALUE);
104
122
  return;
105
123
  }
106
- var nextItem = (_b = item !== null && item !== void 0 ? item : (_a = valueToItemRef.current) === null || _a === void 0 ? void 0 : _a.call(valueToItemRef, committedValue)) !== null && _b !== void 0 ? _b : timeValueToItem(committedValue, shouldBuildItemAsObjectRef.current);
107
- onValueChange(nextItem, committedValue);
124
+ var nextItem = (_b = item !== null && item !== void 0 ? item : (_a = valueToItemRef.current) === null || _a === void 0 ? void 0 : _a.call(valueToItemRef, nextValue)) !== null && _b !== void 0 ? _b : timeValueToItem(nextValue, shouldBuildItemAsObjectRef.current);
125
+ onValueChange(nextItem);
108
126
  }, [onValueChange]);
127
+ var onBlurRef = useRef(onBlur);
128
+ onBlurRef.current = onBlur;
129
+ var pendingBlurEventRef = useRef(null);
130
+ var _j = useState(0), blurRequestId = _j[0], setBlurRequestId = _j[1];
131
+ /**
132
+ * Завершает сессию фокуса и откладывает `onBlur` до конца рендера, как это делает ComboBox.
133
+ * Значение коммитится синхронно с потерей фокуса, поэтому вызванный тут же `onBlur`
134
+ * попал бы в обработчик с состоянием родителя до изменения значения — например с пустым временем.
135
+ * Событие может отсутствовать: сессия все равно закрывается, но наружу ничего не уходит.
136
+ */
137
+ var emitBlur = useCallback(function (event) {
138
+ if (!isControlFocusedRef.current) {
139
+ return;
140
+ }
141
+ isControlFocusedRef.current = false;
142
+ if (!event || !onBlurRef.current) {
143
+ return;
144
+ }
145
+ event.persist();
146
+ pendingBlurEventRef.current = event;
147
+ setBlurRequestId(function (currentId) { return currentId + 1; });
148
+ }, []);
149
+ var flushPendingBlur = useCallback(function () {
150
+ var _a;
151
+ var pendingBlurEvent = pendingBlurEventRef.current;
152
+ if (!pendingBlurEvent) {
153
+ return;
154
+ }
155
+ pendingBlurEventRef.current = null;
156
+ (_a = onBlurRef.current) === null || _a === void 0 ? void 0 : _a.call(onBlurRef, pendingBlurEvent);
157
+ }, []);
158
+ useEffect(flushPendingBlur, [blurRequestId, flushPendingBlur]);
159
+ /** Родитель мог убрать поле в ответ на коммит значения — отложенное событие все равно должно уйти. */
160
+ useEffect(function () { return flushPendingBlur; }, [flushPendingBlur]);
109
161
  var _k = useTimePickerValue({
110
162
  isInputFocused: isInputFocused,
111
163
  format: format,
@@ -113,9 +165,9 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
113
165
  isValueControlled: value !== undefined,
114
166
  onCommitValue: handleCommitValue,
115
167
  onInputValueChange: onInputValueChange,
116
- }), editingValue = _k.editingValue, editingValueRef = _k.editingValueRef, updateEditingValue = _k.updateEditingValue, commitEditingValue = _k.commitEditingValue, commitValue = _k.commitValue, commitItem = _k.commitItem;
168
+ }), editingValue = _k.editingValue, editingValueRef = _k.editingValueRef, committedValue = _k.committedValue, updateEditingValue = _k.updateEditingValue, commitEditingValue = _k.commitEditingValue, commitValue = _k.commitValue, commitItem = _k.commitItem;
117
169
  var filterQuery = isEditedAfterOpen ? getTimeFilterQuery(editingValue, format) : EMPTY_VALUE;
118
- var _l = useTimePickerSource({ source: source, format: format, isDropdownOpened: isDropdownOpened, filterQuery: filterQuery }), sourceValueItems = _l.items, fetchedItemsQuery = _l.fetchedQuery, isLoadingItems = _l.isLoading;
170
+ var _l = useTimePickerSource({ source: source, format: format, isDropdownOpened: isDropdownOpened, filterQuery: filterQuery }), sourceValueItems = _l.items, fetchedItemsQuery = _l.fetchedQuery, isLoadingItems = _l.isLoading, isSourceFailed = _l.isFailed, retrySource = _l.retry;
119
171
  useEffect(function () {
120
172
  if (!isSourceFunction || sourceValueItems.some(isTimeItem)) {
121
173
  lastSourceItemShapeRef.current = sourceValueItems.some(function (item) { return isTimeItem(item) && isTimeItemObject(item); });
@@ -123,17 +175,17 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
123
175
  shouldBuildItemAsObjectRef.current =
124
176
  lastSourceItemShapeRef.current === true || (value !== null && value !== undefined && isTimeItemObject(value));
125
177
  }, [isSourceFunction, sourceValueItems, value]);
126
- var filteredItems = useMemo(function () { return filterTimeItems(dedupeTimeItems(sourceValueItems, format), filterQuery, format); }, [filterQuery, format, sourceValueItems]);
127
- /**
128
- * Элементы для отрисовки: время и подпись достаются из элемента,
129
- * а `disabled` дополняется проверкой диапазона `minTime`/`maxTime`.
130
- * Исходный элемент сохраняется как есть — именно он уходит в `onValueChange`.
131
- */
132
- var resolvedItems = useMemo(function () { return resolveTimeItems(filteredItems, format, minTime, maxTime); }, [maxTime, minTime, format, filteredItems]);
178
+ var resolvedItems = useMemo(function () { return resolveTimeItems(filterTimeItems(sourceValueItems, filterQuery, format), format, minTime, maxTime); }, [filterQuery, format, maxTime, minTime, sourceValueItems]);
133
179
  var popupMaxHeight = getTimePickerPopupMaxHeight(size, theme);
134
180
  var ariaPlaceholder = format === 'HH:mm' ? locale.ariaPlaceholderHHMM : locale.ariaPlaceholderHHMMSS;
135
- var normalizedValue = normalizeTimeValue(editingValue, format);
136
- var selectedItemIndex = resolvedItems.findIndex(function (item) { return isTimeMenuItem(item) && normalizeTimeValue(item.value, format) === normalizedValue; });
181
+ /**
182
+ * Время, отмеченное в меню выбранным.
183
+ * Пока пользователь не начал править значение при открытом меню, это то же время, что в поле.
184
+ * С началом правки отмечено остается закоммиченное значение: набор фильтра — например `10` —
185
+ * не должен отмечать элемент `10:00` как уже выбранный.
186
+ */
187
+ var selectedValue = normalizeTimeValue(isEditedAfterOpen ? committedValue : editingValue, format);
188
+ var selectedItemIndex = resolvedItems.findIndex(function (item) { return isTimeMenuItem(item) && normalizeTimeValue(item.value, format) === selectedValue; });
137
189
  var autoHighlightKey = null;
138
190
  if (filterQuery !== EMPTY_VALUE) {
139
191
  if (isSourceFunction) {
@@ -145,12 +197,16 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
145
197
  autoHighlightKey = "source-array:".concat(filterQuery);
146
198
  }
147
199
  }
148
- var canUseMobileDropdownTimePicker = hasDropdown && isMobileDevice && !canUseMobileNativeTimePicker;
200
+ var canUseMobileDropdownTimePicker = hasDropdown && isMobileLayout && !canUseMobileNativeTimePicker;
201
+ /** Ввод идет в мобильном попапе: он открыт, а нативного пикера в этом режиме нет. */
202
+ var isMobileDropdownActive = canUseMobileDropdownTimePicker && isDropdownOpened;
149
203
  /**
150
204
  * Меню с одними лишь заголовками и разделителями показывать не о чем,
151
205
  * поэтому при активном фильтре нужен хотя бы один подошедший элемент со временем.
152
206
  */
153
- var hasDropdownContent = isLoadingItems || (filterQuery === EMPTY_VALUE ? resolvedItems.length > 0 : resolvedItems.some(isTimeMenuItem));
207
+ var hasDropdownContent = isLoadingItems ||
208
+ isSourceFailed ||
209
+ (filterQuery === EMPTY_VALUE ? resolvedItems.length > 0 : resolvedItems.some(isTimeMenuItem));
154
210
  /**
155
211
  * Элементы, с которыми работает клавиатура.
156
212
  * Пока меню скрыто, их нет: иначе стрелки ходили бы по невидимому списку,
@@ -159,16 +215,16 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
159
215
  var menuItems = hasDropdownContent ? resolvedItems : EMPTY_MENU_ITEMS;
160
216
  var inputRightIcon = isLoadingItems && resolvedItems.length > 0 ? (React.createElement("span", { "data-tid": TimePickerDataTids.inputLoading },
161
217
  React.createElement(LoadingIcon, { size: size }))) : (rightIcon);
162
- var displayValue = editingValue;
163
- if (isInputFocused) {
164
- displayValue = editingValue === EMPTY_VALUE ? getEmptyDisplayValue(format) : editingValue;
165
- }
166
- else if (isTimeDisplayEmpty(editingValue)) {
167
- displayValue = EMPTY_VALUE;
168
- }
218
+ /** Сфокусированное поле всегда показывает сегменты, а пустое без фокуса — ничего. */
219
+ var getDisplayValue = function () {
220
+ if (isInputFocused) {
221
+ return editingValue || getEmptyDisplayValue(format);
222
+ }
223
+ return isTimeDisplayEmpty(editingValue) ? EMPTY_VALUE : editingValue;
224
+ };
225
+ var displayValue = getDisplayValue();
169
226
  var resetMouseInteractionState = useCallback(function () {
170
227
  isMouseFocusRef.current = false;
171
- isMouseDownOnFragmentRef.current = false;
172
228
  mouseDownSegmentRef.current = null;
173
229
  }, []);
174
230
  var updateEditingValueAfterUserEdit = useCallback(function (nextEditingValue) {
@@ -186,13 +242,21 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
186
242
  if (!canUseMobileNativeTimePicker || disabled) {
187
243
  return;
188
244
  }
245
+ // На iOS системный пикер открывается только фокусом, поэтому фокус уходит из поля в скрытый инпут.
246
+ isMovingFocusToNativePickerRef.current = true;
189
247
  if (isIOS) {
190
248
  (_a = nativeInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
191
249
  }
192
250
  else {
193
251
  (_b = nativeInputRef.current) === null || _b === void 0 ? void 0 : _b.click();
194
252
  }
253
+ isMovingFocusToNativePickerRef.current = false;
195
254
  }, [canUseMobileNativeTimePicker, disabled]);
255
+ /** Фокус ушел в скрытый нативный инпут: для внешнего мира контрол остается активным. */
256
+ var isFocusMovedToNativePicker = function (event) {
257
+ return isMovingFocusToNativePickerRef.current ||
258
+ (nativeInputRef.current !== null && event.relatedTarget === nativeInputRef.current.getNode());
259
+ };
196
260
  var _m = useTimePickerDropdown({
197
261
  disabled: disabled,
198
262
  hasDropdown: hasDropdown,
@@ -215,65 +279,59 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
215
279
  var popupId = popupIdRef.current;
216
280
  var highlightedMenuItem = highlightedItemIndex === null ? undefined : menuItems[highlightedItemIndex];
217
281
  /** Кастомный `MenuItem` может принести свой `id` — тогда указывать нужно именно на него. */
218
- var activeDescendantId = hasDropdown && highlightedItemIndex !== null && highlightedMenuItem
282
+ var activeDescendantId = highlightedMenuItem
219
283
  ? ((_a = (isNavigableMenuElement(highlightedMenuItem) ? highlightedMenuItem.props.id : undefined)) !== null && _a !== void 0 ? _a : "".concat(popupId, "-item-").concat(highlightedItemIndex))
220
284
  : undefined;
221
- var isMobileDropdownActive = canUseMobileDropdownTimePicker && isDropdownOpened;
222
- var getActiveInput = useCallback(function () { return (canUseMobileDropdownTimePicker && isDropdownOpened ? mobileInputRef.current : inputRef.current); }, [canUseMobileDropdownTimePicker, isDropdownOpened]);
285
+ var getActiveInput = useCallback(function () { return (isMobileDropdownActive ? mobileInputRef.current : inputRef.current); }, [isMobileDropdownActive]);
223
286
  var _o = useTimePickerSelection({
224
287
  isInputFocused: isInputFocused,
225
288
  format: format,
226
289
  displayValue: displayValue,
227
290
  getInput: getActiveInput,
228
291
  }), selection = _o.selection, selectedSegment = _o.selectedSegment, selectSegment = _o.selectSegment, selectAll = _o.selectAll, syncSelectionWithDOM = _o.syncSelectionWithDOM;
229
- var blinkInputValue = useCallback(function () {
292
+ var blinkInput = useCallback(function () {
230
293
  var _a;
231
294
  (_a = getActiveInput()) === null || _a === void 0 ? void 0 : _a.blink();
232
295
  }, [getActiveInput]);
233
- /**
234
- * Сообщает о некорректном вводе: нажатой клавише или вставленном значении, которое не может быть временем.
235
- * Если обработчик не задан, поле вспыхивает само.
236
- */
237
296
  var handleUnexpectedInput = useCallback(function (unexpectedValue) {
238
- if (onUnexpectedInput) {
239
- onUnexpectedInput(unexpectedValue, blinkInputValue);
297
+ if (!onUnexpectedInput) {
298
+ blinkInput();
240
299
  return;
241
300
  }
242
- blinkInputValue();
243
- }, [blinkInputValue, onUnexpectedInput]);
301
+ var returnedValue = onUnexpectedInput(unexpectedValue, blinkInput);
302
+ if (returnedValue === undefined) {
303
+ return;
304
+ }
305
+ if (returnedValue === null) {
306
+ commitValue(EMPTY_VALUE);
307
+ return;
308
+ }
309
+ commitItem(returnedValue);
310
+ }, [blinkInput, commitItem, commitValue, onUnexpectedInput]);
311
+ /** Закрывает открытое меню: мобильный попап заодно завершает сессию ввода, как потеря фокуса. */
244
312
  var closeOpenedDropdown = useCallback(function () {
245
- var _a;
246
- if (canUseMobileDropdownTimePicker && isDropdownOpened) {
313
+ var _a, _b;
314
+ if (isMobileDropdownActive) {
315
+ // Фокус может остаться в любом из двух полей: инпут попапа не всегда получает его —
316
+ // например мобильный браузер отказывается переводить фокус без жеста пользователя.
317
+ // Гасим оба, чтобы закрытие попапа всегда давало событие потери фокуса.
247
318
  (_a = mobileInputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
319
+ (_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.blur();
248
320
  setIsInputFocused(false);
249
321
  resetMouseInteractionState();
250
322
  closeDropdown();
251
323
  commitEditingValue();
252
324
  var blurEvent = mobileBlurEventRef.current;
253
325
  mobileBlurEventRef.current = null;
254
- if (blurEvent) {
255
- onBlur === null || onBlur === void 0 ? void 0 : onBlur(blurEvent);
256
- }
326
+ emitBlur(blurEvent);
257
327
  return;
258
328
  }
259
329
  closeDropdown();
260
- }, [
261
- canUseMobileDropdownTimePicker,
262
- closeDropdown,
263
- commitEditingValue,
264
- isDropdownOpened,
265
- onBlur,
266
- resetMouseInteractionState,
267
- ]);
330
+ }, [closeDropdown, commitEditingValue, emitBlur, isMobileDropdownActive, resetMouseInteractionState]);
268
331
  var selectItem = useCallback(function (item) {
269
332
  commitItem(item);
270
- if (canUseMobileDropdownTimePicker) {
271
- closeOpenedDropdown();
272
- }
273
- else {
274
- closeDropdown();
275
- }
276
- }, [canUseMobileDropdownTimePicker, closeDropdown, closeOpenedDropdown, commitItem]);
333
+ closeOpenedDropdown();
334
+ }, [closeOpenedDropdown, commitItem]);
277
335
  var isSelectHighlightedItem = useCallback(function (event) {
278
336
  var _a, _b;
279
337
  if (highlightedItemIndex === null) {
@@ -320,28 +378,23 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
320
378
  openDropdown();
321
379
  }, [canUseMobileNativeTimePicker, disabled, getActiveInput, openDropdown, openNativeTimePicker]);
322
380
  var blurInput = useCallback(function () {
323
- var _a;
324
- if (canUseMobileDropdownTimePicker && isDropdownOpened) {
381
+ var _a, _b;
382
+ if (isMobileDropdownActive) {
325
383
  closeOpenedDropdown();
326
384
  return;
327
385
  }
328
- (_a = getActiveInput()) === null || _a === void 0 ? void 0 : _a.blur();
329
- }, [canUseMobileDropdownTimePicker, closeOpenedDropdown, getActiveInput, isDropdownOpened]);
330
- var closeInputDropdown = useCallback(function () {
331
- closeOpenedDropdown();
332
- }, [closeOpenedDropdown]);
333
- var blinkInput = useCallback(function () {
334
- var _a;
335
- (_a = getActiveInput()) === null || _a === void 0 ? void 0 : _a.blink();
336
- }, [getActiveInput]);
386
+ // В нативном режиме фокус держит скрытый инпут системного пикера.
387
+ (_a = nativeInputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
388
+ (_b = getActiveInput()) === null || _b === void 0 ? void 0 : _b.blur();
389
+ }, [closeOpenedDropdown, getActiveInput, isMobileDropdownActive]);
337
390
  useImperativeHandle(ref, function () { return ({
338
391
  focus: focusInput,
339
392
  blur: blurInput,
340
393
  blink: blinkInput,
341
394
  open: openInputDropdown,
342
- close: closeInputDropdown,
395
+ close: closeOpenedDropdown,
343
396
  getRootNode: function () { return rootRef.current; },
344
- }); }, [blinkInput, blurInput, closeInputDropdown, focusInput, openInputDropdown]);
397
+ }); }, [blinkInput, blurInput, closeOpenedDropdown, focusInput, openInputDropdown]);
345
398
  useLayoutEffect(function () {
346
399
  if (!isDropdownOpened) {
347
400
  return;
@@ -363,7 +416,7 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
363
416
  if (!disabled) {
364
417
  return;
365
418
  }
366
- if (canUseMobileDropdownTimePicker && isDropdownOpened) {
419
+ if (isMobileDropdownActive) {
367
420
  closeOpenedDropdown();
368
421
  return;
369
422
  }
@@ -376,94 +429,149 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
376
429
  commitEditingValue();
377
430
  }
378
431
  }, [
379
- canUseMobileDropdownTimePicker,
380
432
  closeDropdown,
381
433
  closeOpenedDropdown,
382
434
  commitEditingValue,
383
435
  disabled,
384
436
  isDropdownOpened,
385
437
  isInputFocused,
438
+ isMobileDropdownActive,
386
439
  resetMouseInteractionState,
387
440
  ]);
441
+ var previousIsMobileLayoutRef = useRef(isMobileLayout);
442
+ /**
443
+ * Смена верстки переносит открытое меню в нужную версию: как в ComboBox, меню не закрывается.
444
+ * Начатый ввод переезжает вместе с ним, а если переезжать некуда — коммитится, как при потере фокуса.
445
+ */
388
446
  useEffect(function () {
389
- setIsMobileDevice(Boolean(isMobile));
390
- setCanUseMobileNativeTimePicker(useMobileNativeTimePicker && Boolean(isMobile));
391
- }, [useMobileNativeTimePicker]);
392
- var handleCloseMobileDropdown = useCallback(function () {
393
- closeOpenedDropdown();
394
- }, [closeOpenedDropdown]);
447
+ if (previousIsMobileLayoutRef.current === isMobileLayout) {
448
+ return;
449
+ }
450
+ previousIsMobileLayoutRef.current = isMobileLayout;
451
+ // Запомненный blur остался от прошлой верстки: как потеря фокуса контрола он больше не годится.
452
+ mobileBlurEventRef.current = null;
453
+ if (isMobileLayout) {
454
+ // Ввод продолжится в инпуте попапа, только если попап открывается вместе со сменой верстки.
455
+ if (isInputFocused && !isMobileDropdownActive) {
456
+ setIsInputFocused(false);
457
+ resetMouseInteractionState();
458
+ commitEditingValue();
459
+ }
460
+ // В режиме нативного пикера своего меню нет.
461
+ if (isDropdownOpened && canUseMobileNativeTimePicker) {
462
+ closeDropdown();
463
+ }
464
+ return;
465
+ }
466
+ /**
467
+ * Десктопное меню закрывается по потере фокуса поля, поэтому без фокуса в контроле
468
+ * его нечем было бы закрыть: мобильный попап мог быть открыт и без фокуса в своем инпуте.
469
+ * Если же фокус был, его вернет в поле `useTimePickerSelection`.
470
+ */
471
+ if (isDropdownOpened && !isInputFocused) {
472
+ closeDropdown();
473
+ }
474
+ }, [
475
+ canUseMobileNativeTimePicker,
476
+ closeDropdown,
477
+ commitEditingValue,
478
+ isDropdownOpened,
479
+ isInputFocused,
480
+ isMobileDropdownActive,
481
+ isMobileLayout,
482
+ resetMouseInteractionState,
483
+ ]);
484
+ /** Сообщает о фокусе один раз за сессию: переезд фокуса внутри контрола наружу не виден. */
485
+ var emitFocus = function (event) {
486
+ if (isControlFocusedRef.current) {
487
+ return;
488
+ }
489
+ isControlFocusedRef.current = true;
490
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
491
+ };
395
492
  var handleFocusBySource = function (event, isMobilePopupInput) {
396
493
  var shouldSkipOpenDropdown = shouldSkipOpenOnFocusRef.current;
397
494
  shouldSkipOpenOnFocusRef.current = false;
495
+ var isFocusMovedInsideControl = isControlFocusedRef.current;
398
496
  if (canUseMobileNativeTimePicker) {
497
+ // Фокус сообщается до открытия пикера: иначе увод фокуса в нативный инпут закрыл бы сессию.
498
+ emitFocus(event);
399
499
  if (!shouldSkipOpenDropdown) {
400
500
  openNativeTimePicker();
401
501
  }
402
- onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
403
502
  return;
404
503
  }
405
504
  if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {
406
505
  if (!shouldSkipOpenDropdown) {
407
506
  openDropdown();
408
507
  }
508
+ // Дальше ввод идет в инпуте попапа, но фокус контрол получает здесь.
509
+ emitFocus(event);
409
510
  return;
410
511
  }
411
512
  setIsInputFocused(true);
412
513
  if (!shouldSkipOpenDropdown) {
413
514
  openDropdown();
414
515
  }
415
- if (isMouseDownOnFragmentRef.current && !isInputFocused) {
416
- if (isTimeDisplayEmpty(editingValueRef.current)) {
417
- selectSegment('hours');
418
- }
419
- else if (mouseDownSegmentRef.current) {
420
- selectSegment(mouseDownSegmentRef.current);
421
- }
516
+ if (mouseDownSegmentRef.current && !isInputFocused) {
517
+ // По пустому полю ввод всегда начинается с часов, а по заполненному — с сегмента под курсором.
518
+ selectSegment(isTimeDisplayEmpty(editingValueRef.current) ? 'hours' : mouseDownSegmentRef.current);
422
519
  }
423
520
  else {
424
- selectSegment('hours');
521
+ // Переезд фокуса внутри контрола продолжает начатый ввод, поэтому сегмент сохраняется:
522
+ // иначе следующая цифра ушла бы в часы и затерла бы набранное время.
523
+ selectSegment(isFocusMovedInsideControl ? selectedSegment : 'hours');
425
524
  }
426
- onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
525
+ emitFocus(event);
427
526
  };
428
527
  var handleFocus = function (event) { return handleFocusBySource(event, false); };
429
528
  var handleMobileFocus = function (event) { return handleFocusBySource(event, true); };
430
529
  var handleBlurBySource = function (event, isMobilePopupInput) {
431
- if (canUseMobileNativeTimePicker) {
432
- onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
530
+ /**
531
+ * Пока открыт мобильный попап, фокус ходит между полем и его инпутом: контрол остается активным,
532
+ * поэтому наружу о таком blur сообщать нечего. Событие запоминается на случай,
533
+ * если фокус в инпуте попапа так и не оказался — тогда именно оно уйдет в `onBlur` при закрытии.
534
+ */
535
+ if (isMobileDropdownActive) {
536
+ event.persist();
537
+ mobileBlurEventRef.current = event;
433
538
  return;
434
539
  }
435
- if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {
540
+ if (canUseMobileNativeTimePicker) {
541
+ if (isFocusMovedToNativePicker(event)) {
542
+ return;
543
+ }
544
+ // Ввод в мобильной версии не идет через поле, но незакоммиченное значение могло остаться
545
+ // от десктопной версии, если верстка сменилась посреди ввода.
546
+ if (isInputFocused) {
547
+ setIsInputFocused(false);
548
+ resetMouseInteractionState();
549
+ commitEditingValue();
550
+ }
551
+ emitBlur(event);
436
552
  return;
437
553
  }
554
+ // Инпут закрытого попапа фокуса уже не держит, но его blur может прийти на размонтировании.
438
555
  if (isMobilePopupInput) {
439
- event.persist();
440
- mobileBlurEventRef.current = event;
441
556
  return;
442
557
  }
443
558
  setIsInputFocused(false);
444
559
  resetMouseInteractionState();
445
560
  closeDropdown();
446
561
  commitEditingValue();
447
- onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
562
+ emitBlur(event);
448
563
  };
449
564
  var handleBlur = function (event) { return handleBlurBySource(event, false); };
450
565
  var handleMobileBlur = function (event) { return handleBlurBySource(event, true); };
451
- var handleClickBySource = function (event, isMobilePopupInput) {
566
+ var handleClick = function (event) {
452
567
  if (canUseMobileNativeTimePicker) {
453
568
  openNativeTimePicker();
454
- onClick === null || onClick === void 0 ? void 0 : onClick(event);
455
- return;
456
569
  }
457
- if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {
570
+ else {
458
571
  openDropdown();
459
- onClick === null || onClick === void 0 ? void 0 : onClick(event);
460
- return;
461
572
  }
462
- openDropdown();
463
573
  onClick === null || onClick === void 0 ? void 0 : onClick(event);
464
574
  };
465
- var handleClick = function (event) { return handleClickBySource(event, false); };
466
- var handleMobileClick = function (event) { return handleClickBySource(event, true); };
467
575
  var handleMouseDownCaptureBySource = function (event, isMobilePopupInput) {
468
576
  var _a, _b;
469
577
  if (canUseMobileNativeTimePicker || (canUseMobileDropdownTimePicker && !isMobilePopupInput)) {
@@ -471,12 +579,10 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
471
579
  }
472
580
  var currentInputRef = isMobilePopupInput ? mobileInputRef : inputRef;
473
581
  var segment = (_b = (_a = currentInputRef.current) === null || _a === void 0 ? void 0 : _a.getSegment(event.target)) !== null && _b !== void 0 ? _b : null;
474
- var isFragment = segment !== null;
475
- if (isInputFocused && !isFragment) {
582
+ if (isInputFocused && segment === null) {
476
583
  event.preventDefault();
477
584
  }
478
585
  isMouseFocusRef.current = !isInputFocused;
479
- isMouseDownOnFragmentRef.current = isFragment;
480
586
  mouseDownSegmentRef.current = segment;
481
587
  };
482
588
  var handleMouseDownCapture = function (event) {
@@ -637,29 +743,28 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
637
743
  if (isKeyEscape(event)) {
638
744
  if (isDropdownOpened) {
639
745
  event.preventDefault();
640
- if (canUseMobileDropdownTimePicker) {
641
- closeOpenedDropdown();
642
- }
643
- else {
644
- closeDropdown();
645
- }
746
+ closeOpenedDropdown();
646
747
  }
647
748
  return;
648
749
  }
649
750
  if (isKeyEnter(event)) {
751
+ if (isSourceFailed) {
752
+ event.preventDefault();
753
+ retrySource();
754
+ return;
755
+ }
650
756
  if (isSelectHighlightedItem(event)) {
651
757
  event.preventDefault();
652
758
  return;
653
759
  }
654
- if (canUseMobileDropdownTimePicker && isDropdownOpened) {
760
+ if (isMobileDropdownActive) {
655
761
  event.preventDefault();
656
762
  closeOpenedDropdown();
657
763
  return;
658
764
  }
659
- // Enter не выбирает элемент, а лишь подтверждает введенное значение,
660
- // поэтому коммитим значение как при потере фокуса и подсвечиваем поле.
765
+ // Enter не выбирает элемент, а лишь подтверждает введенное значение, как потеря фокуса.
661
766
  commitEditingValue();
662
- blinkInputValue();
767
+ blinkInput();
663
768
  if (isDropdownOpened) {
664
769
  event.preventDefault();
665
770
  closeDropdown();
@@ -711,19 +816,16 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
711
816
  };
712
817
  var handlePaste = function (event) { return handlePasteBySource(event, false); };
713
818
  var handleMobilePaste = function (event) { return handlePasteBySource(event, true); };
714
- var handleNativeValueChange = useCallback(function (nextValue) {
715
- commitValue(nextValue);
716
- }, [commitValue]);
717
819
  return (React.createElement(CommonWrapper, __assign({}, props),
718
820
  React.createElement("span", { ref: rootRef, className: styles.root(), "data-tid": TimePickerDataTids.root },
719
821
  React.createElement(TimeInput, __assign({}, inputProps, { "data-tid": TimePickerDataTids.input, ref: inputRef, disabled: disabled, hasDropdown: hasDropdown, size: size, format: format, corners: corners, rightIcon: inputRightIcon, suffix: suffix, value: displayValue, "aria-haspopup": hasDropdown ? 'listbox' : undefined, "aria-expanded": !isMobileDropdownActive && hasDropdown && isDropdownOpened && hasDropdownContent ? true : undefined, "aria-controls": !isMobileDropdownActive && hasDropdown && isDropdownOpened && hasDropdownContent ? popupId : undefined, "aria-activedescendant": isMobileDropdownActive ? undefined : activeDescendantId, "aria-placeholder": ariaPlaceholder, "aria-busy": isLoadingItems || undefined, onClick: handleClick, onBlur: handleBlur, onFocus: handleFocus, onMouseDownCapture: handleMouseDownCapture, onMouseUp: handleMouseUp, onKeyDown: handleKeyDown, onSelectSegment: handleSelectSegmentByMouse, onPaste: handlePaste })),
720
- canUseMobileNativeTimePicker && (React.createElement(NativeTimeInput, { "data-tid": TimePickerDataTids.nativeInput, disabled: disabled, ref: nativeInputRef, format: format, minTime: minTime, maxTime: maxTime, value: editingValue, onValueChange: handleNativeValueChange })),
721
- canUseMobileDropdownTimePicker && isDropdownOpened && (React.createElement(TimePickerMobilePopup, { id: popupId, opened: isDropdownOpened, value: displayValue, inputRef: mobileInputRef, disabled: disabled, format: format, size: size, rightIcon: inputRightIcon, suffix: suffix, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoadingItems, highlightedItemIndex: highlightedItemIndex, normalizedValue: normalizedValue, itemRefs: itemRefs, error: props.error, warning: props.warning, "aria-describedby": props['aria-describedby'], "aria-label": props['aria-label'], "aria-placeholder": ariaPlaceholder, "aria-haspopup": 'listbox', "aria-expanded": resolvedItems.length > 0 || isLoadingItems ? true : undefined, "aria-controls": resolvedItems.length > 0 || isLoadingItems ? popupId : undefined, "aria-activedescendant": activeDescendantId, onFocus: handleMobileFocus, onBlur: handleMobileBlur, onClick: handleMobileClick, onKeyDown: handleMobileKeyDown, onMouseDownCapture: handleMobileMouseDownCapture, onMouseUp: handleMobileMouseUp, onPaste: handleMobilePaste, onSelectSegment: handleMobileSelectSegmentByMouse, onSelectItem: selectItem, onCloseRequest: handleCloseMobileDropdown })),
822
+ canUseMobileNativeTimePicker && (React.createElement(NativeTimeInput, { "data-tid": TimePickerDataTids.nativeInput, disabled: disabled, ref: nativeInputRef, format: format, minTime: minTime, maxTime: maxTime, value: editingValue, onValueChange: commitValue, onBlur: emitBlur })),
823
+ isMobileDropdownActive && (React.createElement(TimePickerMobilePopup, { id: popupId, value: displayValue, inputRef: mobileInputRef, disabled: disabled, format: format, size: size, rightIcon: inputRightIcon, suffix: suffix, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoadingItems, isFailed: isSourceFailed, errorNetworkButton: locale.errorNetworkButton, errorNetworkMessage: locale.errorNetworkMessage, highlightedItemIndex: highlightedItemIndex, selectedValue: selectedValue, itemRefs: itemRefs, error: props.error, warning: props.warning, "aria-describedby": props['aria-describedby'], "aria-label": props['aria-label'], "aria-placeholder": ariaPlaceholder, "aria-haspopup": 'listbox', "aria-expanded": resolvedItems.length > 0 || isLoadingItems || isSourceFailed ? true : undefined, "aria-controls": resolvedItems.length > 0 || isLoadingItems || isSourceFailed ? popupId : undefined, "aria-activedescendant": activeDescendantId, onFocus: handleMobileFocus, onBlur: handleMobileBlur, onClick: handleClick, onKeyDown: handleMobileKeyDown, onMouseDownCapture: handleMobileMouseDownCapture, onMouseUp: handleMobileMouseUp, onPaste: handleMobilePaste, onSelectSegment: handleMobileSelectSegmentByMouse, onRetry: retrySource, onSelectItem: selectItem, onCloseRequest: closeOpenedDropdown })),
722
824
  hasDropdown &&
723
825
  !canUseMobileNativeTimePicker &&
724
826
  !canUseMobileDropdownTimePicker &&
725
827
  isDropdownOpened &&
726
828
  hasDropdownContent &&
727
- rootRef.current && (React.createElement(TimePickerPopup, { id: popupId, anchorElement: rootRef.current, menuPos: menuPos, menuAlign: menuAlign, menuWidth: menuWidth, popupMaxHeight: popupMaxHeight, format: format, size: size, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoadingItems, highlightedItemIndex: highlightedItemIndex, normalizedValue: normalizedValue, itemRefs: itemRefs, onSelectItem: selectItem })))));
829
+ rootRef.current && (React.createElement(TimePickerPopup, { id: popupId, anchorElement: rootRef.current, menuPos: menuPos, menuAlign: menuAlign, menuWidth: menuWidth, popupMaxHeight: popupMaxHeight, format: format, size: size, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoadingItems, isFailed: isSourceFailed, errorNetworkButton: locale.errorNetworkButton, errorNetworkMessage: locale.errorNetworkMessage, highlightedItemIndex: highlightedItemIndex, selectedValue: selectedValue, itemRefs: itemRefs, onRetry: retrySource, onSelectItem: selectItem })))));
728
830
  }), { validate: validateTimePicker });
729
831
  //# sourceMappingURL=TimePicker.js.map