@skbkontur/react-ui 6.1.7-1c902.0 → 6.1.7-4c72d.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/components/MenuItem/MenuItem.d.ts +1 -1
  2. package/components/MenuItem/MenuItem.js +0 -1
  3. package/components/MenuItem/MenuItem.js.map +1 -1
  4. package/components/MenuItem/MenuItem.styles.d.ts +0 -1
  5. package/components/MenuItem/MenuItem.styles.js +7 -10
  6. package/components/MenuItem/MenuItem.styles.js.map +1 -1
  7. package/components/TimePicker/TimePicker.d.ts +44 -25
  8. package/components/TimePicker/TimePicker.js +373 -191
  9. package/components/TimePicker/TimePicker.js.map +1 -1
  10. package/components/TimePicker/TimePicker.styles.d.ts +3 -1
  11. package/components/TimePicker/TimePicker.styles.js +9 -3
  12. package/components/TimePicker/TimePicker.styles.js.map +1 -1
  13. package/components/TimePicker/TimePickerItems.d.ts +5 -1
  14. package/components/TimePicker/TimePickerItems.js +39 -29
  15. package/components/TimePicker/TimePickerItems.js.map +1 -1
  16. package/components/TimePicker/TimePickerMobilePopup.d.ts +5 -2
  17. package/components/TimePicker/TimePickerMobilePopup.js +4 -4
  18. package/components/TimePicker/TimePickerMobilePopup.js.map +1 -1
  19. package/components/TimePicker/TimePickerPopup.d.ts +5 -1
  20. package/components/TimePicker/TimePickerPopup.js +4 -4
  21. package/components/TimePicker/TimePickerPopup.js.map +1 -1
  22. package/components/TimePicker/helpers/TimePicker.constants.d.ts +8 -1
  23. package/components/TimePicker/helpers/TimePicker.constants.js +8 -7
  24. package/components/TimePicker/helpers/TimePicker.constants.js.map +1 -1
  25. package/components/TimePicker/helpers/TimePicker.editing.d.ts +1 -5
  26. package/components/TimePicker/helpers/TimePicker.editing.js +8 -35
  27. package/components/TimePicker/helpers/TimePicker.editing.js.map +1 -1
  28. package/components/TimePicker/helpers/TimePicker.shared.d.ts +20 -22
  29. package/components/TimePicker/helpers/TimePicker.shared.js +27 -24
  30. package/components/TimePicker/helpers/TimePicker.shared.js.map +1 -1
  31. package/components/TimePicker/helpers/TimePicker.value.d.ts +22 -11
  32. package/components/TimePicker/helpers/TimePicker.value.js +69 -37
  33. package/components/TimePicker/helpers/TimePicker.value.js.map +1 -1
  34. package/components/TimePicker/helpers/scrollSelectedItemIntoView.d.ts +2 -0
  35. package/components/TimePicker/helpers/scrollSelectedItemIntoView.js +2 -0
  36. package/components/TimePicker/helpers/scrollSelectedItemIntoView.js.map +1 -1
  37. package/components/TimePicker/helpers/validateTimePicker.js +2 -4
  38. package/components/TimePicker/helpers/validateTimePicker.js.map +1 -1
  39. package/components/TimePicker/hooks/useTimePickerDropdown.d.ts +6 -1
  40. package/components/TimePicker/hooks/useTimePickerDropdown.js +15 -33
  41. package/components/TimePicker/hooks/useTimePickerDropdown.js.map +1 -1
  42. package/components/TimePicker/hooks/useTimePickerSource.d.ts +29 -0
  43. package/components/TimePicker/hooks/useTimePickerSource.js +67 -0
  44. package/components/TimePicker/hooks/useTimePickerSource.js.map +1 -0
  45. package/components/TimePicker/hooks/useTimePickerValue.d.ts +15 -4
  46. package/components/TimePicker/hooks/useTimePickerValue.js +40 -20
  47. package/components/TimePicker/hooks/useTimePickerValue.js.map +1 -1
  48. package/components/TimePicker/index.d.ts +3 -1
  49. package/components/TimePicker/index.js +1 -0
  50. package/components/TimePicker/index.js.map +1 -1
  51. package/components/TimePicker/locale/locales/en.js +2 -0
  52. package/components/TimePicker/locale/locales/en.js.map +1 -1
  53. package/components/TimePicker/locale/locales/ru.js +2 -0
  54. package/components/TimePicker/locale/locales/ru.js.map +1 -1
  55. package/components/TimePicker/locale/types.d.ts +2 -0
  56. package/components/TimePicker/locale/types.js.map +1 -1
  57. package/internal/NativeTimeInput/NativeTimeInput.d.ts +4 -0
  58. package/internal/NativeTimeInput/NativeTimeInput.js +7 -2
  59. package/internal/NativeTimeInput/NativeTimeInput.js.map +1 -1
  60. package/internal/NativeTimeInput/NativeTimeInput.utils.d.ts +2 -0
  61. package/internal/NativeTimeInput/NativeTimeInput.utils.js +4 -8
  62. package/internal/NativeTimeInput/NativeTimeInput.utils.js.map +1 -1
  63. package/internal/TimeInput/TimeFragments.d.ts +0 -1
  64. package/internal/TimeInput/TimeFragments.js +30 -8
  65. package/internal/TimeInput/TimeFragments.js.map +1 -1
  66. package/internal/TimeInput/TimeFragments.styles.d.ts +15 -0
  67. package/internal/TimeInput/TimeFragments.styles.js +39 -9
  68. package/internal/TimeInput/TimeFragments.styles.js.map +1 -1
  69. package/internal/TimeInput/TimeInput.d.ts +0 -1
  70. package/internal/TimeInput/TimeInput.js +0 -1
  71. package/internal/TimeInput/TimeInput.js.map +1 -1
  72. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TimePickerItems.js","sourceRoot":"","sources":["TimePickerItems.tsx"],"names":[],"mappings":"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","sourcesContent":["import { cx } from '@emotion/css';\nimport React, { useContext } from 'react';\n\nimport { Menu } from '../../internal/Menu/index.js';\nimport { MenuMessage } from '../../internal/MenuMessage/index.js';\nimport { useStyles } from '../../lib/renderEnvironment/index.js';\nimport type { Theme } from '../../lib/theming/Theme.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport { isMenuFooter } from '../MenuFooter/index.js';\nimport { isMenuHeader } from '../MenuHeader/index.js';\nimport { isMenuItem, MenuItem, type MenuItemProps, type MenuItemState } from '../MenuItem/index.js';\nimport { Spinner } from '../Spinner/index.js';\nimport { TimePickerDataTids } from './helpers/TimePicker.constants.js';\nimport {\n isTimeMenuItem,\n type TimeFormat,\n type TimeItemValue,\n type TimePickerMenuItem,\n} from './helpers/TimePicker.shared.js';\nimport { normalizeTimeValue } from './helpers/TimePicker.value.js';\nimport { getStyles } from './TimePicker.styles.js';\n\nconst getItemSizeClassName = (styles: ReturnType<typeof getStyles>, theme: Theme, size: SizeProp): string => {\n switch (size) {\n case 'large':\n return styles.itemLarge(theme);\n case 'medium':\n return styles.itemMedium(theme);\n case 'small':\n default:\n return styles.itemSmall(theme);\n }\n};\n\nconst ItemRoot = React.forwardRef<\n HTMLElement,\n React.HTMLAttributes<HTMLElement> & { disabled?: boolean; state?: MenuItemState }\n>(({ disabled = false, state: _state, ...props }, ref) => {\n if (disabled) {\n return <div {...props} ref={ref as React.Ref<HTMLDivElement>} />;\n }\n\n return <button {...props} ref={ref as React.Ref<HTMLButtonElement>} type={'button'} disabled={disabled} />;\n});\n\ninterface TimePickerItemsProps<T extends TimeItemValue> {\n itemIdPrefix?: string;\n format: TimeFormat;\n size: SizeProp;\n resolvedItems: Array<TimePickerMenuItem<T>>;\n renderItem?: (item: T, state: MenuItemState) => React.ReactNode;\n highlightedItemIndex: number | null;\n normalizedValue: string;\n itemRefs?: React.RefObject<Map<number, HTMLSpanElement>>;\n maxHeight?: React.CSSProperties['maxHeight'];\n disableScrollContainer?: boolean;\n isLoading?: boolean;\n onSelectItem(item: T): void;\n}\n\nexport const TimePickerItems = <T extends TimeItemValue>(props: TimePickerItemsProps<T>) => {\n const {\n itemIdPrefix,\n format,\n size,\n resolvedItems,\n renderItem,\n highlightedItemIndex,\n normalizedValue,\n itemRefs,\n maxHeight,\n disableScrollContainer,\n isLoading,\n onSelectItem,\n } = props;\n\n const theme = useContext(ThemeContext);\n const styles = useStyles(getStyles);\n const itemSizeClassName = getItemSizeClassName(styles, theme, size);\n\n if (isLoading && resolvedItems.length === 0) {\n return (\n <Menu\n hasMargin={false}\n width={'100%'}\n maxHeight={maxHeight}\n disableScrollContainer={disableScrollContainer}\n data-tid={TimePickerDataTids.loading}\n >\n <MenuMessage size={size} as={'div'}>\n <Spinner size={'small'} dimmed />\n </MenuMessage>\n </Menu>\n );\n }\n\n return (\n <Menu hasMargin={false} width={'100%'} maxHeight={maxHeight} disableScrollContainer={disableScrollContainer}>\n {resolvedItems.map((resolvedItem, index) => {\n if (!isTimeMenuItem(resolvedItem)) {\n const element = typeof resolvedItem === 'function' ? resolvedItem() : resolvedItem;\n const key = element.key ?? index;\n\n if (isMenuItem(element)) {\n return React.cloneElement(element, {\n key,\n isMobile: disableScrollContainer,\n size,\n } as MenuItemProps);\n }\n\n if (isMenuHeader(element)) {\n return React.cloneElement(element, { key, size });\n }\n\n if (isMenuFooter(element)) {\n return React.cloneElement(element, { key, size });\n }\n\n return React.cloneElement(element, { key });\n }\n\n const normalizedItem = normalizeTimeValue(resolvedItem.value, format);\n\n let state: 'hover' | 'selected' | undefined;\n\n if (highlightedItemIndex === index) {\n state = 'hover';\n } else if (normalizedItem === normalizedValue) {\n state = 'selected';\n }\n\n return (\n <MenuItem\n key={`${resolvedItem.value}-${index}`}\n component={ItemRoot}\n disabled={resolvedItem.disabled}\n isNotSelectable={resolvedItem.disabled}\n size={size}\n state={state}\n onClick={resolvedItem.disabled ? undefined : () => onSelectItem(resolvedItem.item)}\n >\n {(activeState) => (\n <span\n id={itemIdPrefix ? `${itemIdPrefix}-item-${index}` : undefined}\n data-tid={TimePickerDataTids.item}\n className={cx(styles.item(), itemSizeClassName)}\n ref={(node) => {\n if (!itemRefs) {\n return;\n }\n\n if (node) {\n itemRefs.current.set(index, node);\n } else {\n itemRefs.current.delete(index);\n }\n }}\n >\n {renderItem ? (\n renderItem(resolvedItem.item, activeState ?? null)\n ) : (\n <>\n <span className={styles.itemValue()}>{normalizedItem}</span>\n {resolvedItem.label && <span className={styles.itemLabel(theme)}>{resolvedItem.label}</span>}\n </>\n )}\n </span>\n )}\n </MenuItem>\n );\n })}\n </Menu>\n );\n};\n"]}
