@skbkontur/react-ui 6.1.7-c386f.0 → 6.1.7-e032b.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 (58) hide show
  1. package/components/Button/Button.d.ts +1 -1
  2. package/components/Button/Button.js +4 -7
  3. package/components/Button/Button.js.map +1 -1
  4. package/components/FxInput/FxInputRestoreBtn.js +1 -1
  5. package/components/FxInput/FxInputRestoreBtn.js.map +1 -1
  6. package/components/Switcher/Switcher.js +0 -2
  7. package/components/Switcher/Switcher.js.map +1 -1
  8. package/components/TimePicker/TimePicker.d.ts +24 -23
  9. package/components/TimePicker/TimePicker.js +196 -132
  10. package/components/TimePicker/TimePicker.js.map +1 -1
  11. package/components/TimePicker/TimePickerItems.d.ts +1 -1
  12. package/components/TimePicker/TimePickerItems.js +5 -8
  13. package/components/TimePicker/TimePickerItems.js.map +1 -1
  14. package/components/TimePicker/TimePickerMobilePopup.d.ts +1 -2
  15. package/components/TimePicker/TimePickerMobilePopup.js +3 -3
  16. package/components/TimePicker/TimePickerMobilePopup.js.map +1 -1
  17. package/components/TimePicker/TimePickerPopup.d.ts +1 -1
  18. package/components/TimePicker/TimePickerPopup.js +2 -2
  19. package/components/TimePicker/TimePickerPopup.js.map +1 -1
  20. package/components/TimePicker/helpers/TimePicker.constants.d.ts +2 -1
  21. package/components/TimePicker/helpers/TimePicker.constants.js +2 -7
  22. package/components/TimePicker/helpers/TimePicker.constants.js.map +1 -1
  23. package/components/TimePicker/helpers/TimePicker.editing.d.ts +1 -5
  24. package/components/TimePicker/helpers/TimePicker.editing.js +8 -35
  25. package/components/TimePicker/helpers/TimePicker.editing.js.map +1 -1
  26. package/components/TimePicker/helpers/TimePicker.shared.d.ts +13 -24
  27. package/components/TimePicker/helpers/TimePicker.shared.js +13 -27
  28. package/components/TimePicker/helpers/TimePicker.shared.js.map +1 -1
  29. package/components/TimePicker/helpers/TimePicker.value.d.ts +3 -13
  30. package/components/TimePicker/helpers/TimePicker.value.js +13 -43
  31. package/components/TimePicker/helpers/TimePicker.value.js.map +1 -1
  32. package/components/TimePicker/helpers/scrollSelectedItemIntoView.d.ts +2 -0
  33. package/components/TimePicker/helpers/scrollSelectedItemIntoView.js +2 -0
  34. package/components/TimePicker/helpers/scrollSelectedItemIntoView.js.map +1 -1
  35. package/components/TimePicker/helpers/validateTimePicker.js +2 -4
  36. package/components/TimePicker/helpers/validateTimePicker.js.map +1 -1
  37. package/components/TimePicker/hooks/useTimePickerDropdown.js +9 -25
  38. package/components/TimePicker/hooks/useTimePickerDropdown.js.map +1 -1
  39. package/components/TimePicker/hooks/useTimePickerSource.js +2 -1
  40. package/components/TimePicker/hooks/useTimePickerSource.js.map +1 -1
  41. package/components/TimePicker/hooks/useTimePickerValue.d.ts +9 -4
  42. package/components/TimePicker/hooks/useTimePickerValue.js +22 -23
  43. package/components/TimePicker/hooks/useTimePickerValue.js.map +1 -1
  44. package/components/TimePicker/index.d.ts +1 -1
  45. package/components/TimePicker/index.js.map +1 -1
  46. package/internal/NativeTimeInput/NativeTimeInput.utils.d.ts +2 -0
  47. package/internal/NativeTimeInput/NativeTimeInput.utils.js +4 -8
  48. package/internal/NativeTimeInput/NativeTimeInput.utils.js.map +1 -1
  49. package/internal/TimeInput/TimeFragments.d.ts +0 -1
  50. package/internal/TimeInput/TimeFragments.js +27 -6
  51. package/internal/TimeInput/TimeFragments.js.map +1 -1
  52. package/internal/TimeInput/TimeFragments.styles.d.ts +14 -0
  53. package/internal/TimeInput/TimeFragments.styles.js +36 -9
  54. package/internal/TimeInput/TimeFragments.styles.js.map +1 -1
  55. package/internal/TimeInput/TimeInput.d.ts +0 -1
  56. package/internal/TimeInput/TimeInput.js +0 -1
  57. package/internal/TimeInput/TimeInput.js.map +1 -1
  58. package/package.json +1 -1
