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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/components/Input/Input.d.ts +1 -1
  2. package/components/Input/Input.js.map +1 -1
  3. package/components/TimePicker/TimeClockIcon.d.ts +3 -0
  4. package/components/TimePicker/TimeClockIcon.js +11 -0
  5. package/components/TimePicker/TimeClockIcon.js.map +1 -0
  6. package/components/TimePicker/TimeFragmentsView.d.ts +15 -0
  7. package/components/TimePicker/TimeFragmentsView.js +72 -0
  8. package/components/TimePicker/TimeFragmentsView.js.map +1 -0
  9. package/components/TimePicker/TimeFragmentsView.styles.d.ts +12 -0
  10. package/components/TimePicker/TimeFragmentsView.styles.js +43 -0
  11. package/components/TimePicker/TimeFragmentsView.styles.js.map +1 -0
  12. package/components/TimePicker/TimeInput.d.ts +22 -0
  13. package/components/TimePicker/TimeInput.js +103 -0
  14. package/components/TimePicker/TimeInput.js.map +1 -0
  15. package/components/TimePicker/TimePicker.d.ts +70 -0
  16. package/components/TimePicker/TimePicker.js +506 -0
  17. package/components/TimePicker/TimePicker.js.map +1 -0
  18. package/components/TimePicker/TimePicker.styles.d.ts +14 -0
  19. package/components/TimePicker/TimePicker.styles.js +45 -0
  20. package/components/TimePicker/TimePicker.styles.js.map +1 -0
  21. package/components/TimePicker/TimePickerMobilePopup.d.ts +38 -0
  22. package/components/TimePicker/TimePickerMobilePopup.js +21 -0
  23. package/components/TimePicker/TimePickerMobilePopup.js.map +1 -0
  24. package/components/TimePicker/TimePickerPopup.d.ts +20 -0
  25. package/components/TimePicker/TimePickerPopup.js +18 -0
  26. package/components/TimePicker/TimePickerPopup.js.map +1 -0
  27. package/components/TimePicker/TimePickerSlots.d.ts +17 -0
  28. package/components/TimePicker/TimePickerSlots.js +80 -0
  29. package/components/TimePicker/TimePickerSlots.js.map +1 -0
  30. package/components/TimePicker/helpers/TimePicker.constants.d.ts +22 -0
  31. package/components/TimePicker/helpers/TimePicker.constants.js +31 -0
  32. package/components/TimePicker/helpers/TimePicker.constants.js.map +1 -0
  33. package/components/TimePicker/helpers/TimePicker.editing.d.ts +23 -0
  34. package/components/TimePicker/helpers/TimePicker.editing.js +101 -0
  35. package/components/TimePicker/helpers/TimePicker.editing.js.map +1 -0
  36. package/components/TimePicker/helpers/TimePicker.layout.d.ts +6 -0
  37. package/components/TimePicker/helpers/TimePicker.layout.js +49 -0
  38. package/components/TimePicker/helpers/TimePicker.layout.js.map +1 -0
  39. package/components/TimePicker/helpers/TimePicker.selection.d.ts +5 -0
  40. package/components/TimePicker/helpers/TimePicker.selection.js +23 -0
  41. package/components/TimePicker/helpers/TimePicker.selection.js.map +1 -0
  42. package/components/TimePicker/helpers/TimePicker.shared.d.ts +47 -0
  43. package/components/TimePicker/helpers/TimePicker.shared.js +70 -0
  44. package/components/TimePicker/helpers/TimePicker.shared.js.map +1 -0
  45. package/components/TimePicker/helpers/TimePicker.value.d.ts +23 -0
  46. package/components/TimePicker/helpers/TimePicker.value.js +71 -0
  47. package/components/TimePicker/helpers/TimePicker.value.js.map +1 -0
  48. package/components/TimePicker/helpers/scrollSelectedSlotIntoView.d.ts +4 -0
  49. package/components/TimePicker/helpers/scrollSelectedSlotIntoView.js +24 -0
  50. package/components/TimePicker/helpers/scrollSelectedSlotIntoView.js.map +1 -0
  51. package/components/TimePicker/hooks/useTimePickerDropdown.d.ts +17 -0
  52. package/components/TimePicker/hooks/useTimePickerDropdown.js +62 -0
  53. package/components/TimePicker/hooks/useTimePickerDropdown.js.map +1 -0
  54. package/components/TimePicker/hooks/useTimePickerSelection.d.ts +18 -0
  55. package/components/TimePicker/hooks/useTimePickerSelection.js +66 -0
  56. package/components/TimePicker/hooks/useTimePickerSelection.js.map +1 -0
  57. package/components/TimePicker/hooks/useTimePickerValue.d.ts +18 -0
  58. package/components/TimePicker/hooks/useTimePickerValue.js +58 -0
  59. package/components/TimePicker/hooks/useTimePickerValue.js.map +1 -0
  60. package/components/TimePicker/index.d.ts +2 -0
  61. package/components/TimePicker/index.js +2 -0
  62. package/components/TimePicker/index.js.map +1 -0
  63. package/index.d.ts +1 -0
  64. package/index.js +1 -0
  65. package/index.js.map +1 -1
  66. package/internal/NativeTimeInput/NativeTimeInput.d.ts +16 -0
  67. package/internal/NativeTimeInput/NativeTimeInput.js +25 -0
  68. package/internal/NativeTimeInput/NativeTimeInput.js.map +1 -0
  69. package/internal/NativeTimeInput/NativeTimeInput.styles.d.ts +3 -0
  70. package/internal/NativeTimeInput/NativeTimeInput.styles.js +15 -0
  71. package/internal/NativeTimeInput/NativeTimeInput.styles.js.map +1 -0
  72. package/internal/NativeTimeInput/NativeTimeInput.utils.d.ts +7 -0
  73. package/internal/NativeTimeInput/NativeTimeInput.utils.js +28 -0
  74. package/internal/NativeTimeInput/NativeTimeInput.utils.js.map +1 -0
  75. package/internal/NativeTimeInput/index.d.ts +1 -0
  76. package/internal/NativeTimeInput/index.js +2 -0
  77. package/internal/NativeTimeInput/index.js.map +1 -0
  78. package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.d.ts +2 -0
  79. package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.js +20 -0
  80. package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.js.map +1 -0
  81. package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.d.ts +2 -0
  82. package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.js +20 -0
  83. package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.js.map +1 -0
  84. package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.d.ts +2 -0
  85. package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.js +20 -0
  86. package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.js.map +1 -0
  87. package/internal/themes/BasicTheme.d.ts +34 -0
  88. package/internal/themes/BasicTheme.js +96 -0
  89. package/internal/themes/BasicTheme.js.map +1 -1
  90. package/package.json +5 -1