1
+ {"version":3,"file":"TimePickerItems.js","sourceRoot":"","sources":["TimePickerItems.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useContext } from 'react';\n\nimport { Menu } from '../../internal/Menu/index.js';\nimport { MenuMessage } from '../../internal/MenuMessage/index.js';\nimport { useEmotion, useStyles } from '../../lib/renderEnvironment/index.js';\nimport type { Theme } from '../../lib/theming/Theme.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport { isMenuFooter } from '../MenuFooter/index.js';\nimport { isMenuHeader } from '../MenuHeader/index.js';\nimport { isMenuItem, MenuItem, type MenuItemProps, type MenuItemState } from '../MenuItem/index.js';\nimport { Spinner } from '../Spinner/index.js';\nimport { TimePickerDataTids } from './helpers/TimePicker.constants.js';\nimport {\n isNavigableMenuElement,\n isTimeMenuItem,\n type TimeFormat,\n type TimeItemValue,\n type TimePickerMenuItem,\n} from './helpers/TimePicker.shared.js';\nimport { normalizeTimeValue } from './helpers/TimePicker.value.js';\nimport { getStyles } from './TimePicker.styles.js';\n\nconst getItemSizeClassName = (styles: ReturnType<typeof getStyles>, theme: Theme, size: SizeProp): string => {\n switch (size) {\n case 'large':\n return styles.itemLarge(theme);\n case 'medium':\n return styles.itemMedium(theme);\n case 'small':\n default:\n return styles.itemSmall(theme);\n }\n};\n\nconst ItemRoot = React.forwardRef<\n HTMLElement,\n React.HTMLAttributes<HTMLElement> & { disabled?: boolean; state?: MenuItemState }\n>(({ disabled = false, state: _state, ...props }, ref) => {\n if (disabled) {\n return <div {...props} ref={ref as React.Ref<HTMLDivElement>} />;\n }\n\n return <button {...props} ref={ref as React.Ref<HTMLButtonElement>} type={'button'} />;\n});\n\ninterface TimePickerItemsProps<T extends TimeItemValue> {\n itemIdPrefix?: string;\n format: TimeFormat;\n size: SizeProp;\n resolvedItems: Array<TimePickerMenuItem<T>>;\n renderItem?: (item: T, state: MenuItemState) => React.ReactNode;\n highlightedItemIndex: number | null;\n selectedValue: string;\n itemRefs?: React.RefObject<Map<number, HTMLSpanElement>>;\n maxHeight?: React.CSSProperties['maxHeight'];\n disableScrollContainer?: boolean;\n isLoading?: boolean;\n isFailed: boolean;\n errorNetworkButton: string;\n errorNetworkMessage: string;\n onRetry(): void;\n onSelectItem(item: T): void;\n}\n\nexport const TimePickerItems = <T extends TimeItemValue>(props: TimePickerItemsProps<T>) => {\n const {\n itemIdPrefix,\n format,\n size,\n resolvedItems,\n renderItem,\n highlightedItemIndex,\n selectedValue,\n itemRefs,\n maxHeight,\n disableScrollContainer,\n isLoading,\n isFailed,\n errorNetworkButton,\n errorNetworkMessage,\n onRetry,\n onSelectItem,\n } = props;\n\n const theme = useContext(ThemeContext);\n const { cx } = useEmotion();\n const styles = useStyles(getStyles);\n const itemSizeClassName = getItemSizeClassName(styles, theme, size);\n\n if (isFailed) {\n return (\n <Menu\n hasMargin={false}\n width={'100%'}\n maxHeight={maxHeight}\n disableScrollContainer={disableScrollContainer}\n data-tid={TimePickerDataTids.failed}\n >\n <MenuMessage size={size} as={'div'}>\n <div style={{ maxWidth: 300, whiteSpace: 'normal' }}>{errorNetworkMessage}</div>\n </MenuMessage>\n <MenuItem onClick={onRetry} size={size} isMobile={disableScrollContainer}>\n {errorNetworkButton}\n </MenuItem>\n </Menu>\n );\n }\n\n if (isLoading && resolvedItems.length === 0) {\n return (\n <Menu\n hasMargin={false}\n width={'100%'}\n maxHeight={maxHeight}\n disableScrollContainer={disableScrollContainer}\n data-tid={TimePickerDataTids.loading}\n >\n <MenuMessage size={size} as={'div'}>\n <Spinner size={'small'} dimmed />\n </MenuMessage>\n </Menu>\n );\n }\n\n return (\n <Menu hasMargin={false} width={'100%'} maxHeight={maxHeight} disableScrollContainer={disableScrollContainer}>\n {resolvedItems.map((resolvedItem, index) => {\n if (!isTimeMenuItem(resolvedItem)) {\n const element = typeof resolvedItem === 'function' ? resolvedItem() : resolvedItem;\n const key = element.key ?? index;\n\n if (isMenuItem(element)) {\n const menuItemProps = element.props as MenuItemProps;\n // Навигация смотрит на исходный элемент источника, поэтому пункт-функция в нее не попадает:\n // выглядеть как доступная опция он не должен.\n const isNavigable = isNavigableMenuElement(resolvedItem);\n const isHighlighted = isNavigable && highlightedItemIndex === index;\n\n return React.cloneElement(element, {\n key,\n isMobile: disableScrollContainer,\n size,\n id: menuItemProps.id ?? (isNavigable && itemIdPrefix ? `${itemIdPrefix}-item-${index}` : undefined),\n role: menuItemProps.role ?? 'option',\n 'aria-selected': menuItemProps['aria-selected'] ?? false,\n 'aria-disabled': menuItemProps['aria-disabled'] ?? (isNavigable ? undefined : true),\n ...(isHighlighted ? { state: 'hover' } : null),\n } as MenuItemProps);\n }\n\n if (isMenuHeader(element) || isMenuFooter(element)) {\n return React.cloneElement(element, { key, size });\n }\n\n return React.cloneElement(element, { key });\n }\n\n const normalizedItem = normalizeTimeValue(resolvedItem.value, format);\n\n let state: 'hover' | 'selected' | undefined;\n\n if (highlightedItemIndex === index) {\n state = 'hover';\n } else if (normalizedItem === selectedValue) {\n state = 'selected';\n }\n\n return (\n <MenuItem\n key={`${resolvedItem.value}-${index}`}\n id={itemIdPrefix ? `${itemIdPrefix}-item-${index}` : undefined}\n role={'option'}\n aria-selected={normalizedItem === selectedValue}\n aria-disabled={resolvedItem.disabled || undefined}\n component={ItemRoot}\n disabled={resolvedItem.disabled}\n isNotSelectable={resolvedItem.disabled}\n size={size}\n state={state}\n onClick={resolvedItem.disabled ? undefined : () => onSelectItem(resolvedItem.item)}\n >\n {(activeState) => (\n <span\n data-tid={TimePickerDataTids.item}\n className={cx(styles.item(), itemSizeClassName)}\n ref={(node) => {\n if (!itemRefs) {\n return;\n }\n\n if (node) {\n itemRefs.current.set(index, node);\n } else {\n itemRefs.current.delete(index);\n }\n }}\n >\n {renderItem ? (\n renderItem(resolvedItem.item, activeState ?? null)\n ) : (\n <>\n <span className={styles.itemValue()}>{normalizedItem}</span>\n {resolvedItem.label && (\n <span\n className={cx(styles.itemLabel(), {\n [styles.itemLabelColor(theme)]: !resolvedItem.disabled,\n [styles.itemLabelHover(theme)]: !resolvedItem.disabled && activeState === 'hover',\n })}\n >\n {resolvedItem.label}\n </span>\n )}\n </>\n )}\n </span>\n )}\n </MenuItem>\n );\n })}\n </Menu>\n );\n};\n"]}
@@ -7,7 +7,6 @@ import type { MenuItemState } from '../MenuItem/index.js';
7
7
  import type { TimeSegment, TimeFormat, TimeItemValue, TimePickerMenuItem } from './helpers/TimePicker.shared.js';