@@ -1 +1 @@
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 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 opened={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 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 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 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 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 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 highlightedItemIndex={highlightedItemIndex}\n selectedValue={selectedValue}\n itemRefs={itemRefs}\n maxHeight={'auto'}\n disableScrollContainer\n onSelectItem={onSelectItem}\n />\n </div>\n </MobilePopup>\n );\n};\n"]}
@@ -15,7 +15,7 @@ interface TimePickerPopupProps<T extends TimeItemValue> {
15
15
  renderItem?: (item: T, state: MenuItemState) => React.ReactNode;
16
16
  isLoading?: boolean;
17
17
  highlightedItemIndex: number | null;
18
- normalizedValue: string;
18
+ selectedValue: string;
19
19
  itemRefs: React.RefObject<Map<number, HTMLSpanElement>>;
20
20
  onSelectItem(item: T): void;
21
21
  }
@@ -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, highlightedItemIndex = props.highlightedItemIndex, selectedValue = props.selectedValue, itemRefs = props.itemRefs, onSelectItem = props.onSelectItem;
12
12
  var theme = useContext(ThemeContext);
13
13
  var styles = useStyles(getStyles);
14
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
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, highlightedItemIndex: highlightedItemIndex, normalizedValue: normalizedValue, itemRefs: itemRefs, maxHeight: popupMaxHeight, onSelectItem: onSelectItem }))));
16
+ React.createElement(TimePickerItems, { itemIdPrefix: id, format: format, size: size, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoading, highlightedItemIndex: highlightedItemIndex, selectedValue: selectedValue, itemRefs: itemRefs, maxHeight: popupMaxHeight, 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,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,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 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 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;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,aAAa,GAGX,KAAK,cAHM,EACb,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,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,oBAAoB,EAAE,oBAAoB,EAC1C,aAAa,EAAE,aAAa,EAC5B,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 selectedValue: 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 selectedValue,\n itemRefs,\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 highlightedItemIndex={highlightedItemIndex}\n selectedValue={selectedValue}\n itemRefs={itemRefs}\n maxHeight={popupMaxHeight}\n onSelectItem={onSelectItem}\n />\n </div>\n </Popup>\n );\n};\n"]}
@@ -10,6 +10,8 @@ export declare const TimePickerDataTids: {
10
10
  readonly loading: "TimePicker__loading";
11
11
  readonly inputLoading: "TimePicker__inputLoading";
12
12
  };
13
+ /** Больше двух десятков часов не бывает: такая первая цифра сразу завершает сегмент. */
14
+ export declare const HOURS_FIRST_DIGIT_MAX = 2;
13
15
  export declare const TIME_PLACEHOLDER_CHAR = "\u2212";
14
16
  export declare const TIME_SEPARATOR = ":";
15
17
  export declare const TIME_SEGMENT_LENGTH = 2;
@@ -26,4 +28,3 @@ export declare const TIME_LIKE_SEGMENTS_REGEXP: RegExp;
26
28
  /** Время без разделителей: `1`, `12`, `1230`, `123045`. */
27
29
  export declare const TIME_LIKE_DIGITS_REGEXP: RegExp;
28
30
  export declare const TIME_SEGMENTS_BY_FORMAT: Record<TimeFormat, TimeSegment[]>;
29
- export declare const FIRST_DIGIT_MAX_BY_SEGMENT: Record<TimeSegment, number>;
@@ -9,8 +9,8 @@ export var TimePickerDataTids = {
9
9
  loading: 'TimePicker__loading',
10
10
  inputLoading: 'TimePicker__inputLoading',
11
11
  };
12
- var HOURS_FIRST_DIGIT_MAX = 2;
13
- var MINUTES_AND_SECONDS_FIRST_DIGIT_MAX = 5;
12
+ /** Больше двух десятков часов не бывает: такая первая цифра сразу завершает сегмент. */
13
+ export var HOURS_FIRST_DIGIT_MAX = 2;
14
14
  export var TIME_PLACEHOLDER_CHAR = '\u2212';