@@ -0,0 +1,45 @@
1
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
2
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
3
+ return cooked;
4
+ };
5
+ import { memoizeGetStyles } from '../../lib/theming/Emotion.js';
6
+ export var getStyles = memoizeGetStyles(function (_a) {
7
+ var css = _a.css;
8
+ return ({
9
+ root: function () {
10
+ return css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: inline-block;\n position: relative;\n line-height: normal;\n "], ["\n display: inline-block;\n position: relative;\n line-height: normal;\n "])));
11
+ },
12
+ popup: function (t) {
13
+ return css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n background: ", ";\n border-radius: ", ";\n box-shadow: ", ";\n font-variant-numeric: tabular-nums;\n overflow: hidden;\n "], ["\n background: ", ";\n border-radius: ", ";\n box-shadow: ", ";\n font-variant-numeric: tabular-nums;\n overflow: hidden;\n "])), t.timePickerPopupBg, t.timePickerPopupBorderRadius, t.timePickerPopupShadow);
14
+ },
15
+ rightIcon: function () {
16
+ return css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n user-select: none;\n "], ["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n user-select: none;\n "])));
17
+ },
18
+ rightIconInteractive: function () {
19
+ return css(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n cursor: pointer;\n "], ["\n cursor: pointer;\n "])));
20
+ },
21
+ rightIconDefault: function (t) {
22
+ return css(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n color: ", ";\n "], ["\n color: ", ";\n "])), t.textColorDefault);
23
+ },
24
+ slot: function () {
25
+ return css(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n width: 100%;\n font-variant-numeric: tabular-nums;\n "], ["\n display: flex;\n align-items: center;\n width: 100%;\n font-variant-numeric: tabular-nums;\n "])));
26
+ },
27
+ slotSmall: function (t) {
28
+ return css(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n gap: ", ";\n "], ["\n gap: ", ";\n "])), t.timePickerSlotGapSmall);
29
+ },
30
+ slotMedium: function (t) {
31
+ return css(templateObject_8 || (templateObject_8 = __makeTemplateObject(["\n gap: ", ";\n "], ["\n gap: ", ";\n "])), t.timePickerSlotGapMedium);
32
+ },
33
+ slotLarge: function (t) {
34
+ return css(templateObject_9 || (templateObject_9 = __makeTemplateObject(["\n gap: ", ";\n "], ["\n gap: ", ";\n "])), t.timePickerSlotGapLarge);
35
+ },
36
+ slotValue: function () {
37
+ return css(templateObject_10 || (templateObject_10 = __makeTemplateObject(["\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n "], ["\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n "])));
38
+ },
39
+ slotLabel: function (t) {
40
+ return css(templateObject_11 || (templateObject_11 = __makeTemplateObject(["\n color: ", ";\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n "], ["\n color: ", ";\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n "])), t.menuItemCommentColor);
41
+ },
42
+ });
43
+ });
44
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9, templateObject_10, templateObject_11;
45
+ //# sourceMappingURL=TimePicker.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePicker.styles.js","sourceRoot":"","sources":["TimePicker.styles.ts"],"names":[],"mappings":";;;;AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGhE,MAAM,CAAC,IAAM,SAAS,GAAG,gBAAgB,CAAC,UAAC,EAAgB;QAAd,GAAG,SAAA;IAAgB,OAAA,CAAC;QAC/D,IAAI;YACF,OAAO,GAAG,gKAAA,6FAIT,KAAC;QACJ,CAAC;QAED,KAAK,YAAC,CAAQ;YACZ,OAAO,GAAG,6NAAA,sBACM,EAAmB,0BAChB,EAA6B,uBAChC,EAAuB,6EAGtC,KALe,CAAC,CAAC,iBAAiB,EAChB,CAAC,CAAC,2BAA2B,EAChC,CAAC,CAAC,qBAAqB,EAGrC;QACJ,CAAC;QAED,SAAS;YACP,OAAO,GAAG,kNAAA,+IAMT,KAAC;QACJ,CAAC;QAED,oBAAoB;YAClB,OAAO,GAAG,mGAAA,gCAET,KAAC;QACJ,CAAC;QAED,gBAAgB,YAAC,CAAQ;YACvB,OAAO,GAAG,+FAAA,iBACC,EAAkB,SAC5B,KADU,CAAC,CAAC,gBAAgB,EAC3B;QACJ,CAAC;QAED,IAAI;YACF,OAAO,GAAG,4LAAA,yHAKT,KAAC;QACJ,CAAC;QAED,SAAS,YAAC,CAAQ;YAChB,OAAO,GAAG,6FAAA,eACD,EAAwB,SAChC,KADQ,CAAC,CAAC,sBAAsB,EAC/B;QACJ,CAAC;QAED,UAAU,YAAC,CAAQ;YACjB,OAAO,GAAG,6FAAA,eACD,EAAyB,SACjC,KADQ,CAAC,CAAC,uBAAuB,EAChC;QACJ,CAAC;QAED,SAAS,YAAC,CAAQ;YAChB,OAAO,GAAG,6FAAA,eACD,EAAwB,SAChC,KADQ,CAAC,CAAC,sBAAsB,EAC/B;QACJ,CAAC;QAED,SAAS;YACP,OAAO,GAAG,oJAAA,+EAGT,KAAC;QACJ,CAAC;QAED,SAAS,YAAC,CAAQ;YAChB,OAAO,GAAG,wKAAA,iBACC,EAAsB,gFAGhC,KAHU,CAAC,CAAC,oBAAoB,EAG/B;QACJ,CAAC;KACF,CAAC;AAlF8D,CAkF9D,CAAC,CAAC","sourcesContent":["import type { Emotion } from '@emotion/css/create-instance';\n\nimport { memoizeGetStyles } from '../../lib/theming/Emotion.js';\nimport type { Theme } from '../../lib/theming/Theme.js';\n\nexport const getStyles = memoizeGetStyles(({ css }: Emotion) => ({\n root() {\n return css`\n display: inline-block;\n position: relative;\n line-height: normal;\n `;\n },\n\n popup(t: Theme) {\n return css`\n background: ${t.timePickerPopupBg};\n border-radius: ${t.timePickerPopupBorderRadius};\n box-shadow: ${t.timePickerPopupShadow};\n font-variant-numeric: tabular-nums;\n overflow: hidden;\n `;\n },\n\n rightIcon() {\n return css`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n user-select: none;\n `;\n },\n\n rightIconInteractive() {\n return css`\n cursor: pointer;\n `;\n },\n\n rightIconDefault(t: Theme) {\n return css`\n color: ${t.textColorDefault};\n `;\n },\n\n slot() {\n return css`\n display: flex;\n align-items: center;\n width: 100%;\n font-variant-numeric: tabular-nums;\n `;\n },\n\n slotSmall(t: Theme) {\n return css`\n gap: ${t.timePickerSlotGapSmall};\n `;\n },\n\n slotMedium(t: Theme) {\n return css`\n gap: ${t.timePickerSlotGapMedium};\n `;\n },\n\n slotLarge(t: Theme) {\n return css`\n gap: ${t.timePickerSlotGapLarge};\n `;\n },\n\n slotValue() {\n return css`\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n `;\n },\n\n slotLabel(t: Theme) {\n return css`\n color: ${t.menuItemCommentColor};\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n `;\n },\n}));\n"]}
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import type { ReactNode } from 'react';
3
+ import type { SizeProp } from '../../lib/types/props.js';
4
+ import type { InputIconType } from '../Input/index.js';
5
+ import type { TimeSegment, TimeFormat, TimeSlot } from './helpers/TimePicker.shared.js';
6
+ import type { TimeInputRef } from './TimeInput.js';
7
+ interface TimePickerMobilePopupProps {
8
+ id?: string;
9
+ opened: boolean;
10
+ value: string;
11
+ inputRef: React.RefObject<TimeInputRef | null>;
12
+ disabled?: boolean;
13
+ format: TimeFormat;
14
+ size: SizeProp;
15
+ rightIcon?: InputIconType;
16
+ suffix?: ReactNode;
17
+ resolvedSlots: TimeSlot[];
18
+ highlightedSlotIndex: number | null;
19
+ normalizedValue: string;
20
+ slotRefs: React.RefObject<Map<number, HTMLSpanElement>>;
21
+ error?: boolean;
22
+ warning?: boolean;
23
+ 'aria-describedby'?: string;
24
+ 'aria-label'?: string;
25
+ 'aria-placeholder'?: string;
26
+ onFocus(event: React.FocusEvent<HTMLInputElement>): void;
27
+ onBlur(event: React.FocusEvent<HTMLInputElement>): void;
28
+ onClick(event: React.MouseEvent<HTMLInputElement>): void;
29
+ onKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void;
30
+ onMouseDownCapture(event: React.MouseEvent<HTMLInputElement>): void;
31
+ onMouseUp(event: React.MouseEvent<HTMLInputElement>): void;
32
+ onPaste(event: React.ClipboardEvent<HTMLInputElement>): void;
33
+ onSelectSegment(segment: TimeSegment, event: React.MouseEvent<HTMLSpanElement>): void;
34
+ onSelectSlot(slot: TimeSlot): void;
35
+ onCloseRequest(): void;
36
+ }
37
+ export declare const TimePickerMobilePopup: (props: TimePickerMobilePopupProps) => React.JSX.Element;
38
+ export {};
@@ -0,0 +1,21 @@
1
+ import React, { useLayoutEffect } from 'react';
2
+ import { MobilePopup } from '../../internal/MobilePopup/index.js';
3
+ import { TimePickerDataTids } from './helpers/TimePicker.constants.js';
4
+ import { TimeInput } from './TimeInput.js';
5
+ import { TimePickerSlots } from './TimePickerSlots.js';
6
+ export var TimePickerMobilePopup = function (props) {
7
+ 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, resolvedSlots = props.resolvedSlots, highlightedSlotIndex = props.highlightedSlotIndex, normalizedValue = props.normalizedValue, slotRefs = props.slotRefs, error = props.error, warning = props.warning, ariaDescribedby = props["aria-describedby"], ariaLabel = props["aria-label"], ariaPlaceholder = props["aria-placeholder"], onFocus = props.onFocus, onBlur = props.onBlur, onClick = props.onClick, onKeyDown = props.onKeyDown, onMouseDownCapture = props.onMouseDownCapture, onMouseUp = props.onMouseUp, onPaste = props.onPaste, onSelectSegment = props.onSelectSegment, onSelectSlot = props.onSelectSlot, onCloseRequest = props.onCloseRequest;
8
+ useLayoutEffect(function () {
9
+ var timer = setTimeout(function () {
10
+ var _a;
11
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
12
+ });
13
+ return function () {
14
+ clearTimeout(timer);
15
+ };
16
+ }, [inputRef]);
17
+ return (React.createElement(MobilePopup, { id: id, opened: opened, verticalAlign: 'center', size: size, headerChildComponent: React.createElement(TimeInput, { ref: inputRef, "data-tid": TimePickerDataTids.mobileInput, width: '100%', disabled: disabled, format: format, size: size, rightIcon: rightIcon, suffix: suffix, value: value, error: error, warning: warning, "aria-describedby": ariaDescribedby, "aria-label": ariaLabel, "aria-placeholder": ariaPlaceholder, onFocus: onFocus, onBlur: onBlur, onClick: onClick, onKeyDown: onKeyDown, onMouseDownCapture: onMouseDownCapture, onMouseUp: onMouseUp, onPaste: onPaste, onSelectSegment: onSelectSegment }), onCloseRequest: onCloseRequest },
18
+ React.createElement("div", { "data-tid": TimePickerDataTids.mobilePopup },
19
+ React.createElement(TimePickerSlots, { slotIdPrefix: id, format: format, size: size, resolvedSlots: resolvedSlots, highlightedSlotIndex: highlightedSlotIndex, normalizedValue: normalizedValue, slotRefs: slotRefs, maxHeight: 'auto', disableScrollContainer: true, onSelectSlot: onSelectSlot }))));
20
+ };
21
+ //# sourceMappingURL=TimePickerMobilePopup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePickerMobilePopup.js","sourceRoot":"","sources":["TimePickerMobilePopup.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useLayoutEffect } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { MobilePopup } from '../../internal/MobilePopup/index.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport type { InputIconType } from '../Input/index.js';\nimport { TimePickerDataTids } from './helpers/TimePicker.constants.js';\nimport type { TimeSegment, TimeFormat, TimeSlot } from './helpers/TimePicker.shared.js';\nimport type { TimeInputRef } from './TimeInput.js';\nimport { TimeInput } from './TimeInput.js';\nimport { TimePickerSlots } from './TimePickerSlots.js';\n\ninterface TimePickerMobilePopupProps {\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 resolvedSlots: TimeSlot[];\n highlightedSlotIndex: number | null;\n normalizedValue: string;\n slotRefs: React.RefObject<Map<number, HTMLSpanElement>>;\n error?: boolean;\n warning?: boolean;\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n 'aria-placeholder'?: string;\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 onSelectSlot(slot: TimeSlot): void;\n onCloseRequest(): void;\n}\n\nexport const TimePickerMobilePopup = (props: TimePickerMobilePopupProps) => {\n const {\n id,\n opened,\n value,\n inputRef,\n disabled,\n format,\n size,\n rightIcon,\n suffix,\n resolvedSlots,\n highlightedSlotIndex,\n normalizedValue,\n slotRefs,\n error,\n warning,\n 'aria-describedby': ariaDescribedby,\n 'aria-label': ariaLabel,\n 'aria-placeholder': ariaPlaceholder,\n onFocus,\n onBlur,\n onClick,\n onKeyDown,\n onMouseDownCapture,\n onMouseUp,\n onPaste,\n onSelectSegment,\n onSelectSlot,\n onCloseRequest,\n } = props;\n\n useLayoutEffect(() => {\n const timer = setTimeout(() => {\n inputRef.current?.focus();\n });\n\n return () => {\n clearTimeout(timer);\n };\n }, [inputRef]);\n\n return (\n <MobilePopup\n id={id}\n opened={opened}\n verticalAlign={'center'}\n size={size}\n headerChildComponent={\n <TimeInput\n ref={inputRef}\n data-tid={TimePickerDataTids.mobileInput}\n width={'100%'}\n disabled={disabled}\n format={format}\n size={size}\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 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 onCloseRequest={onCloseRequest}\n >\n <div data-tid={TimePickerDataTids.mobilePopup}>\n <TimePickerSlots\n slotIdPrefix={id}\n format={format}\n size={size}\n resolvedSlots={resolvedSlots}\n highlightedSlotIndex={highlightedSlotIndex}\n normalizedValue={normalizedValue}\n slotRefs={slotRefs}\n maxHeight={'auto'}\n disableScrollContainer\n onSelectSlot={onSelectSlot}\n />\n </div>\n </MobilePopup>\n );\n};\n"]}
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import type { SizeProp } from '../../lib/types/props.js';
3
+ import type { TimeFormat, TimeSlot } from './helpers/TimePicker.shared.js';
4
+ interface TimePickerPopupProps {
5
+ id?: string;
6
+ anchorElement: HTMLElement;
7
+ menuPos?: 'top' | 'bottom';
8
+ menuAlign?: 'left' | 'right';
9
+ menuWidth?: React.CSSProperties['width'];
10
+ popupMaxHeight: string;
11
+ format: TimeFormat;
12
+ size: SizeProp;
13
+ resolvedSlots: TimeSlot[];
14
+ highlightedSlotIndex: number | null;
15
+ normalizedValue: string;
16
+ slotRefs: React.RefObject<Map<number, HTMLSpanElement>>;
17
+ onSelectSlot(slot: TimeSlot): void;
18
+ }
19
+ export declare const TimePickerPopup: (props: TimePickerPopupProps) => React.JSX.Element;
20
+ export {};
@@ -0,0 +1,18 @@
1
+ import React, { useContext } from 'react';
2
+ import { Popup } from '../../internal/Popup/index.js';
3
+ import { ZIndex } from '../../internal/ZIndex/index.js';
4
+ import { getMenuPositions } from '../../lib/getMenuPositions.js';
5
+ import { useStyles } from '../../lib/renderEnvironment/index.js';
6
+ import { ThemeContext } from '../../lib/theming/ThemeContext.js';
7
+ import { TimePickerDataTids } from './helpers/TimePicker.constants.js';
8
+ import { getStyles } from './TimePicker.styles.js';
9
+ import { TimePickerSlots } from './TimePickerSlots.js';
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, resolvedSlots = props.resolvedSlots, highlightedSlotIndex = props.highlightedSlotIndex, normalizedValue = props.normalizedValue, slotRefs = props.slotRefs, onSelectSlot = props.onSelectSlot;
12
+ var theme = useContext(ThemeContext);
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(TimePickerSlots, { slotIdPrefix: id, format: format, size: size, resolvedSlots: resolvedSlots, highlightedSlotIndex: highlightedSlotIndex, normalizedValue: normalizedValue, slotRefs: slotRefs, maxHeight: popupMaxHeight, onSelectSlot: onSelectSlot }))));
17
+ };
18
+ //# sourceMappingURL=TimePickerPopup.js.map
@@ -0,0 +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;AAEjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAkBvD,MAAM,CAAC,IAAM,eAAe,GAAG,UAAC,KAA2B;IAEvD,IAAA,EAAE,GAaA,KAAK,GAbL,EACF,aAAa,GAYX,KAAK,cAZM,EACb,OAAO,GAWL,KAAK,QAXA,EACP,SAAS,GAUP,KAAK,UAVE,EACT,SAAS,GASP,KAAK,UATE,EACT,cAAc,GAQZ,KAAK,eARO,EACd,MAAM,GAOJ,KAAK,OAPD,EACN,IAAI,GAMF,KAAK,KANH,EACJ,aAAa,GAKX,KAAK,cALM,EACb,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,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 { TimePickerDataTids } from './helpers/TimePicker.constants.js';\nimport type { TimeFormat, TimeSlot } from './helpers/TimePicker.shared.js';\nimport { getStyles } from './TimePicker.styles.js';\nimport { TimePickerSlots } from './TimePickerSlots.js';\n\ninterface TimePickerPopupProps {\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 resolvedSlots: TimeSlot[];\n highlightedSlotIndex: number | null;\n normalizedValue: string;\n slotRefs: React.RefObject<Map<number, HTMLSpanElement>>;\n onSelectSlot(slot: TimeSlot): void;\n}\n\nexport const TimePickerPopup = (props: TimePickerPopupProps) => {\n const {\n id,\n anchorElement,\n menuPos,\n menuAlign,\n menuWidth,\n popupMaxHeight,\n format,\n size,\n resolvedSlots,\n highlightedSlotIndex,\n normalizedValue,\n slotRefs,\n onSelectSlot,\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 <TimePickerSlots\n slotIdPrefix={id}\n format={format}\n size={size}\n resolvedSlots={resolvedSlots}\n highlightedSlotIndex={highlightedSlotIndex}\n normalizedValue={normalizedValue}\n slotRefs={slotRefs}\n maxHeight={popupMaxHeight}\n onSelectSlot={onSelectSlot}\n />\n </div>\n </Popup>\n );\n};\n"]}
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import type { SizeProp } from '../../lib/types/props.js';
3
+ import type { TimeFormat, TimeSlot } from './helpers/TimePicker.shared.js';
4
+ interface TimePickerSlotsProps {
5
+ slotIdPrefix?: string;
6
+ format: TimeFormat;
7
+ size: SizeProp;
8
+ resolvedSlots: TimeSlot[];
9
+ highlightedSlotIndex: number | null;
10
+ normalizedValue: string;
11
+ slotRefs?: React.RefObject<Map<number, HTMLSpanElement>>;
12
+ maxHeight?: React.CSSProperties['maxHeight'];
13
+ disableScrollContainer?: boolean;
14
+ onSelectSlot(slot: TimeSlot): void;
15
+ }
16
+ export declare const TimePickerSlots: (props: TimePickerSlotsProps) => React.JSX.Element;
17
+ export {};
@@ -0,0 +1,80 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ import { cx } from '@emotion/css';
24
+ import React, { useContext } from 'react';
25
+ import { Menu } from '../../internal/Menu/index.js';
26
+ import { useStyles } from '../../lib/renderEnvironment/index.js';
27
+ import { ThemeContext } from '../../lib/theming/ThemeContext.js';
28
+ import { MenuItem } from '../MenuItem/index.js';
29
+ import { TimePickerDataTids } from './helpers/TimePicker.constants.js';
30
+ import { normalizeTimeValue } from './helpers/TimePicker.value.js';
31
+ import { getStyles } from './TimePicker.styles.js';
32
+ var getSlotSizeClassName = function (styles, theme, size) {
33
+ switch (size) {
34
+ case 'large':
35
+ return styles.slotLarge(theme);
36
+ case 'medium':
37
+ return styles.slotMedium(theme);
38
+ case 'small':
39
+ default:
40
+ return styles.slotSmall(theme);
41
+ }
42
+ };
43
+ var SlotRoot = React.forwardRef(function (_a, ref) {
44
+ var _b = _a.disabled, disabled = _b === void 0 ? false : _b, _state = _a.state, props = __rest(_a, ["disabled", "state"]);
45
+ if (disabled) {
46
+ return React.createElement("div", __assign({}, props, { ref: ref }));
47
+ }
48
+ return React.createElement("button", __assign({}, props, { ref: ref, type: 'button', disabled: disabled }));
49
+ });
50
+ export var TimePickerSlots = function (props) {
51
+ var slotIdPrefix = props.slotIdPrefix, format = props.format, size = props.size, resolvedSlots = props.resolvedSlots, highlightedSlotIndex = props.highlightedSlotIndex, normalizedValue = props.normalizedValue, slotRefs = props.slotRefs, maxHeight = props.maxHeight, disableScrollContainer = props.disableScrollContainer, onSelectSlot = props.onSelectSlot;
52
+ var theme = useContext(ThemeContext);
53
+ var styles = useStyles(getStyles);
54
+ var slotSizeClassName = getSlotSizeClassName(styles, theme, size);
55
+ return (React.createElement(Menu, { hasMargin: false, width: '100%', maxHeight: maxHeight, disableScrollContainer: disableScrollContainer }, resolvedSlots.map(function (slot, index) {
56
+ var normalizedSlot = normalizeTimeValue(slot.value, format);
57
+ var state;
58
+ if (highlightedSlotIndex === index) {
59
+ state = 'hover';
60
+ }
61
+ else if (normalizedSlot === normalizedValue) {
62
+ state = 'selected';
63
+ }
64
+ return (React.createElement(MenuItem, { key: "".concat(slot.value, "-").concat(index), component: SlotRoot, disabled: slot.disabled, isNotSelectable: slot.disabled, size: size, state: state, onClick: slot.disabled ? undefined : function () { return onSelectSlot(slot); } },
65
+ React.createElement("span", { id: slotIdPrefix ? "".concat(slotIdPrefix, "-slot-").concat(index) : undefined, "data-tid": TimePickerDataTids.slot, className: cx(styles.slot(), slotSizeClassName), ref: function (node) {
66
+ if (!slotRefs) {
67
+ return;
68
+ }
69
+ if (node) {
70
+ slotRefs.current.set(index, node);
71
+ }
72
+ else {
73
+ slotRefs.current.delete(index);
74
+ }
75
+ } },
76
+ React.createElement("span", { className: styles.slotValue() }, normalizedSlot),
77
+ slot.label && React.createElement("span", { className: styles.slotLabel(theme) }, slot.label))));
78
+ })));
79
+ };
80
+ //# sourceMappingURL=TimePickerSlots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePickerSlots.js","sourceRoot":"","sources":["TimePickerSlots.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 { 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 { MenuItem } from '../MenuItem/index.js';\nimport { TimePickerDataTids } from './helpers/TimePicker.constants.js';\nimport type { TimeFormat, TimeSlot } from './helpers/TimePicker.shared.js';\nimport { normalizeTimeValue } from './helpers/TimePicker.value.js';\nimport { getStyles } from './TimePicker.styles.js';\n\nconst getSlotSizeClassName = (styles: ReturnType<typeof getStyles>, theme: Theme, size: SizeProp): string => {\n switch (size) {\n case 'large':\n return styles.slotLarge(theme);\n case 'medium':\n return styles.slotMedium(theme);\n case 'small':\n default:\n return styles.slotSmall(theme);\n }\n};\n\nconst SlotRoot = React.forwardRef<\n HTMLElement,\n React.HTMLAttributes<HTMLElement> & { disabled?: boolean; state?: unknown }\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 TimePickerSlotsProps {\n slotIdPrefix?: string;\n format: TimeFormat;\n size: SizeProp;\n resolvedSlots: TimeSlot[];\n highlightedSlotIndex: number | null;\n normalizedValue: string;\n slotRefs?: React.RefObject<Map<number, HTMLSpanElement>>;\n maxHeight?: React.CSSProperties['maxHeight'];\n disableScrollContainer?: boolean;\n onSelectSlot(slot: TimeSlot): void;\n}\n\nexport const TimePickerSlots = (props: TimePickerSlotsProps) => {\n const {\n slotIdPrefix,\n format,\n size,\n resolvedSlots,\n highlightedSlotIndex,\n normalizedValue,\n slotRefs,\n maxHeight,\n disableScrollContainer,\n onSelectSlot,\n } = props;\n\n const theme = useContext(ThemeContext);\n const styles = useStyles(getStyles);\n const slotSizeClassName = getSlotSizeClassName(styles, theme, size);\n\n return (\n <Menu hasMargin={false} width={'100%'} maxHeight={maxHeight} disableScrollContainer={disableScrollContainer}>\n {resolvedSlots.map((slot, index) => {\n const normalizedSlot = normalizeTimeValue(slot.value, format);\n\n let state: 'hover' | 'selected' | undefined;\n\n if (highlightedSlotIndex === index) {\n state = 'hover';\n } else if (normalizedSlot === normalizedValue) {\n state = 'selected';\n }\n\n return (\n <MenuItem\n key={`${slot.value}-${index}`}\n component={SlotRoot}\n disabled={slot.disabled}\n isNotSelectable={slot.disabled}\n size={size}\n state={state}\n onClick={slot.disabled ? undefined : () => onSelectSlot(slot)}\n >\n <span\n id={slotIdPrefix ? `${slotIdPrefix}-slot-${index}` : undefined}\n data-tid={TimePickerDataTids.slot}\n className={cx(styles.slot(), slotSizeClassName)}\n ref={(node) => {\n if (!slotRefs) {\n return;\n }\n\n if (node) {\n slotRefs.current.set(index, node);\n } else {\n slotRefs.current.delete(index);\n }\n }}\n >\n <span className={styles.slotValue()}>{normalizedSlot}</span>\n {slot.label && <span className={styles.slotLabel(theme)}>{slot.label}</span>}\n </span>\n </MenuItem>\n );\n })}\n </Menu>\n );\n};\n"]}
@@ -0,0 +1,22 @@
1
+ import type { TimeFormat, TimeSegment } from './TimePicker.shared.js';
2
+ export declare const TimePickerDataTids: {
3
+ readonly root: "TimePicker__root";
4
+ readonly input: "TimePicker__input";
5
+ readonly mobileInput: "TimePicker__mobileInput";
6
+ readonly nativeInput: "TimePicker__nativeInput";
7
+ readonly popup: "TimePicker__popup";
8
+ readonly mobilePopup: "TimePicker__mobilePopup";
9
+ readonly slot: "TimePicker__slot";
10
+ };
11
+ export declare const TIME_PLACEHOLDER_CHAR = "\u2212";
12
+ export declare const TIME_SEPARATOR = ":";
13
+ export declare const TIME_SEGMENT_LENGTH = 2;
14
+ export declare const HOURS_MAX_VALUE = 23;
15
+ export declare const MINUTES_AND_SECONDS_MAX_VALUE = 59;
16
+ export declare const ZERO_PAD_CHAR = "0";
17
+ export declare const EMPTY_VALUE = "";
18
+ export declare const DIGIT_REGEXP: RegExp;
19
+ export declare const NON_DIGIT_REGEXP: RegExp;
20
+ export declare const EMPTY_SEGMENT: string;
21
+ export declare const TIME_SEGMENTS_BY_FORMAT: Record<TimeFormat, TimeSegment[]>;
22
+ export declare const FIRST_DIGIT_MAX_BY_SEGMENT: Record<TimeSegment, number>;
@@ -0,0 +1,31 @@
1
+ export var TimePickerDataTids = {
2
+ root: 'TimePicker__root',
3
+ input: 'TimePicker__input',
4
+ mobileInput: 'TimePicker__mobileInput',
5
+ nativeInput: 'TimePicker__nativeInput',
6
+ popup: 'TimePicker__popup',
7
+ mobilePopup: 'TimePicker__mobilePopup',
8
+ slot: 'TimePicker__slot',
9
+ };
10
+ var HOURS_FIRST_DIGIT_MAX = 2;
11
+ var MINUTES_AND_SECONDS_FIRST_DIGIT_MAX = 5;
12
+ export var TIME_PLACEHOLDER_CHAR = '\u2212';
13
+ export var TIME_SEPARATOR = ':';
14
+ export var TIME_SEGMENT_LENGTH = 2;
15
+ export var HOURS_MAX_VALUE = 23;
16
+ export var MINUTES_AND_SECONDS_MAX_VALUE = 59;
17
+ export var ZERO_PAD_CHAR = '0';
18
+ export var EMPTY_VALUE = '';
19
+ export var DIGIT_REGEXP = /\d/;
20
+ export var NON_DIGIT_REGEXP = /\D/g;
21
+ export var EMPTY_SEGMENT = TIME_PLACEHOLDER_CHAR.repeat(TIME_SEGMENT_LENGTH);
22
+ export var TIME_SEGMENTS_BY_FORMAT = {
23
+ minute: ['hours', 'minutes'],
24
+ second: ['hours', 'minutes', 'seconds'],
25
+ };
26
+ export var FIRST_DIGIT_MAX_BY_SEGMENT = {
27
+ hours: HOURS_FIRST_DIGIT_MAX,
28
+ minutes: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,
29
+ seconds: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,
30
+ };
31
+ //# sourceMappingURL=TimePicker.constants.js.map
@@ -0,0 +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;CAChB,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,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;CACxC,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 slot: 'TimePicker__slot',\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 minute: ['hours', 'minutes'],\n second: ['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"]}
@@ -0,0 +1,23 @@
1
+ import { type TimeDigitInputResult, type TimeFormat, type TimeSegment } from './TimePicker.shared.js';
2
+ /**
3
+ * Удаляет одну цифру из активного сегмента справа налево.
4
+ * Сначала превращает заполненный сегмент в значение с одной ожидающей цифрой,
5
+ * затем — в полностью пустой сегмент.
6
+ */
7
+ export declare const deleteTimeSegmentDigit: (value: string, segment: TimeSegment, format: TimeFormat) => string;
8
+ /**
9
+ * Коммитит активный сегмент при уходе с него или потере фокуса.
10
+ * Частично введенное значение дополняется и нормализуется, а полностью пустой сегмент остается пустым.
11
+ */
12
+ export declare const commitTimeSegmentOnLeave: (value: string, segment: TimeSegment, format: TimeFormat) => string;
13
+ /**
14
+ * Сдвигает значение активного сегмента на шаг вверх или вниз с циклическим переходом по границам.
15
+ * Пустой сегмент трактуется как `00`.
16
+ */
17
+ export declare const shiftTimeSegmentValue: (value: string, segment: TimeSegment, step: 1 | -1, format: TimeFormat) => string;
18
+ /**
19
+ * Обрабатывает ввод одной цифры в активный сегмент.
20
+ * Возвращает следующее display-значение и метаданные для UI:
21
+ * нужно ли завершить сегмент, перейти к следующему сегменту или показать анимацию ошибки.
22
+ */
23
+ export declare const formatDigitToTimeSegment: (value: string, segment: TimeSegment, digit: string, format: TimeFormat) => TimeDigitInputResult;
@@ -0,0 +1,101 @@
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';
2
+ import { getNextTimeSegment } from './TimePicker.selection.js';
3
+ import { getDigits, getTimeSegmentMax, hasPendingSingleDigit, normalizeEditableSegment, } from './TimePicker.shared.js';
4
+ import { getTimeSegmentValue, replaceTimeSegment } from './TimePicker.value.js';
5
+ /**
6
+ * Удаляет одну цифру из активного сегмента справа налево.
7
+ * Сначала превращает заполненный сегмент в значение с одной ожидающей цифрой,
8
+ * затем — в полностью пустой сегмент.
9
+ */
10
+ export var deleteTimeSegmentDigit = function (value, segment, format) {
11
+ var currentSegmentValue = getTimeSegmentValue(value, segment, format);
12
+ var _a = Array.from(currentSegmentValue), first = _a[0], second = _a[1];
13
+ if (DIGIT_REGEXP.test(second !== null && second !== void 0 ? second : EMPTY_VALUE)) {
14
+ return replaceTimeSegment(value, segment, "".concat(first).concat(TIME_PLACEHOLDER_CHAR), format);
15
+ }
16
+ if (DIGIT_REGEXP.test(first !== null && first !== void 0 ? first : EMPTY_VALUE)) {
17
+ return replaceTimeSegment(value, segment, EMPTY_SEGMENT, format);
18
+ }
19
+ return value;
20
+ };
21
+ /**
22
+ * Коммитит активный сегмент при уходе с него или потере фокуса.
23
+ * Частично введенное значение дополняется и нормализуется, а полностью пустой сегмент остается пустым.
24
+ */
25
+ export var commitTimeSegmentOnLeave = function (value, segment, format) {
26
+ var nextValue = normalizeEditableSegment(getTimeSegmentValue(value, segment, format), segment);
27
+ if (nextValue === EMPTY_SEGMENT) {
28
+ return replaceTimeSegment(value, segment, EMPTY_SEGMENT, format);
29
+ }
30
+ return replaceTimeSegment(value, segment, nextValue, format);
31
+ };
32
+ /**
33
+ * Сдвигает значение активного сегмента на шаг вверх или вниз с циклическим переходом по границам.
34
+ * Пустой сегмент трактуется как `00`.
35
+ */
36
+ export var shiftTimeSegmentValue = function (value, segment, step, format) {
37
+ var currentSegmentValue = getTimeSegmentValue(value, segment, format);
38
+ var normalizedSegmentValue = normalizeEditableSegment(currentSegmentValue, segment);
39
+ var max = getTimeSegmentMax(segment);
40
+ var current = normalizedSegmentValue === EMPTY_SEGMENT ? 0 : Number(normalizedSegmentValue);
41
+ var next = (current + step + max + 1) % (max + 1);
42
+ return replaceTimeSegment(value, segment, String(next).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR), format);
43
+ };
44
+ /**
45
+ * Обрабатывает ввод одной цифры в активный сегмент.
46
+ * Возвращает следующее display-значение и метаданные для UI:
47
+ * нужно ли завершить сегмент, перейти к следующему сегменту или показать анимацию ошибки.
48
+ */
49
+ export var formatDigitToTimeSegment = function (value, segment, digit, format) {
50
+ var currentSegmentValue = getTimeSegmentValue(value, segment, format);
51
+ var nextSegment = getNextTimeSegment(segment, format);
52
+ var shouldAppend = hasPendingSingleDigit(currentSegmentValue);
53
+ var currentDigits = shouldAppend ? getDigits(currentSegmentValue) : '';
54
+ var firstDigitThreshold = FIRST_DIGIT_MAX_BY_SEGMENT[segment];
55
+ if (currentDigits.length === 0) {
56
+ if (segment === 'hours' && Number(digit) > firstDigitThreshold) {
57
+ var nextValue_1 = replaceTimeSegment(value, segment, "0".concat(digit), format);
58
+ return {
59
+ isFinalPart: nextSegment === null,
60
+ isCompletedPart: true,
61
+ shouldBlink: false,
62
+ selectedSegment: nextSegment !== null && nextSegment !== void 0 ? nextSegment : segment,
63
+ nextValue: nextValue_1,
64
+ };
65
+ }
66
+ return {
67
+ isFinalPart: false,
68
+ isCompletedPart: false,
69
+ shouldBlink: false,
70
+ selectedSegment: segment,
71
+ nextValue: replaceTimeSegment(value, segment, "".concat(digit).concat(TIME_PLACEHOLDER_CHAR), format),
72
+ };
73
+ }
74
+ 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
+ };
82
+ }
83
+ 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
+ };
91
+ }
92
+ var nextValue = replaceTimeSegment(value, segment, String(Number("".concat(currentDigits).concat(digit))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR), format);
93
+ return {
94
+ isFinalPart: nextSegment === null,
95
+ isCompletedPart: true,
96
+ shouldBlink: false,
97
+ selectedSegment: nextSegment !== null && nextSegment !== void 0 ? nextSegment : segment,
98
+ nextValue: nextValue,
99
+ };
100
+ };
101
+ //# sourceMappingURL=TimePicker.editing.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,6 @@
1
+ import type { Theme } from '../../../lib/theming/Theme.js';
2
+ import type { SizeProp } from '../../../lib/types/props.js';
3
+ import type { TimeFormat } from './TimePicker.shared.js';
4
+ export declare const getTimePickerPopupMaxHeight: (size: SizeProp, theme: Theme) => string;
5
+ export declare const getTimePickerSuffixMargin: (size: SizeProp, theme: Theme) => string;
6
+ export declare const getTimePickerInputMinWidth: (size: SizeProp, format: TimeFormat, hasIcon: boolean, theme: Theme) => string;
@@ -0,0 +1,49 @@
1
+ export var getTimePickerPopupMaxHeight = function (size, theme) {
2
+ switch (size) {
3
+ case 'large':
4
+ return theme.timePickerMenuMaxHeightLarge;
5
+ case 'medium':
6
+ return theme.timePickerMenuMaxHeightMedium;
7
+ case 'small':
8
+ default:
9
+ return theme.timePickerMenuMaxHeightSmall;
10
+ }
11
+ };
12
+ export var getTimePickerSuffixMargin = function (size, theme) {
13
+ switch (size) {
14
+ case 'large':
15
+ return theme.timePickerSuffixGapLarge;
16
+ case 'medium':
17
+ return theme.timePickerSuffixGapMedium;
18
+ case 'small':
19
+ default:
20
+ return theme.timePickerSuffixGapSmall;
21
+ }
22
+ };
23
+ export var getTimePickerInputMinWidth = function (size, format, hasIcon, theme) {
24
+ switch (size) {
25
+ case 'large':
26
+ if (format === 'second') {
27
+ return hasIcon
28
+ ? theme.timePickerInputMinWidthWithIconAndSecondsLarge
29
+ : theme.timePickerInputMinWidthWithSecondsLarge;
30
+ }
31
+ return hasIcon ? theme.timePickerInputMinWidthWithIconLarge : theme.timePickerInputMinWidthLarge;
32
+ case 'medium':
33
+ if (format === 'second') {
34
+ return hasIcon
35
+ ? theme.timePickerInputMinWidthWithIconAndSecondsMedium
36
+ : theme.timePickerInputMinWidthWithSecondsMedium;
37
+ }
38
+ return hasIcon ? theme.timePickerInputMinWidthWithIconMedium : theme.timePickerInputMinWidthMedium;
39
+ case 'small':
40
+ default:
41
+ if (format === 'second') {
42
+ return hasIcon
43
+ ? theme.timePickerInputMinWidthWithIconAndSecondsSmall
44
+ : theme.timePickerInputMinWidthWithSecondsSmall;
45
+ }
46
+ return hasIcon ? theme.timePickerInputMinWidthWithIconSmall : theme.timePickerInputMinWidthSmall;
47
+ }
48
+ };
49
+ //# sourceMappingURL=TimePicker.layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePicker.layout.js","sourceRoot":"","sources":["TimePicker.layout.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,IAAM,2BAA2B,GAAG,UAAC,IAAc,EAAE,KAAY;IACtE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,4BAA4B,CAAC;QAE5C,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,6BAA6B,CAAC;QAE7C,KAAK,OAAO,CAAC;QAEb;YACE,OAAO,KAAK,CAAC,4BAA4B,CAAC;IAC9C,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,yBAAyB,GAAG,UAAC,IAAc,EAAE,KAAY;IACpE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,wBAAwB,CAAC;QAExC,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,yBAAyB,CAAC;QAEzC,KAAK,OAAO,CAAC;QAEb;YACE,OAAO,KAAK,CAAC,wBAAwB,CAAC;IAC1C,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,0BAA0B,GAAG,UACxC,IAAc,EACd,MAAkB,EAClB,OAAgB,EAChB,KAAY;IAEZ,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,OAAO,OAAO;oBACZ,CAAC,CAAC,KAAK,CAAC,8CAA8C;oBACtD,CAAC,CAAC,KAAK,CAAC,uCAAuC,CAAC;YACpD,CAAC;YAED,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC,KAAK,CAAC,4BAA4B,CAAC;QAEnG,KAAK,QAAQ;YACX,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,OAAO,OAAO;oBACZ,CAAC,CAAC,KAAK,CAAC,+CAA+C;oBACvD,CAAC,CAAC,KAAK,CAAC,wCAAwC,CAAC;YACrD,CAAC;YAED,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC;QAErG,KAAK,OAAO,CAAC;QAEb;YACE,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,OAAO,OAAO;oBACZ,CAAC,CAAC,KAAK,CAAC,8CAA8C;oBACtD,CAAC,CAAC,KAAK,CAAC,uCAAuC,CAAC;YACpD,CAAC;YAED,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC,KAAK,CAAC,4BAA4B,CAAC;IACrG,CAAC;AACH,CAAC,CAAC","sourcesContent":["import type { Theme } from '../../../lib/theming/Theme.js';\nimport type { SizeProp } from '../../../lib/types/props.js';\nimport type { TimeFormat } from './TimePicker.shared.js';\n\nexport const getTimePickerPopupMaxHeight = (size: SizeProp, theme: Theme): string => {\n switch (size) {\n case 'large':\n return theme.timePickerMenuMaxHeightLarge;\n\n case 'medium':\n return theme.timePickerMenuMaxHeightMedium;\n\n case 'small':\n\n default:\n return theme.timePickerMenuMaxHeightSmall;\n }\n};\n\nexport const getTimePickerSuffixMargin = (size: SizeProp, theme: Theme): string => {\n switch (size) {\n case 'large':\n return theme.timePickerSuffixGapLarge;\n\n case 'medium':\n return theme.timePickerSuffixGapMedium;\n\n case 'small':\n\n default:\n return theme.timePickerSuffixGapSmall;\n }\n};\n\nexport const getTimePickerInputMinWidth = (\n size: SizeProp,\n format: TimeFormat,\n hasIcon: boolean,\n theme: Theme,\n): string => {\n switch (size) {\n case 'large':\n if (format === 'second') {\n return hasIcon\n ? theme.timePickerInputMinWidthWithIconAndSecondsLarge\n : theme.timePickerInputMinWidthWithSecondsLarge;\n }\n\n return hasIcon ? theme.timePickerInputMinWidthWithIconLarge : theme.timePickerInputMinWidthLarge;\n\n case 'medium':\n if (format === 'second') {\n return hasIcon\n ? theme.timePickerInputMinWidthWithIconAndSecondsMedium\n : theme.timePickerInputMinWidthWithSecondsMedium;\n }\n\n return hasIcon ? theme.timePickerInputMinWidthWithIconMedium : theme.timePickerInputMinWidthMedium;\n\n case 'small':\n\n default:\n if (format === 'second') {\n return hasIcon\n ? theme.timePickerInputMinWidthWithIconAndSecondsSmall\n : theme.timePickerInputMinWidthWithSecondsSmall;\n }\n\n return hasIcon ? theme.timePickerInputMinWidthWithIconSmall : theme.timePickerInputMinWidthSmall;\n }\n};\n"]}
@@ -0,0 +1,5 @@
1
+ import type { TimeFormat, TimeSegment } from './TimePicker.shared.js';
2
+ /** Возвращает следующий сегмент для навигации по вводу или `null`, если текущий сегмент последний. */
3
+ export declare const getNextTimeSegment: (segment: TimeSegment, format: TimeFormat) => TimeSegment | null;
4
+ /** Возвращает предыдущий сегмент для навигации по вводу или `null`, если текущий сегмент первый. */
5
+ export declare const getPreviousTimeSegment: (segment: TimeSegment) => TimeSegment | null;
@@ -0,0 +1,23 @@
1
+ /** Возвращает следующий сегмент для навигации по вводу или `null`, если текущий сегмент последний. */
2
+ export var getNextTimeSegment = function (segment, format) {
3
+ switch (segment) {
4
+ case 'hours':
5
+ return 'minutes';
6
+ case 'minutes':
7
+ return format === 'second' ? 'seconds' : null;
8
+ case 'seconds':
9
+ return null;
10
+ }
11
+ };
12
+ /** Возвращает предыдущий сегмент для навигации по вводу или `null`, если текущий сегмент первый. */
13
+ export var getPreviousTimeSegment = function (segment) {
14
+ switch (segment) {
15
+ case 'hours':
16
+ return null;
17
+ case 'minutes':
18
+ return 'hours';
19
+ case 'seconds':
20
+ return 'minutes';
21
+ }
22
+ };
23
+ //# sourceMappingURL=TimePicker.selection.js.map