8
8
  interface TimePickerMobilePopupProps<T extends TimeItemValue> {
9
9
  id?: string;
10
- opened: boolean;
11
10
  value: string;
12
11
  inputRef: React.RefObject<TimeInputRef | null>;
13
12
  disabled?: boolean;
@@ -18,8 +17,11 @@ interface TimePickerMobilePopupProps<T extends TimeItemValue> {
18
17
  resolvedItems: Array<TimePickerMenuItem<T>>;
19
18
  renderItem?: (item: T, state: MenuItemState) => ReactNode;
20
19
  isLoading?: boolean;
20
+ isFailed: boolean;
21
+ errorNetworkButton: string;
22
+ errorNetworkMessage: string;
21
23
  highlightedItemIndex: number | null;
22
- normalizedValue: string;
24
+ selectedValue: string;
23
25
  itemRefs: React.RefObject<Map<number, HTMLSpanElement>>;
24
26
  error?: boolean;
25
27
  warning?: boolean;
@@ -38,6 +40,7 @@ interface TimePickerMobilePopupProps<T extends TimeItemValue> {
38
40
  onMouseUp(event: React.MouseEvent<HTMLInputElement>): void;
39
41
  onPaste(event: React.ClipboardEvent<HTMLInputElement>): void;
40
42
  onSelectSegment(segment: TimeSegment, event: React.MouseEvent<HTMLSpanElement>): void;
43
+ onRetry(): void;
41
44
  onSelectItem(item: T): void;
42
45
  onCloseRequest(): void;
43
46
  }
@@ -17,7 +17,7 @@ import { isThemeGTE } from '../../lib/theming/ThemeHelpers.js';
17
17
  import { TimePickerDataTids } from './helpers/TimePicker.constants.js';
18
18
  import { TimePickerItems } from './TimePickerItems.js';
19
19
  export var TimePickerMobilePopup = function (props) {
20
- var id = props.id, opened = props.opened, value = props.value, inputRef = props.inputRef, disabled = props.disabled, format = props.format, size = props.size, rightIcon = props.rightIcon, suffix = props.suffix, resolvedItems = props.resolvedItems, renderItem = props.renderItem, isLoading = props.isLoading, highlightedItemIndex = props.highlightedItemIndex, normalizedValue = props.normalizedValue, itemRefs = props.itemRefs, error = props.error, warning = props.warning, ariaDescribedby = props["aria-describedby"], ariaLabel = props["aria-label"], ariaPlaceholder = props["aria-placeholder"], ariaActiveDescendant = props["aria-activedescendant"], ariaControls = props["aria-controls"], ariaExpanded = props["aria-expanded"], ariaHasPopup = props["aria-haspopup"], onFocus = props.onFocus, onBlur = props.onBlur, onClick = props.onClick, onKeyDown = props.onKeyDown, onMouseDownCapture = props.onMouseDownCapture, onMouseUp = props.onMouseUp, onPaste = props.onPaste, onSelectSegment = props.onSelectSegment, onSelectItem = props.onSelectItem, onCloseRequest = props.onCloseRequest;
20
+ var id = props.id, value = props.value, inputRef = props.inputRef, disabled = props.disabled, format = props.format, size = props.size, rightIcon = props.rightIcon, suffix = props.suffix, resolvedItems = props.resolvedItems, renderItem = props.renderItem, isLoading = props.isLoading, isFailed = props.isFailed, errorNetworkButton = props.errorNetworkButton, errorNetworkMessage = props.errorNetworkMessage, highlightedItemIndex = props.highlightedItemIndex, selectedValue = props.selectedValue, itemRefs = props.itemRefs, error = props.error, warning = props.warning, ariaDescribedby = props["aria-describedby"], ariaLabel = props["aria-label"], ariaPlaceholder = props["aria-placeholder"], ariaActiveDescendant = props["aria-activedescendant"], ariaControls = props["aria-controls"], ariaExpanded = props["aria-expanded"], ariaHasPopup = props["aria-haspopup"], onFocus = props.onFocus, onBlur = props.onBlur, onClick = props.onClick, onKeyDown = props.onKeyDown, onMouseDownCapture = props.onMouseDownCapture, onMouseUp = props.onMouseUp, onPaste = props.onPaste, onSelectSegment = props.onSelectSegment, onRetry = props.onRetry, onSelectItem = props.onSelectItem, onCloseRequest = props.onCloseRequest;
21
21
  var theme = useContext(ThemeContext);
22
22
  var themeGTE6_1 = isThemeGTE(theme, '6.1');
23
23
  useLayoutEffect(function () {
@@ -38,8 +38,8 @@ export var TimePickerMobilePopup = function (props) {
38
38
  : {
39
39
  headerChildComponent: input,
40
40
  };
41
- return (React.createElement(MobilePopup, __assign({ id: id, opened: opened }, themeDependantProps, { onCloseRequest: onCloseRequest }),
42
- React.createElement("div", { "data-tid": TimePickerDataTids.mobilePopup },
43
- React.createElement(TimePickerItems, { itemIdPrefix: id, format: format, size: size, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoading, highlightedItemIndex: highlightedItemIndex, normalizedValue: normalizedValue, itemRefs: itemRefs, maxHeight: 'auto', disableScrollContainer: true, onSelectItem: onSelectItem }))));
41
+ return (React.createElement(MobilePopup, __assign({ opened: true }, themeDependantProps, { onCloseRequest: onCloseRequest }),
42
+ React.createElement("div", { id: id, role: 'listbox', "data-tid": TimePickerDataTids.mobilePopup },
43
+ React.createElement(TimePickerItems, { itemIdPrefix: id, format: format, size: size, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoading, isFailed: isFailed, errorNetworkButton: errorNetworkButton, errorNetworkMessage: errorNetworkMessage, highlightedItemIndex: highlightedItemIndex, selectedValue: selectedValue, itemRefs: itemRefs, maxHeight: 'auto', disableScrollContainer: true, onRetry: onRetry, onSelectItem: onSelectItem }))));
44
44
  };
45
45
  //# sourceMappingURL=TimePickerMobilePopup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimePickerMobilePopup.js","sourceRoot":"","sources":["TimePickerMobilePopup.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAElE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAI/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAuCvD,MAAM,CAAC,IAAM,qBAAqB,GAAG,UAA0B,KAAoC;IAE/F,IAAA,EAAE,GAkCA,KAAK,GAlCL,EACF,MAAM,GAiCJ,KAAK,OAjCD,EACN,KAAK,GAgCH,KAAK,MAhCF,EACL,QAAQ,GA+BN,KAAK,SA/BC,EACR,QAAQ,GA8BN,KAAK,SA9BC,EACR,MAAM,GA6BJ,KAAK,OA7BD,EACN,IAAI,GA4BF,KAAK,KA5BH,EACJ,SAAS,GA2BP,KAAK,UA3BE,EACT,MAAM,GA0BJ,KAAK,OA1BD,EACN,aAAa,GAyBX,KAAK,cAzBM,EACb,UAAU,GAwBR,KAAK,WAxBG,EACV,SAAS,GAuBP,KAAK,UAvBE,EACT,oBAAoB,GAsBlB,KAAK,qBAtBa,EACpB,eAAe,GAqBb,KAAK,gBArBQ,EACf,QAAQ,GAoBN,KAAK,SApBC,EACR,KAAK,GAmBH,KAAK,MAnBF,EACL,OAAO,GAkBL,KAAK,QAlBA,EACa,eAAe,GAiBjC,KAAK,oBAjB4B,EACrB,SAAS,GAgBrB,KAAK,cAhBgB,EACH,eAAe,GAejC,KAAK,oBAf4B,EACV,oBAAoB,GAc3C,KAAK,yBAdsC,EAC5B,YAAY,GAa3B,KAAK,iBAbsB,EACZ,YAAY,GAY3B,KAAK,iBAZsB,EACZ,YAAY,GAW3B,KAAK,iBAXsB,EAC7B,OAAO,GAUL,KAAK,QAVA,EACP,MAAM,GASJ,KAAK,OATD,EACN,OAAO,GAQL,KAAK,QARA,EACP,SAAS,GAOP,KAAK,UAPE,EACT,kBAAkB,GAMhB,KAAK,mBANW,EAClB,SAAS,GAKP,KAAK,UALE,EACT,OAAO,GAIL,KAAK,QAJA,EACP,eAAe,GAGb,KAAK,gBAHQ,EACf,YAAY,GAEV,KAAK,aAFK,EACZ,cAAc,GACZ,KAAK,eADO,CACN;IAEV,IAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACvC,IAAM,WAAW,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE7C,eAAe,CAAC;QACd,IAAM,KAAK,GAAG,UAAU,CAAC;;YACvB,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,IAAM,KAAK,GAAG,CACZ,oBAAC,SAAS,IACR,GAAG,EAAE,QAAQ,cACH,kBAAkB,CAAC,WAAW,EACxC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EACpC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,sBACE,eAAe,gBACrB,SAAS,sBACH,eAAe,eACtB,SAAS,IAAI,SAAS,2BACV,oBAAoB,mBAC5B,YAAY,mBACZ,YAAY,mBACZ,YAAY,EAC3B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,kBAAkB,EAAE,kBAAkB,EACtC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,eAAe,GAChC,CACH,CAAC;IAEF,IAAM,mBAAmB,GAAG,WAAW;QACrC,CAAC,CAAC;YACE,oBAAoB,EAAE,KAAK;YAC3B,IAAI,MAAA;SACL;QACH,CAAC,CAAC;YACE,oBAAoB,EAAE,KAAK;SAC5B,CAAC;IAEN,OAAO,CACL,oBAAC,WAAW,aAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,IAAM,mBAAmB,IAAE,cAAc,EAAE,cAAc;QAC1F,yCAAe,kBAAkB,CAAC,WAAW;YAC3C,oBAAC,eAAe,IACd,YAAY,EAAE,EAAE,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,oBAAoB,EAAE,oBAAoB,EAC1C,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,sBAAsB,QACtB,YAAY,EAAE,YAAY,GAC1B,CACE,CACM,CACf,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React, { useContext, useLayoutEffect } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { MobilePopup } from '../../internal/MobilePopup/index.js';\nimport type { TimeInputRef } from '../../internal/TimeInput/index.js';\nimport { TimeInput } from '../../internal/TimeInput/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport { isThemeGTE } from '../../lib/theming/ThemeHelpers.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport type { InputIconType } from '../Input/index.js';\nimport type { MenuItemState } from '../MenuItem/index.js';\nimport { TimePickerDataTids } from './helpers/TimePicker.constants.js';\nimport type { TimeSegment, TimeFormat, TimeItemValue, TimePickerMenuItem } from './helpers/TimePicker.shared.js';\nimport { TimePickerItems } from './TimePickerItems.js';\n\ninterface TimePickerMobilePopupProps<T extends TimeItemValue> {\n id?: string;\n opened: boolean;\n value: string;\n inputRef: React.RefObject<TimeInputRef | null>;\n disabled?: boolean;\n format: TimeFormat;\n size: SizeProp;\n rightIcon?: InputIconType;\n suffix?: ReactNode;\n resolvedItems: Array<TimePickerMenuItem<T>>;\n renderItem?: (item: T, state: MenuItemState) => ReactNode;\n isLoading?: boolean;\n highlightedItemIndex: number | null;\n normalizedValue: string;\n itemRefs: React.RefObject<Map<number, HTMLSpanElement>>;\n error?: boolean;\n warning?: boolean;\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n 'aria-placeholder'?: string;\n 'aria-activedescendant'?: string;\n 'aria-controls'?: string;\n 'aria-expanded'?: boolean;\n 'aria-haspopup'?: React.AriaAttributes['aria-haspopup'];\n onFocus(event: React.FocusEvent<HTMLInputElement>): void;\n onBlur(event: React.FocusEvent<HTMLInputElement>): void;\n onClick(event: React.MouseEvent<HTMLInputElement>): void;\n onKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void;\n onMouseDownCapture(event: React.MouseEvent<HTMLInputElement>): void;\n onMouseUp(event: React.MouseEvent<HTMLInputElement>): void;\n onPaste(event: React.ClipboardEvent<HTMLInputElement>): void;\n onSelectSegment(segment: TimeSegment, event: React.MouseEvent<HTMLSpanElement>): void;\n onSelectItem(item: T): void;\n onCloseRequest(): void;\n}\n\nexport const TimePickerMobilePopup = <T extends TimeItemValue>(props: TimePickerMobilePopupProps<T>) => {\n const {\n id,\n opened,\n value,\n inputRef,\n disabled,\n format,\n size,\n rightIcon,\n suffix,\n resolvedItems,\n renderItem,\n isLoading,\n highlightedItemIndex,\n normalizedValue,\n itemRefs,\n error,\n warning,\n 'aria-describedby': ariaDescribedby,\n 'aria-label': ariaLabel,\n 'aria-placeholder': ariaPlaceholder,\n 'aria-activedescendant': ariaActiveDescendant,\n 'aria-controls': ariaControls,\n 'aria-expanded': ariaExpanded,\n 'aria-haspopup': ariaHasPopup,\n onFocus,\n onBlur,\n onClick,\n onKeyDown,\n onMouseDownCapture,\n onMouseUp,\n onPaste,\n onSelectSegment,\n onSelectItem,\n onCloseRequest,\n } = props;\n\n const theme = useContext(ThemeContext);\n const themeGTE6_1 = isThemeGTE(theme, '6.1');\n\n useLayoutEffect(() => {\n const timer = setTimeout(() => {\n inputRef.current?.focus();\n });\n\n return () => {\n clearTimeout(timer);\n };\n }, [inputRef]);\n\n const input = (\n <TimeInput\n ref={inputRef}\n data-tid={TimePickerDataTids.mobileInput}\n width={'100%'}\n disabled={disabled}\n format={format}\n size={themeGTE6_1 ? size : undefined}\n rightIcon={rightIcon}\n suffix={suffix}\n value={value}\n error={error}\n warning={warning}\n aria-describedby={ariaDescribedby}\n aria-label={ariaLabel}\n aria-placeholder={ariaPlaceholder}\n aria-busy={isLoading || undefined}\n aria-activedescendant={ariaActiveDescendant}\n aria-controls={ariaControls}\n aria-expanded={ariaExpanded}\n aria-haspopup={ariaHasPopup}\n onFocus={onFocus}\n onBlur={onBlur}\n onClick={onClick}\n onKeyDown={onKeyDown}\n onMouseDownCapture={onMouseDownCapture}\n onMouseUp={onMouseUp}\n onPaste={onPaste}\n onSelectSegment={onSelectSegment}\n />\n );\n\n const themeDependantProps = themeGTE6_1\n ? {\n footerChildComponent: input,\n size,\n }\n : {\n headerChildComponent: input,\n };\n\n return (\n <MobilePopup id={id} opened={opened} {...themeDependantProps} onCloseRequest={onCloseRequest}>\n <div data-tid={TimePickerDataTids.mobilePopup}>\n <TimePickerItems\n itemIdPrefix={id}\n format={format}\n size={size}\n resolvedItems={resolvedItems}\n renderItem={renderItem}\n isLoading={isLoading}\n highlightedItemIndex={highlightedItemIndex}\n normalizedValue={normalizedValue}\n itemRefs={itemRefs}\n maxHeight={'auto'}\n disableScrollContainer\n onSelectItem={onSelectItem}\n />\n </div>\n </MobilePopup>\n );\n};\n"]}
1
+ {"version":3,"file":"TimePickerMobilePopup.js","sourceRoot":"","sources":["TimePickerMobilePopup.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useContext, useLayoutEffect } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { MobilePopup } from '../../internal/MobilePopup/index.js';\nimport type { TimeInputRef } from '../../internal/TimeInput/index.js';\nimport { TimeInput } from '../../internal/TimeInput/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport { isThemeGTE } from '../../lib/theming/ThemeHelpers.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport type { InputIconType } from '../Input/index.js';\nimport type { MenuItemState } from '../MenuItem/index.js';\nimport { TimePickerDataTids } from './helpers/TimePicker.constants.js';\nimport type { TimeSegment, TimeFormat, TimeItemValue, TimePickerMenuItem } from './helpers/TimePicker.shared.js';\nimport { TimePickerItems } from './TimePickerItems.js';\n\ninterface TimePickerMobilePopupProps<T extends TimeItemValue> {\n id?: string;\n value: string;\n inputRef: React.RefObject<TimeInputRef | null>;\n disabled?: boolean;\n format: TimeFormat;\n size: SizeProp;\n rightIcon?: InputIconType;\n suffix?: ReactNode;\n resolvedItems: Array<TimePickerMenuItem<T>>;\n renderItem?: (item: T, state: MenuItemState) => ReactNode;\n isLoading?: boolean;\n isFailed: boolean;\n errorNetworkButton: string;\n errorNetworkMessage: string;\n highlightedItemIndex: number | null;\n selectedValue: string;\n itemRefs: React.RefObject<Map<number, HTMLSpanElement>>;\n error?: boolean;\n warning?: boolean;\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n 'aria-placeholder'?: string;\n 'aria-activedescendant'?: string;\n 'aria-controls'?: string;\n 'aria-expanded'?: boolean;\n 'aria-haspopup'?: React.AriaAttributes['aria-haspopup'];\n onFocus(event: React.FocusEvent<HTMLInputElement>): void;\n onBlur(event: React.FocusEvent<HTMLInputElement>): void;\n onClick(event: React.MouseEvent<HTMLInputElement>): void;\n onKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void;\n onMouseDownCapture(event: React.MouseEvent<HTMLInputElement>): void;\n onMouseUp(event: React.MouseEvent<HTMLInputElement>): void;\n onPaste(event: React.ClipboardEvent<HTMLInputElement>): void;\n onSelectSegment(segment: TimeSegment, event: React.MouseEvent<HTMLSpanElement>): void;\n onRetry(): void;\n onSelectItem(item: T): void;\n onCloseRequest(): void;\n}\n\nexport const TimePickerMobilePopup = <T extends TimeItemValue>(props: TimePickerMobilePopupProps<T>) => {\n const {\n id,\n value,\n inputRef,\n disabled,\n format,\n size,\n rightIcon,\n suffix,\n resolvedItems,\n renderItem,\n isLoading,\n isFailed,\n errorNetworkButton,\n errorNetworkMessage,\n highlightedItemIndex,\n selectedValue,\n itemRefs,\n error,\n warning,\n 'aria-describedby': ariaDescribedby,\n 'aria-label': ariaLabel,\n 'aria-placeholder': ariaPlaceholder,\n 'aria-activedescendant': ariaActiveDescendant,\n 'aria-controls': ariaControls,\n 'aria-expanded': ariaExpanded,\n 'aria-haspopup': ariaHasPopup,\n onFocus,\n onBlur,\n onClick,\n onKeyDown,\n onMouseDownCapture,\n onMouseUp,\n onPaste,\n onSelectSegment,\n onRetry,\n onSelectItem,\n onCloseRequest,\n } = props;\n\n const theme = useContext(ThemeContext);\n const themeGTE6_1 = isThemeGTE(theme, '6.1');\n\n useLayoutEffect(() => {\n const timer = setTimeout(() => {\n inputRef.current?.focus();\n });\n\n return () => {\n clearTimeout(timer);\n };\n }, [inputRef]);\n\n const input = (\n <TimeInput\n ref={inputRef}\n data-tid={TimePickerDataTids.mobileInput}\n width={'100%'}\n disabled={disabled}\n format={format}\n size={themeGTE6_1 ? size : undefined}\n rightIcon={rightIcon}\n suffix={suffix}\n value={value}\n error={error}\n warning={warning}\n aria-describedby={ariaDescribedby}\n aria-label={ariaLabel}\n aria-placeholder={ariaPlaceholder}\n aria-busy={isLoading || undefined}\n aria-activedescendant={ariaActiveDescendant}\n aria-controls={ariaControls}\n aria-expanded={ariaExpanded}\n aria-haspopup={ariaHasPopup}\n onFocus={onFocus}\n onBlur={onBlur}\n onClick={onClick}\n onKeyDown={onKeyDown}\n onMouseDownCapture={onMouseDownCapture}\n onMouseUp={onMouseUp}\n onPaste={onPaste}\n onSelectSegment={onSelectSegment}\n />\n );\n\n const themeDependantProps = themeGTE6_1\n ? {\n footerChildComponent: input,\n size,\n }\n : {\n headerChildComponent: input,\n };\n\n return (\n <MobilePopup opened {...themeDependantProps} onCloseRequest={onCloseRequest}>\n <div id={id} role={'listbox'} data-tid={TimePickerDataTids.mobilePopup}>\n <TimePickerItems\n itemIdPrefix={id}\n format={format}\n size={size}\n resolvedItems={resolvedItems}\n renderItem={renderItem}\n isLoading={isLoading}\n isFailed={isFailed}\n errorNetworkButton={errorNetworkButton}\n errorNetworkMessage={errorNetworkMessage}\n highlightedItemIndex={highlightedItemIndex}\n selectedValue={selectedValue}\n itemRefs={itemRefs}\n maxHeight={'auto'}\n disableScrollContainer\n onRetry={onRetry}\n onSelectItem={onSelectItem}\n />\n </div>\n </MobilePopup>\n );\n};\n"]}
@@ -14,9 +14,13 @@ interface TimePickerPopupProps<T extends TimeItemValue> {
14
14
  resolvedItems: Array<TimePickerMenuItem<T>>;
15
15
  renderItem?: (item: T, state: MenuItemState) => React.ReactNode;
16
16
  isLoading?: boolean;
17
+ isFailed: boolean;
18
+ errorNetworkButton: string;
19
+ errorNetworkMessage: string;
17
20
  highlightedItemIndex: number | null;
18
- normalizedValue: string;
21
+ selectedValue: string;
19
22
  itemRefs: React.RefObject<Map<number, HTMLSpanElement>>;
23
+ onRetry(): void;
20
24
  onSelectItem(item: T): void;
21
25
  }
22
26
  export declare const TimePickerPopup: <T extends TimeItemValue>(props: TimePickerPopupProps<T>) => React.JSX.Element;
@@ -8,11 +8,11 @@ import { TimePickerDataTids } from './helpers/TimePicker.constants.js';
8
8
  import { getStyles } from './TimePicker.styles.js';
9
9
  import { TimePickerItems } from './TimePickerItems.js';
10
10
  export var TimePickerPopup = function (props) {
11
- var id = props.id, anchorElement = props.anchorElement, menuPos = props.menuPos, menuAlign = props.menuAlign, menuWidth = props.menuWidth, popupMaxHeight = props.popupMaxHeight, format = props.format, size = props.size, resolvedItems = props.resolvedItems, renderItem = props.renderItem, isLoading = props.isLoading, highlightedItemIndex = props.highlightedItemIndex, normalizedValue = props.normalizedValue, itemRefs = props.itemRefs, onSelectItem = props.onSelectItem;
11
+ var id = props.id, anchorElement = props.anchorElement, menuPos = props.menuPos, menuAlign = props.menuAlign, menuWidth = props.menuWidth, popupMaxHeight = props.popupMaxHeight, format = props.format, size = props.size, resolvedItems = props.resolvedItems, renderItem = props.renderItem, isLoading = props.isLoading, isFailed = props.isFailed, errorNetworkButton = props.errorNetworkButton, errorNetworkMessage = props.errorNetworkMessage, highlightedItemIndex = props.highlightedItemIndex, selectedValue = props.selectedValue, itemRefs = props.itemRefs, onRetry = props.onRetry, onSelectItem = props.onSelectItem;
12
12
  var theme = useContext(ThemeContext);
13
13
  var styles = useStyles(getStyles);
14
- return (React.createElement(Popup, { id: id, opened: true, hasShadow: true, anchorElement: anchorElement, "data-tid": TimePickerDataTids.popup, priority: ZIndex.priorities.PopupMenu, margin: parseInt(theme.timePickerMenuOffsetY), width: menuWidth, minWidth: menuWidth === undefined ? '100%' : undefined, positions: getMenuPositions(menuPos, menuAlign) },
15
- React.createElement("div", { className: styles.popup(theme), onMouseDown: function (event) { return event.preventDefault(); } },
16
- React.createElement(TimePickerItems, { itemIdPrefix: id, format: format, size: size, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoading, highlightedItemIndex: highlightedItemIndex, normalizedValue: normalizedValue, itemRefs: itemRefs, maxHeight: popupMaxHeight, onSelectItem: onSelectItem }))));
14
+ return (React.createElement(Popup, { opened: true, hasShadow: true, anchorElement: anchorElement, "data-tid": TimePickerDataTids.popup, priority: ZIndex.priorities.PopupMenu, margin: parseInt(theme.timePickerMenuOffsetY), width: menuWidth, minWidth: menuWidth === undefined ? '100%' : undefined, positions: getMenuPositions(menuPos, menuAlign) },
15
+ React.createElement("div", { id: id, role: 'listbox', className: styles.popup(theme), onMouseDown: function (event) { return event.preventDefault(); } },
16
+ React.createElement(TimePickerItems, { itemIdPrefix: id, format: format, size: size, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoading, isFailed: isFailed, errorNetworkButton: errorNetworkButton, errorNetworkMessage: errorNetworkMessage, highlightedItemIndex: highlightedItemIndex, selectedValue: selectedValue, itemRefs: itemRefs, maxHeight: popupMaxHeight, onRetry: onRetry, onSelectItem: onSelectItem }))));
17
17
  };
18
18
  //# sourceMappingURL=TimePickerPopup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimePickerPopup.js","sourceRoot":"","sources":["TimePickerPopup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAoBvD,MAAM,CAAC,IAAM,eAAe,GAAG,UAA0B,KAA8B;IAEnF,IAAA,EAAE,GAeA,KAAK,GAfL,EACF,aAAa,GAcX,KAAK,cAdM,EACb,OAAO,GAaL,KAAK,QAbA,EACP,SAAS,GAYP,KAAK,UAZE,EACT,SAAS,GAWP,KAAK,UAXE,EACT,cAAc,GAUZ,KAAK,eAVO,EACd,MAAM,GASJ,KAAK,OATD,EACN,IAAI,GAQF,KAAK,KARH,EACJ,aAAa,GAOX,KAAK,cAPM,EACb,UAAU,GAMR,KAAK,WANG,EACV,SAAS,GAKP,KAAK,UALE,EACT,oBAAoB,GAIlB,KAAK,qBAJa,EACpB,eAAe,GAGb,KAAK,gBAHQ,EACf,QAAQ,GAEN,KAAK,SAFC,EACR,YAAY,GACV,KAAK,aADK,CACJ;IAEV,IAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACvC,IAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAEpC,OAAO,CACL,oBAAC,KAAK,IACJ,EAAE,EAAE,EAAE,EACN,MAAM,QACN,SAAS,QACT,aAAa,EAAE,aAAa,cAClB,kBAAkB,CAAC,KAAK,EAClC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EACrC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAC7C,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EACtD,SAAS,EAAE,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC;QAE/C,6BAAK,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,UAAC,KAAK,IAAK,OAAA,KAAK,CAAC,cAAc,EAAE,EAAtB,CAAsB;YACjF,oBAAC,eAAe,IACd,YAAY,EAAE,EAAE,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,oBAAoB,EAAE,oBAAoB,EAC1C,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,YAAY,GAC1B,CACE,CACA,CACT,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React, { useContext } from 'react';\n\nimport { Popup } from '../../internal/Popup/index.js';\nimport { ZIndex } from '../../internal/ZIndex/index.js';\nimport { getMenuPositions } from '../../lib/getMenuPositions.js';\nimport { useStyles } from '../../lib/renderEnvironment/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport type { MenuItemState } from '../MenuItem/index.js';\nimport { TimePickerDataTids } from './helpers/TimePicker.constants.js';\nimport type { TimeFormat, TimeItemValue, TimePickerMenuItem } from './helpers/TimePicker.shared.js';\nimport { getStyles } from './TimePicker.styles.js';\nimport { TimePickerItems } from './TimePickerItems.js';\n\ninterface TimePickerPopupProps<T extends TimeItemValue> {\n id?: string;\n anchorElement: HTMLElement;\n menuPos?: 'top' | 'bottom';\n menuAlign?: 'left' | 'right';\n menuWidth?: React.CSSProperties['width'];\n popupMaxHeight: string;\n format: TimeFormat;\n size: SizeProp;\n resolvedItems: Array<TimePickerMenuItem<T>>;\n renderItem?: (item: T, state: MenuItemState) => React.ReactNode;\n isLoading?: boolean;\n highlightedItemIndex: number | null;\n normalizedValue: string;\n itemRefs: React.RefObject<Map<number, HTMLSpanElement>>;\n onSelectItem(item: T): void;\n}\n\nexport const TimePickerPopup = <T extends TimeItemValue>(props: TimePickerPopupProps<T>) => {\n const {\n id,\n anchorElement,\n menuPos,\n menuAlign,\n menuWidth,\n popupMaxHeight,\n format,\n size,\n resolvedItems,\n renderItem,\n isLoading,\n highlightedItemIndex,\n normalizedValue,\n itemRefs,\n onSelectItem,\n } = props;\n\n const theme = useContext(ThemeContext);\n const styles = useStyles(getStyles);\n\n return (\n <Popup\n id={id}\n opened\n hasShadow\n anchorElement={anchorElement}\n data-tid={TimePickerDataTids.popup}\n priority={ZIndex.priorities.PopupMenu}\n margin={parseInt(theme.timePickerMenuOffsetY)}\n width={menuWidth}\n minWidth={menuWidth === undefined ? '100%' : undefined}\n positions={getMenuPositions(menuPos, menuAlign)}\n >\n <div className={styles.popup(theme)} onMouseDown={(event) => event.preventDefault()}>\n <TimePickerItems\n itemIdPrefix={id}\n format={format}\n size={size}\n resolvedItems={resolvedItems}\n renderItem={renderItem}\n isLoading={isLoading}\n highlightedItemIndex={highlightedItemIndex}\n normalizedValue={normalizedValue}\n itemRefs={itemRefs}\n maxHeight={popupMaxHeight}\n onSelectItem={onSelectItem}\n />\n </div>\n </Popup>\n );\n};\n"]}
1
+ {"version":3,"file":"TimePickerPopup.js","sourceRoot":"","sources":["TimePickerPopup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAwBvD,MAAM,CAAC,IAAM,eAAe,GAAG,UAA0B,KAA8B;IAEnF,IAAA,EAAE,GAmBA,KAAK,GAnBL,EACF,aAAa,GAkBX,KAAK,cAlBM,EACb,OAAO,GAiBL,KAAK,QAjBA,EACP,SAAS,GAgBP,KAAK,UAhBE,EACT,SAAS,GAeP,KAAK,UAfE,EACT,cAAc,GAcZ,KAAK,eAdO,EACd,MAAM,GAaJ,KAAK,OAbD,EACN,IAAI,GAYF,KAAK,KAZH,EACJ,aAAa,GAWX,KAAK,cAXM,EACb,UAAU,GAUR,KAAK,WAVG,EACV,SAAS,GASP,KAAK,UATE,EACT,QAAQ,GAQN,KAAK,SARC,EACR,kBAAkB,GAOhB,KAAK,mBAPW,EAClB,mBAAmB,GAMjB,KAAK,oBANY,EACnB,oBAAoB,GAKlB,KAAK,qBALa,EACpB,aAAa,GAIX,KAAK,cAJM,EACb,QAAQ,GAGN,KAAK,SAHC,EACR,OAAO,GAEL,KAAK,QAFA,EACP,YAAY,GACV,KAAK,aADK,CACJ;IAEV,IAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACvC,IAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAEpC,OAAO,CACL,oBAAC,KAAK,IACJ,MAAM,QACN,SAAS,QACT,aAAa,EAAE,aAAa,cAClB,kBAAkB,CAAC,KAAK,EAClC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EACrC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAC7C,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EACtD,SAAS,EAAE,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC;QAE/C,6BAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,UAAC,KAAK,IAAK,OAAA,KAAK,CAAC,cAAc,EAAE,EAAtB,CAAsB;YAC1G,oBAAC,eAAe,IACd,YAAY,EAAE,EAAE,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,kBAAkB,EAAE,kBAAkB,EACtC,mBAAmB,EAAE,mBAAmB,EACxC,oBAAoB,EAAE,oBAAoB,EAC1C,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,GAC1B,CACE,CACA,CACT,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React, { useContext } from 'react';\n\nimport { Popup } from '../../internal/Popup/index.js';\nimport { ZIndex } from '../../internal/ZIndex/index.js';\nimport { getMenuPositions } from '../../lib/getMenuPositions.js';\nimport { useStyles } from '../../lib/renderEnvironment/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport type { MenuItemState } from '../MenuItem/index.js';\nimport { TimePickerDataTids } from './helpers/TimePicker.constants.js';\nimport type { TimeFormat, TimeItemValue, TimePickerMenuItem } from './helpers/TimePicker.shared.js';\nimport { getStyles } from './TimePicker.styles.js';\nimport { TimePickerItems } from './TimePickerItems.js';\n\ninterface TimePickerPopupProps<T extends TimeItemValue> {\n id?: string;\n anchorElement: HTMLElement;\n menuPos?: 'top' | 'bottom';\n menuAlign?: 'left' | 'right';\n menuWidth?: React.CSSProperties['width'];\n popupMaxHeight: string;\n format: TimeFormat;\n size: SizeProp;\n resolvedItems: Array<TimePickerMenuItem<T>>;\n renderItem?: (item: T, state: MenuItemState) => React.ReactNode;\n isLoading?: boolean;\n isFailed: boolean;\n errorNetworkButton: string;\n errorNetworkMessage: string;\n highlightedItemIndex: number | null;\n selectedValue: string;\n itemRefs: React.RefObject<Map<number, HTMLSpanElement>>;\n onRetry(): void;\n onSelectItem(item: T): void;\n}\n\nexport const TimePickerPopup = <T extends TimeItemValue>(props: TimePickerPopupProps<T>) => {\n const {\n id,\n anchorElement,\n menuPos,\n menuAlign,\n menuWidth,\n popupMaxHeight,\n format,\n size,\n resolvedItems,\n renderItem,\n isLoading,\n isFailed,\n errorNetworkButton,\n errorNetworkMessage,\n highlightedItemIndex,\n selectedValue,\n itemRefs,\n onRetry,\n onSelectItem,\n } = props;\n\n const theme = useContext(ThemeContext);\n const styles = useStyles(getStyles);\n\n return (\n <Popup\n opened\n hasShadow\n anchorElement={anchorElement}\n data-tid={TimePickerDataTids.popup}\n priority={ZIndex.priorities.PopupMenu}\n margin={parseInt(theme.timePickerMenuOffsetY)}\n width={menuWidth}\n minWidth={menuWidth === undefined ? '100%' : undefined}\n positions={getMenuPositions(menuPos, menuAlign)}\n >\n <div id={id} role={'listbox'} className={styles.popup(theme)} onMouseDown={(event) => event.preventDefault()}>\n <TimePickerItems\n itemIdPrefix={id}\n format={format}\n size={size}\n resolvedItems={resolvedItems}\n renderItem={renderItem}\n isLoading={isLoading}\n isFailed={isFailed}\n errorNetworkButton={errorNetworkButton}\n errorNetworkMessage={errorNetworkMessage}\n highlightedItemIndex={highlightedItemIndex}\n selectedValue={selectedValue}\n itemRefs={itemRefs}\n maxHeight={popupMaxHeight}\n onRetry={onRetry}\n onSelectItem={onSelectItem}\n />\n </div>\n </Popup>\n );\n};\n"]}
@@ -8,8 +8,11 @@ export declare const TimePickerDataTids: {
8
8
  readonly mobilePopup: "TimePicker__mobilePopup";
9
9
  readonly item: "TimePicker__item";
10
10
  readonly loading: "TimePicker__loading";
11
+ readonly failed: "TimePicker__failed";
11
12
  readonly inputLoading: "TimePicker__inputLoading";
12
13
  };
14
+ /** Больше двух десятков часов не бывает: такая первая цифра сразу завершает сегмент. */
15
+ export declare const HOURS_FIRST_DIGIT_MAX = 2;
13
16
  export declare const TIME_PLACEHOLDER_CHAR = "\u2212";
14
17
  export declare const TIME_SEPARATOR = ":";
15
18
  export declare const TIME_SEGMENT_LENGTH = 2;
@@ -20,5 +23,9 @@ export declare const EMPTY_VALUE = "";
20
23
  export declare const DIGIT_REGEXP: RegExp;
21
24
  export declare const NON_DIGIT_REGEXP: RegExp;
22
25
  export declare const EMPTY_SEGMENT: string;
26
+ export declare const MAX_TIME_SEGMENTS_COUNT = 3;
27
+ /** Сегменты времени через любой разделитель: `12:30`, `9:5`, `1:23:45`, `12.30`. */
28
+ export declare const TIME_LIKE_SEGMENTS_REGEXP: RegExp;
29
+ /** Время без разделителей: `1`, `12`, `1230`, `123045`. */
30
+ export declare const TIME_LIKE_DIGITS_REGEXP: RegExp;
23
31
  export declare const TIME_SEGMENTS_BY_FORMAT: Record<TimeFormat, TimeSegment[]>;
24
- export declare const FIRST_DIGIT_MAX_BY_SEGMENT: Record<TimeSegment, number>;
@@ -7,10 +7,11 @@ export var TimePickerDataTids = {
7
7
  mobilePopup: 'TimePicker__mobilePopup',
8
8
  item: 'TimePicker__item',
9
9
  loading: 'TimePicker__loading',
10
+ failed: 'TimePicker__failed',
10
11
  inputLoading: 'TimePicker__inputLoading',
11
12
  };
12
- var HOURS_FIRST_DIGIT_MAX = 2;
13
- var MINUTES_AND_SECONDS_FIRST_DIGIT_MAX = 5;
13
+ /** Больше двух десятков часов не бывает: такая первая цифра сразу завершает сегмент. */
14
+ export var HOURS_FIRST_DIGIT_MAX = 2;
14
15
  export var TIME_PLACEHOLDER_CHAR = '\u2212';
15
16
  export var TIME_SEPARATOR = ':';
16
17
  export var TIME_SEGMENT_LENGTH = 2;
@@ -21,13 +22,13 @@ export var EMPTY_VALUE = '';
21
22
  export var DIGIT_REGEXP = /\d/;
22
23
  export var NON_DIGIT_REGEXP = /\D/g;
23
24
  export var EMPTY_SEGMENT = TIME_PLACEHOLDER_CHAR.repeat(TIME_SEGMENT_LENGTH);
25
+ export var MAX_TIME_SEGMENTS_COUNT = 3;
26
+ /** Сегменты времени через любой разделитель: `12:30`, `9:5`, `1:23:45`, `12.30`. */
27
+ export var TIME_LIKE_SEGMENTS_REGEXP = new RegExp("^\\d{1,2}(?:\\D{1,3}\\d{1,2}){0,".concat(MAX_TIME_SEGMENTS_COUNT - 1, "}$"));
28
+ /** Время без разделителей: `1`, `12`, `1230`, `123045`. */
29
+ export var TIME_LIKE_DIGITS_REGEXP = new RegExp("^\\d{1,".concat(MAX_TIME_SEGMENTS_COUNT * TIME_SEGMENT_LENGTH, "}$"));
24
30
  export var TIME_SEGMENTS_BY_FORMAT = {
25
31
  'HH:mm': ['hours', 'minutes'],
26
32
  'HH:mm:ss': ['hours', 'minutes', 'seconds'],
27
33
  };
28
- export var FIRST_DIGIT_MAX_BY_SEGMENT = {
29
- hours: HOURS_FIRST_DIGIT_MAX,
30
- minutes: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,
31
- seconds: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,
32
- };
33
34
  //# sourceMappingURL=TimePicker.constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker.constants.js","sourceRoot":"","sources":["TimePicker.constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,IAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EAAE,yBAAyB;IACtC,WAAW,EAAE,yBAAyB;IACtC,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EAAE,yBAAyB;IACtC,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,qBAAqB;IAC9B,YAAY,EAAE,0BAA0B;CAChC,CAAC;AAEX,IAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,IAAM,mCAAmC,GAAG,CAAC,CAAC;AAC9C,MAAM,CAAC,IAAM,qBAAqB,GAAG,QAAQ,CAAC;AAC9C,MAAM,CAAC,IAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,IAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,IAAM,eAAe,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,IAAM,6BAA6B,GAAG,EAAE,CAAC;AAChD,MAAM,CAAC,IAAM,aAAa,GAAG,GAAG,CAAC;AACjC,MAAM,CAAC,IAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,MAAM,CAAC,IAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,IAAM,gBAAgB,GAAG,KAAK,CAAC;AACtC,MAAM,CAAC,IAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE/E,MAAM,CAAC,IAAM,uBAAuB,GAAsC;IACxE,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;CAC5C,CAAC;AAEF,MAAM,CAAC,IAAM,0BAA0B,GAAgC;IACrE,KAAK,EAAE,qBAAqB;IAC5B,OAAO,EAAE,mCAAmC;IAC5C,OAAO,EAAE,mCAAmC;CAC7C,CAAC","sourcesContent":["import type { TimeFormat, TimeSegment } from './TimePicker.shared.js';\n\nexport const TimePickerDataTids = {\n root: 'TimePicker__root',\n input: 'TimePicker__input',\n mobileInput: 'TimePicker__mobileInput',\n nativeInput: 'TimePicker__nativeInput',\n popup: 'TimePicker__popup',\n mobilePopup: 'TimePicker__mobilePopup',\n item: 'TimePicker__item',\n loading: 'TimePicker__loading',\n inputLoading: 'TimePicker__inputLoading',\n} as const;\n\nconst HOURS_FIRST_DIGIT_MAX = 2;\nconst MINUTES_AND_SECONDS_FIRST_DIGIT_MAX = 5;\nexport const TIME_PLACEHOLDER_CHAR = '\\u2212';\nexport const TIME_SEPARATOR = ':';\nexport const TIME_SEGMENT_LENGTH = 2;\nexport const HOURS_MAX_VALUE = 23;\nexport const MINUTES_AND_SECONDS_MAX_VALUE = 59;\nexport const ZERO_PAD_CHAR = '0';\nexport const EMPTY_VALUE = '';\nexport const DIGIT_REGEXP = /\\d/;\nexport const NON_DIGIT_REGEXP = /\\D/g;\nexport const EMPTY_SEGMENT = TIME_PLACEHOLDER_CHAR.repeat(TIME_SEGMENT_LENGTH);\n\nexport const TIME_SEGMENTS_BY_FORMAT: Record<TimeFormat, TimeSegment[]> = {\n 'HH:mm': ['hours', 'minutes'],\n 'HH:mm:ss': ['hours', 'minutes', 'seconds'],\n};\n\nexport const FIRST_DIGIT_MAX_BY_SEGMENT: Record<TimeSegment, number> = {\n hours: HOURS_FIRST_DIGIT_MAX,\n minutes: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,\n seconds: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,\n};\n"]}
1
+ {"version":3,"file":"TimePicker.constants.js","sourceRoot":"","sources":["TimePicker.constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,IAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EAAE,yBAAyB;IACtC,WAAW,EAAE,yBAAyB;IACtC,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EAAE,yBAAyB;IACtC,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,qBAAqB;IAC9B,MAAM,EAAE,oBAAoB;IAC5B,YAAY,EAAE,0BAA0B;CAChC,CAAC;AAEX,wFAAwF;AACxF,MAAM,CAAC,IAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,IAAM,qBAAqB,GAAG,QAAQ,CAAC;AAC9C,MAAM,CAAC,IAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,IAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,IAAM,eAAe,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,IAAM,6BAA6B,GAAG,EAAE,CAAC;AAChD,MAAM,CAAC,IAAM,aAAa,GAAG,GAAG,CAAC;AACjC,MAAM,CAAC,IAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,MAAM,CAAC,IAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,IAAM,gBAAgB,GAAG,KAAK,CAAC;AACtC,MAAM,CAAC,IAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE/E,MAAM,CAAC,IAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,oFAAoF;AACpF,MAAM,CAAC,IAAM,yBAAyB,GAAG,IAAI,MAAM,CAAC,0CAAmC,uBAAuB,GAAG,CAAC,OAAI,CAAC,CAAC;AACxH,2DAA2D;AAC3D,MAAM,CAAC,IAAM,uBAAuB,GAAG,IAAI,MAAM,CAAC,iBAAU,uBAAuB,GAAG,mBAAmB,OAAI,CAAC,CAAC;AAE/G,MAAM,CAAC,IAAM,uBAAuB,GAAsC;IACxE,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;CAC5C,CAAC","sourcesContent":["import type { TimeFormat, TimeSegment } from './TimePicker.shared.js';\n\nexport const TimePickerDataTids = {\n root: 'TimePicker__root',\n input: 'TimePicker__input',\n mobileInput: 'TimePicker__mobileInput',\n nativeInput: 'TimePicker__nativeInput',\n popup: 'TimePicker__popup',\n mobilePopup: 'TimePicker__mobilePopup',\n item: 'TimePicker__item',\n loading: 'TimePicker__loading',\n failed: 'TimePicker__failed',\n inputLoading: 'TimePicker__inputLoading',\n} as const;\n\n/** Больше двух десятков часов не бывает: такая первая цифра сразу завершает сегмент. */\nexport const HOURS_FIRST_DIGIT_MAX = 2;\nexport const TIME_PLACEHOLDER_CHAR = '\\u2212';\nexport const TIME_SEPARATOR = ':';\nexport const TIME_SEGMENT_LENGTH = 2;\nexport const HOURS_MAX_VALUE = 23;\nexport const MINUTES_AND_SECONDS_MAX_VALUE = 59;\nexport const ZERO_PAD_CHAR = '0';\nexport const EMPTY_VALUE = '';\nexport const DIGIT_REGEXP = /\\d/;\nexport const NON_DIGIT_REGEXP = /\\D/g;\nexport const EMPTY_SEGMENT = TIME_PLACEHOLDER_CHAR.repeat(TIME_SEGMENT_LENGTH);\n\nexport const MAX_TIME_SEGMENTS_COUNT = 3;\n/** Сегменты времени через любой разделитель: `12:30`, `9:5`, `1:23:45`, `12.30`. */\nexport const TIME_LIKE_SEGMENTS_REGEXP = new RegExp(`^\\\\d{1,2}(?:\\\\D{1,3}\\\\d{1,2}){0,${MAX_TIME_SEGMENTS_COUNT - 1}}$`);\n/** Время без разделителей: `1`, `12`, `1230`, `123045`. */\nexport const TIME_LIKE_DIGITS_REGEXP = new RegExp(`^\\\\d{1,${MAX_TIME_SEGMENTS_COUNT * TIME_SEGMENT_LENGTH}}$`);\n\nexport const TIME_SEGMENTS_BY_FORMAT: Record<TimeFormat, TimeSegment[]> = {\n 'HH:mm': ['hours', 'minutes'],\n 'HH:mm:ss': ['hours', 'minutes', 'seconds'],\n};\n"]}
@@ -15,9 +15,5 @@ export declare const commitTimeSegmentOnLeave: (value: string, segment: TimeSegm
15
15
  * Пустой сегмент трактуется как `00`.
16
16
  */
17
17
  export declare const shiftTimeSegmentValue: (value: string, segment: TimeSegment, step: 1 | -1, format: TimeFormat) => string;
18
- /**
19
- * Обрабатывает ввод одной цифры в активный сегмент.
20
- * Возвращает следующее display-значение и метаданные для UI:
21
- * нужно ли завершить сегмент, перейти к следующему сегменту или показать анимацию ошибки.
22
- */
18
+ /** Обрабатывает ввод одной цифры в активный сегмент. */
23
19
  export declare const formatDigitToTimeSegment: (value: string, segment: TimeSegment, digit: string, format: TimeFormat) => TimeDigitInputResult;
@@ -1,4 +1,4 @@
1
- import { DIGIT_REGEXP, EMPTY_SEGMENT, EMPTY_VALUE, FIRST_DIGIT_MAX_BY_SEGMENT, TIME_PLACEHOLDER_CHAR, TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR, } from './TimePicker.constants.js';
1
+ import { DIGIT_REGEXP, EMPTY_SEGMENT, EMPTY_VALUE, HOURS_FIRST_DIGIT_MAX, TIME_PLACEHOLDER_CHAR, TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR, } from './TimePicker.constants.js';
2
2
  import { getNextTimeSegment } from './TimePicker.selection.js';
3
3
  import { getDigits, getTimeSegmentMax, hasPendingSingleDigit, normalizeEditableSegment, } from './TimePicker.shared.js';
4
4
  import { getTimeSegmentValue, replaceTimeSegment } from './TimePicker.value.js';
@@ -24,9 +24,6 @@ export var deleteTimeSegmentDigit = function (value, segment, format) {
24
24
  */
25
25
  export var commitTimeSegmentOnLeave = function (value, segment, format) {
26
26
  var nextValue = normalizeEditableSegment(getTimeSegmentValue(value, segment, format), segment);
27
- if (nextValue === EMPTY_SEGMENT) {
28
- return replaceTimeSegment(value, segment, EMPTY_SEGMENT, format);
29
- }
30
27
  return replaceTimeSegment(value, segment, nextValue, format);
31
28
  };
32
29
  /**
@@ -41,61 +38,37 @@ export var shiftTimeSegmentValue = function (value, segment, step, format) {
41
38
  var next = (current + step + max + 1) % (max + 1);
42
39
  return replaceTimeSegment(value, segment, String(next).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR), format);
43
40
  };
44
- /**
45
- * Обрабатывает ввод одной цифры в активный сегмент.
46
- * Возвращает следующее display-значение и метаданные для UI:
47
- * нужно ли завершить сегмент, перейти к следующему сегменту или показать анимацию ошибки.
48
- */
41
+ /** Обрабатывает ввод одной цифры в активный сегмент. */
49
42
  export var formatDigitToTimeSegment = function (value, segment, digit, format) {
50
43
  var currentSegmentValue = getTimeSegmentValue(value, segment, format);
51
44
  var nextSegment = getNextTimeSegment(segment, format);
52
45
  var shouldAppend = hasPendingSingleDigit(currentSegmentValue);
53
46
  var currentDigits = shouldAppend ? getDigits(currentSegmentValue) : '';
54
- var firstDigitThreshold = FIRST_DIGIT_MAX_BY_SEGMENT[segment];
55
47
  if (currentDigits.length === 0) {
56
- if (segment === 'hours' && Number(digit) > firstDigitThreshold) {
57
- var nextValue_1 = replaceTimeSegment(value, segment, "0".concat(digit), format);
48
+ // Первая цифра часов больше двух не может быть десятками, поэтому сегмент завершается сразу.
49
+ if (segment === 'hours' && Number(digit) > HOURS_FIRST_DIGIT_MAX) {
58
50
  return {
59
- isFinalPart: nextSegment === null,
60
- isCompletedPart: true,
61
51
  shouldBlink: false,
62
52
  selectedSegment: nextSegment !== null && nextSegment !== void 0 ? nextSegment : segment,
63
- nextValue: nextValue_1,
53
+ nextValue: replaceTimeSegment(value, segment, "0".concat(digit), format),
64
54
  };
65
55
  }
66
56
  return {
67
- isFinalPart: false,
68
- isCompletedPart: false,
69
57
  shouldBlink: false,
70
58
  selectedSegment: segment,
71
59
  nextValue: replaceTimeSegment(value, segment, "".concat(digit).concat(TIME_PLACEHOLDER_CHAR), format),
72
60
  };
73
61
  }
74
62
  if (segment === 'hours' && currentDigits === '2' && Number(digit) > 3) {
75
- return {
76
- isFinalPart: false,
77
- isCompletedPart: false,
78
- shouldBlink: true,
79
- selectedSegment: segment,
80
- nextValue: value,
81
- };
63
+ return { shouldBlink: true, selectedSegment: segment, nextValue: value };
82
64
  }
83
65
  if (segment !== 'hours' && Number("".concat(currentDigits).concat(digit)) > getTimeSegmentMax(segment)) {
84
- return {
85
- isFinalPart: false,
86
- isCompletedPart: false,
87
- shouldBlink: true,
88
- selectedSegment: segment,
89
- nextValue: value,
90
- };
66
+ return { shouldBlink: true, selectedSegment: segment, nextValue: value };
91
67
  }
92
- var nextValue = replaceTimeSegment(value, segment, String(Number("".concat(currentDigits).concat(digit))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR), format);
93
68
  return {
94
- isFinalPart: nextSegment === null,
95
- isCompletedPart: true,
96
69
  shouldBlink: false,
97
70
  selectedSegment: nextSegment !== null && nextSegment !== void 0 ? nextSegment : segment,
98
- nextValue: nextValue,
71
+ nextValue: replaceTimeSegment(value, segment, String(Number("".concat(currentDigits).concat(digit))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR), format),
99
72
  };
100
73
  };
101
74
  //# sourceMappingURL=TimePicker.editing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker.editing.js","sourceRoot":"","sources":["TimePicker.editing.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DIGIT_REGEXP,\n EMPTY_SEGMENT,\n EMPTY_VALUE,\n FIRST_DIGIT_MAX_BY_SEGMENT,\n TIME_PLACEHOLDER_CHAR,\n TIME_SEGMENT_LENGTH,\n ZERO_PAD_CHAR,\n} from './TimePicker.constants.js';\nimport { getNextTimeSegment } from './TimePicker.selection.js';\nimport {\n getDigits,\n getTimeSegmentMax,\n hasPendingSingleDigit,\n normalizeEditableSegment,\n type TimeDigitInputResult,\n type TimeFormat,\n type TimeSegment,\n} from './TimePicker.shared.js';\nimport { getTimeSegmentValue, replaceTimeSegment } from './TimePicker.value.js';\n\n/**\n * Удаляет одну цифру из активного сегмента справа налево.\n * Сначала превращает заполненный сегмент в значение с одной ожидающей цифрой,\n * затем — в полностью пустой сегмент.\n */\nexport const deleteTimeSegmentDigit = (value: string, segment: TimeSegment, format: TimeFormat): string => {\n const currentSegmentValue = getTimeSegmentValue(value, segment, format);\n\n const [first, second] = Array.from(currentSegmentValue);\n\n if (DIGIT_REGEXP.test(second ?? EMPTY_VALUE)) {\n return replaceTimeSegment(value, segment, `${first}${TIME_PLACEHOLDER_CHAR}`, format);\n }\n\n if (DIGIT_REGEXP.test(first ?? EMPTY_VALUE)) {\n return replaceTimeSegment(value, segment, EMPTY_SEGMENT, format);\n }\n\n return value;\n};\n\n/**\n * Коммитит активный сегмент при уходе с него или потере фокуса.\n * Частично введенное значение дополняется и нормализуется, а полностью пустой сегмент остается пустым.\n */\nexport const commitTimeSegmentOnLeave = (value: string, segment: TimeSegment, format: TimeFormat): string => {\n const nextValue = normalizeEditableSegment(getTimeSegmentValue(value, segment, format), segment);\n\n if (nextValue === EMPTY_SEGMENT) {\n return replaceTimeSegment(value, segment, EMPTY_SEGMENT, format);\n }\n\n return replaceTimeSegment(value, segment, nextValue, format);\n};\n\n/**\n * Сдвигает значение активного сегмента на шаг вверх или вниз с циклическим переходом по границам.\n * Пустой сегмент трактуется как `00`.\n */\nexport const shiftTimeSegmentValue = (\n value: string,\n segment: TimeSegment,\n step: 1 | -1,\n format: TimeFormat,\n): string => {\n const currentSegmentValue = getTimeSegmentValue(value, segment, format);\n\n const normalizedSegmentValue = normalizeEditableSegment(currentSegmentValue, segment);\n\n const max = getTimeSegmentMax(segment);\n\n const current = normalizedSegmentValue === EMPTY_SEGMENT ? 0 : Number(normalizedSegmentValue);\n const next = (current + step + max + 1) % (max + 1);\n\n return replaceTimeSegment(value, segment, String(next).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR), format);\n};\n\n/**\n * Обрабатывает ввод одной цифры в активный сегмент.\n * Возвращает следующее display-значение и метаданные для UI:\n * нужно ли завершить сегмент, перейти к следующему сегменту или показать анимацию ошибки.\n */\nexport const formatDigitToTimeSegment = (\n value: string,\n segment: TimeSegment,\n digit: string,\n format: TimeFormat,\n): TimeDigitInputResult => {\n const currentSegmentValue = getTimeSegmentValue(value, segment, format);\n\n const nextSegment = getNextTimeSegment(segment, format);\n\n const shouldAppend = hasPendingSingleDigit(currentSegmentValue);\n\n const currentDigits = shouldAppend ? getDigits(currentSegmentValue) : '';\n const firstDigitThreshold = FIRST_DIGIT_MAX_BY_SEGMENT[segment];\n\n if (currentDigits.length === 0) {\n if (segment === 'hours' && Number(digit) > firstDigitThreshold) {\n const nextValue = replaceTimeSegment(value, segment, `0${digit}`, format);\n\n return {\n isFinalPart: nextSegment === null,\n isCompletedPart: true,\n shouldBlink: false,\n selectedSegment: nextSegment ?? segment,\n nextValue,\n };\n }\n\n return {\n isFinalPart: false,\n isCompletedPart: false,\n shouldBlink: false,\n selectedSegment: segment,\n nextValue: replaceTimeSegment(value, segment, `${digit}${TIME_PLACEHOLDER_CHAR}`, format),\n };\n }\n\n if (segment === 'hours' && currentDigits === '2' && Number(digit) > 3) {\n return {\n isFinalPart: false,\n isCompletedPart: false,\n shouldBlink: true,\n selectedSegment: segment,\n nextValue: value,\n };\n }\n\n if (segment !== 'hours' && Number(`${currentDigits}${digit}`) > getTimeSegmentMax(segment)) {\n return {\n isFinalPart: false,\n isCompletedPart: false,\n shouldBlink: true,\n selectedSegment: segment,\n nextValue: value,\n };\n }\n\n const nextValue = replaceTimeSegment(\n value,\n segment,\n String(Number(`${currentDigits}${digit}`)).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR),\n format,\n );\n\n return {\n isFinalPart: nextSegment === null,\n isCompletedPart: true,\n shouldBlink: false,\n selectedSegment: nextSegment ?? segment,\n nextValue,\n };\n};\n"]}
1
+ {"version":3,"file":"TimePicker.editing.js","sourceRoot":"","sources":["TimePicker.editing.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DIGIT_REGEXP,\n EMPTY_SEGMENT,\n EMPTY_VALUE,\n HOURS_FIRST_DIGIT_MAX,\n TIME_PLACEHOLDER_CHAR,\n TIME_SEGMENT_LENGTH,\n ZERO_PAD_CHAR,\n} from './TimePicker.constants.js';\nimport { getNextTimeSegment } from './TimePicker.selection.js';\nimport {\n getDigits,\n getTimeSegmentMax,\n hasPendingSingleDigit,\n normalizeEditableSegment,\n type TimeDigitInputResult,\n type TimeFormat,\n type TimeSegment,\n} from './TimePicker.shared.js';\nimport { getTimeSegmentValue, replaceTimeSegment } from './TimePicker.value.js';\n\n/**\n * Удаляет одну цифру из активного сегмента справа налево.\n * Сначала превращает заполненный сегмент в значение с одной ожидающей цифрой,\n * затем — в полностью пустой сегмент.\n */\nexport const deleteTimeSegmentDigit = (value: string, segment: TimeSegment, format: TimeFormat): string => {\n const currentSegmentValue = getTimeSegmentValue(value, segment, format);\n\n const [first, second] = Array.from(currentSegmentValue);\n\n if (DIGIT_REGEXP.test(second ?? EMPTY_VALUE)) {\n return replaceTimeSegment(value, segment, `${first}${TIME_PLACEHOLDER_CHAR}`, format);\n }\n\n if (DIGIT_REGEXP.test(first ?? EMPTY_VALUE)) {\n return replaceTimeSegment(value, segment, EMPTY_SEGMENT, format);\n }\n\n return value;\n};\n\n/**\n * Коммитит активный сегмент при уходе с него или потере фокуса.\n * Частично введенное значение дополняется и нормализуется, а полностью пустой сегмент остается пустым.\n */\nexport const commitTimeSegmentOnLeave = (value: string, segment: TimeSegment, format: TimeFormat): string => {\n const nextValue = normalizeEditableSegment(getTimeSegmentValue(value, segment, format), segment);\n\n return replaceTimeSegment(value, segment, nextValue, format);\n};\n\n/**\n * Сдвигает значение активного сегмента на шаг вверх или вниз с циклическим переходом по границам.\n * Пустой сегмент трактуется как `00`.\n */\nexport const shiftTimeSegmentValue = (\n value: string,\n segment: TimeSegment,\n step: 1 | -1,\n format: TimeFormat,\n): string => {\n const currentSegmentValue = getTimeSegmentValue(value, segment, format);\n\n const normalizedSegmentValue = normalizeEditableSegment(currentSegmentValue, segment);\n\n const max = getTimeSegmentMax(segment);\n\n const current = normalizedSegmentValue === EMPTY_SEGMENT ? 0 : Number(normalizedSegmentValue);\n const next = (current + step + max + 1) % (max + 1);\n\n return replaceTimeSegment(value, segment, String(next).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR), format);\n};\n\n/** Обрабатывает ввод одной цифры в активный сегмент. */\nexport const formatDigitToTimeSegment = (\n value: string,\n segment: TimeSegment,\n digit: string,\n format: TimeFormat,\n): TimeDigitInputResult => {\n const currentSegmentValue = getTimeSegmentValue(value, segment, format);\n\n const nextSegment = getNextTimeSegment(segment, format);\n\n const shouldAppend = hasPendingSingleDigit(currentSegmentValue);\n\n const currentDigits = shouldAppend ? getDigits(currentSegmentValue) : '';\n\n if (currentDigits.length === 0) {\n // Первая цифра часов больше двух не может быть десятками, поэтому сегмент завершается сразу.\n if (segment === 'hours' && Number(digit) > HOURS_FIRST_DIGIT_MAX) {\n return {\n shouldBlink: false,\n selectedSegment: nextSegment ?? segment,\n nextValue: replaceTimeSegment(value, segment, `0${digit}`, format),\n };\n }\n\n return {\n shouldBlink: false,\n selectedSegment: segment,\n nextValue: replaceTimeSegment(value, segment, `${digit}${TIME_PLACEHOLDER_CHAR}`, format),\n };\n }\n\n if (segment === 'hours' && currentDigits === '2' && Number(digit) > 3) {\n return { shouldBlink: true, selectedSegment: segment, nextValue: value };\n }\n\n if (segment !== 'hours' && Number(`${currentDigits}${digit}`) > getTimeSegmentMax(segment)) {\n return { shouldBlink: true, selectedSegment: segment, nextValue: value };\n }\n\n return {\n shouldBlink: false,\n selectedSegment: nextSegment ?? segment,\n nextValue: replaceTimeSegment(\n value,\n segment,\n String(Number(`${currentDigits}${digit}`)).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR),\n format,\n ),\n };\n};\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { ReactElement, ReactNode } from 'react';
2
+ import type { MenuItemProps } from '../../MenuItem/index.js';
2
3
  export type TimeFormat = 'HH:mm' | 'HH:mm:ss';
3
4
  export type TimeSegment = 'hours' | 'minutes' | 'seconds';
4
5
  export interface TimeItem {
@@ -8,8 +9,14 @@ export interface TimeItem {
8
9
  }
9
10
  /** Элемент со временем: строка в формате `HH:mm[:ss]` или объект. */
10
11
  export type TimeItemValue = string | TimeItem;
12
+ /**
13
+ * React-элемент выпадающего списка: сам элемент или функция, возвращающая его.
14
+ * Параметры типа заданы как `any`, чтобы тип совпадал с тем, что дает инлайн-разметка в `source`:
15
+ * иначе TypeScript не отличает React-элемент от элемента со временем и не выводит тип элемента.
16
+ */
17
+ export type TimePickerMenuElement = ReactElement<any, any> | (() => ReactElement<any, any>);
11
18
  /** Элемент, который можно передать в `source`: элемент со временем или React-элемент. */
12
- export type TimePickerExtendedItem<T extends TimeItemValue = TimeItemValue> = T | ReactElement | (() => ReactElement);
19
+ export type TimePickerExtendedItem<T extends TimeItemValue = TimeItemValue> = T | TimePickerMenuElement;
13
20
  export type TimePickerSource<T extends TimeItemValue = TimeItemValue> = Array<TimePickerExtendedItem<T>> | ((query: string) => Array<TimePickerExtendedItem<T>> | Promise<Array<TimePickerExtendedItem<T>>>);
14
21
  /** Значение поля времени: элемент, строка в формате `HH:mm[:ss]` или пустое значение. */
15
22
  export type TimePickerValue<T extends TimeItemValue = TimeItemValue> = T | string | null;
@@ -23,38 +30,35 @@ export interface TimePickerResolvedItem<T extends TimeItemValue = TimeItemValue>
23
30
  disabled: boolean;
24
31
  }
25
32
  /** Элемент выпадающего списка: разобранный элемент со временем или React-элемент. */
26
- export type TimePickerMenuItem<T extends TimeItemValue = TimeItemValue> = TimePickerResolvedItem<T> | ReactElement | (() => ReactElement);
33
+ export type TimePickerMenuItem<T extends TimeItemValue = TimeItemValue> = TimePickerResolvedItem<T> | TimePickerMenuElement;
27
34
  /** Проверяет, что элемент источника содержит время, а не является React-элементом. */
28
35
  export declare const isTimeItem: <T extends TimeItemValue>(item: TimePickerExtendedItem<T>) => item is T;
29
36
  /** Проверяет, что элемент выпадающего списка содержит время, а не является React-элементом. */
30
37
  export declare const isTimeMenuItem: <T extends TimeItemValue>(item: TimePickerMenuItem<T>) => item is TimePickerResolvedItem<T>;
31
- /** Возвращает время элемента. */
38
+ /**
39
+ * Проверяет, что элемент выпадающего списка — это `MenuItem`, по которому можно ходить с клавиатуры.
40
+ * Заблокированные и невыбираемые пункты в навигации не участвуют, как и элементы-функции:
41
+ * последние отрисовываются как есть, поэтому кликом по ним по-прежнему управляет их собственный `onClick`.
42
+ */
43
+ export declare const isNavigableMenuElement: <T extends TimeItemValue>(item: TimePickerMenuItem<T>) => item is ReactElement<MenuItemProps>;
44
+ /** Проверяет, что на элементе выпадающего списка может стоять выделение с клавиатуры. */
45
+ export declare const isHighlightableMenuItem: <T extends TimeItemValue>(item: TimePickerMenuItem<T>) => boolean;
32
46
  export declare const getTimeItemValue: (item: TimeItemValue) => string;
33
- /** Возвращает подпись элемента. У элемента-строки подписи нет. */
34
47
  export declare const getTimeItemLabel: (item: TimeItemValue) => ReactNode;
35
- /** Проверяет, заблокирован ли элемент. Элемент-строка заблокированным быть не может. */
36
48
  export declare const isTimeItemDisabled: (item: TimeItemValue) => boolean;
37
- /** Проверяет, задан ли элемент объектом. */
38
49
  export declare const isTimeItemObject: (item: TimeItemValue) => item is TimeItem;
39
50
  /**
40
51
  * Дефолтное преобразование времени в элемент.
41
52
  * Компонент повторяет форму элементов источника: строку оставляет строкой, а объекту задает только `value`.
42
53
  */
43
54
  export declare const timeValueToItem: <T extends TimeItemValue>(value: string, asObject: boolean) => T;
44
- /**
45
- * Результат ввода одной цифры в активный сегмент.
46
- * Содержит следующее display-значение и инструкции для UI по выбору сегмента и необходимости blink.
47
- */
55
+ /** Результат ввода одной цифры: следующее display-значение, сегмент под выделением и признак вспышки. */
48
56
  export interface TimeDigitInputResult {
49
- isFinalPart: boolean;
50
- isCompletedPart: boolean;
51
57
  nextValue: string;
52
58
  selectedSegment: TimeSegment;
53
59
  shouldBlink: boolean;
54
60
  }
55
- /** Возвращает массив сегментов, используемых в заданном формате времени. */
56
61
  export declare const getTimeSegments: (format: TimeFormat) => TimeSegment[];
57
- /** Возвращает верхнюю границу допустимого значения для конкретного сегмента. */
58
62
  export declare const getTimeSegmentMax: (segment: TimeSegment) => number;
59
63
  /** Извлекает из сегмента только цифры и ограничивает результат длиной сегмента. */
60
64
  export declare const getDigits: (segment: string) => string;
@@ -63,15 +67,9 @@ export declare const getDigits: (segment: string) => string;
63
67
  * оставляет только цифры и плейсхолдеры, ограничивает длину и дополняет незаполненные позиции плейсхолдером.
64
68
  */
65
69
  export declare const sanitizeSegment: (segment: string) => string;
66
- /**
67
- * Нормализует сегмент для committed-значения.
68
- * Пустой сегмент преобразуется в `00`, а значения выше максимума — к максимуму сегмента.
69
- */
70
+ /** Нормализует сегмент для committed-значения: пустой сегмент становится `00`. */
70
71
  export declare const normalizeTimeSegment: (segmentValue: string, segment: TimeSegment) => string;
71
- /**
72
- * Нормализует сегмент для режима редактирования.
73
- * В отличие от committed-нормализации, полностью пустой сегмент остается пустым.
74
- */
72
+ /** Нормализует сегмент для режима редактирования: полностью пустой сегмент остается пустым. */
75
73
  export declare const normalizeEditableSegment: (segmentValue: string, segment: TimeSegment) => string;
76
74
  /** Проверяет, что сегмент содержит одну введенную цифру и ожидает вторую. */
77
75
  export declare const hasPendingSingleDigit: (segmentValue: string) => boolean;