15
15
  export var TIME_SEPARATOR = ':';
16
16
  export var TIME_SEGMENT_LENGTH = 2;
@@ -30,9 +30,4 @@ export var TIME_SEGMENTS_BY_FORMAT = {
30
30
  'HH:mm': ['hours', 'minutes'],
31
31
  'HH:mm:ss': ['hours', 'minutes', 'seconds'],
32
32
  };
33
- export var FIRST_DIGIT_MAX_BY_SEGMENT = {
34
- hours: HOURS_FIRST_DIGIT_MAX,
35
- minutes: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,
36
- seconds: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,
37
- };
38
33
  //# 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,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;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 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\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,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 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"]}
@@ -9,8 +9,14 @@ export interface TimeItem {
9
9
  }
10
10
  /** Элемент со временем: строка в формате `HH:mm[:ss]` или объект. */
11
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>);
12
18
  /** Элемент, который можно передать в `source`: элемент со временем или React-элемент. */
13
- export type TimePickerExtendedItem<T extends TimeItemValue = TimeItemValue> = T | ReactElement | (() => ReactElement);
19
+ export type TimePickerExtendedItem<T extends TimeItemValue = TimeItemValue> = T | TimePickerMenuElement;
14
20
  export type TimePickerSource<T extends TimeItemValue = TimeItemValue> = Array<TimePickerExtendedItem<T>> | ((query: string) => Array<TimePickerExtendedItem<T>> | Promise<Array<TimePickerExtendedItem<T>>>);
15
21
  /** Значение поля времени: элемент, строка в формате `HH:mm[:ss]` или пустое значение. */
16
22
  export type TimePickerValue<T extends TimeItemValue = TimeItemValue> = T | string | null;
@@ -24,46 +30,35 @@ export interface TimePickerResolvedItem<T extends TimeItemValue = TimeItemValue>
24
30
  disabled: boolean;
25
31
  }
26
32
  /** Элемент выпадающего списка: разобранный элемент со временем или React-элемент. */
27
- export type TimePickerMenuItem<T extends TimeItemValue = TimeItemValue> = TimePickerResolvedItem<T> | ReactElement | (() => ReactElement);
33
+ export type TimePickerMenuItem<T extends TimeItemValue = TimeItemValue> = TimePickerResolvedItem<T> | TimePickerMenuElement;
28
34
  /** Проверяет, что элемент источника содержит время, а не является React-элементом. */
29
35
  export declare const isTimeItem: <T extends TimeItemValue>(item: TimePickerExtendedItem<T>) => item is T;
30
36
  /** Проверяет, что элемент выпадающего списка содержит время, а не является React-элементом. */
31
37
  export declare const isTimeMenuItem: <T extends TimeItemValue>(item: TimePickerMenuItem<T>) => item is TimePickerResolvedItem<T>;
32
38
  /**
33
39
  * Проверяет, что элемент выпадающего списка — это `MenuItem`, по которому можно ходить с клавиатуры.
34
- * Заблокированные и невыбираемые пункты, как и элементы-функции, в навигации не участвуют:
35
- * их не выбирает и клик мышью.
40
+ * Заблокированные и невыбираемые пункты в навигации не участвуют, как и элементы-функции:
41
+ * последние отрисовываются как есть, поэтому кликом по ним по-прежнему управляет их собственный `onClick`.
36
42
  */
37
43
  export declare const isNavigableMenuElement: <T extends TimeItemValue>(item: TimePickerMenuItem<T>) => item is ReactElement<MenuItemProps>;
38
44
  /** Проверяет, что на элементе выпадающего списка может стоять выделение с клавиатуры. */
39
45
  export declare const isHighlightableMenuItem: <T extends TimeItemValue>(item: TimePickerMenuItem<T>) => boolean;
40
- /** Возвращает время элемента. */
41
46
  export declare const getTimeItemValue: (item: TimeItemValue) => string;
42
- /** Возвращает подпись элемента. У элемента-строки подписи нет. */
43
47
  export declare const getTimeItemLabel: (item: TimeItemValue) => ReactNode;
44
- /** Проверяет, заблокирован ли элемент. Элемент-строка заблокированным быть не может. */
45
48
  export declare const isTimeItemDisabled: (item: TimeItemValue) => boolean;
46
- /** Проверяет, задан ли элемент объектом. */
47
49
  export declare const isTimeItemObject: (item: TimeItemValue) => item is TimeItem;
