@skbkontur/react-ui 6.1.7-4c72d.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.
@@ -4,7 +4,7 @@ import type { CommonProps } from '../../internal/CommonWrapper/index.js';
4
4
  import type { SizeProp } from '../../lib/types/props.js';
5
5
  import { type NoInfer } from '../../lib/utils.js';
6
6
  import type { MenuItemState } from '../MenuItem/index.js';
7
- import { type TimeFormat, type TimeItem, type TimeItemValue, type TimePickerSource, type TimePickerValue, type TimePickerValueToItem } from './helpers/TimePicker.shared.js';
7
+ import { type TimeFormat, type TimeItem, type TimePickerEmptyItem, type TimeItemValue, type TimePickerSource, type TimePickerValue, type TimePickerValueToItem } from './helpers/TimePicker.shared.js';
8
8
  import { validateTimePicker } from './helpers/validateTimePicker.js';
9
9
  export interface TimePickerProps<T extends TimeItemValue = string> extends CommonProps, Pick<AriaAttributes, 'aria-describedby' | 'aria-label'>, Pick<HTMLAttributes<HTMLElement>, 'id'> {
10
10
  /** Устанавливает формат времени @default HH:mm */
@@ -78,14 +78,15 @@ export interface TimePickerProps<T extends TimeItemValue = string> extends Commo
78
78
  * Событие изменения значения `value`.
79
79
  * Вызывается при коммите значения: потере фокуса, нажатии Enter, выборе элемента из списка
80
80
  * или изменении в нативном пикере.
81
- * Первым аргументом приходит элемент в той же форме, в которой элементы переданы в `source`:
82
- * при выборе из выпадающего списка — тот же элемент, в остальных случаях — результат `valueToItem`,
83
- * а при пустом значении `null`.
84
- * Вторым аргументом приходит полностью нормализованное время в формате `HH:mm[:ss]` или пустая строка.
81
+ * Элемент приходит в той же форме, в которой элементы переданы в `source`:
82
+ * при выборе из выпадающего списка — тот же элемент, в остальных случаях — результат `valueToItem`.
83
+ * Пустое значение приходит пустой строкой в строковой форме и `null` — в объектной.
84
+ * Время элемента полностью нормализовано до формата `HH:mm[:ss]`,
85
+ * у элемента-объекта его можно прочитать из `item.value`.
85
86
  * Тип элемента выводится из `source` и `value`, но не из этого обработчика,
86
87
  * иначе `onValueChange={setItem}` сузил бы его до `TimeItem`.
87
88
  */
88
- onValueChange?(item: NoInfer<T> | null, value: string): void;
89
+ onValueChange?(item: NoInfer<T> | TimePickerEmptyItem<T>): void;
89
90
  /**
90
91
  * Событие изменения значения в процессе ввода.
91
92
  * Значение частично нормализуется по сегментам, например `1` => `01`, незаполненный хвост отбрасывается.
@@ -117,11 +117,12 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
117
117
  return;
118
118
  }
119
119
  if (nextValue === EMPTY_VALUE) {
120
- onValueChange(null, EMPTY_VALUE);
120
+ // Пустое значение повторяет форму элементов: у объектов элемента нет, а строка остается строкой.
121
+ onValueChange(shouldBuildItemAsObjectRef.current ? null : EMPTY_VALUE);
121
122
  return;
122
123
  }
123
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);
124
- onValueChange(nextItem, nextValue);
125
+ onValueChange(nextItem);
125
126
  }, [onValueChange]);
126
127
  var onBlurRef = useRef(onBlur);
127
128
  onBlurRef.current = onBlur;
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker.js","sourceRoot":"","sources":["TimePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { AriaAttributes, HTMLAttributes, ReactNode } from 'react';\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport type { CommonProps } from '../../internal/CommonWrapper/index.js';\nimport { CommonWrapper } from '../../internal/CommonWrapper/index.js';\nimport { extractCommonProps } from '../../internal/CommonWrapper/utils/extractCommonProps.js';\nimport { LoadingIcon } from '../../internal/icons2022/LoadingIcon.js';\nimport type { NativeTimeInputRef } from '../../internal/NativeTimeInput/index.js';\nimport { NativeTimeInput } from '../../internal/NativeTimeInput/index.js';\nimport type { TimeInputRef } from '../../internal/TimeInput/index.js';\nimport { TimeInput } from '../../internal/TimeInput/index.js';\nimport { isIOS } from '../../lib/client.js';\nimport {\n isKeyArrowDown,\n isKeyArrowLeft,\n isKeyArrowRight,\n isKeyArrowUp,\n isKeyBackspace,\n isKeyChar,\n isKeyDelete,\n isKeyEnter,\n isKeyEscape,\n isKeySpace,\n isKeyTab,\n isModShift,\n isShortcutSelectAll,\n} from '../../lib/events/keyboard/identifiers.js';\nimport { forwardRefAndName } from '../../lib/forwardRefAndName.js';\nimport { useLocaleForControl } from '../../lib/locale/useLocaleForControl.js';\nimport { useStyles } from '../../lib/renderEnvironment/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport { getRandomID, type NoInfer } from '../../lib/utils.js';\nimport type { MenuItemState } from '../MenuItem/index.js';\nimport { useResponsiveLayout } from '../ResponsiveLayout/index.js';\nimport { scrollSelectedItemIntoView } from './helpers/scrollSelectedItemIntoView.js';\nimport { DIGIT_REGEXP, EMPTY_SEGMENT, EMPTY_VALUE, TimePickerDataTids } from './helpers/TimePicker.constants.js';\nimport {\n commitTimeSegmentOnLeave,\n deleteTimeSegmentDigit,\n formatDigitToTimeSegment,\n shiftTimeSegmentValue,\n} from './helpers/TimePicker.editing.js';\nimport { getTimePickerPopupMaxHeight } from './helpers/TimePicker.layout.js';\nimport { getNextTimeSegment, getPreviousTimeSegment } from './helpers/TimePicker.selection.js';\nimport {\n isNavigableMenuElement,\n isTimeItem,\n isTimeItemObject,\n isTimeMenuItem,\n type TimeFormat,\n type TimeItem,\n type TimePickerMenuItem,\n type TimeItemValue,\n type TimePickerSource,\n type TimePickerValue,\n type TimePickerValueToItem,\n type TimeSegment,\n timeValueToItem,\n} from './helpers/TimePicker.shared.js';\nimport {\n filterTimeItems,\n getEmptyDisplayValue,\n getTimeFilterQuery,\n getTimeValueString,\n isTimeDisplayEmpty,\n normalizeTimeValue,\n parsePastedTimeValue,\n replaceTimeSegment,\n resolveTimeItems,\n} from './helpers/TimePicker.value.js';\nimport { validateTimePicker } from './helpers/validateTimePicker.js';\nimport { useTimePickerDropdown } from './hooks/useTimePickerDropdown.js';\nimport { useTimePickerSelection } from './hooks/useTimePickerSelection.js';\nimport { useTimePickerSource } from './hooks/useTimePickerSource.js';\nimport { useTimePickerValue } from './hooks/useTimePickerValue.js';\nimport { TimePickerLocaleHelper } from './locale/index.js';\nimport { getStyles } from './TimePicker.styles.js';\nimport { TimePickerMobilePopup } from './TimePickerMobilePopup.js';\nimport { TimePickerPopup } from './TimePickerPopup.js';\n\n/** Пустой список для клавиатуры: не создает новую ссылку на каждый рендер. */\nconst EMPTY_MENU_ITEMS: Array<TimePickerMenuItem<TimeItemValue>> = [];\n\nexport interface TimePickerProps<T extends TimeItemValue = string>\n extends\n CommonProps,\n Pick<AriaAttributes, 'aria-describedby' | 'aria-label'>,\n Pick<HTMLAttributes<HTMLElement>, 'id'> {\n /** Устанавливает формат времени @default HH:mm */\n format?: TimeFormat;\n /** Задает источник элементов выпадающего списка: массив либо функцию запроса,\n * которая возвращает массив или Promise с массивом.\n * Запрос — это введенные цифры сегментов с сохранением их позиций: `12`, `12:3`, а если заполнены только минуты — `:30`.\n * Элементы задаются либо строками со временем — `'09:00'`, — либо объектами `{ value, label?, disabled? }`\n * с любыми дополнительными полями; смешивать формы в одном источнике нельзя, это ошибка типов.\n * Выбранный элемент приходит в `onValueChange` в той же форме.\n * Кроме значений времени можно передать React-элементы — например `MenuHeader` или `MenuItem`:\n * они отображаются в меню, но не участвуют в фильтрации и выборе значения.\n * Фильтрацию, индикацию загрузки и повторные запросы компонент берет на себя,\n * подробности — в разделе документации про выпадающий список.\n * Замена самой функции уже открытый список не перезапрашивает: как в `ComboBox`,\n * актуальная функция используется при следующем запросе. */\n source?: TimePickerSource<T>;\n /** Отрисовывает значение времени в выпадающем списке. Не применяется к React-элементам из `source`. */\n renderItem?: (item: T, state: MenuItemState) => ReactNode;\n /** Задает нижнюю границу времени. Элементы за границей становятся заблокированными. */\n minTime?: string;\n /** Задает верхнюю границу времени. Элементы за границей становятся заблокированными. */\n maxTime?: string;\n /** Задает значение поля: элемент того же типа, что в `source`, либо строку в формате `HH:mm[:ss]`.\n * Из элемента-объекта используется только время `value`, `label` в поле не отображается.\n * Пустое значение можно передать как `''` или `null`.\n * Если проп не задан, компонент неконтролируемый: он хранит значение сам и сообщает о нем через `onValueChange`. */\n value?: TimePickerValue<T>;\n /** Преобразует время в элемент.\n * Применяется ко временам, которые пользователь не выбрал из `source`:\n * ручной ввод, изменение стрелками, вставка из буфера, нативный пикер.\n * По умолчанию компонент повторяет форму элементов `source` и `value`:\n * для строк отдает строку, для объектов — `{ value }`.\n * Задавайте этот проп, если элементы содержат поля, кроме `value`, `label` и `disabled`:\n * форму элементов функции-источника компонент узнает только после ее первого ответа.\n * @default (value) => value | ({ value }) */\n valueToItem?: TimePickerValueToItem<T>;\n /** Устанавливает фокус на поле ввода после окончания загрузки страницы @default false */\n autoFocus?: boolean;\n /** Делает компонент заблокированным. */\n disabled?: boolean;\n /** Переводит контрол в состояние валидации ошибки. */\n error?: boolean;\n /** Переводит контрол в состояние валидации предупреждения. */\n warning?: boolean;\n /** Включает нативный системный выбор времени в мобильной верстке.\n * Мобильная верстка определяется медиавыражением темы, как в остальных адаптивных контролах. */\n useMobileNativeTimePicker?: boolean;\n /** Расположение выпадающего меню. */\n menuPos?: 'top' | 'bottom';\n /** Выравнивание выпадающего меню. */\n menuAlign?: 'left' | 'right';\n /** Ширина выпадающего меню. По умолчанию — минимальная ширина поля ввода, расширяется по контенту. */\n menuWidth?: string | number;\n /** Задает ширину поля. */\n width?: string | number;\n /** Переопределяет иконку или скрывает, если передать `null`.\n * Пока элементы уже показаны, а новый запрос к функции-источнику еще выполняется,\n * вместо иконки показывается индикатор загрузки. */\n rightIcon?: React.ReactNode | (() => React.ReactNode);\n /** Устанавливает суффикс после значения и перед иконкой. */\n suffix?: ReactNode;\n /** Размер поля ввода и выпадающего меню. */\n size?: SizeProp;\n /** Устанавливает радиус скруглений углов.\n * @ignore */\n corners?: Partial<\n Pick<\n React.CSSProperties,\n 'borderTopRightRadius' | 'borderBottomRightRadius' | 'borderBottomLeftRadius' | 'borderTopLeftRadius'\n >\n >;\n /** Задает функцию, которая вызывается при нажатии на контрол. */\n onClick?(event: React.MouseEvent<HTMLElement>): void;\n /**\n * Событие изменения значения `value`.\n * Вызывается при коммите значения: потере фокуса, нажатии Enter, выборе элемента из списка\n * или изменении в нативном пикере.\n * Первым аргументом приходит элемент в той же форме, в которой элементы переданы в `source`:\n * при выборе из выпадающего списка — тот же элемент, в остальных случаях — результат `valueToItem`,\n * а при пустом значении — `null`.\n * Вторым аргументом приходит полностью нормализованное время в формате `HH:mm[:ss]` или пустая строка.\n * Тип элемента выводится из `source` и `value`, но не из этого обработчика,\n * иначе `onValueChange={setItem}` сузил бы его до `TimeItem`.\n */\n onValueChange?(item: NoInfer<T> | null, value: string): void;\n /**\n * Событие изменения значения в процессе ввода.\n * Значение частично нормализуется по сегментам, например `1` => `01`, незаполненный хвост отбрасывается.\n * Промежуточное значение может не соответствовать полной форме `HH:mm[:ss]`, поэтому тип — произвольная строка.\n */\n onInputValueChange?(value: string): void;\n /**\n * Событие некорректного ввода: пользователь ввел или вставил значение, которое не может быть временем.\n * Вызывается с нажатой клавишей — например `а` или `,` — либо со значением из буфера,\n * из которого не получилось собрать время.\n * Значение вне диапазона `minTime`/`maxTime` некорректным вводом не считается,\n * его можно проверить через `TimePicker.validate`.\n * Вторым аргументом передается метод вспыхивания рамки поля.\n * Если обработчик не задан, поле вспыхивает само.\n * Обработчик может подставить значение вместо некорректного ввода — например разобрать вставку\n * в собственном формате: возвращенный элемент коммитится и приходит в `onValueChange`,\n * `null` очищает поле, а `undefined` оставляет значение прежним.\n */\n onUnexpectedInput?(value: string, blink: () => void): void | NoInfer<T> | null;\n /**\n * Событие потери фокуса.\n * Вызывается после коммита значения и следующего за ним рендера,\n * поэтому обработчик видит уже измененное значение — например при выборе элемента в мобильном попапе.\n * Из-за этого событие приходит отложенно и его `currentTarget` уже пуст: элемент читайте из `target`.\n */\n onBlur?(event: React.FocusEvent<HTMLElement>): void;\n /** Событие получения фокуса. */\n onFocus?(event: React.FocusEvent<HTMLElement>): void;\n /** Событие нажатия клавиши. */\n onKeyDown?(event: React.KeyboardEvent<HTMLElement>): void;\n /** Событие вставки из буфера. */\n onPaste?(event: React.ClipboardEvent<HTMLElement>): void;\n}\n\nexport interface TimePickerRef {\n /** Устанавливает фокус на поле ввода.\n * С опцией `withoutOpenDropdown` фокус не открывает выпадающее меню. */\n focus(options?: { withoutOpenDropdown?: boolean }): void;\n /** Снимает фокус с поля ввода. */\n blur(): void;\n /** Открывает выпадающее меню, установив фокус на поле.\n * В режиме нативного пикера открывает системный пикер. */\n open(): void;\n /** Закрывает выпадающее меню. */\n close(): void;\n /** Запускает анимацию blink у поля ввода времени. */\n blink(): void;\n /** Возвращает корневой DOM-узел компонента. */\n getRootNode(): HTMLElement | null;\n}\n\nexport type TimePicker = TimePickerRef;\n\ninterface TimePickerComponent {\n /** Строковый режим: элементы source — строки со временем. */\n (props: TimePickerProps<string> & React.RefAttributes<TimePickerRef>): React.ReactElement | null;\n /** Объектный режим: элементы source — объекты, расширяющие `{ value: string }`. */\n <T extends TimeItem>(props: TimePickerProps<T> & React.RefAttributes<TimePickerRef>): React.ReactElement | null;\n displayName?: string;\n __KONTUR_REACT_UI__: string;\n /** Проверяет, что значение полностью заполнено, соответствует формату и попадает в диапазон `minTime`/`maxTime`. */\n validate: typeof validateTimePicker;\n}\n\n/** Поле с временем помогает пользователю быстро и удобно указать время в правильном формате.\n * В поле можно ввести время с клавиатуры либо выбрать из выпадающего списка,\n * передав массив или функцию в проп `source`.\n */\nexport const TimePicker = Object.assign(\n forwardRefAndName<TimePickerRef, TimePickerProps<TimeItemValue>>('TimePicker', (props, ref) => {\n // `className`, `style` и data-атрибуты применяет `CommonWrapper` к корневому элементу,\n // поэтому в поле ввода они не должны уехать повторно.\n const [, notCommonProps] = extractCommonProps(props);\n\n const {\n disabled,\n useMobileNativeTimePicker = false,\n format = 'HH:mm',\n size = 'small',\n source,\n renderItem,\n menuPos,\n menuAlign,\n menuWidth,\n minTime,\n maxTime,\n rightIcon,\n suffix,\n corners,\n value,\n valueToItem,\n onValueChange,\n onInputValueChange,\n onUnexpectedInput,\n onFocus,\n onBlur,\n onClick,\n onKeyDown,\n onPaste,\n ...inputProps\n } = notCommonProps;\n\n const theme = useContext(ThemeContext);\n\n const styles = useStyles(getStyles);\n const locale = useLocaleForControl('TimePicker', TimePickerLocaleHelper);\n\n const [isInputFocused, setIsInputFocused] = useState(false);\n\n const inputRef = useRef<TimeInputRef>(null);\n const mobileInputRef = useRef<TimeInputRef>(null);\n const nativeInputRef = useRef<NativeTimeInputRef>(null);\n const rootRef = useRef<HTMLSpanElement>(null);\n const itemRefs = useRef(new Map<number, HTMLSpanElement>());\n const isMouseFocusRef = useRef(false);\n /** Сегмент, по которому нажали мышью, или `null`, если нажали мимо сегментов. */\n const mouseDownSegmentRef = useRef<TimeSegment | null>(null);\n const mobileBlurEventRef = useRef<React.FocusEvent<HTMLInputElement> | null>(null);\n const shouldSkipOpenOnFocusRef = useRef(false);\n /**\n * Контрол считает себя сфокусированным: о фокусе сообщено наружу, а сессия ввода не закончена.\n * Внутри одной сессии фокус может переезжать между полем и инпутом мобильного попапа —\n * например вместе со сменой верстки, — и такой переезд не начинает сессию заново.\n */\n const isControlFocusedRef = useRef(false);\n /** Фокус, который контрол сам переводит в скрытый нативный инпут, открывая системный пикер. */\n const isMovingFocusToNativePickerRef = useRef(false);\n const popupIdRef = useRef(TimePickerDataTids.popup + getRandomID());\n\n /**\n * Мобильная версия включается медиавыражением темы, как в ComboBox:\n * поле переключается между мобильной и десктопной версией вместе с версткой страницы.\n */\n const { isMobile: isMobileLayout } = useResponsiveLayout();\n const canUseMobileNativeTimePicker = useMobileNativeTimePicker && isMobileLayout;\n\n const isSourceFunction = typeof source === 'function';\n const hasDropdown = isSourceFunction || (Array.isArray(source) && source.length > 0);\n\n const [isDropdownOpened, setIsDropdownOpened] = useState(false);\n const [isEditedAfterOpen, setIsEditedAfterOpen] = useState(false);\n\n /**\n * Форма элементов функции-источника: последняя, о которой компонент знает.\n * Форма запоминается, потому что элементы функции очищаются при закрытии меню,\n * а коммит значения после закрытия должен отдать наружу элемент той же формы.\n * Для массива форма всегда считается по текущим элементам — запоминать нечего.\n */\n const lastSourceItemShapeRef = useRef<boolean | null>(null);\n\n /**\n * Форма элемента, который компонент собирает для времени без элемента.\n * Повторяет форму элементов источника, а если их нет — форму внешнего `value`,\n * чтобы наружу уходило то же, что пришло внутрь.\n * Значение читается при коммите, поэтому обновляется в эффекте: так его не меняет отброшенный рендер.\n */\n const shouldBuildItemAsObjectRef = useRef(false);\n\n const valueToItemRef = useRef(valueToItem);\n valueToItemRef.current = valueToItem;\n\n const handleCommitValue = useCallback(\n (nextValue: string, item: TimeItemValue | null) => {\n if (!onValueChange) {\n return;\n }\n\n if (nextValue === EMPTY_VALUE) {\n onValueChange(null, EMPTY_VALUE);\n return;\n }\n\n const nextItem =\n item ??\n valueToItemRef.current?.(nextValue) ??\n timeValueToItem<TimeItemValue>(nextValue, shouldBuildItemAsObjectRef.current);\n\n onValueChange(nextItem, nextValue);\n },\n [onValueChange],\n );\n\n const onBlurRef = useRef(onBlur);\n onBlurRef.current = onBlur;\n\n const pendingBlurEventRef = useRef<React.FocusEvent<HTMLInputElement> | null>(null);\n const [blurRequestId, setBlurRequestId] = useState(0);\n\n /**\n * Завершает сессию фокуса и откладывает `onBlur` до конца рендера, как это делает ComboBox.\n * Значение коммитится синхронно с потерей фокуса, поэтому вызванный тут же `onBlur`\n * попал бы в обработчик с состоянием родителя до изменения значения — например с пустым временем.\n * Событие может отсутствовать: сессия все равно закрывается, но наружу ничего не уходит.\n */\n const emitBlur = useCallback((event: React.FocusEvent<HTMLInputElement> | null) => {\n if (!isControlFocusedRef.current) {\n return;\n }\n\n isControlFocusedRef.current = false;\n\n if (!event || !onBlurRef.current) {\n return;\n }\n\n event.persist();\n pendingBlurEventRef.current = event;\n setBlurRequestId((currentId) => currentId + 1);\n }, []);\n\n const flushPendingBlur = useCallback(() => {\n const pendingBlurEvent = pendingBlurEventRef.current;\n\n if (!pendingBlurEvent) {\n return;\n }\n\n pendingBlurEventRef.current = null;\n onBlurRef.current?.(pendingBlurEvent);\n }, []);\n\n useEffect(flushPendingBlur, [blurRequestId, flushPendingBlur]);\n\n /** Родитель мог убрать поле в ответ на коммит значения — отложенное событие все равно должно уйти. */\n useEffect(() => flushPendingBlur, [flushPendingBlur]);\n\n const {\n editingValue,\n editingValueRef,\n committedValue,\n updateEditingValue,\n commitEditingValue,\n commitValue,\n commitItem,\n } = useTimePickerValue({\n isInputFocused,\n format,\n externalValue: getTimeValueString(value),\n isValueControlled: value !== undefined,\n onCommitValue: handleCommitValue,\n onInputValueChange,\n });\n\n const filterQuery = isEditedAfterOpen ? getTimeFilterQuery(editingValue, format) : EMPTY_VALUE;\n\n const {\n items: sourceValueItems,\n fetchedQuery: fetchedItemsQuery,\n isLoading: isLoadingItems,\n isFailed: isSourceFailed,\n retry: retrySource,\n } = useTimePickerSource<TimeItemValue>({ source, format, isDropdownOpened, filterQuery });\n\n useEffect(() => {\n if (!isSourceFunction || sourceValueItems.some(isTimeItem)) {\n lastSourceItemShapeRef.current = sourceValueItems.some((item) => isTimeItem(item) && isTimeItemObject(item));\n }\n\n shouldBuildItemAsObjectRef.current =\n lastSourceItemShapeRef.current === true || (value !== null && value !== undefined && isTimeItemObject(value));\n }, [isSourceFunction, sourceValueItems, value]);\n\n const resolvedItems = useMemo(\n () => resolveTimeItems(filterTimeItems(sourceValueItems, filterQuery, format), format, minTime, maxTime),\n [filterQuery, format, maxTime, minTime, sourceValueItems],\n );\n\n const popupMaxHeight = getTimePickerPopupMaxHeight(size, theme);\n\n const ariaPlaceholder = format === 'HH:mm' ? locale.ariaPlaceholderHHMM : locale.ariaPlaceholderHHMMSS;\n\n /**\n * Время, отмеченное в меню выбранным.\n * Пока пользователь не начал править значение при открытом меню, это то же время, что в поле.\n * С началом правки отмечено остается закоммиченное значение: набор фильтра — например `10` —\n * не должен отмечать элемент `10:00` как уже выбранный.\n */\n const selectedValue = normalizeTimeValue(isEditedAfterOpen ? committedValue : editingValue, format);\n\n const selectedItemIndex = resolvedItems.findIndex(\n (item) => isTimeMenuItem(item) && normalizeTimeValue(item.value, format) === selectedValue,\n );\n\n let autoHighlightKey: string | null = null;\n\n if (filterQuery !== EMPTY_VALUE) {\n if (isSourceFunction) {\n if (!isLoadingItems && fetchedItemsQuery === filterQuery) {\n autoHighlightKey = `source-function:${filterQuery}`;\n }\n } else {\n autoHighlightKey = `source-array:${filterQuery}`;\n }\n }\n\n const canUseMobileDropdownTimePicker = hasDropdown && isMobileLayout && !canUseMobileNativeTimePicker;\n /** Ввод идет в мобильном попапе: он открыт, а нативного пикера в этом режиме нет. */\n const isMobileDropdownActive = canUseMobileDropdownTimePicker && isDropdownOpened;\n\n /**\n * Меню с одними лишь заголовками и разделителями показывать не о чем,\n * поэтому при активном фильтре нужен хотя бы один подошедший элемент со временем.\n */\n const hasDropdownContent =\n isLoadingItems ||\n isSourceFailed ||\n (filterQuery === EMPTY_VALUE ? resolvedItems.length > 0 : resolvedItems.some(isTimeMenuItem));\n\n /**\n * Элементы, с которыми работает клавиатура.\n * Пока меню скрыто, их нет: иначе стрелки ходили бы по невидимому списку,\n * а Enter выбирал бы невидимый элемент вместо коммита введенного времени.\n */\n const menuItems = hasDropdownContent ? resolvedItems : EMPTY_MENU_ITEMS;\n\n const inputRightIcon =\n isLoadingItems && resolvedItems.length > 0 ? (\n <span data-tid={TimePickerDataTids.inputLoading}>\n <LoadingIcon size={size} />\n </span>\n ) : (\n rightIcon\n );\n\n /** Сфокусированное поле всегда показывает сегменты, а пустое без фокуса — ничего. */\n const getDisplayValue = (): string => {\n if (isInputFocused) {\n return editingValue || getEmptyDisplayValue(format);\n }\n\n return isTimeDisplayEmpty(editingValue) ? EMPTY_VALUE : editingValue;\n };\n\n const displayValue = getDisplayValue();\n\n const resetMouseInteractionState = useCallback(() => {\n isMouseFocusRef.current = false;\n mouseDownSegmentRef.current = null;\n }, []);\n\n const updateEditingValueAfterUserEdit = useCallback(\n (nextEditingValue: string) => {\n if (hasDropdown && editingValueRef.current !== nextEditingValue) {\n setIsEditedAfterOpen(true);\n }\n\n updateEditingValue(nextEditingValue);\n },\n [editingValueRef, hasDropdown, updateEditingValue],\n );\n\n const normalizeCurrentSegmentIfNeeded = useCallback(\n (segment: TimeSegment) => {\n const nextDisplayValue = commitTimeSegmentOnLeave(\n editingValue === EMPTY_VALUE ? getEmptyDisplayValue(format) : editingValue,\n segment,\n format,\n );\n\n updateEditingValueAfterUserEdit(nextDisplayValue);\n },\n [editingValue, format, updateEditingValueAfterUserEdit],\n );\n\n const openNativeTimePicker = useCallback(() => {\n if (!canUseMobileNativeTimePicker || disabled) {\n return;\n }\n\n // На iOS системный пикер открывается только фокусом, поэтому фокус уходит из поля в скрытый инпут.\n isMovingFocusToNativePickerRef.current = true;\n\n if (isIOS) {\n nativeInputRef.current?.focus();\n } else {\n nativeInputRef.current?.click();\n }\n\n isMovingFocusToNativePickerRef.current = false;\n }, [canUseMobileNativeTimePicker, disabled]);\n\n /** Фокус ушел в скрытый нативный инпут: для внешнего мира контрол остается активным. */\n const isFocusMovedToNativePicker = (event: React.FocusEvent<HTMLInputElement>): boolean =>\n isMovingFocusToNativePickerRef.current ||\n (nativeInputRef.current !== null && event.relatedTarget === nativeInputRef.current.getNode());\n\n const { highlightedItemIndex, openDropdown, closeDropdown, resetHighlightedItem, tryNavigateItems } =\n useTimePickerDropdown({\n disabled,\n hasDropdown,\n items: menuItems,\n selectedItemIndex: selectedItemIndex >= 0 ? selectedItemIndex : null,\n autoHighlightKey,\n isDropdownOpened,\n setIsDropdownOpened,\n });\n\n /**\n * Фильтрация начинается только после правки значения при открытом меню.\n * Состояние живет ровно столько, сколько открыто меню: правка, которая заново открывает меню,\n * сохраняет свой запрос, а правка при закрытом меню — например стрелками — на список не влияет.\n */\n useEffect(() => {\n if (!isDropdownOpened && isEditedAfterOpen) {\n setIsEditedAfterOpen(false);\n }\n }, [isDropdownOpened, isEditedAfterOpen]);\n\n const popupId = popupIdRef.current;\n const highlightedMenuItem = highlightedItemIndex === null ? undefined : menuItems[highlightedItemIndex];\n\n /** Кастомный `MenuItem` может принести свой `id` — тогда указывать нужно именно на него. */\n const activeDescendantId = highlightedMenuItem\n ? ((isNavigableMenuElement(highlightedMenuItem) ? highlightedMenuItem.props.id : undefined) ??\n `${popupId}-item-${highlightedItemIndex}`)\n : undefined;\n\n const getActiveInput = useCallback(\n () => (isMobileDropdownActive ? mobileInputRef.current : inputRef.current),\n [isMobileDropdownActive],\n );\n\n const { selection, selectedSegment, selectSegment, selectAll, syncSelectionWithDOM } = useTimePickerSelection({\n isInputFocused,\n format,\n displayValue,\n getInput: getActiveInput,\n });\n\n const blinkInput = useCallback(() => {\n getActiveInput()?.blink();\n }, [getActiveInput]);\n\n const handleUnexpectedInput = useCallback(\n (unexpectedValue: string) => {\n if (!onUnexpectedInput) {\n blinkInput();\n return;\n }\n\n const returnedValue = onUnexpectedInput(unexpectedValue, blinkInput);\n\n if (returnedValue === undefined) {\n return;\n }\n\n if (returnedValue === null) {\n commitValue(EMPTY_VALUE);\n return;\n }\n\n commitItem(returnedValue);\n },\n [blinkInput, commitItem, commitValue, onUnexpectedInput],\n );\n\n /** Закрывает открытое меню: мобильный попап заодно завершает сессию ввода, как потеря фокуса. */\n const closeOpenedDropdown = useCallback(() => {\n if (isMobileDropdownActive) {\n // Фокус может остаться в любом из двух полей: инпут попапа не всегда получает его —\n // например мобильный браузер отказывается переводить фокус без жеста пользователя.\n // Гасим оба, чтобы закрытие попапа всегда давало событие потери фокуса.\n mobileInputRef.current?.blur();\n inputRef.current?.blur();\n setIsInputFocused(false);\n resetMouseInteractionState();\n closeDropdown();\n commitEditingValue();\n const blurEvent = mobileBlurEventRef.current;\n mobileBlurEventRef.current = null;\n emitBlur(blurEvent);\n return;\n }\n\n closeDropdown();\n }, [closeDropdown, commitEditingValue, emitBlur, isMobileDropdownActive, resetMouseInteractionState]);\n\n const selectItem = useCallback(\n (item: TimeItemValue) => {\n commitItem(item);\n closeOpenedDropdown();\n },\n [closeOpenedDropdown, commitItem],\n );\n\n const isSelectHighlightedItem = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (highlightedItemIndex === null) {\n return false;\n }\n\n const resolvedItem = menuItems[highlightedItemIndex];\n\n if (!resolvedItem) {\n return true;\n }\n\n if (isNavigableMenuElement(resolvedItem)) {\n resolvedItem.props.onClick?.(event);\n return true;\n }\n\n if (!isTimeMenuItem(resolvedItem) || resolvedItem.disabled) {\n return true;\n }\n\n selectItem(resolvedItem.item);\n return true;\n },\n [highlightedItemIndex, menuItems, selectItem],\n );\n\n const focusInput = useCallback(\n (options?: { withoutOpenDropdown?: boolean }) => {\n if (disabled) {\n return;\n }\n\n shouldSkipOpenOnFocusRef.current = Boolean(options?.withoutOpenDropdown);\n getActiveInput()?.focus();\n shouldSkipOpenOnFocusRef.current = false;\n },\n [disabled, getActiveInput],\n );\n\n /**\n * Открывает выпадающее меню так же, как это делает пользователь: через фокус в поле.\n * Меню закрывается по потере фокуса, поэтому открытое без фокуса меню было бы нечем закрыть.\n * В режиме нативного пикера открывается системный пикер — своего меню в этом режиме нет.\n */\n const openInputDropdown = useCallback(() => {\n if (disabled) {\n return;\n }\n\n if (canUseMobileNativeTimePicker) {\n openNativeTimePicker();\n return;\n }\n\n getActiveInput()?.focus();\n openDropdown();\n }, [canUseMobileNativeTimePicker, disabled, getActiveInput, openDropdown, openNativeTimePicker]);\n\n const blurInput = useCallback(() => {\n if (isMobileDropdownActive) {\n closeOpenedDropdown();\n return;\n }\n\n // В нативном режиме фокус держит скрытый инпут системного пикера.\n nativeInputRef.current?.blur();\n getActiveInput()?.blur();\n }, [closeOpenedDropdown, getActiveInput, isMobileDropdownActive]);\n\n useImperativeHandle(\n ref,\n () => ({\n focus: focusInput,\n blur: blurInput,\n blink: blinkInput,\n open: openInputDropdown,\n close: closeOpenedDropdown,\n getRootNode: () => rootRef.current,\n }),\n [blinkInput, blurInput, closeOpenedDropdown, focusInput, openInputDropdown],\n );\n\n useLayoutEffect(() => {\n if (!isDropdownOpened) {\n return;\n }\n\n const selectedIndex = highlightedItemIndex ?? selectedItemIndex;\n\n if (selectedIndex < 0) {\n return;\n }\n\n const targetNode = itemRefs.current.get(selectedIndex);\n\n if (targetNode) {\n scrollSelectedItemIntoView(targetNode);\n }\n }, [highlightedItemIndex, isDropdownOpened, selectedItemIndex]);\n\n /**\n * Блокировка контрола посреди ввода завершает его так же, как потеря фокуса:\n * меню закрывается, а недоведенное значение коммитится, а не остается висеть в поле.\n */\n useEffect(() => {\n if (!disabled) {\n return;\n }\n\n if (isMobileDropdownActive) {\n closeOpenedDropdown();\n return;\n }\n\n if (isDropdownOpened) {\n closeDropdown();\n }\n\n if (isInputFocused) {\n setIsInputFocused(false);\n resetMouseInteractionState();\n commitEditingValue();\n }\n }, [\n closeDropdown,\n closeOpenedDropdown,\n commitEditingValue,\n disabled,\n isDropdownOpened,\n isInputFocused,\n isMobileDropdownActive,\n resetMouseInteractionState,\n ]);\n\n const previousIsMobileLayoutRef = useRef(isMobileLayout);\n\n /**\n * Смена верстки переносит открытое меню в нужную версию: как в ComboBox, меню не закрывается.\n * Начатый ввод переезжает вместе с ним, а если переезжать некуда — коммитится, как при потере фокуса.\n */\n useEffect(() => {\n if (previousIsMobileLayoutRef.current === isMobileLayout) {\n return;\n }\n\n previousIsMobileLayoutRef.current = isMobileLayout;\n // Запомненный blur остался от прошлой верстки: как потеря фокуса контрола он больше не годится.\n mobileBlurEventRef.current = null;\n\n if (isMobileLayout) {\n // Ввод продолжится в инпуте попапа, только если попап открывается вместе со сменой верстки.\n if (isInputFocused && !isMobileDropdownActive) {\n setIsInputFocused(false);\n resetMouseInteractionState();\n commitEditingValue();\n }\n\n // В режиме нативного пикера своего меню нет.\n if (isDropdownOpened && canUseMobileNativeTimePicker) {\n closeDropdown();\n }\n\n return;\n }\n\n /**\n * Десктопное меню закрывается по потере фокуса поля, поэтому без фокуса в контроле\n * его нечем было бы закрыть: мобильный попап мог быть открыт и без фокуса в своем инпуте.\n * Если же фокус был, его вернет в поле `useTimePickerSelection`.\n */\n if (isDropdownOpened && !isInputFocused) {\n closeDropdown();\n }\n }, [\n canUseMobileNativeTimePicker,\n closeDropdown,\n commitEditingValue,\n isDropdownOpened,\n isInputFocused,\n isMobileDropdownActive,\n isMobileLayout,\n resetMouseInteractionState,\n ]);\n\n /** Сообщает о фокусе один раз за сессию: переезд фокуса внутри контрола наружу не виден. */\n const emitFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n if (isControlFocusedRef.current) {\n return;\n }\n\n isControlFocusedRef.current = true;\n onFocus?.(event);\n };\n\n const handleFocusBySource = (event: React.FocusEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n const shouldSkipOpenDropdown = shouldSkipOpenOnFocusRef.current;\n shouldSkipOpenOnFocusRef.current = false;\n const isFocusMovedInsideControl = isControlFocusedRef.current;\n\n if (canUseMobileNativeTimePicker) {\n // Фокус сообщается до открытия пикера: иначе увод фокуса в нативный инпут закрыл бы сессию.\n emitFocus(event);\n\n if (!shouldSkipOpenDropdown) {\n openNativeTimePicker();\n }\n return;\n }\n\n if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {\n if (!shouldSkipOpenDropdown) {\n openDropdown();\n }\n // Дальше ввод идет в инпуте попапа, но фокус контрол получает здесь.\n emitFocus(event);\n return;\n }\n\n setIsInputFocused(true);\n\n if (!shouldSkipOpenDropdown) {\n openDropdown();\n }\n\n if (mouseDownSegmentRef.current && !isInputFocused) {\n // По пустому полю ввод всегда начинается с часов, а по заполненному — с сегмента под курсором.\n selectSegment(isTimeDisplayEmpty(editingValueRef.current) ? 'hours' : mouseDownSegmentRef.current);\n } else {\n // Переезд фокуса внутри контрола продолжает начатый ввод, поэтому сегмент сохраняется:\n // иначе следующая цифра ушла бы в часы и затерла бы набранное время.\n selectSegment(isFocusMovedInsideControl ? selectedSegment : 'hours');\n }\n\n emitFocus(event);\n };\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => handleFocusBySource(event, false);\n\n const handleMobileFocus = (event: React.FocusEvent<HTMLInputElement>) => handleFocusBySource(event, true);\n\n const handleBlurBySource = (event: React.FocusEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n /**\n * Пока открыт мобильный попап, фокус ходит между полем и его инпутом: контрол остается активным,\n * поэтому наружу о таком blur сообщать нечего. Событие запоминается на случай,\n * если фокус в инпуте попапа так и не оказался — тогда именно оно уйдет в `onBlur` при закрытии.\n */\n if (isMobileDropdownActive) {\n event.persist();\n mobileBlurEventRef.current = event;\n return;\n }\n\n if (canUseMobileNativeTimePicker) {\n if (isFocusMovedToNativePicker(event)) {\n return;\n }\n\n // Ввод в мобильной версии не идет через поле, но незакоммиченное значение могло остаться\n // от десктопной версии, если верстка сменилась посреди ввода.\n if (isInputFocused) {\n setIsInputFocused(false);\n resetMouseInteractionState();\n commitEditingValue();\n }\n\n emitBlur(event);\n return;\n }\n\n // Инпут закрытого попапа фокуса уже не держит, но его blur может прийти на размонтировании.\n if (isMobilePopupInput) {\n return;\n }\n\n setIsInputFocused(false);\n resetMouseInteractionState();\n closeDropdown();\n commitEditingValue();\n emitBlur(event);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => handleBlurBySource(event, false);\n\n const handleMobileBlur = (event: React.FocusEvent<HTMLInputElement>) => handleBlurBySource(event, true);\n\n const handleClick = (event: React.MouseEvent<HTMLInputElement>) => {\n if (canUseMobileNativeTimePicker) {\n openNativeTimePicker();\n } else {\n openDropdown();\n }\n\n onClick?.(event);\n };\n\n const handleMouseDownCaptureBySource = (event: React.MouseEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n if (canUseMobileNativeTimePicker || (canUseMobileDropdownTimePicker && !isMobilePopupInput)) {\n return;\n }\n\n const currentInputRef = isMobilePopupInput ? mobileInputRef : inputRef;\n const segment = currentInputRef.current?.getSegment(event.target) ?? null;\n\n if (isInputFocused && segment === null) {\n event.preventDefault();\n }\n\n isMouseFocusRef.current = !isInputFocused;\n mouseDownSegmentRef.current = segment;\n };\n\n const handleMouseDownCapture = (event: React.MouseEvent<HTMLInputElement>) =>\n handleMouseDownCaptureBySource(event, false);\n\n const handleMobileMouseDownCapture = (event: React.MouseEvent<HTMLInputElement>) =>\n handleMouseDownCaptureBySource(event, true);\n\n const handleMouseUpBySource = (_event: React.MouseEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n if (disabled || canUseMobileNativeTimePicker || (canUseMobileDropdownTimePicker && !isMobilePopupInput)) {\n return;\n }\n\n syncSelectionWithDOM();\n };\n\n const handleMouseUp = (event: React.MouseEvent<HTMLInputElement>) => handleMouseUpBySource(event, false);\n\n const handleMobileMouseUp = (event: React.MouseEvent<HTMLInputElement>) => handleMouseUpBySource(event, true);\n\n const handleSelectSegmentByMouseBySource = (segment: TimeSegment, isMobilePopupInput: boolean) => {\n if (canUseMobileNativeTimePicker) {\n openNativeTimePicker();\n return;\n }\n\n if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {\n openDropdown();\n return;\n }\n\n openDropdown();\n\n if (disabled) {\n return;\n }\n\n if (!(isMouseFocusRef.current && isTimeDisplayEmpty(editingValueRef.current)) && selectedSegment !== segment) {\n normalizeCurrentSegmentIfNeeded(selectedSegment);\n selectSegment(segment);\n }\n\n resetMouseInteractionState();\n };\n\n const handleSelectSegmentByMouse = (segment: TimeSegment) => handleSelectSegmentByMouseBySource(segment, false);\n\n const handleMobileSelectSegmentByMouse = (segment: TimeSegment) =>\n handleSelectSegmentByMouseBySource(segment, true);\n\n const handleKeyDownBySource = (event: React.KeyboardEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n onKeyDown?.(event);\n\n if (event.defaultPrevented || disabled) {\n return;\n }\n\n if (canUseMobileNativeTimePicker) {\n openNativeTimePicker();\n return;\n }\n\n if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {\n openDropdown();\n return;\n }\n\n if (isShortcutSelectAll(event)) {\n event.preventDefault();\n selectAll();\n return;\n }\n\n if (event.altKey || event.ctrlKey || event.metaKey) {\n return;\n }\n\n const currentDisplayValue = displayValue;\n const currentSegment = selectedSegment;\n const hasAllSelectionInState = selection === 'all';\n const hasAllSelectionInDOM = getActiveInput()?.isAllSelected() ?? false;\n const shouldHandleAsAllSelection = hasAllSelectionInState || hasAllSelectionInDOM;\n\n if (hasAllSelectionInDOM && !hasAllSelectionInState) {\n syncSelectionWithDOM();\n }\n\n if (shouldHandleAsAllSelection && (isKeyBackspace(event) || isKeyDelete(event))) {\n event.preventDefault();\n openDropdown();\n updateEditingValueAfterUserEdit(getEmptyDisplayValue(format));\n selectSegment('hours');\n return;\n }\n\n if (DIGIT_REGEXP.test(event.key)) {\n event.preventDefault();\n\n openDropdown();\n\n const nextDigitInputValue = shouldHandleAsAllSelection ? getEmptyDisplayValue(format) : currentDisplayValue;\n\n const nextDigitInputSegment = shouldHandleAsAllSelection ? 'hours' : currentSegment;\n\n const result = formatDigitToTimeSegment(nextDigitInputValue, nextDigitInputSegment, event.key, format);\n\n // Отклоненная цифра не меняет ни значение, ни список, поэтому и подсветку трогать нельзя:\n // автоподсветка не восстановится, а Enter выбрал бы не тот элемент, который видит пользователь.\n if (result.shouldBlink) {\n handleUnexpectedInput(event.key);\n return;\n }\n\n resetHighlightedItem();\n\n updateEditingValueAfterUserEdit(result.nextValue);\n selectSegment(result.selectedSegment);\n return;\n }\n\n if (isKeyArrowLeft(event)) {\n event.preventDefault();\n normalizeCurrentSegmentIfNeeded(currentSegment);\n selectSegment(getPreviousTimeSegment(currentSegment) ?? currentSegment);\n return;\n }\n\n if (isModShift(isKeyTab)(event)) {\n const previousSegment = getPreviousTimeSegment(currentSegment);\n\n if (previousSegment) {\n event.preventDefault();\n normalizeCurrentSegmentIfNeeded(currentSegment);\n selectSegment(previousSegment);\n }\n return;\n }\n\n if (isKeyArrowRight(event)) {\n event.preventDefault();\n normalizeCurrentSegmentIfNeeded(currentSegment);\n selectSegment(getNextTimeSegment(currentSegment, format) ?? currentSegment);\n return;\n }\n\n if (isKeyTab(event)) {\n const nextSegment = getNextTimeSegment(currentSegment, format);\n\n if (nextSegment) {\n event.preventDefault();\n normalizeCurrentSegmentIfNeeded(currentSegment);\n selectSegment(nextSegment);\n }\n return;\n }\n\n if (isKeyArrowUp(event) || isKeyArrowDown(event)) {\n event.preventDefault();\n\n const itemStep = isKeyArrowUp(event) ? -1 : 1;\n\n if (tryNavigateItems(itemStep)) {\n return;\n }\n\n const step = isKeyArrowUp(event) ? 1 : -1;\n\n updateEditingValueAfterUserEdit(shiftTimeSegmentValue(currentDisplayValue, currentSegment, step, format));\n selectSegment(currentSegment);\n return;\n }\n\n if (isKeyBackspace(event)) {\n event.preventDefault();\n openDropdown();\n\n let nextDisplayValue = deleteTimeSegmentDigit(currentDisplayValue, currentSegment, format);\n let nextSegment = currentSegment;\n\n if (nextDisplayValue === currentDisplayValue) {\n const previousSegment = getPreviousTimeSegment(currentSegment);\n\n if (previousSegment) {\n nextSegment = previousSegment;\n nextDisplayValue = deleteTimeSegmentDigit(currentDisplayValue, previousSegment, format);\n }\n }\n\n updateEditingValueAfterUserEdit(nextDisplayValue);\n selectSegment(nextSegment);\n return;\n }\n\n if (isKeyDelete(event)) {\n event.preventDefault();\n openDropdown();\n updateEditingValueAfterUserEdit(replaceTimeSegment(currentDisplayValue, currentSegment, EMPTY_SEGMENT, format));\n selectSegment(currentSegment);\n return;\n }\n\n if (isKeyEscape(event)) {\n if (isDropdownOpened) {\n event.preventDefault();\n\n closeOpenedDropdown();\n }\n return;\n }\n\n if (isKeyEnter(event)) {\n if (isSourceFailed) {\n event.preventDefault();\n retrySource();\n return;\n }\n\n if (isSelectHighlightedItem(event)) {\n event.preventDefault();\n return;\n }\n\n if (isMobileDropdownActive) {\n event.preventDefault();\n closeOpenedDropdown();\n return;\n }\n\n // Enter не выбирает элемент, а лишь подтверждает введенное значение, как потеря фокуса.\n commitEditingValue();\n blinkInput();\n\n if (isDropdownOpened) {\n event.preventDefault();\n closeDropdown();\n }\n return;\n }\n\n if (isKeySpace(event)) {\n event.preventDefault();\n\n const nextSegment = getNextTimeSegment(currentSegment, format);\n const nextDisplayValue = commitTimeSegmentOnLeave(currentDisplayValue, currentSegment, format);\n\n updateEditingValueAfterUserEdit(nextDisplayValue);\n\n if (nextSegment) {\n selectSegment(nextSegment);\n } else {\n selectSegment(currentSegment);\n }\n return;\n }\n\n if (isKeyChar(event)) {\n event.preventDefault();\n handleUnexpectedInput(event.key);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => handleKeyDownBySource(event, false);\n\n const handleMobileKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => handleKeyDownBySource(event, true);\n\n const handlePasteBySource = (event: React.ClipboardEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n onPaste?.(event);\n\n if (event.defaultPrevented || disabled) {\n return;\n }\n\n if (canUseMobileNativeTimePicker || (canUseMobileDropdownTimePicker && !isMobilePopupInput)) {\n return;\n }\n\n const pastedValue = event.clipboardData?.getData('text') ?? EMPTY_VALUE;\n\n event.preventDefault();\n\n if (pastedValue.trim() === EMPTY_VALUE) {\n return;\n }\n\n const nextDisplayValue = parsePastedTimeValue(pastedValue, format);\n\n if (isTimeDisplayEmpty(nextDisplayValue)) {\n handleUnexpectedInput(pastedValue);\n return;\n }\n\n openDropdown();\n updateEditingValueAfterUserEdit(nextDisplayValue);\n selectSegment('hours');\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => handlePasteBySource(event, false);\n\n const handleMobilePaste = (event: React.ClipboardEvent<HTMLInputElement>) => handlePasteBySource(event, true);\n\n return (\n <CommonWrapper {...props}>\n <span ref={rootRef} className={styles.root()} data-tid={TimePickerDataTids.root}>\n <TimeInput\n {...inputProps}\n data-tid={TimePickerDataTids.input}\n ref={inputRef}\n disabled={disabled}\n hasDropdown={hasDropdown}\n size={size}\n format={format}\n corners={corners}\n rightIcon={inputRightIcon}\n suffix={suffix}\n value={displayValue}\n aria-haspopup={hasDropdown ? 'listbox' : undefined}\n aria-expanded={\n !isMobileDropdownActive && hasDropdown && isDropdownOpened && hasDropdownContent ? true : undefined\n }\n aria-controls={\n !isMobileDropdownActive && hasDropdown && isDropdownOpened && hasDropdownContent ? popupId : undefined\n }\n aria-activedescendant={isMobileDropdownActive ? undefined : activeDescendantId}\n aria-placeholder={ariaPlaceholder}\n aria-busy={isLoadingItems || undefined}\n onClick={handleClick}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onMouseDownCapture={handleMouseDownCapture}\n onMouseUp={handleMouseUp}\n onKeyDown={handleKeyDown}\n onSelectSegment={handleSelectSegmentByMouse}\n onPaste={handlePaste}\n />\n\n {canUseMobileNativeTimePicker && (\n <NativeTimeInput\n data-tid={TimePickerDataTids.nativeInput}\n disabled={disabled}\n ref={nativeInputRef}\n format={format}\n minTime={minTime}\n maxTime={maxTime}\n value={editingValue}\n onValueChange={commitValue}\n onBlur={emitBlur}\n />\n )}\n\n {isMobileDropdownActive && (\n <TimePickerMobilePopup\n id={popupId}\n value={displayValue}\n inputRef={mobileInputRef}\n disabled={disabled}\n format={format}\n size={size}\n rightIcon={inputRightIcon}\n suffix={suffix}\n resolvedItems={resolvedItems}\n renderItem={renderItem}\n isLoading={isLoadingItems}\n isFailed={isSourceFailed}\n errorNetworkButton={locale.errorNetworkButton}\n errorNetworkMessage={locale.errorNetworkMessage}\n highlightedItemIndex={highlightedItemIndex}\n selectedValue={selectedValue}\n itemRefs={itemRefs}\n error={props.error}\n warning={props.warning}\n aria-describedby={props['aria-describedby']}\n aria-label={props['aria-label']}\n aria-placeholder={ariaPlaceholder}\n aria-haspopup={'listbox'}\n aria-expanded={resolvedItems.length > 0 || isLoadingItems || isSourceFailed ? true : undefined}\n aria-controls={resolvedItems.length > 0 || isLoadingItems || isSourceFailed ? popupId : undefined}\n aria-activedescendant={activeDescendantId}\n onFocus={handleMobileFocus}\n onBlur={handleMobileBlur}\n onClick={handleClick}\n onKeyDown={handleMobileKeyDown}\n onMouseDownCapture={handleMobileMouseDownCapture}\n onMouseUp={handleMobileMouseUp}\n onPaste={handleMobilePaste}\n onSelectSegment={handleMobileSelectSegmentByMouse}\n onRetry={retrySource}\n onSelectItem={selectItem}\n onCloseRequest={closeOpenedDropdown}\n />\n )}\n\n {hasDropdown &&\n !canUseMobileNativeTimePicker &&\n !canUseMobileDropdownTimePicker &&\n isDropdownOpened &&\n hasDropdownContent &&\n rootRef.current && (\n <TimePickerPopup\n id={popupId}\n anchorElement={rootRef.current}\n menuPos={menuPos}\n menuAlign={menuAlign}\n menuWidth={menuWidth}\n popupMaxHeight={popupMaxHeight}\n format={format}\n size={size}\n resolvedItems={resolvedItems}\n renderItem={renderItem}\n isLoading={isLoadingItems}\n isFailed={isSourceFailed}\n errorNetworkButton={locale.errorNetworkButton}\n errorNetworkMessage={locale.errorNetworkMessage}\n highlightedItemIndex={highlightedItemIndex}\n selectedValue={selectedValue}\n itemRefs={itemRefs}\n onRetry={retrySource}\n onSelectItem={selectItem}\n />\n )}\n </span>\n </CommonWrapper>\n );\n }),\n { validate: validateTimePicker },\n) as unknown as TimePickerComponent;\n"]}
1
+ {"version":3,"file":"TimePicker.js","sourceRoot":"","sources":["TimePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { AriaAttributes, HTMLAttributes, ReactNode } from 'react';\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport type { CommonProps } from '../../internal/CommonWrapper/index.js';\nimport { CommonWrapper } from '../../internal/CommonWrapper/index.js';\nimport { extractCommonProps } from '../../internal/CommonWrapper/utils/extractCommonProps.js';\nimport { LoadingIcon } from '../../internal/icons2022/LoadingIcon.js';\nimport type { NativeTimeInputRef } from '../../internal/NativeTimeInput/index.js';\nimport { NativeTimeInput } from '../../internal/NativeTimeInput/index.js';\nimport type { TimeInputRef } from '../../internal/TimeInput/index.js';\nimport { TimeInput } from '../../internal/TimeInput/index.js';\nimport { isIOS } from '../../lib/client.js';\nimport {\n isKeyArrowDown,\n isKeyArrowLeft,\n isKeyArrowRight,\n isKeyArrowUp,\n isKeyBackspace,\n isKeyChar,\n isKeyDelete,\n isKeyEnter,\n isKeyEscape,\n isKeySpace,\n isKeyTab,\n isModShift,\n isShortcutSelectAll,\n} from '../../lib/events/keyboard/identifiers.js';\nimport { forwardRefAndName } from '../../lib/forwardRefAndName.js';\nimport { useLocaleForControl } from '../../lib/locale/useLocaleForControl.js';\nimport { useStyles } from '../../lib/renderEnvironment/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport { getRandomID, type NoInfer } from '../../lib/utils.js';\nimport type { MenuItemState } from '../MenuItem/index.js';\nimport { useResponsiveLayout } from '../ResponsiveLayout/index.js';\nimport { scrollSelectedItemIntoView } from './helpers/scrollSelectedItemIntoView.js';\nimport { DIGIT_REGEXP, EMPTY_SEGMENT, EMPTY_VALUE, TimePickerDataTids } from './helpers/TimePicker.constants.js';\nimport {\n commitTimeSegmentOnLeave,\n deleteTimeSegmentDigit,\n formatDigitToTimeSegment,\n shiftTimeSegmentValue,\n} from './helpers/TimePicker.editing.js';\nimport { getTimePickerPopupMaxHeight } from './helpers/TimePicker.layout.js';\nimport { getNextTimeSegment, getPreviousTimeSegment } from './helpers/TimePicker.selection.js';\nimport {\n isNavigableMenuElement,\n isTimeItem,\n isTimeItemObject,\n isTimeMenuItem,\n type TimeFormat,\n type TimeItem,\n type TimePickerEmptyItem,\n type TimePickerMenuItem,\n type TimeItemValue,\n type TimePickerSource,\n type TimePickerValue,\n type TimePickerValueToItem,\n type TimeSegment,\n timeValueToItem,\n} from './helpers/TimePicker.shared.js';\nimport {\n filterTimeItems,\n getEmptyDisplayValue,\n getTimeFilterQuery,\n getTimeValueString,\n isTimeDisplayEmpty,\n normalizeTimeValue,\n parsePastedTimeValue,\n replaceTimeSegment,\n resolveTimeItems,\n} from './helpers/TimePicker.value.js';\nimport { validateTimePicker } from './helpers/validateTimePicker.js';\nimport { useTimePickerDropdown } from './hooks/useTimePickerDropdown.js';\nimport { useTimePickerSelection } from './hooks/useTimePickerSelection.js';\nimport { useTimePickerSource } from './hooks/useTimePickerSource.js';\nimport { useTimePickerValue } from './hooks/useTimePickerValue.js';\nimport { TimePickerLocaleHelper } from './locale/index.js';\nimport { getStyles } from './TimePicker.styles.js';\nimport { TimePickerMobilePopup } from './TimePickerMobilePopup.js';\nimport { TimePickerPopup } from './TimePickerPopup.js';\n\n/** Пустой список для клавиатуры: не создает новую ссылку на каждый рендер. */\nconst EMPTY_MENU_ITEMS: Array<TimePickerMenuItem<TimeItemValue>> = [];\n\nexport interface TimePickerProps<T extends TimeItemValue = string>\n extends\n CommonProps,\n Pick<AriaAttributes, 'aria-describedby' | 'aria-label'>,\n Pick<HTMLAttributes<HTMLElement>, 'id'> {\n /** Устанавливает формат времени @default HH:mm */\n format?: TimeFormat;\n /** Задает источник элементов выпадающего списка: массив либо функцию запроса,\n * которая возвращает массив или Promise с массивом.\n * Запрос — это введенные цифры сегментов с сохранением их позиций: `12`, `12:3`, а если заполнены только минуты — `:30`.\n * Элементы задаются либо строками со временем — `'09:00'`, — либо объектами `{ value, label?, disabled? }`\n * с любыми дополнительными полями; смешивать формы в одном источнике нельзя, это ошибка типов.\n * Выбранный элемент приходит в `onValueChange` в той же форме.\n * Кроме значений времени можно передать React-элементы — например `MenuHeader` или `MenuItem`:\n * они отображаются в меню, но не участвуют в фильтрации и выборе значения.\n * Фильтрацию, индикацию загрузки и повторные запросы компонент берет на себя,\n * подробности — в разделе документации про выпадающий список.\n * Замена самой функции уже открытый список не перезапрашивает: как в `ComboBox`,\n * актуальная функция используется при следующем запросе. */\n source?: TimePickerSource<T>;\n /** Отрисовывает значение времени в выпадающем списке. Не применяется к React-элементам из `source`. */\n renderItem?: (item: T, state: MenuItemState) => ReactNode;\n /** Задает нижнюю границу времени. Элементы за границей становятся заблокированными. */\n minTime?: string;\n /** Задает верхнюю границу времени. Элементы за границей становятся заблокированными. */\n maxTime?: string;\n /** Задает значение поля: элемент того же типа, что в `source`, либо строку в формате `HH:mm[:ss]`.\n * Из элемента-объекта используется только время `value`, `label` в поле не отображается.\n * Пустое значение можно передать как `''` или `null`.\n * Если проп не задан, компонент неконтролируемый: он хранит значение сам и сообщает о нем через `onValueChange`. */\n value?: TimePickerValue<T>;\n /** Преобразует время в элемент.\n * Применяется ко временам, которые пользователь не выбрал из `source`:\n * ручной ввод, изменение стрелками, вставка из буфера, нативный пикер.\n * По умолчанию компонент повторяет форму элементов `source` и `value`:\n * для строк отдает строку, для объектов — `{ value }`.\n * Задавайте этот проп, если элементы содержат поля, кроме `value`, `label` и `disabled`:\n * форму элементов функции-источника компонент узнает только после ее первого ответа.\n * @default (value) => value | ({ value }) */\n valueToItem?: TimePickerValueToItem<T>;\n /** Устанавливает фокус на поле ввода после окончания загрузки страницы @default false */\n autoFocus?: boolean;\n /** Делает компонент заблокированным. */\n disabled?: boolean;\n /** Переводит контрол в состояние валидации ошибки. */\n error?: boolean;\n /** Переводит контрол в состояние валидации предупреждения. */\n warning?: boolean;\n /** Включает нативный системный выбор времени в мобильной верстке.\n * Мобильная верстка определяется медиавыражением темы, как в остальных адаптивных контролах. */\n useMobileNativeTimePicker?: boolean;\n /** Расположение выпадающего меню. */\n menuPos?: 'top' | 'bottom';\n /** Выравнивание выпадающего меню. */\n menuAlign?: 'left' | 'right';\n /** Ширина выпадающего меню. По умолчанию — минимальная ширина поля ввода, расширяется по контенту. */\n menuWidth?: string | number;\n /** Задает ширину поля. */\n width?: string | number;\n /** Переопределяет иконку или скрывает, если передать `null`.\n * Пока элементы уже показаны, а новый запрос к функции-источнику еще выполняется,\n * вместо иконки показывается индикатор загрузки. */\n rightIcon?: React.ReactNode | (() => React.ReactNode);\n /** Устанавливает суффикс после значения и перед иконкой. */\n suffix?: ReactNode;\n /** Размер поля ввода и выпадающего меню. */\n size?: SizeProp;\n /** Устанавливает радиус скруглений углов.\n * @ignore */\n corners?: Partial<\n Pick<\n React.CSSProperties,\n 'borderTopRightRadius' | 'borderBottomRightRadius' | 'borderBottomLeftRadius' | 'borderTopLeftRadius'\n >\n >;\n /** Задает функцию, которая вызывается при нажатии на контрол. */\n onClick?(event: React.MouseEvent<HTMLElement>): void;\n /**\n * Событие изменения значения `value`.\n * Вызывается при коммите значения: потере фокуса, нажатии Enter, выборе элемента из списка\n * или изменении в нативном пикере.\n * Элемент приходит в той же форме, в которой элементы переданы в `source`:\n * при выборе из выпадающего списка — тот же элемент, в остальных случаях — результат `valueToItem`.\n * Пустое значение приходит пустой строкой в строковой форме и `null` — в объектной.\n * Время элемента полностью нормализовано до формата `HH:mm[:ss]`,\n * у элемента-объекта его можно прочитать из `item.value`.\n * Тип элемента выводится из `source` и `value`, но не из этого обработчика,\n * иначе `onValueChange={setItem}` сузил бы его до `TimeItem`.\n */\n onValueChange?(item: NoInfer<T> | TimePickerEmptyItem<T>): void;\n /**\n * Событие изменения значения в процессе ввода.\n * Значение частично нормализуется по сегментам, например `1` => `01`, незаполненный хвост отбрасывается.\n * Промежуточное значение может не соответствовать полной форме `HH:mm[:ss]`, поэтому тип — произвольная строка.\n */\n onInputValueChange?(value: string): void;\n /**\n * Событие некорректного ввода: пользователь ввел или вставил значение, которое не может быть временем.\n * Вызывается с нажатой клавишей — например `а` или `,` — либо со значением из буфера,\n * из которого не получилось собрать время.\n * Значение вне диапазона `minTime`/`maxTime` некорректным вводом не считается,\n * его можно проверить через `TimePicker.validate`.\n * Вторым аргументом передается метод вспыхивания рамки поля.\n * Если обработчик не задан, поле вспыхивает само.\n * Обработчик может подставить значение вместо некорректного ввода — например разобрать вставку\n * в собственном формате: возвращенный элемент коммитится и приходит в `onValueChange`,\n * `null` очищает поле, а `undefined` оставляет значение прежним.\n */\n onUnexpectedInput?(value: string, blink: () => void): void | NoInfer<T> | null;\n /**\n * Событие потери фокуса.\n * Вызывается после коммита значения и следующего за ним рендера,\n * поэтому обработчик видит уже измененное значение — например при выборе элемента в мобильном попапе.\n * Из-за этого событие приходит отложенно и его `currentTarget` уже пуст: элемент читайте из `target`.\n */\n onBlur?(event: React.FocusEvent<HTMLElement>): void;\n /** Событие получения фокуса. */\n onFocus?(event: React.FocusEvent<HTMLElement>): void;\n /** Событие нажатия клавиши. */\n onKeyDown?(event: React.KeyboardEvent<HTMLElement>): void;\n /** Событие вставки из буфера. */\n onPaste?(event: React.ClipboardEvent<HTMLElement>): void;\n}\n\nexport interface TimePickerRef {\n /** Устанавливает фокус на поле ввода.\n * С опцией `withoutOpenDropdown` фокус не открывает выпадающее меню. */\n focus(options?: { withoutOpenDropdown?: boolean }): void;\n /** Снимает фокус с поля ввода. */\n blur(): void;\n /** Открывает выпадающее меню, установив фокус на поле.\n * В режиме нативного пикера открывает системный пикер. */\n open(): void;\n /** Закрывает выпадающее меню. */\n close(): void;\n /** Запускает анимацию blink у поля ввода времени. */\n blink(): void;\n /** Возвращает корневой DOM-узел компонента. */\n getRootNode(): HTMLElement | null;\n}\n\nexport type TimePicker = TimePickerRef;\n\ninterface TimePickerComponent {\n /** Строковый режим: элементы source — строки со временем. */\n (props: TimePickerProps<string> & React.RefAttributes<TimePickerRef>): React.ReactElement | null;\n /** Объектный режим: элементы source — объекты, расширяющие `{ value: string }`. */\n <T extends TimeItem>(props: TimePickerProps<T> & React.RefAttributes<TimePickerRef>): React.ReactElement | null;\n displayName?: string;\n __KONTUR_REACT_UI__: string;\n /** Проверяет, что значение полностью заполнено, соответствует формату и попадает в диапазон `minTime`/`maxTime`. */\n validate: typeof validateTimePicker;\n}\n\n/** Поле с временем помогает пользователю быстро и удобно указать время в правильном формате.\n * В поле можно ввести время с клавиатуры либо выбрать из выпадающего списка,\n * передав массив или функцию в проп `source`.\n */\nexport const TimePicker = Object.assign(\n forwardRefAndName<TimePickerRef, TimePickerProps<TimeItemValue>>('TimePicker', (props, ref) => {\n // `className`, `style` и data-атрибуты применяет `CommonWrapper` к корневому элементу,\n // поэтому в поле ввода они не должны уехать повторно.\n const [, notCommonProps] = extractCommonProps(props);\n\n const {\n disabled,\n useMobileNativeTimePicker = false,\n format = 'HH:mm',\n size = 'small',\n source,\n renderItem,\n menuPos,\n menuAlign,\n menuWidth,\n minTime,\n maxTime,\n rightIcon,\n suffix,\n corners,\n value,\n valueToItem,\n onValueChange,\n onInputValueChange,\n onUnexpectedInput,\n onFocus,\n onBlur,\n onClick,\n onKeyDown,\n onPaste,\n ...inputProps\n } = notCommonProps;\n\n const theme = useContext(ThemeContext);\n\n const styles = useStyles(getStyles);\n const locale = useLocaleForControl('TimePicker', TimePickerLocaleHelper);\n\n const [isInputFocused, setIsInputFocused] = useState(false);\n\n const inputRef = useRef<TimeInputRef>(null);\n const mobileInputRef = useRef<TimeInputRef>(null);\n const nativeInputRef = useRef<NativeTimeInputRef>(null);\n const rootRef = useRef<HTMLSpanElement>(null);\n const itemRefs = useRef(new Map<number, HTMLSpanElement>());\n const isMouseFocusRef = useRef(false);\n /** Сегмент, по которому нажали мышью, или `null`, если нажали мимо сегментов. */\n const mouseDownSegmentRef = useRef<TimeSegment | null>(null);\n const mobileBlurEventRef = useRef<React.FocusEvent<HTMLInputElement> | null>(null);\n const shouldSkipOpenOnFocusRef = useRef(false);\n /**\n * Контрол считает себя сфокусированным: о фокусе сообщено наружу, а сессия ввода не закончена.\n * Внутри одной сессии фокус может переезжать между полем и инпутом мобильного попапа —\n * например вместе со сменой верстки, — и такой переезд не начинает сессию заново.\n */\n const isControlFocusedRef = useRef(false);\n /** Фокус, который контрол сам переводит в скрытый нативный инпут, открывая системный пикер. */\n const isMovingFocusToNativePickerRef = useRef(false);\n const popupIdRef = useRef(TimePickerDataTids.popup + getRandomID());\n\n /**\n * Мобильная версия включается медиавыражением темы, как в ComboBox:\n * поле переключается между мобильной и десктопной версией вместе с версткой страницы.\n */\n const { isMobile: isMobileLayout } = useResponsiveLayout();\n const canUseMobileNativeTimePicker = useMobileNativeTimePicker && isMobileLayout;\n\n const isSourceFunction = typeof source === 'function';\n const hasDropdown = isSourceFunction || (Array.isArray(source) && source.length > 0);\n\n const [isDropdownOpened, setIsDropdownOpened] = useState(false);\n const [isEditedAfterOpen, setIsEditedAfterOpen] = useState(false);\n\n /**\n * Форма элементов функции-источника: последняя, о которой компонент знает.\n * Форма запоминается, потому что элементы функции очищаются при закрытии меню,\n * а коммит значения после закрытия должен отдать наружу элемент той же формы.\n * Для массива форма всегда считается по текущим элементам — запоминать нечего.\n */\n const lastSourceItemShapeRef = useRef<boolean | null>(null);\n\n /**\n * Форма элемента, который компонент собирает для времени без элемента.\n * Повторяет форму элементов источника, а если их нет — форму внешнего `value`,\n * чтобы наружу уходило то же, что пришло внутрь.\n * Значение читается при коммите, поэтому обновляется в эффекте: так его не меняет отброшенный рендер.\n */\n const shouldBuildItemAsObjectRef = useRef(false);\n\n const valueToItemRef = useRef(valueToItem);\n valueToItemRef.current = valueToItem;\n\n const handleCommitValue = useCallback(\n (nextValue: string, item: TimeItemValue | null) => {\n if (!onValueChange) {\n return;\n }\n\n if (nextValue === EMPTY_VALUE) {\n // Пустое значение повторяет форму элементов: у объектов элемента нет, а строка остается строкой.\n onValueChange(shouldBuildItemAsObjectRef.current ? null : EMPTY_VALUE);\n return;\n }\n\n const nextItem =\n item ??\n valueToItemRef.current?.(nextValue) ??\n timeValueToItem<TimeItemValue>(nextValue, shouldBuildItemAsObjectRef.current);\n\n onValueChange(nextItem);\n },\n [onValueChange],\n );\n\n const onBlurRef = useRef(onBlur);\n onBlurRef.current = onBlur;\n\n const pendingBlurEventRef = useRef<React.FocusEvent<HTMLInputElement> | null>(null);\n const [blurRequestId, setBlurRequestId] = useState(0);\n\n /**\n * Завершает сессию фокуса и откладывает `onBlur` до конца рендера, как это делает ComboBox.\n * Значение коммитится синхронно с потерей фокуса, поэтому вызванный тут же `onBlur`\n * попал бы в обработчик с состоянием родителя до изменения значения — например с пустым временем.\n * Событие может отсутствовать: сессия все равно закрывается, но наружу ничего не уходит.\n */\n const emitBlur = useCallback((event: React.FocusEvent<HTMLInputElement> | null) => {\n if (!isControlFocusedRef.current) {\n return;\n }\n\n isControlFocusedRef.current = false;\n\n if (!event || !onBlurRef.current) {\n return;\n }\n\n event.persist();\n pendingBlurEventRef.current = event;\n setBlurRequestId((currentId) => currentId + 1);\n }, []);\n\n const flushPendingBlur = useCallback(() => {\n const pendingBlurEvent = pendingBlurEventRef.current;\n\n if (!pendingBlurEvent) {\n return;\n }\n\n pendingBlurEventRef.current = null;\n onBlurRef.current?.(pendingBlurEvent);\n }, []);\n\n useEffect(flushPendingBlur, [blurRequestId, flushPendingBlur]);\n\n /** Родитель мог убрать поле в ответ на коммит значения — отложенное событие все равно должно уйти. */\n useEffect(() => flushPendingBlur, [flushPendingBlur]);\n\n const {\n editingValue,\n editingValueRef,\n committedValue,\n updateEditingValue,\n commitEditingValue,\n commitValue,\n commitItem,\n } = useTimePickerValue({\n isInputFocused,\n format,\n externalValue: getTimeValueString(value),\n isValueControlled: value !== undefined,\n onCommitValue: handleCommitValue,\n onInputValueChange,\n });\n\n const filterQuery = isEditedAfterOpen ? getTimeFilterQuery(editingValue, format) : EMPTY_VALUE;\n\n const {\n items: sourceValueItems,\n fetchedQuery: fetchedItemsQuery,\n isLoading: isLoadingItems,\n isFailed: isSourceFailed,\n retry: retrySource,\n } = useTimePickerSource<TimeItemValue>({ source, format, isDropdownOpened, filterQuery });\n\n useEffect(() => {\n if (!isSourceFunction || sourceValueItems.some(isTimeItem)) {\n lastSourceItemShapeRef.current = sourceValueItems.some((item) => isTimeItem(item) && isTimeItemObject(item));\n }\n\n shouldBuildItemAsObjectRef.current =\n lastSourceItemShapeRef.current === true || (value !== null && value !== undefined && isTimeItemObject(value));\n }, [isSourceFunction, sourceValueItems, value]);\n\n const resolvedItems = useMemo(\n () => resolveTimeItems(filterTimeItems(sourceValueItems, filterQuery, format), format, minTime, maxTime),\n [filterQuery, format, maxTime, minTime, sourceValueItems],\n );\n\n const popupMaxHeight = getTimePickerPopupMaxHeight(size, theme);\n\n const ariaPlaceholder = format === 'HH:mm' ? locale.ariaPlaceholderHHMM : locale.ariaPlaceholderHHMMSS;\n\n /**\n * Время, отмеченное в меню выбранным.\n * Пока пользователь не начал править значение при открытом меню, это то же время, что в поле.\n * С началом правки отмечено остается закоммиченное значение: набор фильтра — например `10` —\n * не должен отмечать элемент `10:00` как уже выбранный.\n */\n const selectedValue = normalizeTimeValue(isEditedAfterOpen ? committedValue : editingValue, format);\n\n const selectedItemIndex = resolvedItems.findIndex(\n (item) => isTimeMenuItem(item) && normalizeTimeValue(item.value, format) === selectedValue,\n );\n\n let autoHighlightKey: string | null = null;\n\n if (filterQuery !== EMPTY_VALUE) {\n if (isSourceFunction) {\n if (!isLoadingItems && fetchedItemsQuery === filterQuery) {\n autoHighlightKey = `source-function:${filterQuery}`;\n }\n } else {\n autoHighlightKey = `source-array:${filterQuery}`;\n }\n }\n\n const canUseMobileDropdownTimePicker = hasDropdown && isMobileLayout && !canUseMobileNativeTimePicker;\n /** Ввод идет в мобильном попапе: он открыт, а нативного пикера в этом режиме нет. */\n const isMobileDropdownActive = canUseMobileDropdownTimePicker && isDropdownOpened;\n\n /**\n * Меню с одними лишь заголовками и разделителями показывать не о чем,\n * поэтому при активном фильтре нужен хотя бы один подошедший элемент со временем.\n */\n const hasDropdownContent =\n isLoadingItems ||\n isSourceFailed ||\n (filterQuery === EMPTY_VALUE ? resolvedItems.length > 0 : resolvedItems.some(isTimeMenuItem));\n\n /**\n * Элементы, с которыми работает клавиатура.\n * Пока меню скрыто, их нет: иначе стрелки ходили бы по невидимому списку,\n * а Enter выбирал бы невидимый элемент вместо коммита введенного времени.\n */\n const menuItems = hasDropdownContent ? resolvedItems : EMPTY_MENU_ITEMS;\n\n const inputRightIcon =\n isLoadingItems && resolvedItems.length > 0 ? (\n <span data-tid={TimePickerDataTids.inputLoading}>\n <LoadingIcon size={size} />\n </span>\n ) : (\n rightIcon\n );\n\n /** Сфокусированное поле всегда показывает сегменты, а пустое без фокуса — ничего. */\n const getDisplayValue = (): string => {\n if (isInputFocused) {\n return editingValue || getEmptyDisplayValue(format);\n }\n\n return isTimeDisplayEmpty(editingValue) ? EMPTY_VALUE : editingValue;\n };\n\n const displayValue = getDisplayValue();\n\n const resetMouseInteractionState = useCallback(() => {\n isMouseFocusRef.current = false;\n mouseDownSegmentRef.current = null;\n }, []);\n\n const updateEditingValueAfterUserEdit = useCallback(\n (nextEditingValue: string) => {\n if (hasDropdown && editingValueRef.current !== nextEditingValue) {\n setIsEditedAfterOpen(true);\n }\n\n updateEditingValue(nextEditingValue);\n },\n [editingValueRef, hasDropdown, updateEditingValue],\n );\n\n const normalizeCurrentSegmentIfNeeded = useCallback(\n (segment: TimeSegment) => {\n const nextDisplayValue = commitTimeSegmentOnLeave(\n editingValue === EMPTY_VALUE ? getEmptyDisplayValue(format) : editingValue,\n segment,\n format,\n );\n\n updateEditingValueAfterUserEdit(nextDisplayValue);\n },\n [editingValue, format, updateEditingValueAfterUserEdit],\n );\n\n const openNativeTimePicker = useCallback(() => {\n if (!canUseMobileNativeTimePicker || disabled) {\n return;\n }\n\n // На iOS системный пикер открывается только фокусом, поэтому фокус уходит из поля в скрытый инпут.\n isMovingFocusToNativePickerRef.current = true;\n\n if (isIOS) {\n nativeInputRef.current?.focus();\n } else {\n nativeInputRef.current?.click();\n }\n\n isMovingFocusToNativePickerRef.current = false;\n }, [canUseMobileNativeTimePicker, disabled]);\n\n /** Фокус ушел в скрытый нативный инпут: для внешнего мира контрол остается активным. */\n const isFocusMovedToNativePicker = (event: React.FocusEvent<HTMLInputElement>): boolean =>\n isMovingFocusToNativePickerRef.current ||\n (nativeInputRef.current !== null && event.relatedTarget === nativeInputRef.current.getNode());\n\n const { highlightedItemIndex, openDropdown, closeDropdown, resetHighlightedItem, tryNavigateItems } =\n useTimePickerDropdown({\n disabled,\n hasDropdown,\n items: menuItems,\n selectedItemIndex: selectedItemIndex >= 0 ? selectedItemIndex : null,\n autoHighlightKey,\n isDropdownOpened,\n setIsDropdownOpened,\n });\n\n /**\n * Фильтрация начинается только после правки значения при открытом меню.\n * Состояние живет ровно столько, сколько открыто меню: правка, которая заново открывает меню,\n * сохраняет свой запрос, а правка при закрытом меню — например стрелками — на список не влияет.\n */\n useEffect(() => {\n if (!isDropdownOpened && isEditedAfterOpen) {\n setIsEditedAfterOpen(false);\n }\n }, [isDropdownOpened, isEditedAfterOpen]);\n\n const popupId = popupIdRef.current;\n const highlightedMenuItem = highlightedItemIndex === null ? undefined : menuItems[highlightedItemIndex];\n\n /** Кастомный `MenuItem` может принести свой `id` — тогда указывать нужно именно на него. */\n const activeDescendantId = highlightedMenuItem\n ? ((isNavigableMenuElement(highlightedMenuItem) ? highlightedMenuItem.props.id : undefined) ??\n `${popupId}-item-${highlightedItemIndex}`)\n : undefined;\n\n const getActiveInput = useCallback(\n () => (isMobileDropdownActive ? mobileInputRef.current : inputRef.current),\n [isMobileDropdownActive],\n );\n\n const { selection, selectedSegment, selectSegment, selectAll, syncSelectionWithDOM } = useTimePickerSelection({\n isInputFocused,\n format,\n displayValue,\n getInput: getActiveInput,\n });\n\n const blinkInput = useCallback(() => {\n getActiveInput()?.blink();\n }, [getActiveInput]);\n\n const handleUnexpectedInput = useCallback(\n (unexpectedValue: string) => {\n if (!onUnexpectedInput) {\n blinkInput();\n return;\n }\n\n const returnedValue = onUnexpectedInput(unexpectedValue, blinkInput);\n\n if (returnedValue === undefined) {\n return;\n }\n\n if (returnedValue === null) {\n commitValue(EMPTY_VALUE);\n return;\n }\n\n commitItem(returnedValue);\n },\n [blinkInput, commitItem, commitValue, onUnexpectedInput],\n );\n\n /** Закрывает открытое меню: мобильный попап заодно завершает сессию ввода, как потеря фокуса. */\n const closeOpenedDropdown = useCallback(() => {\n if (isMobileDropdownActive) {\n // Фокус может остаться в любом из двух полей: инпут попапа не всегда получает его —\n // например мобильный браузер отказывается переводить фокус без жеста пользователя.\n // Гасим оба, чтобы закрытие попапа всегда давало событие потери фокуса.\n mobileInputRef.current?.blur();\n inputRef.current?.blur();\n setIsInputFocused(false);\n resetMouseInteractionState();\n closeDropdown();\n commitEditingValue();\n const blurEvent = mobileBlurEventRef.current;\n mobileBlurEventRef.current = null;\n emitBlur(blurEvent);\n return;\n }\n\n closeDropdown();\n }, [closeDropdown, commitEditingValue, emitBlur, isMobileDropdownActive, resetMouseInteractionState]);\n\n const selectItem = useCallback(\n (item: TimeItemValue) => {\n commitItem(item);\n closeOpenedDropdown();\n },\n [closeOpenedDropdown, commitItem],\n );\n\n const isSelectHighlightedItem = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (highlightedItemIndex === null) {\n return false;\n }\n\n const resolvedItem = menuItems[highlightedItemIndex];\n\n if (!resolvedItem) {\n return true;\n }\n\n if (isNavigableMenuElement(resolvedItem)) {\n resolvedItem.props.onClick?.(event);\n return true;\n }\n\n if (!isTimeMenuItem(resolvedItem) || resolvedItem.disabled) {\n return true;\n }\n\n selectItem(resolvedItem.item);\n return true;\n },\n [highlightedItemIndex, menuItems, selectItem],\n );\n\n const focusInput = useCallback(\n (options?: { withoutOpenDropdown?: boolean }) => {\n if (disabled) {\n return;\n }\n\n shouldSkipOpenOnFocusRef.current = Boolean(options?.withoutOpenDropdown);\n getActiveInput()?.focus();\n shouldSkipOpenOnFocusRef.current = false;\n },\n [disabled, getActiveInput],\n );\n\n /**\n * Открывает выпадающее меню так же, как это делает пользователь: через фокус в поле.\n * Меню закрывается по потере фокуса, поэтому открытое без фокуса меню было бы нечем закрыть.\n * В режиме нативного пикера открывается системный пикер — своего меню в этом режиме нет.\n */\n const openInputDropdown = useCallback(() => {\n if (disabled) {\n return;\n }\n\n if (canUseMobileNativeTimePicker) {\n openNativeTimePicker();\n return;\n }\n\n getActiveInput()?.focus();\n openDropdown();\n }, [canUseMobileNativeTimePicker, disabled, getActiveInput, openDropdown, openNativeTimePicker]);\n\n const blurInput = useCallback(() => {\n if (isMobileDropdownActive) {\n closeOpenedDropdown();\n return;\n }\n\n // В нативном режиме фокус держит скрытый инпут системного пикера.\n nativeInputRef.current?.blur();\n getActiveInput()?.blur();\n }, [closeOpenedDropdown, getActiveInput, isMobileDropdownActive]);\n\n useImperativeHandle(\n ref,\n () => ({\n focus: focusInput,\n blur: blurInput,\n blink: blinkInput,\n open: openInputDropdown,\n close: closeOpenedDropdown,\n getRootNode: () => rootRef.current,\n }),\n [blinkInput, blurInput, closeOpenedDropdown, focusInput, openInputDropdown],\n );\n\n useLayoutEffect(() => {\n if (!isDropdownOpened) {\n return;\n }\n\n const selectedIndex = highlightedItemIndex ?? selectedItemIndex;\n\n if (selectedIndex < 0) {\n return;\n }\n\n const targetNode = itemRefs.current.get(selectedIndex);\n\n if (targetNode) {\n scrollSelectedItemIntoView(targetNode);\n }\n }, [highlightedItemIndex, isDropdownOpened, selectedItemIndex]);\n\n /**\n * Блокировка контрола посреди ввода завершает его так же, как потеря фокуса:\n * меню закрывается, а недоведенное значение коммитится, а не остается висеть в поле.\n */\n useEffect(() => {\n if (!disabled) {\n return;\n }\n\n if (isMobileDropdownActive) {\n closeOpenedDropdown();\n return;\n }\n\n if (isDropdownOpened) {\n closeDropdown();\n }\n\n if (isInputFocused) {\n setIsInputFocused(false);\n resetMouseInteractionState();\n commitEditingValue();\n }\n }, [\n closeDropdown,\n closeOpenedDropdown,\n commitEditingValue,\n disabled,\n isDropdownOpened,\n isInputFocused,\n isMobileDropdownActive,\n resetMouseInteractionState,\n ]);\n\n const previousIsMobileLayoutRef = useRef(isMobileLayout);\n\n /**\n * Смена верстки переносит открытое меню в нужную версию: как в ComboBox, меню не закрывается.\n * Начатый ввод переезжает вместе с ним, а если переезжать некуда — коммитится, как при потере фокуса.\n */\n useEffect(() => {\n if (previousIsMobileLayoutRef.current === isMobileLayout) {\n return;\n }\n\n previousIsMobileLayoutRef.current = isMobileLayout;\n // Запомненный blur остался от прошлой верстки: как потеря фокуса контрола он больше не годится.\n mobileBlurEventRef.current = null;\n\n if (isMobileLayout) {\n // Ввод продолжится в инпуте попапа, только если попап открывается вместе со сменой верстки.\n if (isInputFocused && !isMobileDropdownActive) {\n setIsInputFocused(false);\n resetMouseInteractionState();\n commitEditingValue();\n }\n\n // В режиме нативного пикера своего меню нет.\n if (isDropdownOpened && canUseMobileNativeTimePicker) {\n closeDropdown();\n }\n\n return;\n }\n\n /**\n * Десктопное меню закрывается по потере фокуса поля, поэтому без фокуса в контроле\n * его нечем было бы закрыть: мобильный попап мог быть открыт и без фокуса в своем инпуте.\n * Если же фокус был, его вернет в поле `useTimePickerSelection`.\n */\n if (isDropdownOpened && !isInputFocused) {\n closeDropdown();\n }\n }, [\n canUseMobileNativeTimePicker,\n closeDropdown,\n commitEditingValue,\n isDropdownOpened,\n isInputFocused,\n isMobileDropdownActive,\n isMobileLayout,\n resetMouseInteractionState,\n ]);\n\n /** Сообщает о фокусе один раз за сессию: переезд фокуса внутри контрола наружу не виден. */\n const emitFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n if (isControlFocusedRef.current) {\n return;\n }\n\n isControlFocusedRef.current = true;\n onFocus?.(event);\n };\n\n const handleFocusBySource = (event: React.FocusEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n const shouldSkipOpenDropdown = shouldSkipOpenOnFocusRef.current;\n shouldSkipOpenOnFocusRef.current = false;\n const isFocusMovedInsideControl = isControlFocusedRef.current;\n\n if (canUseMobileNativeTimePicker) {\n // Фокус сообщается до открытия пикера: иначе увод фокуса в нативный инпут закрыл бы сессию.\n emitFocus(event);\n\n if (!shouldSkipOpenDropdown) {\n openNativeTimePicker();\n }\n return;\n }\n\n if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {\n if (!shouldSkipOpenDropdown) {\n openDropdown();\n }\n // Дальше ввод идет в инпуте попапа, но фокус контрол получает здесь.\n emitFocus(event);\n return;\n }\n\n setIsInputFocused(true);\n\n if (!shouldSkipOpenDropdown) {\n openDropdown();\n }\n\n if (mouseDownSegmentRef.current && !isInputFocused) {\n // По пустому полю ввод всегда начинается с часов, а по заполненному — с сегмента под курсором.\n selectSegment(isTimeDisplayEmpty(editingValueRef.current) ? 'hours' : mouseDownSegmentRef.current);\n } else {\n // Переезд фокуса внутри контрола продолжает начатый ввод, поэтому сегмент сохраняется:\n // иначе следующая цифра ушла бы в часы и затерла бы набранное время.\n selectSegment(isFocusMovedInsideControl ? selectedSegment : 'hours');\n }\n\n emitFocus(event);\n };\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => handleFocusBySource(event, false);\n\n const handleMobileFocus = (event: React.FocusEvent<HTMLInputElement>) => handleFocusBySource(event, true);\n\n const handleBlurBySource = (event: React.FocusEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n /**\n * Пока открыт мобильный попап, фокус ходит между полем и его инпутом: контрол остается активным,\n * поэтому наружу о таком blur сообщать нечего. Событие запоминается на случай,\n * если фокус в инпуте попапа так и не оказался — тогда именно оно уйдет в `onBlur` при закрытии.\n */\n if (isMobileDropdownActive) {\n event.persist();\n mobileBlurEventRef.current = event;\n return;\n }\n\n if (canUseMobileNativeTimePicker) {\n if (isFocusMovedToNativePicker(event)) {\n return;\n }\n\n // Ввод в мобильной версии не идет через поле, но незакоммиченное значение могло остаться\n // от десктопной версии, если верстка сменилась посреди ввода.\n if (isInputFocused) {\n setIsInputFocused(false);\n resetMouseInteractionState();\n commitEditingValue();\n }\n\n emitBlur(event);\n return;\n }\n\n // Инпут закрытого попапа фокуса уже не держит, но его blur может прийти на размонтировании.\n if (isMobilePopupInput) {\n return;\n }\n\n setIsInputFocused(false);\n resetMouseInteractionState();\n closeDropdown();\n commitEditingValue();\n emitBlur(event);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => handleBlurBySource(event, false);\n\n const handleMobileBlur = (event: React.FocusEvent<HTMLInputElement>) => handleBlurBySource(event, true);\n\n const handleClick = (event: React.MouseEvent<HTMLInputElement>) => {\n if (canUseMobileNativeTimePicker) {\n openNativeTimePicker();\n } else {\n openDropdown();\n }\n\n onClick?.(event);\n };\n\n const handleMouseDownCaptureBySource = (event: React.MouseEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n if (canUseMobileNativeTimePicker || (canUseMobileDropdownTimePicker && !isMobilePopupInput)) {\n return;\n }\n\n const currentInputRef = isMobilePopupInput ? mobileInputRef : inputRef;\n const segment = currentInputRef.current?.getSegment(event.target) ?? null;\n\n if (isInputFocused && segment === null) {\n event.preventDefault();\n }\n\n isMouseFocusRef.current = !isInputFocused;\n mouseDownSegmentRef.current = segment;\n };\n\n const handleMouseDownCapture = (event: React.MouseEvent<HTMLInputElement>) =>\n handleMouseDownCaptureBySource(event, false);\n\n const handleMobileMouseDownCapture = (event: React.MouseEvent<HTMLInputElement>) =>\n handleMouseDownCaptureBySource(event, true);\n\n const handleMouseUpBySource = (_event: React.MouseEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n if (disabled || canUseMobileNativeTimePicker || (canUseMobileDropdownTimePicker && !isMobilePopupInput)) {\n return;\n }\n\n syncSelectionWithDOM();\n };\n\n const handleMouseUp = (event: React.MouseEvent<HTMLInputElement>) => handleMouseUpBySource(event, false);\n\n const handleMobileMouseUp = (event: React.MouseEvent<HTMLInputElement>) => handleMouseUpBySource(event, true);\n\n const handleSelectSegmentByMouseBySource = (segment: TimeSegment, isMobilePopupInput: boolean) => {\n if (canUseMobileNativeTimePicker) {\n openNativeTimePicker();\n return;\n }\n\n if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {\n openDropdown();\n return;\n }\n\n openDropdown();\n\n if (disabled) {\n return;\n }\n\n if (!(isMouseFocusRef.current && isTimeDisplayEmpty(editingValueRef.current)) && selectedSegment !== segment) {\n normalizeCurrentSegmentIfNeeded(selectedSegment);\n selectSegment(segment);\n }\n\n resetMouseInteractionState();\n };\n\n const handleSelectSegmentByMouse = (segment: TimeSegment) => handleSelectSegmentByMouseBySource(segment, false);\n\n const handleMobileSelectSegmentByMouse = (segment: TimeSegment) =>\n handleSelectSegmentByMouseBySource(segment, true);\n\n const handleKeyDownBySource = (event: React.KeyboardEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n onKeyDown?.(event);\n\n if (event.defaultPrevented || disabled) {\n return;\n }\n\n if (canUseMobileNativeTimePicker) {\n openNativeTimePicker();\n return;\n }\n\n if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {\n openDropdown();\n return;\n }\n\n if (isShortcutSelectAll(event)) {\n event.preventDefault();\n selectAll();\n return;\n }\n\n if (event.altKey || event.ctrlKey || event.metaKey) {\n return;\n }\n\n const currentDisplayValue = displayValue;\n const currentSegment = selectedSegment;\n const hasAllSelectionInState = selection === 'all';\n const hasAllSelectionInDOM = getActiveInput()?.isAllSelected() ?? false;\n const shouldHandleAsAllSelection = hasAllSelectionInState || hasAllSelectionInDOM;\n\n if (hasAllSelectionInDOM && !hasAllSelectionInState) {\n syncSelectionWithDOM();\n }\n\n if (shouldHandleAsAllSelection && (isKeyBackspace(event) || isKeyDelete(event))) {\n event.preventDefault();\n openDropdown();\n updateEditingValueAfterUserEdit(getEmptyDisplayValue(format));\n selectSegment('hours');\n return;\n }\n\n if (DIGIT_REGEXP.test(event.key)) {\n event.preventDefault();\n\n openDropdown();\n\n const nextDigitInputValue = shouldHandleAsAllSelection ? getEmptyDisplayValue(format) : currentDisplayValue;\n\n const nextDigitInputSegment = shouldHandleAsAllSelection ? 'hours' : currentSegment;\n\n const result = formatDigitToTimeSegment(nextDigitInputValue, nextDigitInputSegment, event.key, format);\n\n // Отклоненная цифра не меняет ни значение, ни список, поэтому и подсветку трогать нельзя:\n // автоподсветка не восстановится, а Enter выбрал бы не тот элемент, который видит пользователь.\n if (result.shouldBlink) {\n handleUnexpectedInput(event.key);\n return;\n }\n\n resetHighlightedItem();\n\n updateEditingValueAfterUserEdit(result.nextValue);\n selectSegment(result.selectedSegment);\n return;\n }\n\n if (isKeyArrowLeft(event)) {\n event.preventDefault();\n normalizeCurrentSegmentIfNeeded(currentSegment);\n selectSegment(getPreviousTimeSegment(currentSegment) ?? currentSegment);\n return;\n }\n\n if (isModShift(isKeyTab)(event)) {\n const previousSegment = getPreviousTimeSegment(currentSegment);\n\n if (previousSegment) {\n event.preventDefault();\n normalizeCurrentSegmentIfNeeded(currentSegment);\n selectSegment(previousSegment);\n }\n return;\n }\n\n if (isKeyArrowRight(event)) {\n event.preventDefault();\n normalizeCurrentSegmentIfNeeded(currentSegment);\n selectSegment(getNextTimeSegment(currentSegment, format) ?? currentSegment);\n return;\n }\n\n if (isKeyTab(event)) {\n const nextSegment = getNextTimeSegment(currentSegment, format);\n\n if (nextSegment) {\n event.preventDefault();\n normalizeCurrentSegmentIfNeeded(currentSegment);\n selectSegment(nextSegment);\n }\n return;\n }\n\n if (isKeyArrowUp(event) || isKeyArrowDown(event)) {\n event.preventDefault();\n\n const itemStep = isKeyArrowUp(event) ? -1 : 1;\n\n if (tryNavigateItems(itemStep)) {\n return;\n }\n\n const step = isKeyArrowUp(event) ? 1 : -1;\n\n updateEditingValueAfterUserEdit(shiftTimeSegmentValue(currentDisplayValue, currentSegment, step, format));\n selectSegment(currentSegment);\n return;\n }\n\n if (isKeyBackspace(event)) {\n event.preventDefault();\n openDropdown();\n\n let nextDisplayValue = deleteTimeSegmentDigit(currentDisplayValue, currentSegment, format);\n let nextSegment = currentSegment;\n\n if (nextDisplayValue === currentDisplayValue) {\n const previousSegment = getPreviousTimeSegment(currentSegment);\n\n if (previousSegment) {\n nextSegment = previousSegment;\n nextDisplayValue = deleteTimeSegmentDigit(currentDisplayValue, previousSegment, format);\n }\n }\n\n updateEditingValueAfterUserEdit(nextDisplayValue);\n selectSegment(nextSegment);\n return;\n }\n\n if (isKeyDelete(event)) {\n event.preventDefault();\n openDropdown();\n updateEditingValueAfterUserEdit(replaceTimeSegment(currentDisplayValue, currentSegment, EMPTY_SEGMENT, format));\n selectSegment(currentSegment);\n return;\n }\n\n if (isKeyEscape(event)) {\n if (isDropdownOpened) {\n event.preventDefault();\n\n closeOpenedDropdown();\n }\n return;\n }\n\n if (isKeyEnter(event)) {\n if (isSourceFailed) {\n event.preventDefault();\n retrySource();\n return;\n }\n\n if (isSelectHighlightedItem(event)) {\n event.preventDefault();\n return;\n }\n\n if (isMobileDropdownActive) {\n event.preventDefault();\n closeOpenedDropdown();\n return;\n }\n\n // Enter не выбирает элемент, а лишь подтверждает введенное значение, как потеря фокуса.\n commitEditingValue();\n blinkInput();\n\n if (isDropdownOpened) {\n event.preventDefault();\n closeDropdown();\n }\n return;\n }\n\n if (isKeySpace(event)) {\n event.preventDefault();\n\n const nextSegment = getNextTimeSegment(currentSegment, format);\n const nextDisplayValue = commitTimeSegmentOnLeave(currentDisplayValue, currentSegment, format);\n\n updateEditingValueAfterUserEdit(nextDisplayValue);\n\n if (nextSegment) {\n selectSegment(nextSegment);\n } else {\n selectSegment(currentSegment);\n }\n return;\n }\n\n if (isKeyChar(event)) {\n event.preventDefault();\n handleUnexpectedInput(event.key);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => handleKeyDownBySource(event, false);\n\n const handleMobileKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => handleKeyDownBySource(event, true);\n\n const handlePasteBySource = (event: React.ClipboardEvent<HTMLInputElement>, isMobilePopupInput: boolean) => {\n onPaste?.(event);\n\n if (event.defaultPrevented || disabled) {\n return;\n }\n\n if (canUseMobileNativeTimePicker || (canUseMobileDropdownTimePicker && !isMobilePopupInput)) {\n return;\n }\n\n const pastedValue = event.clipboardData?.getData('text') ?? EMPTY_VALUE;\n\n event.preventDefault();\n\n if (pastedValue.trim() === EMPTY_VALUE) {\n return;\n }\n\n const nextDisplayValue = parsePastedTimeValue(pastedValue, format);\n\n if (isTimeDisplayEmpty(nextDisplayValue)) {\n handleUnexpectedInput(pastedValue);\n return;\n }\n\n openDropdown();\n updateEditingValueAfterUserEdit(nextDisplayValue);\n selectSegment('hours');\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => handlePasteBySource(event, false);\n\n const handleMobilePaste = (event: React.ClipboardEvent<HTMLInputElement>) => handlePasteBySource(event, true);\n\n return (\n <CommonWrapper {...props}>\n <span ref={rootRef} className={styles.root()} data-tid={TimePickerDataTids.root}>\n <TimeInput\n {...inputProps}\n data-tid={TimePickerDataTids.input}\n ref={inputRef}\n disabled={disabled}\n hasDropdown={hasDropdown}\n size={size}\n format={format}\n corners={corners}\n rightIcon={inputRightIcon}\n suffix={suffix}\n value={displayValue}\n aria-haspopup={hasDropdown ? 'listbox' : undefined}\n aria-expanded={\n !isMobileDropdownActive && hasDropdown && isDropdownOpened && hasDropdownContent ? true : undefined\n }\n aria-controls={\n !isMobileDropdownActive && hasDropdown && isDropdownOpened && hasDropdownContent ? popupId : undefined\n }\n aria-activedescendant={isMobileDropdownActive ? undefined : activeDescendantId}\n aria-placeholder={ariaPlaceholder}\n aria-busy={isLoadingItems || undefined}\n onClick={handleClick}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onMouseDownCapture={handleMouseDownCapture}\n onMouseUp={handleMouseUp}\n onKeyDown={handleKeyDown}\n onSelectSegment={handleSelectSegmentByMouse}\n onPaste={handlePaste}\n />\n\n {canUseMobileNativeTimePicker && (\n <NativeTimeInput\n data-tid={TimePickerDataTids.nativeInput}\n disabled={disabled}\n ref={nativeInputRef}\n format={format}\n minTime={minTime}\n maxTime={maxTime}\n value={editingValue}\n onValueChange={commitValue}\n onBlur={emitBlur}\n />\n )}\n\n {isMobileDropdownActive && (\n <TimePickerMobilePopup\n id={popupId}\n value={displayValue}\n inputRef={mobileInputRef}\n disabled={disabled}\n format={format}\n size={size}\n rightIcon={inputRightIcon}\n suffix={suffix}\n resolvedItems={resolvedItems}\n renderItem={renderItem}\n isLoading={isLoadingItems}\n isFailed={isSourceFailed}\n errorNetworkButton={locale.errorNetworkButton}\n errorNetworkMessage={locale.errorNetworkMessage}\n highlightedItemIndex={highlightedItemIndex}\n selectedValue={selectedValue}\n itemRefs={itemRefs}\n error={props.error}\n warning={props.warning}\n aria-describedby={props['aria-describedby']}\n aria-label={props['aria-label']}\n aria-placeholder={ariaPlaceholder}\n aria-haspopup={'listbox'}\n aria-expanded={resolvedItems.length > 0 || isLoadingItems || isSourceFailed ? true : undefined}\n aria-controls={resolvedItems.length > 0 || isLoadingItems || isSourceFailed ? popupId : undefined}\n aria-activedescendant={activeDescendantId}\n onFocus={handleMobileFocus}\n onBlur={handleMobileBlur}\n onClick={handleClick}\n onKeyDown={handleMobileKeyDown}\n onMouseDownCapture={handleMobileMouseDownCapture}\n onMouseUp={handleMobileMouseUp}\n onPaste={handleMobilePaste}\n onSelectSegment={handleMobileSelectSegmentByMouse}\n onRetry={retrySource}\n onSelectItem={selectItem}\n onCloseRequest={closeOpenedDropdown}\n />\n )}\n\n {hasDropdown &&\n !canUseMobileNativeTimePicker &&\n !canUseMobileDropdownTimePicker &&\n isDropdownOpened &&\n hasDropdownContent &&\n rootRef.current && (\n <TimePickerPopup\n id={popupId}\n anchorElement={rootRef.current}\n menuPos={menuPos}\n menuAlign={menuAlign}\n menuWidth={menuWidth}\n popupMaxHeight={popupMaxHeight}\n format={format}\n size={size}\n resolvedItems={resolvedItems}\n renderItem={renderItem}\n isLoading={isLoadingItems}\n isFailed={isSourceFailed}\n errorNetworkButton={locale.errorNetworkButton}\n errorNetworkMessage={locale.errorNetworkMessage}\n highlightedItemIndex={highlightedItemIndex}\n selectedValue={selectedValue}\n itemRefs={itemRefs}\n onRetry={retrySource}\n onSelectItem={selectItem}\n />\n )}\n </span>\n </CommonWrapper>\n );\n }),\n { validate: validateTimePicker },\n) as unknown as TimePickerComponent;\n"]}
@@ -20,6 +20,8 @@ export type TimePickerExtendedItem<T extends TimeItemValue = TimeItemValue> = T
20
20
  export type TimePickerSource<T extends TimeItemValue = TimeItemValue> = Array<TimePickerExtendedItem<T>> | ((query: string) => Array<TimePickerExtendedItem<T>> | Promise<Array<TimePickerExtendedItem<T>>>);
21
21
  /** Значение поля времени: элемент, строка в формате `HH:mm[:ss]` или пустое значение. */
22
22
  export type TimePickerValue<T extends TimeItemValue = TimeItemValue> = T | string | null;
23
+ /** Пустое значение в форме элементов: строка остается строкой, а вместо элемента-объекта приходит `null`. */
24
+ export type TimePickerEmptyItem<T extends TimeItemValue = TimeItemValue> = T extends string ? never : null;
23
25
  /** Преобразует введенное пользователем время в элемент. */
24
26
  export type TimePickerValueToItem<T extends TimeItemValue = TimeItemValue> = (value: string) => T;
25
27
  /** Разобранный элемент выпадающего списка: исходный элемент, его время, подпись и доступность. */
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker.shared.js","sourceRoot":"","sources":["TimePicker.shared.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidElement } from 'react';\nimport type { ReactElement, ReactNode } from 'react';\n\nimport type { MenuItemProps } from '../../MenuItem/index.js';\nimport { isMenuItem } from '../../MenuItem/index.js';\nimport {\n DIGIT_REGEXP,\n EMPTY_SEGMENT,\n EMPTY_VALUE,\n HOURS_MAX_VALUE,\n MINUTES_AND_SECONDS_MAX_VALUE,\n NON_DIGIT_REGEXP,\n TIME_PLACEHOLDER_CHAR,\n TIME_SEGMENT_LENGTH,\n TIME_SEGMENTS_BY_FORMAT,\n TIME_SEPARATOR,\n ZERO_PAD_CHAR,\n} from './TimePicker.constants.js';\n\nexport type TimeFormat = 'HH:mm' | 'HH:mm:ss';\nexport type TimeSegment = 'hours' | 'minutes' | 'seconds';\n\nexport interface TimeItem {\n disabled?: boolean;\n value: string;\n label?: ReactNode;\n}\n\n/** Элемент со временем: строка в формате `HH:mm[:ss]` или объект. */\nexport type TimeItemValue = string | TimeItem;\n\n/**\n * React-элемент выпадающего списка: сам элемент или функция, возвращающая его.\n * Параметры типа заданы как `any`, чтобы тип совпадал с тем, что дает инлайн-разметка в `source`:\n * иначе TypeScript не отличает React-элемент от элемента со временем и не выводит тип элемента.\n */\nexport type TimePickerMenuElement = ReactElement<any, any> | (() => ReactElement<any, any>);\n\n/** Элемент, который можно передать в `source`: элемент со временем или React-элемент. */\nexport type TimePickerExtendedItem<T extends TimeItemValue = TimeItemValue> = T | TimePickerMenuElement;\n\nexport type TimePickerSource<T extends TimeItemValue = TimeItemValue> =\n | Array<TimePickerExtendedItem<T>>\n | ((query: string) => Array<TimePickerExtendedItem<T>> | Promise<Array<TimePickerExtendedItem<T>>>);\n\n/** Значение поля времени: элемент, строка в формате `HH:mm[:ss]` или пустое значение. */\nexport type TimePickerValue<T extends TimeItemValue = TimeItemValue> = T | string | null;\n\n/** Преобразует введенное пользователем время в элемент. */\nexport type TimePickerValueToItem<T extends TimeItemValue = TimeItemValue> = (value: string) => T;\n\n/** Разобранный элемент выпадающего списка: исходный элемент, его время, подпись и доступность. */\nexport interface TimePickerResolvedItem<T extends TimeItemValue = TimeItemValue> {\n item: T;\n value: string;\n label?: ReactNode;\n disabled: boolean;\n}\n\n/** Элемент выпадающего списка: разобранный элемент со временем или React-элемент. */\nexport type TimePickerMenuItem<T extends TimeItemValue = TimeItemValue> =\n | TimePickerResolvedItem<T>\n | TimePickerMenuElement;\n\nconst isNotMenuElement = (item: unknown): boolean => typeof item !== 'function' && !isValidElement(item);\n\n/** Проверяет, что элемент источника содержит время, а не является React-элементом. */\nexport const isTimeItem = <T extends TimeItemValue>(item: TimePickerExtendedItem<T>): item is T =>\n isNotMenuElement(item);\n\n/** Проверяет, что элемент выпадающего списка содержит время, а не является React-элементом. */\nexport const isTimeMenuItem = <T extends TimeItemValue>(\n item: TimePickerMenuItem<T>,\n): item is TimePickerResolvedItem<T> => isNotMenuElement(item);\n\n/**\n * Проверяет, что элемент выпадающего списка — это `MenuItem`, по которому можно ходить с клавиатуры.\n * Заблокированные и невыбираемые пункты в навигации не участвуют, как и элементы-функции:\n * последние отрисовываются как есть, поэтому кликом по ним по-прежнему управляет их собственный `onClick`.\n */\nexport const isNavigableMenuElement = <T extends TimeItemValue>(\n item: TimePickerMenuItem<T>,\n): item is ReactElement<MenuItemProps> => {\n if (typeof item === 'function' || !isValidElement(item) || !isMenuItem(item)) {\n return false;\n }\n\n const { disabled, isNotSelectable } = item.props as MenuItemProps;\n\n return !disabled && !isNotSelectable;\n};\n\n/** Проверяет, что на элементе выпадающего списка может стоять выделение с клавиатуры. */\nexport const isHighlightableMenuItem = <T extends TimeItemValue>(item: TimePickerMenuItem<T>): boolean =>\n isTimeMenuItem(item) ? !item.disabled : isNavigableMenuElement(item);\n\nexport const getTimeItemValue = (item: TimeItemValue): string => (typeof item === 'string' ? item : item.value);\n\nexport const getTimeItemLabel = (item: TimeItemValue): ReactNode => (typeof item === 'string' ? undefined : item.label);\n\nexport const isTimeItemDisabled = (item: TimeItemValue): boolean => typeof item !== 'string' && Boolean(item.disabled);\n\nexport const isTimeItemObject = (item: TimeItemValue): item is TimeItem => typeof item !== 'string';\n\n/**\n * Дефолтное преобразование времени в элемент.\n * Компонент повторяет форму элементов источника: строку оставляет строкой, а объекту задает только `value`.\n */\nexport const timeValueToItem = <T extends TimeItemValue>(value: string, asObject: boolean): T =>\n (asObject ? { value } : value) as T;\n\n/** Результат ввода одной цифры: следующее display-значение, сегмент под выделением и признак вспышки. */\nexport interface TimeDigitInputResult {\n nextValue: string;\n selectedSegment: TimeSegment;\n shouldBlink: boolean;\n}\n\nexport const getTimeSegments = (format: TimeFormat): TimeSegment[] => TIME_SEGMENTS_BY_FORMAT[format];\n\nexport const getTimeSegmentMax = (segment: TimeSegment): number =>\n segment === 'hours' ? HOURS_MAX_VALUE : MINUTES_AND_SECONDS_MAX_VALUE;\n\n/** Извлекает из сегмента только цифры и ограничивает результат длиной сегмента. */\nexport const getDigits = (segment: string): string =>\n segment.replace(NON_DIGIT_REGEXP, EMPTY_VALUE).slice(0, TIME_SEGMENT_LENGTH);\n\n/**\n * Приводит произвольное строковое значение сегмента к display-форме:\n * оставляет только цифры и плейсхолдеры, ограничивает длину и дополняет незаполненные позиции плейсхолдером.\n */\nexport const sanitizeSegment = (segment: string): string =>\n Array.from(segment)\n .filter((char) => DIGIT_REGEXP.test(char) || char === TIME_PLACEHOLDER_CHAR)\n .slice(0, TIME_SEGMENT_LENGTH)\n .join('')\n .padEnd(TIME_SEGMENT_LENGTH, TIME_PLACEHOLDER_CHAR);\n\nconst normalizeSegment = (segmentValue: string, segment: TimeSegment, emptyResult: string): string => {\n const digits = getDigits(segmentValue);\n\n if (!digits) {\n return emptyResult;\n }\n\n return String(Math.min(Number(digits), getTimeSegmentMax(segment))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR);\n};\n\n/** Нормализует сегмент для committed-значения: пустой сегмент становится `00`. */\nexport const normalizeTimeSegment = (segmentValue: string, segment: TimeSegment): string =>\n normalizeSegment(segmentValue, segment, '00');\n\n/** Нормализует сегмент для режима редактирования: полностью пустой сегмент остается пустым. */\nexport const normalizeEditableSegment = (segmentValue: string, segment: TimeSegment): string =>\n normalizeSegment(segmentValue, segment, EMPTY_SEGMENT);\n\n/** Проверяет, что сегмент содержит одну введенную цифру и ожидает вторую. */\nexport const hasPendingSingleDigit = (segmentValue: string): boolean =>\n new RegExp(`^\\\\d${TIME_PLACEHOLDER_CHAR}$`).test(segmentValue);\n\n/**\n * Разбивает входное значение на display-сегменты текущего формата.\n * Поддерживает committed-значение (`HH:mm[:ss]`) и display-значение с плейсхолдерами\n */\nexport const getDisplaySegments = (value: string, format: TimeFormat): string[] => {\n const segments = getTimeSegments(format);\n const fallback = segments.map(() => EMPTY_SEGMENT);\n\n if (value === EMPTY_VALUE) {\n return fallback;\n }\n\n if (value.includes(TIME_SEPARATOR) || value.includes(TIME_PLACEHOLDER_CHAR)) {\n const sourceParts = value.split(TIME_SEPARATOR);\n return segments.map((_, index) => sanitizeSegment(sourceParts[index] ?? EMPTY_VALUE));\n }\n\n const digits = value.replace(NON_DIGIT_REGEXP, EMPTY_VALUE);\n\n return segments.map((_, index) => {\n const segmentStart = index * TIME_SEGMENT_LENGTH;\n const segmentEnd = segmentStart + TIME_SEGMENT_LENGTH;\n\n return sanitizeSegment(digits.slice(segmentStart, segmentEnd));\n });\n};\n"]}
1
+ {"version":3,"file":"TimePicker.shared.js","sourceRoot":"","sources":["TimePicker.shared.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidElement } from 'react';\nimport type { ReactElement, ReactNode } from 'react';\n\nimport type { MenuItemProps } from '../../MenuItem/index.js';\nimport { isMenuItem } from '../../MenuItem/index.js';\nimport {\n DIGIT_REGEXP,\n EMPTY_SEGMENT,\n EMPTY_VALUE,\n HOURS_MAX_VALUE,\n MINUTES_AND_SECONDS_MAX_VALUE,\n NON_DIGIT_REGEXP,\n TIME_PLACEHOLDER_CHAR,\n TIME_SEGMENT_LENGTH,\n TIME_SEGMENTS_BY_FORMAT,\n TIME_SEPARATOR,\n ZERO_PAD_CHAR,\n} from './TimePicker.constants.js';\n\nexport type TimeFormat = 'HH:mm' | 'HH:mm:ss';\nexport type TimeSegment = 'hours' | 'minutes' | 'seconds';\n\nexport interface TimeItem {\n disabled?: boolean;\n value: string;\n label?: ReactNode;\n}\n\n/** Элемент со временем: строка в формате `HH:mm[:ss]` или объект. */\nexport type TimeItemValue = string | TimeItem;\n\n/**\n * React-элемент выпадающего списка: сам элемент или функция, возвращающая его.\n * Параметры типа заданы как `any`, чтобы тип совпадал с тем, что дает инлайн-разметка в `source`:\n * иначе TypeScript не отличает React-элемент от элемента со временем и не выводит тип элемента.\n */\nexport type TimePickerMenuElement = ReactElement<any, any> | (() => ReactElement<any, any>);\n\n/** Элемент, который можно передать в `source`: элемент со временем или React-элемент. */\nexport type TimePickerExtendedItem<T extends TimeItemValue = TimeItemValue> = T | TimePickerMenuElement;\n\nexport type TimePickerSource<T extends TimeItemValue = TimeItemValue> =\n | Array<TimePickerExtendedItem<T>>\n | ((query: string) => Array<TimePickerExtendedItem<T>> | Promise<Array<TimePickerExtendedItem<T>>>);\n\n/** Значение поля времени: элемент, строка в формате `HH:mm[:ss]` или пустое значение. */\nexport type TimePickerValue<T extends TimeItemValue = TimeItemValue> = T | string | null;\n\n/** Пустое значение в форме элементов: строка остается строкой, а вместо элемента-объекта приходит `null`. */\nexport type TimePickerEmptyItem<T extends TimeItemValue = TimeItemValue> = T extends string ? never : null;\n\n/** Преобразует введенное пользователем время в элемент. */\nexport type TimePickerValueToItem<T extends TimeItemValue = TimeItemValue> = (value: string) => T;\n\n/** Разобранный элемент выпадающего списка: исходный элемент, его время, подпись и доступность. */\nexport interface TimePickerResolvedItem<T extends TimeItemValue = TimeItemValue> {\n item: T;\n value: string;\n label?: ReactNode;\n disabled: boolean;\n}\n\n/** Элемент выпадающего списка: разобранный элемент со временем или React-элемент. */\nexport type TimePickerMenuItem<T extends TimeItemValue = TimeItemValue> =\n | TimePickerResolvedItem<T>\n | TimePickerMenuElement;\n\nconst isNotMenuElement = (item: unknown): boolean => typeof item !== 'function' && !isValidElement(item);\n\n/** Проверяет, что элемент источника содержит время, а не является React-элементом. */\nexport const isTimeItem = <T extends TimeItemValue>(item: TimePickerExtendedItem<T>): item is T =>\n isNotMenuElement(item);\n\n/** Проверяет, что элемент выпадающего списка содержит время, а не является React-элементом. */\nexport const isTimeMenuItem = <T extends TimeItemValue>(\n item: TimePickerMenuItem<T>,\n): item is TimePickerResolvedItem<T> => isNotMenuElement(item);\n\n/**\n * Проверяет, что элемент выпадающего списка — это `MenuItem`, по которому можно ходить с клавиатуры.\n * Заблокированные и невыбираемые пункты в навигации не участвуют, как и элементы-функции:\n * последние отрисовываются как есть, поэтому кликом по ним по-прежнему управляет их собственный `onClick`.\n */\nexport const isNavigableMenuElement = <T extends TimeItemValue>(\n item: TimePickerMenuItem<T>,\n): item is ReactElement<MenuItemProps> => {\n if (typeof item === 'function' || !isValidElement(item) || !isMenuItem(item)) {\n return false;\n }\n\n const { disabled, isNotSelectable } = item.props as MenuItemProps;\n\n return !disabled && !isNotSelectable;\n};\n\n/** Проверяет, что на элементе выпадающего списка может стоять выделение с клавиатуры. */\nexport const isHighlightableMenuItem = <T extends TimeItemValue>(item: TimePickerMenuItem<T>): boolean =>\n isTimeMenuItem(item) ? !item.disabled : isNavigableMenuElement(item);\n\nexport const getTimeItemValue = (item: TimeItemValue): string => (typeof item === 'string' ? item : item.value);\n\nexport const getTimeItemLabel = (item: TimeItemValue): ReactNode => (typeof item === 'string' ? undefined : item.label);\n\nexport const isTimeItemDisabled = (item: TimeItemValue): boolean => typeof item !== 'string' && Boolean(item.disabled);\n\nexport const isTimeItemObject = (item: TimeItemValue): item is TimeItem => typeof item !== 'string';\n\n/**\n * Дефолтное преобразование времени в элемент.\n * Компонент повторяет форму элементов источника: строку оставляет строкой, а объекту задает только `value`.\n */\nexport const timeValueToItem = <T extends TimeItemValue>(value: string, asObject: boolean): T =>\n (asObject ? { value } : value) as T;\n\n/** Результат ввода одной цифры: следующее display-значение, сегмент под выделением и признак вспышки. */\nexport interface TimeDigitInputResult {\n nextValue: string;\n selectedSegment: TimeSegment;\n shouldBlink: boolean;\n}\n\nexport const getTimeSegments = (format: TimeFormat): TimeSegment[] => TIME_SEGMENTS_BY_FORMAT[format];\n\nexport const getTimeSegmentMax = (segment: TimeSegment): number =>\n segment === 'hours' ? HOURS_MAX_VALUE : MINUTES_AND_SECONDS_MAX_VALUE;\n\n/** Извлекает из сегмента только цифры и ограничивает результат длиной сегмента. */\nexport const getDigits = (segment: string): string =>\n segment.replace(NON_DIGIT_REGEXP, EMPTY_VALUE).slice(0, TIME_SEGMENT_LENGTH);\n\n/**\n * Приводит произвольное строковое значение сегмента к display-форме:\n * оставляет только цифры и плейсхолдеры, ограничивает длину и дополняет незаполненные позиции плейсхолдером.\n */\nexport const sanitizeSegment = (segment: string): string =>\n Array.from(segment)\n .filter((char) => DIGIT_REGEXP.test(char) || char === TIME_PLACEHOLDER_CHAR)\n .slice(0, TIME_SEGMENT_LENGTH)\n .join('')\n .padEnd(TIME_SEGMENT_LENGTH, TIME_PLACEHOLDER_CHAR);\n\nconst normalizeSegment = (segmentValue: string, segment: TimeSegment, emptyResult: string): string => {\n const digits = getDigits(segmentValue);\n\n if (!digits) {\n return emptyResult;\n }\n\n return String(Math.min(Number(digits), getTimeSegmentMax(segment))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR);\n};\n\n/** Нормализует сегмент для committed-значения: пустой сегмент становится `00`. */\nexport const normalizeTimeSegment = (segmentValue: string, segment: TimeSegment): string =>\n normalizeSegment(segmentValue, segment, '00');\n\n/** Нормализует сегмент для режима редактирования: полностью пустой сегмент остается пустым. */\nexport const normalizeEditableSegment = (segmentValue: string, segment: TimeSegment): string =>\n normalizeSegment(segmentValue, segment, EMPTY_SEGMENT);\n\n/** Проверяет, что сегмент содержит одну введенную цифру и ожидает вторую. */\nexport const hasPendingSingleDigit = (segmentValue: string): boolean =>\n new RegExp(`^\\\\d${TIME_PLACEHOLDER_CHAR}$`).test(segmentValue);\n\n/**\n * Разбивает входное значение на display-сегменты текущего формата.\n * Поддерживает committed-значение (`HH:mm[:ss]`) и display-значение с плейсхолдерами\n */\nexport const getDisplaySegments = (value: string, format: TimeFormat): string[] => {\n const segments = getTimeSegments(format);\n const fallback = segments.map(() => EMPTY_SEGMENT);\n\n if (value === EMPTY_VALUE) {\n return fallback;\n }\n\n if (value.includes(TIME_SEPARATOR) || value.includes(TIME_PLACEHOLDER_CHAR)) {\n const sourceParts = value.split(TIME_SEPARATOR);\n return segments.map((_, index) => sanitizeSegment(sourceParts[index] ?? EMPTY_VALUE));\n }\n\n const digits = value.replace(NON_DIGIT_REGEXP, EMPTY_VALUE);\n\n return segments.map((_, index) => {\n const segmentStart = index * TIME_SEGMENT_LENGTH;\n const segmentEnd = segmentStart + TIME_SEGMENT_LENGTH;\n\n return sanitizeSegment(digits.slice(segmentStart, segmentEnd));\n });\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skbkontur/react-ui",
3
- "version": "6.1.7-4c72d.0",
3
+ "version": "6.1.7-8e9d5.0",
4
4
  "description": "UI Components",
5
5
  "homepage": "https://tech.skbkontur.ru/kontur-ui",
6
6
  "bugs": {