48
50
  /**
49
51
  * Дефолтное преобразование времени в элемент.
50
52
  * Компонент повторяет форму элементов источника: строку оставляет строкой, а объекту задает только `value`.
51
53
  */
52
54
  export declare const timeValueToItem: <T extends TimeItemValue>(value: string, asObject: boolean) => T;
53
- /**
54
- * Результат ввода одной цифры в активный сегмент.
55
- * Содержит следующее display-значение и инструкции для UI по выбору сегмента и необходимости blink.
56
- */
55
+ /** Результат ввода одной цифры: следующее display-значение, сегмент под выделением и признак вспышки. */
57
56
  export interface TimeDigitInputResult {
58
- isFinalPart: boolean;
59
- isCompletedPart: boolean;
60
57
  nextValue: string;
61
58
  selectedSegment: TimeSegment;
62
59
  shouldBlink: boolean;
63
60
  }
64
- /** Возвращает массив сегментов, используемых в заданном формате времени. */
65
61
  export declare const getTimeSegments: (format: TimeFormat) => TimeSegment[];
66
- /** Возвращает верхнюю границу допустимого значения для конкретного сегмента. */
67
62
  export declare const getTimeSegmentMax: (segment: TimeSegment) => number;
68
63
  /** Извлекает из сегмента только цифры и ограничивает результат длиной сегмента. */
69
64
  export declare const getDigits: (segment: string) => string;
@@ -72,15 +67,9 @@ export declare const getDigits: (segment: string) => string;
72
67
  * оставляет только цифры и плейсхолдеры, ограничивает длину и дополняет незаполненные позиции плейсхолдером.
73
68
  */
74
69
  export declare const sanitizeSegment: (segment: string) => string;
75
- /**
76
- * Нормализует сегмент для committed-значения.
77
- * Пустой сегмент преобразуется в `00`, а значения выше максимума — к максимуму сегмента.
78
- */
70
+ /** Нормализует сегмент для committed-значения: пустой сегмент становится `00`. */
79
71
  export declare const normalizeTimeSegment: (segmentValue: string, segment: TimeSegment) => string;
80
- /**
81
- * Нормализует сегмент для режима редактирования.
82
- * В отличие от committed-нормализации, полностью пустой сегмент остается пустым.
83
- */
72
+ /** Нормализует сегмент для режима редактирования: полностью пустой сегмент остается пустым. */
84
73
  export declare const normalizeEditableSegment: (segmentValue: string, segment: TimeSegment) => string;
85
74
  /** Проверяет, что сегмент содержит одну введенную цифру и ожидает вторую. */
86
75
  export declare const hasPendingSingleDigit: (segmentValue: string) => boolean;
@@ -1,18 +1,17 @@
1
1
  import { isValidElement } from 'react';
2
2
  import { isMenuItem } from '../../MenuItem/index.js';
3
3
  import { DIGIT_REGEXP, EMPTY_SEGMENT, EMPTY_VALUE, HOURS_MAX_VALUE, MINUTES_AND_SECONDS_MAX_VALUE, NON_DIGIT_REGEXP, TIME_PLACEHOLDER_CHAR, TIME_SEGMENT_LENGTH, TIME_SEGMENTS_BY_FORMAT, TIME_SEPARATOR, ZERO_PAD_CHAR, } from './TimePicker.constants.js';
4
+ var isNotMenuElement = function (item) { return typeof item !== 'function' && !isValidElement(item); };
4
5
  /** Проверяет, что элемент источника содержит время, а не является React-элементом. */
5
6
  export var isTimeItem = function (item) {
6
- return typeof item === 'string' || (typeof item !== 'function' && !isValidElement(item));
7
+ return isNotMenuElement(item);
7
8
  };
8
9
  /** Проверяет, что элемент выпадающего списка содержит время, а не является React-элементом. */
9
- export var isTimeMenuItem = function (item) {
10
- return typeof item !== 'function' && !isValidElement(item);
11
- };
10
+ export var isTimeMenuItem = function (item) { return isNotMenuElement(item); };
12
11
  /**
13
12
  * Проверяет, что элемент выпадающего списка — это `MenuItem`, по которому можно ходить с клавиатуры.
14
- * Заблокированные и невыбираемые пункты, как и элементы-функции, в навигации не участвуют:
15
- * их не выбирает и клик мышью.
13
+ * Заблокированные и невыбираемые пункты в навигации не участвуют, как и элементы-функции:
14
+ * последние отрисовываются как есть, поэтому кликом по ним по-прежнему управляет их собственный `onClick`.
16
15
  */
17
16
  export var isNavigableMenuElement = function (item) {
18
17
  if (typeof item === 'function' || !isValidElement(item) || !isMenuItem(item)) {
@@ -25,13 +24,9 @@ export var isNavigableMenuElement = function (item) {
25
24
  export var isHighlightableMenuItem = function (item) {
26
25
  return isTimeMenuItem(item) ? !item.disabled : isNavigableMenuElement(item);
27
26
  };
28
- /** Возвращает время элемента. */
29
27
  export var getTimeItemValue = function (item) { return (typeof item === 'string' ? item : item.value); };
30
- /** Возвращает подпись элемента. У элемента-строки подписи нет. */
31
28
  export var getTimeItemLabel = function (item) { return (typeof item === 'string' ? undefined : item.label); };
32
- /** Проверяет, заблокирован ли элемент. Элемент-строка заблокированным быть не может. */
33
29
  export var isTimeItemDisabled = function (item) { return typeof item !== 'string' && Boolean(item.disabled); };
34
- /** Проверяет, задан ли элемент объектом. */
35
30
  export var isTimeItemObject = function (item) { return typeof item !== 'string'; };
36
31
  /**
37
32
  * Дефолтное преобразование времени в элемент.
@@ -40,9 +35,7 @@ export var isTimeItemObject = function (item) { return typeof item !== 'string';
40
35
  export var timeValueToItem = function (value, asObject) {
41
36
  return (asObject ? { value: value } : value);
42
37
  };
43
- /** Возвращает массив сегментов, используемых в заданном формате времени. */
44
38
  export var getTimeSegments = function (format) { return TIME_SEGMENTS_BY_FORMAT[format]; };
45
- /** Возвращает верхнюю границу допустимого значения для конкретного сегмента. */
46
39
  export var getTimeSegmentMax = function (segment) {
47
40
  return segment === 'hours' ? HOURS_MAX_VALUE : MINUTES_AND_SECONDS_MAX_VALUE;
48
41
  };
@@ -61,27 +54,20 @@ export var sanitizeSegment = function (segment) {
61
54
  .join('')
62
55
  .padEnd(TIME_SEGMENT_LENGTH, TIME_PLACEHOLDER_CHAR);
63
56
  };
64
- /**
65
- * Нормализует сегмент для committed-значения.
66
- * Пустой сегмент преобразуется в `00`, а значения выше максимума — к максимуму сегмента.
67
- */
68
- export var normalizeTimeSegment = function (segmentValue, segment) {
57
+ var normalizeSegment = function (segmentValue, segment, emptyResult) {
69
58
  var digits = getDigits(segmentValue);
70
59
  if (!digits) {
71
- return '00';
60
+ return emptyResult;
72
61
  }
73
62
  return String(Math.min(Number(digits), getTimeSegmentMax(segment))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR);
74
63
  };
75
- /**
76
- * Нормализует сегмент для режима редактирования.
77
- * В отличие от committed-нормализации, полностью пустой сегмент остается пустым.
78
- */
64
+ /** Нормализует сегмент для committed-значения: пустой сегмент становится `00`. */
65
+ export var normalizeTimeSegment = function (segmentValue, segment) {
66
+ return normalizeSegment(segmentValue, segment, '00');
67
+ };
68
+ /** Нормализует сегмент для режима редактирования: полностью пустой сегмент остается пустым. */
79
69
  export var normalizeEditableSegment = function (segmentValue, segment) {
80
- var digits = getDigits(segmentValue);
81
- if (!digits) {
82
- return EMPTY_SEGMENT;
83
- }
84
- return String(Math.min(Number(digits), getTimeSegmentMax(segment))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR);
70
+ return normalizeSegment(segmentValue, segment, EMPTY_SEGMENT);
85
71
  };
86
72
  /** Проверяет, что сегмент содержит одну введенную цифру и ожидает вторую. */
87
73
  export var hasPendingSingleDigit = function (segmentValue) {
@@ -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/** Элемент, который можно передать в `source`: элемент со временем или React-элемент. */\nexport type TimePickerExtendedItem<T extends TimeItemValue = TimeItemValue> = T | ReactElement | (() => ReactElement);\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 | ReactElement\n | (() => ReactElement);\n\n/** Проверяет, что элемент источника содержит время, а не является React-элементом. */\nexport const isTimeItem = <T extends TimeItemValue>(item: TimePickerExtendedItem<T>): item is T => {\n return typeof item === 'string' || (typeof item !== 'function' && !isValidElement(item));\n};\n\n/** Проверяет, что элемент выпадающего списка содержит время, а не является React-элементом. */\nexport const isTimeMenuItem = <T extends TimeItemValue>(\n item: TimePickerMenuItem<T>,\n): item is TimePickerResolvedItem<T> => {\n return typeof item !== 'function' && !isValidElement(item);\n};\n\n/**\n * Проверяет, что элемент выпадающего списка — это `MenuItem`, по которому можно ходить с клавиатуры.\n * Заблокированные и невыбираемые пункты, как и элементы-функции, в навигации не участвуют:\n * их не выбирает и клик мышью.\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\n/** Возвращает время элемента. */\nexport const getTimeItemValue = (item: TimeItemValue): string => (typeof item === 'string' ? item : item.value);\n\n/** Возвращает подпись элемента. У элемента-строки подписи нет. */\nexport const getTimeItemLabel = (item: TimeItemValue): ReactNode => (typeof item === 'string' ? undefined : item.label);\n\n/** Проверяет, заблокирован ли элемент. Элемент-строка заблокированным быть не может. */\nexport const isTimeItemDisabled = (item: TimeItemValue): boolean => typeof item !== 'string' && Boolean(item.disabled);\n\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/**\n * Результат ввода одной цифры в активный сегмент.\n * Содержит следующее display-значение и инструкции для UI по выбору сегмента и необходимости blink.\n */\nexport interface TimeDigitInputResult {\n isFinalPart: boolean;\n isCompletedPart: boolean;\n nextValue: string;\n selectedSegment: TimeSegment;\n shouldBlink: boolean;\n}\n\n/** Возвращает массив сегментов, используемых в заданном формате времени. */\nexport const getTimeSegments = (format: TimeFormat): TimeSegment[] => TIME_SEGMENTS_BY_FORMAT[format];\n\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\n/**\n * Нормализует сегмент для committed-значения.\n * Пустой сегмент преобразуется в `00`, а значения выше максимума — к максимуму сегмента.\n */\nexport const normalizeTimeSegment = (segmentValue: string, segment: TimeSegment): string => {\n const digits = getDigits(segmentValue);\n\n if (!digits) {\n return '00';\n }\n\n return String(Math.min(Number(digits), getTimeSegmentMax(segment))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR);\n};\n\n/**\n * Нормализует сегмент для режима редактирования.\n * В отличие от committed-нормализации, полностью пустой сегмент остается пустым.\n */\nexport const normalizeEditableSegment = (segmentValue: string, segment: TimeSegment): string => {\n const digits = getDigits(segmentValue);\n\n if (!digits) {\n return EMPTY_SEGMENT;\n }\n\n return String(Math.min(Number(digits), getTimeSegmentMax(segment))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR);\n};\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":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EACX,eAAe,EACf,6BAA6B,EAC7B,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,aAAa,GACd,MAAM,2BAA2B,CAAC;AA+CnC,IAAM,gBAAgB,GAAG,UAAC,IAAa,IAAc,OAAA,OAAO,IAAI,KAAK,UAAU,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAnD,CAAmD,CAAC;AAEzG,sFAAsF;AACtF,MAAM,CAAC,IAAM,UAAU,GAAG,UAA0B,IAA+B;IACjF,OAAA,gBAAgB,CAAC,IAAI,CAAC;AAAtB,CAAsB,CAAC;AAEzB,+FAA+F;AAC/F,MAAM,CAAC,IAAM,cAAc,GAAG,UAC5B,IAA2B,IACW,OAAA,gBAAgB,CAAC,IAAI,CAAC,EAAtB,CAAsB,CAAC;AAE/D;;;;GAIG;AACH,MAAM,CAAC,IAAM,sBAAsB,GAAG,UACpC,IAA2B;IAE3B,IAAI,OAAO,IAAI,KAAK,UAAU,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;IAEK,IAAA,KAAgC,IAAI,CAAC,KAAsB,EAAzD,QAAQ,cAAA,EAAE,eAAe,qBAAgC,CAAC;IAElE,OAAO,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC;AACvC,CAAC,CAAC;AAEF,yFAAyF;AACzF,MAAM,CAAC,IAAM,uBAAuB,GAAG,UAA0B,IAA2B;IAC1F,OAAA,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC;AAApE,CAAoE,CAAC;AAEvE,MAAM,CAAC,IAAM,gBAAgB,GAAG,UAAC,IAAmB,IAAa,OAAA,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAA9C,CAA8C,CAAC;AAEhH,MAAM,CAAC,IAAM,gBAAgB,GAAG,UAAC,IAAmB,IAAgB,OAAA,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAnD,CAAmD,CAAC;AAExH,MAAM,CAAC,IAAM,kBAAkB,GAAG,UAAC,IAAmB,IAAc,OAAA,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAlD,CAAkD,CAAC;AAEvH,MAAM,CAAC,IAAM,gBAAgB,GAAG,UAAC,IAAmB,IAAuB,OAAA,OAAO,IAAI,KAAK,QAAQ,EAAxB,CAAwB,CAAC;AAEpG;;;GAGG;AACH,MAAM,CAAC,IAAM,eAAe,GAAG,UAA0B,KAAa,EAAE,QAAiB;IACvF,OAAA,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,OAAA,EAAE,CAAC,CAAC,CAAC,KAAK,CAAM;AAAnC,CAAmC,CAAC;AAStC,MAAM,CAAC,IAAM,eAAe,GAAG,UAAC,MAAkB,IAAoB,OAAA,uBAAuB,CAAC,MAAM,CAAC,EAA/B,CAA+B,CAAC;AAEtG,MAAM,CAAC,IAAM,iBAAiB,GAAG,UAAC,OAAoB;IACpD,OAAA,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,6BAA6B;AAArE,CAAqE,CAAC;AAExE,mFAAmF;AACnF,MAAM,CAAC,IAAM,SAAS,GAAG,UAAC,OAAe;IACvC,OAAA,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC;AAA5E,CAA4E,CAAC;AAE/E;;;GAGG;AACH,MAAM,CAAC,IAAM,eAAe,GAAG,UAAC,OAAe;IAC7C,OAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,UAAC,IAAI,IAAK,OAAA,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,qBAAqB,EAAzD,CAAyD,CAAC;SAC3E,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC;SAC7B,IAAI,CAAC,EAAE,CAAC;SACR,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;AAJrD,CAIqD,CAAC;AAExD,IAAM,gBAAgB,GAAG,UAAC,YAAoB,EAAE,OAAoB,EAAE,WAAmB;IACvF,IAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;IAEvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;AACnH,CAAC,CAAC;AAEF,kFAAkF;AAClF,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAC,YAAoB,EAAE,OAAoB;IAC7E,OAAA,gBAAgB,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAA7C,CAA6C,CAAC;AAEhD,+FAA+F;AAC/F,MAAM,CAAC,IAAM,wBAAwB,GAAG,UAAC,YAAoB,EAAE,OAAoB;IACjF,OAAA,gBAAgB,CAAC,YAAY,EAAE,OAAO,EAAE,aAAa,CAAC;AAAtD,CAAsD,CAAC;AAEzD,6EAA6E;AAC7E,MAAM,CAAC,IAAM,qBAAqB,GAAG,UAAC,YAAoB;IACxD,OAAA,IAAI,MAAM,CAAC,cAAO,qBAAqB,MAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;AAA9D,CAA8D,CAAC;AAEjE;;;GAGG;AACH,MAAM,CAAC,IAAM,kBAAkB,GAAG,UAAC,KAAa,EAAE,MAAkB;IAClE,IAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACzC,IAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,cAAM,OAAA,aAAa,EAAb,CAAa,CAAC,CAAC;IAEnD,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC5E,IAAM,aAAW,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC,GAAG,CAAC,UAAC,CAAC,EAAE,KAAK,YAAK,OAAA,eAAe,CAAC,MAAA,aAAW,CAAC,KAAK,CAAC,mCAAI,WAAW,CAAC,CAAA,EAAA,CAAC,CAAC;IACxF,CAAC;IAED,IAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAE5D,OAAO,QAAQ,CAAC,GAAG,CAAC,UAAC,CAAC,EAAE,KAAK;QAC3B,IAAM,YAAY,GAAG,KAAK,GAAG,mBAAmB,CAAC;QACjD,IAAM,UAAU,GAAG,YAAY,GAAG,mBAAmB,CAAC;QAEtD,OAAO,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","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,7 +1,6 @@
1
1
  import { type TimeFormat, type TimeItemValue, type TimePickerExtendedItem, type TimePickerMenuItem, type TimeSegment } from './TimePicker.shared.js';
2
- /** Проверяет, содержит ли display-значение хотя бы одну введенную цифру. */
2
+ /** Проверяет, что в display-значении нет ни одной введенной цифры. */
3
3
  export declare const isTimeDisplayEmpty: (value: string) => boolean;
4
- /** Приводит значение поля — элемент, строку или пустое значение — к строке времени. */
5
4
  export declare const getTimeValueString: (value: TimeItemValue | null | undefined) => string;
6
5
  /**
7
6
  * Разбирает элементы источника для отрисовки: достает время и подпись,
@@ -16,13 +15,6 @@ export declare const resolveTimeItems: <T extends TimeItemValue>(items: Array<Ti
16
15
  * молча отбрасываются, а элементы, из которых не получается собрать время, отбрасываются с предупреждением.
17
16
  */
18
17
  export declare const sanitizeTimeItems: <T extends TimeItemValue>(items: Array<TimePickerExtendedItem<T>>, format: TimeFormat) => Array<TimePickerExtendedItem<T>>;
19
- /**
20
- * Оставляет в списке только первый элемент для каждого времени.
21
- * Времена сравниваются после нормализации к текущему формату,
22
- * поэтому в формате `HH:mm` элементы `12:00` и `12:00:30` считаются одинаковыми.
23
- * React-элементы не участвуют в сравнении и остаются на своих местах.
24
- */
25
- export declare const dedupeTimeItems: <T extends TimeItemValue>(items: Array<TimePickerExtendedItem<T>>, format: TimeFormat) => Array<TimePickerExtendedItem<T>>;
26
18
  /**
27
19
  * Проверяет, выходит ли значение за диапазон `minTime`/`maxTime` после нормализации.
28
20
  * Пустое значение не считается выходящим за диапазон. Если `minTime > maxTime`, диапазон трактуется как переходящий через полночь.
@@ -34,11 +26,10 @@ export declare const isTimeValueOutOfRange: (value: string, format: TimeFormat,
34
26
  */
35
27
  export declare const normalizeTimeValue: (value: string, format: TimeFormat) => string;
36
28
  /**
37
- * Преобразует display-значение в partial raw value для `onValueChange`.
29
+ * Преобразует display-значение в промежуточное значение для `onInputValueChange`.
38
30
  * Заполненные сегменты дополняются до двух цифр, пропущенные сегменты до последнего заполненного становятся `00`.
39
31
  */
40
32
  export declare const serializeTimeValue: (value: string, format: TimeFormat) => string;
41
- /** Возвращает display-значение с плейсхолдерами из partial или committed value. */
42
33
  export declare const getTimeDisplayValue: (value: string, format: TimeFormat) => string;
43
34
  /**
44
35
  * Возвращает display-значение внешнего `value`.
@@ -63,7 +54,6 @@ export declare const isTimeLikePastedValue: (value: string) => boolean;
63
54
  export declare const parsePastedTimeValue: (value: string, format: TimeFormat) => string;
64
55
  /** Возвращает текущее display-значение сегмента или пустой сегмент, если индекс отсутствует. */
65
56
  export declare const getTimeSegmentValue: (value: string, segment: TimeSegment, format: TimeFormat) => string;
66
- /** Возвращает полностью пустое display-значение для выбранной точности времени. */
67
57
  export declare const getEmptyDisplayValue: (precision: TimeFormat) => string;
68
58
  /**
69
59
  * Преобразует display-значение в поисковый запрос для фильтрации элементов.
@@ -73,7 +63,7 @@ export declare const getEmptyDisplayValue: (precision: TimeFormat) => string;
73
63
  */
74
64
  export declare const getTimeFilterQuery: (value: string, format: TimeFormat) => string;
75
65
  /**
76
- * Дефолтная функция фильтрации элементов по запросу из поля ввода.
66
+ * Фильтрует элементы по запросу из поля ввода.
77
67
  * Сравнивает запрос посегментно: введенные цифры сегмента должны быть префиксом соответствующего сегмента элемента.
78
68
  * Пустой запрос возвращает все элементы.
79
69
  */