@bigbinary/neeto-atoms 1.0.145 → 1.1.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.
- package/dist/{DatePicker-DznpJnhm.js → DatePicker-BC9AOZJ2.js} +696 -131
- package/dist/DatePicker-BC9AOZJ2.js.map +1 -0
- package/dist/{TimePicker-BA7JhrYd.js → TimePicker-CJ8K2zea.js} +192 -17
- package/dist/TimePicker-CJ8K2zea.js.map +1 -0
- package/dist/{TranslationProvider-Dd0ITHC0.js → TranslationProvider-BJjfFEgX.js} +12 -1
- package/dist/{TranslationProvider-Dd0ITHC0.js.map → TranslationProvider-BJjfFEgX.js.map} +1 -1
- package/dist/cjs/{DatePicker-CMcp7TGb.js → DatePicker-aGLz-3Bz.js} +707 -141
- package/dist/cjs/DatePicker-aGLz-3Bz.js.map +1 -0
- package/dist/cjs/{TimePicker-CVGXEgk5.js → TimePicker-BhOW7vbV.js} +217 -41
- package/dist/cjs/TimePicker-BhOW7vbV.js.map +1 -0
- package/dist/cjs/{TranslationProvider-DOeyGtbV.js → TranslationProvider-C1JDwKEN.js} +12 -1
- package/dist/cjs/{TranslationProvider-DOeyGtbV.js.map → TranslationProvider-C1JDwKEN.js.map} +1 -1
- package/dist/cjs/components/DatePicker.js +7 -6
- package/dist/cjs/components/DatePicker.js.map +1 -1
- package/dist/cjs/components/TimePicker.js +7 -7
- package/dist/cjs/components/TranslationProvider.js +1 -1
- package/dist/cjs/components/index.js +7 -7
- package/dist/cjs/index.js +8 -8
- package/dist/cjs/{TimePickerPanel-DvVRLqeM.js → utils-S4yTubWZ.js} +25 -197
- package/dist/cjs/utils-S4yTubWZ.js.map +1 -0
- package/dist/components/DatePicker/DatePickerFooter.d.ts +1 -0
- package/dist/components/DatePicker/RangeCalendar.d.ts +2 -1
- package/dist/components/DatePicker/SegmentedTimeInput.d.ts +17 -0
- package/dist/components/DatePicker/TimeSection.d.ts +22 -0
- package/dist/components/DatePicker/constants.d.ts +1 -1
- package/dist/components/DatePicker/segmentedTime.d.ts +58 -0
- package/dist/components/DatePicker/types.d.ts +33 -4
- package/dist/components/DatePicker/utils.d.ts +3 -0
- package/dist/components/DatePicker.js +7 -6
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/TimePicker.js +6 -6
- package/dist/components/TranslationProvider.js +1 -1
- package/dist/components/index.js +6 -6
- package/dist/index.js +8 -8
- package/dist/translations/index.d.ts +11 -0
- package/dist/utils/inputMask.d.ts +2 -1
- package/dist/{TimePickerPanel-n-Dz1p5N.js → utils-Ca3DmOrC.js} +22 -197
- package/dist/utils-Ca3DmOrC.js.map +1 -0
- package/package.json +1 -1
- package/dist/DatePicker-DznpJnhm.js.map +0 -1
- package/dist/TimePicker-BA7JhrYd.js.map +0 -1
- package/dist/TimePickerPanel-n-Dz1p5N.js.map +0 -1
- package/dist/cjs/DatePicker-CMcp7TGb.js.map +0 -1
- package/dist/cjs/TimePicker-CVGXEgk5.js.map +0 -1
- package/dist/cjs/TimePickerPanel-DvVRLqeM.js.map +0 -1
|
@@ -12,7 +12,11 @@ export interface DatePickerProps {
|
|
|
12
12
|
/** Default value (uncontrolled). */
|
|
13
13
|
defaultValue?: DateValue | [DateValue | null, DateValue | null];
|
|
14
14
|
/** Callback on date change. Returns Dayjs objects for neeto ecosystem compatibility. */
|
|
15
|
-
onChange?: (value: Dayjs | [Dayjs | null, Dayjs | null] | null, formatted: string | [string, string]
|
|
15
|
+
onChange?: (value: Dayjs | [Dayjs | null, Dayjs | null] | null, formatted: string | [string, string],
|
|
16
|
+
/** `hasTime` is false when a `timeOptional` picker saved a date without a time. */
|
|
17
|
+
meta?: {
|
|
18
|
+
hasTime: boolean;
|
|
19
|
+
}) => void;
|
|
16
20
|
/** Callback when the trigger input loses focus. */
|
|
17
21
|
onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
18
22
|
/** Single date or range selection. */
|
|
@@ -21,11 +25,30 @@ export interface DatePickerProps {
|
|
|
21
25
|
dateFormat?: string;
|
|
22
26
|
/** Time format string (date-fns compatible, e.g. "HH:mm:ss"). */
|
|
23
27
|
timeFormat?: string;
|
|
24
|
-
/** Show time
|
|
28
|
+
/** Show the typed time field below the calendar. */
|
|
25
29
|
showTime?: boolean;
|
|
26
|
-
/**
|
|
30
|
+
/** Show the "Now" button in the footer. Defaults to true. */
|
|
31
|
+
showNow?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* With `showTime`, the minute increment, e.g. 5: typed minutes snap to it,
|
|
34
|
+
* the arrow keys move by it, "Now" rounds up to it, and a hint names it.
|
|
35
|
+
* Omit to accept any minute.
|
|
36
|
+
*/
|
|
37
|
+
minuteStep?: number;
|
|
38
|
+
/**
|
|
39
|
+
* With `showTime`, shows an "Add time" switch so the time can be left out.
|
|
40
|
+
* On by default; pass `false` to always require a time. Single dates only;
|
|
41
|
+
* ranges always take a time.
|
|
42
|
+
*/
|
|
43
|
+
timeOptional?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* With `timeOptional`, whether the current `value` includes a time. Pass it
|
|
46
|
+
* for a controlled picker; read `meta.hasTime` in `onChange` to keep it in sync.
|
|
47
|
+
*/
|
|
48
|
+
hasTime?: boolean;
|
|
49
|
+
/** @deprecated No effect. The time row always uses 12-hour time with AM/PM. */
|
|
27
50
|
timePickerFormat?: TimePickerFormat;
|
|
28
|
-
/**
|
|
51
|
+
/** @deprecated No effect. The time row has no seconds input. */
|
|
29
52
|
showSeconds?: boolean;
|
|
30
53
|
/** Minimum selectable date. */
|
|
31
54
|
minDate?: DateValue;
|
|
@@ -49,6 +72,12 @@ export interface DatePickerProps {
|
|
|
49
72
|
allowClear?: boolean;
|
|
50
73
|
/** Required field indicator. */
|
|
51
74
|
required?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* With `showTime`, the time zone line under the time field. Defaults to the
|
|
77
|
+
* user's zone, e.g. "India Standard Time (UTC+5:30)". Pass a label for a
|
|
78
|
+
* value kept in another zone, or "" to hide the line.
|
|
79
|
+
*/
|
|
80
|
+
timezoneLabel?: string;
|
|
52
81
|
/** Timezone value (e.g. "utc" or undefined for local). */
|
|
53
82
|
timezone?: string;
|
|
54
83
|
/** Callback when timezone changes. */
|
|
@@ -9,6 +9,9 @@ export declare const toBrowserLocalDate: (date: Date) => Date;
|
|
|
9
9
|
export declare const toNativeDate: (value: unknown) => Date | null;
|
|
10
10
|
export declare const coerceDateValue: (value: unknown, type: "date" | "range") => Date | [Date | null, Date | null] | null;
|
|
11
11
|
export declare const getInitialCalendarMonth: (value: unknown, defaultValue: unknown, type: "date" | "range") => Date;
|
|
12
|
+
export declare const roundToMinuteStep: (date: Date, step: number) => Date;
|
|
13
|
+
export declare const getTimezoneLabel: (timezone?: string) => string;
|
|
14
|
+
export declare const roundUpToMinuteStep: (date: Date, step: number) => Date;
|
|
12
15
|
/**
|
|
13
16
|
* Format a date for display using browser-local time.
|
|
14
17
|
* Calendar and input always show browser-local dates.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { D as DatePicker } from '../DatePicker-
|
|
1
|
+
export { D as DatePicker } from '../DatePicker-BC9AOZJ2.js';
|
|
2
2
|
import 'react/jsx-runtime';
|
|
3
3
|
import 'react';
|
|
4
4
|
import '../primitives/Calendar.js';
|
|
@@ -28,16 +28,13 @@ import '../index-BYZaLNq1.js';
|
|
|
28
28
|
import '../index-fV_U4ZJM.js';
|
|
29
29
|
import '../index-yFgkK_AM.js';
|
|
30
30
|
import '../index-Cor698lu.js';
|
|
31
|
-
import '../
|
|
32
|
-
import '../primitives/Button.js';
|
|
33
|
-
import '../primitives/ScrollArea.js';
|
|
34
|
-
import '../index-d0BBQf5t.js';
|
|
35
|
-
import '../index-BfAAoDv6.js';
|
|
31
|
+
import '../utils-Ca3DmOrC.js';
|
|
36
32
|
import 'dayjs';
|
|
37
33
|
import 'dayjs/plugin/customParseFormat';
|
|
38
34
|
import '@bigbinary/neeto-commons-frontend/utils';
|
|
39
35
|
import '../fieldIds-VpluAAMl.js';
|
|
40
36
|
import '../hyphenize-TRhMI0tl.js';
|
|
37
|
+
import '../primitives/Button.js';
|
|
41
38
|
import '../primitives/Field.js';
|
|
42
39
|
import '../HelpIcon-CEHRtxZ5.js';
|
|
43
40
|
import '../primitives/Tooltip.js';
|
|
@@ -55,4 +52,8 @@ import '../loader-circle-DycHUAWN.js';
|
|
|
55
52
|
import '../label-Bl6tz8EJ.js';
|
|
56
53
|
import '../separator-ByRsc-y-.js';
|
|
57
54
|
import '../x-_o2T3n6D.js';
|
|
55
|
+
import '../primitives/Label.js';
|
|
56
|
+
import '../primitives/Switch.js';
|
|
57
|
+
import '../check-Cpkv29p1.js';
|
|
58
|
+
import '../index-30QpKM0j.js';
|
|
58
59
|
//# sourceMappingURL=DatePicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
export { T as TimePicker } from '../TimePicker-
|
|
2
|
-
export { T as TimePickerPanel } from '../TimePickerPanel-n-Dz1p5N.js';
|
|
1
|
+
export { T as TimePicker, a as TimePickerPanel } from '../TimePicker-CJ8K2zea.js';
|
|
3
2
|
import 'react/jsx-runtime';
|
|
4
3
|
import 'react';
|
|
5
4
|
import '../primitives/Popover.js';
|
|
@@ -44,11 +43,12 @@ import '../label-Bl6tz8EJ.js';
|
|
|
44
43
|
import '../separator-ByRsc-y-.js';
|
|
45
44
|
import '../fieldIds-VpluAAMl.js';
|
|
46
45
|
import '../hyphenize-TRhMI0tl.js';
|
|
47
|
-
import '../
|
|
48
|
-
import '../primitives/ScrollArea.js';
|
|
49
|
-
import '../index-d0BBQf5t.js';
|
|
50
|
-
import '../index-BfAAoDv6.js';
|
|
46
|
+
import '../utils-Ca3DmOrC.js';
|
|
51
47
|
import 'dayjs';
|
|
52
48
|
import 'dayjs/plugin/customParseFormat';
|
|
53
49
|
import '@bigbinary/neeto-commons-frontend/utils';
|
|
50
|
+
import '../primitives/ScrollArea.js';
|
|
51
|
+
import '../index-d0BBQf5t.js';
|
|
52
|
+
import '../index-BfAAoDv6.js';
|
|
53
|
+
import '../x-_o2T3n6D.js';
|
|
54
54
|
//# sourceMappingURL=TimePicker.js.map
|
package/dist/components/index.js
CHANGED
|
@@ -8,7 +8,7 @@ export { C as Callout } from '../Callout-DJGi3MQR.js';
|
|
|
8
8
|
export { C as Checkbox } from '../Checkbox-BalUzegZ.js';
|
|
9
9
|
export { C as ColorPicker } from '../ColorPicker-g9siUaIe.js';
|
|
10
10
|
export { D as DataTable, u as useColumnOrdering, a as useColumnPinning, b as useColumnVisibility, c as useTablePagination, d as useTableSelection, e as useTableSort } from '../DataTable-BAf51Sfw.js';
|
|
11
|
-
export { D as DatePicker } from '../DatePicker-
|
|
11
|
+
export { D as DatePicker } from '../DatePicker-BC9AOZJ2.js';
|
|
12
12
|
export { D as Dialog } from '../Dialog-ZTcfRPwU.js';
|
|
13
13
|
export { E as Empty } from '../Empty-B4iQJlmf.js';
|
|
14
14
|
export { I as Input } from '../Input-Dm5ILPH3.js';
|
|
@@ -27,11 +27,10 @@ export { S as Stepper } from '../Stepper-GK8gDn-s.js';
|
|
|
27
27
|
export { S as Switch } from '../Switch-C9fqpoNR.js';
|
|
28
28
|
export { T as Tabs } from '../Tabs-DaXiF_67.js';
|
|
29
29
|
export { T as Textarea } from '../Textarea-CUe09-sr.js';
|
|
30
|
-
export { T as TimePicker } from '../TimePicker-
|
|
31
|
-
export { T as TimePickerPanel } from '../TimePickerPanel-n-Dz1p5N.js';
|
|
30
|
+
export { T as TimePicker, a as TimePickerPanel } from '../TimePicker-CJ8K2zea.js';
|
|
32
31
|
export { T as Toastr } from '../Toastr-Dhl8V1V2.js';
|
|
33
32
|
export { T as Tooltip } from '../Tooltip-DWDsgyx7.js';
|
|
34
|
-
export { T as TranslationProvider } from '../TranslationProvider-
|
|
33
|
+
export { T as TranslationProvider } from '../TranslationProvider-BJjfFEgX.js';
|
|
35
34
|
export { T as Tree } from '../Tree-Cf0rLcX9.js';
|
|
36
35
|
export { T as TreeSelect } from '../TreeSelect-BV18q8UD.js';
|
|
37
36
|
export { T as Typography, t as typographyVariants } from '../Typography-Bu78IBJy.js';
|
|
@@ -111,9 +110,12 @@ import '../primitives/Pagination.js';
|
|
|
111
110
|
import '../chevron-left-BDoT8E2-.js';
|
|
112
111
|
import '../ellipsis-lb8Ws6br.js';
|
|
113
112
|
import '../primitives/Calendar.js';
|
|
113
|
+
import '../utils-Ca3DmOrC.js';
|
|
114
114
|
import 'dayjs';
|
|
115
115
|
import 'dayjs/plugin/customParseFormat';
|
|
116
116
|
import '@bigbinary/neeto-commons-frontend/utils';
|
|
117
|
+
import '../primitives/Label.js';
|
|
118
|
+
import '../primitives/Switch.js';
|
|
117
119
|
import '../primitives/Empty.js';
|
|
118
120
|
import '../primitives/InputGroup.js';
|
|
119
121
|
import '../input-group-kccDxDZ0.js';
|
|
@@ -121,7 +123,6 @@ import '../input-BNPBqcmC.js';
|
|
|
121
123
|
import '../textarea-ByEw7FT-.js';
|
|
122
124
|
import '../withIconSize-BonoFXeH.js';
|
|
123
125
|
import '../primitives/Kbd.js';
|
|
124
|
-
import '../primitives/Label.js';
|
|
125
126
|
import '../primitives/HoverCard.js';
|
|
126
127
|
import '../primitives/Progress.js';
|
|
127
128
|
import '../primitives/RadioGroup.js';
|
|
@@ -131,7 +132,6 @@ import '../primitives/Sheet.js';
|
|
|
131
132
|
import '../sheet-CNgGLv5u.js';
|
|
132
133
|
import '../primitives/Slider.js';
|
|
133
134
|
import '../index-BfAAoDv6.js';
|
|
134
|
-
import '../primitives/Switch.js';
|
|
135
135
|
import '../primitives/Tabs.js';
|
|
136
136
|
import '../primitives/Textarea.js';
|
|
137
137
|
import '../primitives/ScrollArea.js';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { dayjs } from '@bigbinary/neeto-commons-frontend/utils';
|
|
2
2
|
export { dayjs } from '@bigbinary/neeto-commons-frontend/utils';
|
|
3
|
-
export { T as TranslationProvider, r as translations } from './TranslationProvider-
|
|
3
|
+
export { T as TranslationProvider, r as translations } from './TranslationProvider-BJjfFEgX.js';
|
|
4
4
|
export { DropdownMenu } from './components/DropdownMenu.js';
|
|
5
5
|
export { u as useIsMobile } from './use-mobile-QbHL72cX.js';
|
|
6
6
|
export { c as cn } from './utils-BJnb9o5c.js';
|
|
@@ -13,7 +13,7 @@ export { C as Callout } from './Callout-DJGi3MQR.js';
|
|
|
13
13
|
export { C as Checkbox } from './Checkbox-BalUzegZ.js';
|
|
14
14
|
export { C as ColorPicker } from './ColorPicker-g9siUaIe.js';
|
|
15
15
|
export { D as DataTable, u as useColumnOrdering, a as useColumnPinning, b as useColumnVisibility, c as useTablePagination, d as useTableSelection, e as useTableSort } from './DataTable-BAf51Sfw.js';
|
|
16
|
-
export { D as DatePicker } from './DatePicker-
|
|
16
|
+
export { D as DatePicker } from './DatePicker-BC9AOZJ2.js';
|
|
17
17
|
export { D as Dialog } from './Dialog-ZTcfRPwU.js';
|
|
18
18
|
export { D as DirectionProvider } from './DirectionProvider-weqLz_BJ.js';
|
|
19
19
|
export { E as Empty } from './Empty-B4iQJlmf.js';
|
|
@@ -33,7 +33,7 @@ export { S as Stepper } from './Stepper-GK8gDn-s.js';
|
|
|
33
33
|
export { S as Switch } from './Switch-C9fqpoNR.js';
|
|
34
34
|
export { T as Tabs } from './Tabs-DaXiF_67.js';
|
|
35
35
|
export { T as Textarea } from './Textarea-CUe09-sr.js';
|
|
36
|
-
export { T as TimePicker } from './TimePicker-
|
|
36
|
+
export { T as TimePicker } from './TimePicker-CJ8K2zea.js';
|
|
37
37
|
export { T as Toastr } from './Toastr-Dhl8V1V2.js';
|
|
38
38
|
export { T as Tooltip } from './Tooltip-DWDsgyx7.js';
|
|
39
39
|
export { T as Tree } from './Tree-Cf0rLcX9.js';
|
|
@@ -114,11 +114,11 @@ import './primitives/Pagination.js';
|
|
|
114
114
|
import './chevron-left-BDoT8E2-.js';
|
|
115
115
|
import './ellipsis-lb8Ws6br.js';
|
|
116
116
|
import './primitives/Calendar.js';
|
|
117
|
-
import './
|
|
118
|
-
import './primitives/ScrollArea.js';
|
|
119
|
-
import './index-BfAAoDv6.js';
|
|
117
|
+
import './utils-Ca3DmOrC.js';
|
|
120
118
|
import 'dayjs';
|
|
121
119
|
import 'dayjs/plugin/customParseFormat';
|
|
120
|
+
import './primitives/Label.js';
|
|
121
|
+
import './primitives/Switch.js';
|
|
122
122
|
import './primitives/Empty.js';
|
|
123
123
|
import './primitives/InputGroup.js';
|
|
124
124
|
import './input-group-kccDxDZ0.js';
|
|
@@ -126,7 +126,6 @@ import './input-BNPBqcmC.js';
|
|
|
126
126
|
import './textarea-ByEw7FT-.js';
|
|
127
127
|
import './withIconSize-BonoFXeH.js';
|
|
128
128
|
import './primitives/Kbd.js';
|
|
129
|
-
import './primitives/Label.js';
|
|
130
129
|
import './primitives/HoverCard.js';
|
|
131
130
|
import './primitives/Progress.js';
|
|
132
131
|
import './primitives/RadioGroup.js';
|
|
@@ -135,9 +134,10 @@ import './SelectFieldWrapper-D370CD4o.js';
|
|
|
135
134
|
import './primitives/Sheet.js';
|
|
136
135
|
import './sheet-CNgGLv5u.js';
|
|
137
136
|
import './primitives/Slider.js';
|
|
138
|
-
import './
|
|
137
|
+
import './index-BfAAoDv6.js';
|
|
139
138
|
import './primitives/Tabs.js';
|
|
140
139
|
import './primitives/Textarea.js';
|
|
140
|
+
import './primitives/ScrollArea.js';
|
|
141
141
|
import './index-CDo_esrR.js';
|
|
142
142
|
import './redux-BKH6DnBB.js';
|
|
143
143
|
|
|
@@ -74,6 +74,17 @@ export declare const resources: {
|
|
|
74
74
|
removeInvalid: string;
|
|
75
75
|
duplicateWarning: string;
|
|
76
76
|
};
|
|
77
|
+
datePicker: {
|
|
78
|
+
timeField: string;
|
|
79
|
+
addTime: string;
|
|
80
|
+
timeHint: string;
|
|
81
|
+
errors: {
|
|
82
|
+
timeRequired: string;
|
|
83
|
+
hourRequired: string;
|
|
84
|
+
minuteRequired: string;
|
|
85
|
+
periodRequired: string;
|
|
86
|
+
};
|
|
87
|
+
};
|
|
77
88
|
};
|
|
78
89
|
};
|
|
79
90
|
};
|
|
@@ -6,12 +6,13 @@ export interface MaskTemplate {
|
|
|
6
6
|
* Convert a display format string into a mask template.
|
|
7
7
|
*
|
|
8
8
|
* Format chars (d, M, y, H, h, m, s) → digit slots (#).
|
|
9
|
-
* A
|
|
9
|
+
* A or AA → two ampm letter slots (@@), since both render as "AM"/"PM".
|
|
10
10
|
* Everything else → literal separators.
|
|
11
11
|
*
|
|
12
12
|
* Examples:
|
|
13
13
|
* "dd/MM/yyyy" → "##/##/####"
|
|
14
14
|
* "hh:mm AA" → "##:## @@"
|
|
15
|
+
* "hh:mm A" → "##:## @@"
|
|
15
16
|
*/
|
|
16
17
|
export declare const buildMaskTemplate: (format: string) => MaskTemplate;
|
|
17
18
|
/**
|
|
@@ -1,12 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { c as cn } from './utils-BJnb9o5c.js';
|
|
4
|
-
import { Button } from './primitives/Button.js';
|
|
5
|
-
import { ScrollArea } from './primitives/ScrollArea.js';
|
|
1
|
+
import { c as createLucideIcon } from './createLucideIcon-C8ycilSN.js';
|
|
2
|
+
import { useState, useCallback, useLayoutEffect, useEffect } from 'react';
|
|
6
3
|
import pureDayjs from 'dayjs';
|
|
7
4
|
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
8
5
|
import { dayjs } from '@bigbinary/neeto-commons-frontend/utils';
|
|
9
6
|
|
|
7
|
+
/**
|
|
8
|
+
* @license lucide-react v0.577.0 - ISC
|
|
9
|
+
*
|
|
10
|
+
* This source code is licensed under the ISC license.
|
|
11
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
const __iconNode = [
|
|
16
|
+
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
17
|
+
["path", { d: "M12 6v6l4 2", key: "mmk7yg" }]
|
|
18
|
+
];
|
|
19
|
+
const Clock = createLucideIcon("clock", __iconNode);
|
|
20
|
+
|
|
10
21
|
function useControlledOpen(controlledOpen, onOpenChange) {
|
|
11
22
|
const [internalOpen, setInternalOpen] = useState(false);
|
|
12
23
|
const isControlled = controlledOpen !== void 0;
|
|
@@ -63,12 +74,14 @@ const isValidChar = (ch, hasAmPm) => DIGIT.test(ch) || hasAmPm && AMPM_CHAR.test
|
|
|
63
74
|
const buildMaskTemplate = (format) => {
|
|
64
75
|
let pattern = "";
|
|
65
76
|
let hasAmPm = false;
|
|
66
|
-
for (
|
|
77
|
+
for (let i = 0; i < format.length; i++) {
|
|
78
|
+
const char = format[i];
|
|
67
79
|
if (FORMAT_CHARS.has(char)) {
|
|
68
80
|
pattern += "#";
|
|
69
81
|
} else if (char === "A") {
|
|
70
|
-
pattern += "
|
|
82
|
+
pattern += "@@";
|
|
71
83
|
hasAmPm = true;
|
|
84
|
+
if (format[i + 1] === "A") i++;
|
|
72
85
|
} else {
|
|
73
86
|
pattern += char;
|
|
74
87
|
}
|
|
@@ -240,27 +253,6 @@ const applyMask = (inputText, template, previousText = "", nativeCursorPos) => {
|
|
|
240
253
|
};
|
|
241
254
|
};
|
|
242
255
|
|
|
243
|
-
const COLUMN_HEIGHT = 224;
|
|
244
|
-
const ITEM_HEIGHT = 32;
|
|
245
|
-
const PERIODS = ["AM", "PM"];
|
|
246
|
-
const SIZE_CONFIG = {
|
|
247
|
-
small: {
|
|
248
|
-
trigger: "h-8 md:h-7",
|
|
249
|
-
input: "text-base md:text-xs",
|
|
250
|
-
icon: "size-3.5"
|
|
251
|
-
},
|
|
252
|
-
medium: {
|
|
253
|
-
trigger: "h-8",
|
|
254
|
-
input: "text-base md:text-sm",
|
|
255
|
-
icon: "size-4"
|
|
256
|
-
},
|
|
257
|
-
large: {
|
|
258
|
-
trigger: "h-10",
|
|
259
|
-
input: "text-base md:text-sm",
|
|
260
|
-
icon: "size-5"
|
|
261
|
-
}
|
|
262
|
-
};
|
|
263
|
-
|
|
264
256
|
pureDayjs.extend(customParseFormat);
|
|
265
257
|
const generateRange = (start, end, step = 1) => {
|
|
266
258
|
const result = [];
|
|
@@ -381,172 +373,5 @@ const timeValueToDayjs = (time) => {
|
|
|
381
373
|
return dayjs(`${today} ${h}:${m}:${s}`);
|
|
382
374
|
};
|
|
383
375
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
selected,
|
|
387
|
-
onSelect,
|
|
388
|
-
disabled = false,
|
|
389
|
-
className,
|
|
390
|
-
padStart = 2
|
|
391
|
-
}) => {
|
|
392
|
-
const selectedRef = useRef(null);
|
|
393
|
-
useEffect(() => {
|
|
394
|
-
if (selectedRef.current) {
|
|
395
|
-
selectedRef.current.scrollIntoView({
|
|
396
|
-
block: "center",
|
|
397
|
-
behavior: "smooth"
|
|
398
|
-
});
|
|
399
|
-
}
|
|
400
|
-
}, [selected]);
|
|
401
|
-
return /* @__PURE__ */ jsx(
|
|
402
|
-
ScrollArea,
|
|
403
|
-
{
|
|
404
|
-
className: cn("w-16", className),
|
|
405
|
-
style: { height: COLUMN_HEIGHT },
|
|
406
|
-
children: /* @__PURE__ */ jsx(
|
|
407
|
-
"div",
|
|
408
|
-
{
|
|
409
|
-
className: "flex flex-col items-center py-2",
|
|
410
|
-
role: "listbox",
|
|
411
|
-
"aria-label": "Time selection",
|
|
412
|
-
children: items.map((item) => {
|
|
413
|
-
const isSelected = item === selected;
|
|
414
|
-
const displayValue = typeof item === "number" ? padNumber(item, padStart) : item;
|
|
415
|
-
return /* @__PURE__ */ jsx(
|
|
416
|
-
Button,
|
|
417
|
-
{
|
|
418
|
-
ref: isSelected ? selectedRef : void 0,
|
|
419
|
-
variant: isSelected ? "default" : "ghost",
|
|
420
|
-
size: "sm",
|
|
421
|
-
role: "option",
|
|
422
|
-
"aria-selected": isSelected,
|
|
423
|
-
disabled,
|
|
424
|
-
className: cn(
|
|
425
|
-
"w-12 justify-center font-mono text-sm",
|
|
426
|
-
!isSelected && "text-muted-foreground"
|
|
427
|
-
),
|
|
428
|
-
style: { height: ITEM_HEIGHT },
|
|
429
|
-
onClick: () => onSelect(item),
|
|
430
|
-
children: displayValue
|
|
431
|
-
},
|
|
432
|
-
item
|
|
433
|
-
);
|
|
434
|
-
})
|
|
435
|
-
}
|
|
436
|
-
)
|
|
437
|
-
}
|
|
438
|
-
);
|
|
439
|
-
};
|
|
440
|
-
TimeColumn.displayName = "TimeColumn";
|
|
441
|
-
|
|
442
|
-
const TimePickerPanel = forwardRef(
|
|
443
|
-
({
|
|
444
|
-
value,
|
|
445
|
-
onChange,
|
|
446
|
-
format = "24",
|
|
447
|
-
showSeconds = false,
|
|
448
|
-
minuteStep = 1,
|
|
449
|
-
secondStep = 1,
|
|
450
|
-
disabled = false,
|
|
451
|
-
className
|
|
452
|
-
}, ref) => {
|
|
453
|
-
const getInitialTime = useCallback(
|
|
454
|
-
() => ({
|
|
455
|
-
hours: value?.hours ?? 0,
|
|
456
|
-
minutes: value?.minutes ?? 0,
|
|
457
|
-
seconds: value?.seconds ?? 0
|
|
458
|
-
}),
|
|
459
|
-
[value]
|
|
460
|
-
);
|
|
461
|
-
const [internalTime, setInternalTime] = useState(getInitialTime);
|
|
462
|
-
useEffect(() => {
|
|
463
|
-
setInternalTime(getInitialTime());
|
|
464
|
-
}, [getInitialTime]);
|
|
465
|
-
const hours = format === "12" ? generateRange(1, 12) : generateRange(0, 23);
|
|
466
|
-
const minutes = generateRange(0, 59, minuteStep);
|
|
467
|
-
const seconds = generateRange(0, 59, secondStep);
|
|
468
|
-
const { hour12, period } = format === "12" ? to12Hour(internalTime.hours) : { hour12: internalTime.hours, period: "AM" };
|
|
469
|
-
const handleHourSelect = (hourValue) => {
|
|
470
|
-
const hour = Number(hourValue);
|
|
471
|
-
const newHours = format === "12" ? to24Hour(hour, period) : hour;
|
|
472
|
-
const newTime = { ...internalTime, hours: newHours };
|
|
473
|
-
setInternalTime(newTime);
|
|
474
|
-
onChange?.(newTime);
|
|
475
|
-
};
|
|
476
|
-
const handleMinuteSelect = (minuteValue) => {
|
|
477
|
-
const newTime = { ...internalTime, minutes: Number(minuteValue) };
|
|
478
|
-
setInternalTime(newTime);
|
|
479
|
-
onChange?.(newTime);
|
|
480
|
-
};
|
|
481
|
-
const handleSecondSelect = (secondValue) => {
|
|
482
|
-
const newTime = { ...internalTime, seconds: Number(secondValue) };
|
|
483
|
-
setInternalTime(newTime);
|
|
484
|
-
onChange?.(newTime);
|
|
485
|
-
};
|
|
486
|
-
const handlePeriodSelect = (newPeriod) => {
|
|
487
|
-
const newHours = to24Hour(hour12, newPeriod);
|
|
488
|
-
const newTime = { ...internalTime, hours: newHours };
|
|
489
|
-
setInternalTime(newTime);
|
|
490
|
-
onChange?.(newTime);
|
|
491
|
-
};
|
|
492
|
-
return /* @__PURE__ */ jsxs(
|
|
493
|
-
"div",
|
|
494
|
-
{
|
|
495
|
-
ref,
|
|
496
|
-
className: cn("flex", className),
|
|
497
|
-
role: "group",
|
|
498
|
-
"aria-label": "Time picker",
|
|
499
|
-
children: [
|
|
500
|
-
/* @__PURE__ */ jsx(
|
|
501
|
-
TimeColumn,
|
|
502
|
-
{
|
|
503
|
-
items: hours,
|
|
504
|
-
selected: format === "12" ? hour12 : internalTime.hours,
|
|
505
|
-
onSelect: handleHourSelect,
|
|
506
|
-
disabled
|
|
507
|
-
}
|
|
508
|
-
),
|
|
509
|
-
/* @__PURE__ */ jsx("div", { className: "border-inline-end border-border" }),
|
|
510
|
-
/* @__PURE__ */ jsx(
|
|
511
|
-
TimeColumn,
|
|
512
|
-
{
|
|
513
|
-
items: minutes,
|
|
514
|
-
selected: internalTime.minutes,
|
|
515
|
-
onSelect: handleMinuteSelect,
|
|
516
|
-
disabled
|
|
517
|
-
}
|
|
518
|
-
),
|
|
519
|
-
showSeconds && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
520
|
-
/* @__PURE__ */ jsx("div", { className: "border-inline-end border-border" }),
|
|
521
|
-
/* @__PURE__ */ jsx(
|
|
522
|
-
TimeColumn,
|
|
523
|
-
{
|
|
524
|
-
items: seconds,
|
|
525
|
-
selected: internalTime.seconds ?? 0,
|
|
526
|
-
onSelect: handleSecondSelect,
|
|
527
|
-
disabled
|
|
528
|
-
}
|
|
529
|
-
)
|
|
530
|
-
] }),
|
|
531
|
-
format === "12" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
532
|
-
/* @__PURE__ */ jsx("div", { className: "border-inline-end border-border" }),
|
|
533
|
-
/* @__PURE__ */ jsx(
|
|
534
|
-
TimeColumn,
|
|
535
|
-
{
|
|
536
|
-
items: [...PERIODS],
|
|
537
|
-
selected: period,
|
|
538
|
-
onSelect: handlePeriodSelect,
|
|
539
|
-
disabled,
|
|
540
|
-
padStart: 0
|
|
541
|
-
}
|
|
542
|
-
)
|
|
543
|
-
] })
|
|
544
|
-
]
|
|
545
|
-
}
|
|
546
|
-
);
|
|
547
|
-
}
|
|
548
|
-
);
|
|
549
|
-
TimePickerPanel.displayName = "TimePickerPanel";
|
|
550
|
-
|
|
551
|
-
export { SIZE_CONFIG as S, TimePickerPanel as T, formatTimeDisplay as a, useOutsideClickClose as b, coerceToTimeValue as c, buildMaskTemplate as d, useCursorRestore as e, formatTimeWithPattern as f, getDefaultTimeMaskFormat as g, timeValueToDayjs as h, getTimePlaceholder as i, applyMask as j, parseTimeString as k, isFixedWidthFormat as l, buildRangeMaskTemplate as m, dateToTimeValue as n, parseTimeWithPattern as p, timeValueEquals as t, useControlledOpen as u };
|
|
552
|
-
//# sourceMappingURL=TimePickerPanel-n-Dz1p5N.js.map
|
|
376
|
+
export { Clock as C, to24Hour as a, formatTimeDisplay as b, coerceToTimeValue as c, timeValueEquals as d, useOutsideClickClose as e, formatTimeWithPattern as f, generateRange as g, buildMaskTemplate as h, getDefaultTimeMaskFormat as i, useCursorRestore as j, timeValueToDayjs as k, getTimePlaceholder as l, applyMask as m, parseTimeWithPattern as n, parseTimeString as o, padNumber as p, isFixedWidthFormat as q, buildRangeMaskTemplate as r, dateToTimeValue as s, to12Hour as t, useControlledOpen as u };
|
|
377
|
+
//# sourceMappingURL=utils-Ca3DmOrC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-Ca3DmOrC.js","sources":["../node_modules/lucide-react/dist/esm/icons/clock.js","../src/hooks/useControlledOpen.ts","../src/hooks/useCursorRestore.ts","../src/hooks/useOutsideClickClose.ts","../src/utils/inputMask.ts","../src/components/TimePicker/utils.ts"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 6v6l4 2\", key: \"mmk7yg\" }]\n];\nconst Clock = createLucideIcon(\"clock\", __iconNode);\n\nexport { __iconNode, Clock as default };\n//# sourceMappingURL=clock.js.map\n","import { useCallback, useState } from \"react\";\n\n/** Manages popover open state, supporting both controlled and uncontrolled modes. */\nexport function useControlledOpen(\n controlledOpen: boolean | undefined,\n onOpenChange?: (open: boolean) => void\n): { open: boolean; setOpen: (next: boolean) => void } {\n const [internalOpen, setInternalOpen] = useState(false);\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n return { open, setOpen };\n}\n","import { MutableRefObject, RefObject, useLayoutEffect } from \"react\";\n\ntype CursorTarget = {\n inputRef: RefObject<HTMLInputElement | null>;\n cursorRef: MutableRefObject<number | null>;\n};\n\n/** Restores cursor selection range on the active input after each render, then clears the stored position. */\nexport function useCursorRestore(targets: CursorTarget[]): void {\n useLayoutEffect(() => {\n for (const { inputRef, cursorRef } of targets) {\n const inputEl = inputRef.current;\n const cursor = cursorRef.current;\n\n if (cursor !== null && inputEl && document.activeElement === inputEl) {\n inputEl.setSelectionRange(cursor, cursor);\n cursorRef.current = null;\n }\n }\n });\n}\n","import { RefObject, useEffect } from \"react\";\n\n/** Calls onClose when a pointerdown occurs outside both the container ref and a popover element. */\nexport function useOutsideClickClose({\n enabled,\n containerRef,\n popoverElementId,\n onClose,\n}: {\n enabled: boolean;\n containerRef: RefObject<HTMLElement | null>;\n popoverElementId: string;\n onClose: () => void;\n}): void {\n useEffect(() => {\n if (!enabled) return;\n\n const handlePointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement;\n if (containerRef.current?.contains(target)) return;\n\n const popoverEl = document.getElementById(popoverElementId);\n if (popoverEl?.contains(target)) return;\n\n onClose();\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [enabled, containerRef, popoverElementId, onClose]);\n}\n","export interface MaskTemplate {\n pattern: string;\n hasAmPm: boolean;\n}\n\nconst FORMAT_CHARS = new Set([\"d\", \"M\", \"y\", \"H\", \"h\", \"m\", \"s\"]);\n\nconst DIGIT = /\\d/;\nconst AMPM_CHAR = /[APM]/;\nconst VALID_CHAR = /[\\dAPM]/i;\n\nconst isSlot = (ch: string) => ch === \"#\" || ch === \"@\";\n\nconst isValidChar = (ch: string, hasAmPm: boolean) =>\n DIGIT.test(ch) || (hasAmPm && AMPM_CHAR.test(ch));\n\n/**\n * Convert a display format string into a mask template.\n *\n * Format chars (d, M, y, H, h, m, s) → digit slots (#).\n * A or AA → two ampm letter slots (@@), since both render as \"AM\"/\"PM\".\n * Everything else → literal separators.\n *\n * Examples:\n * \"dd/MM/yyyy\" → \"##/##/####\"\n * \"hh:mm AA\" → \"##:## @@\"\n * \"hh:mm A\" → \"##:## @@\"\n */\nexport const buildMaskTemplate = (format: string): MaskTemplate => {\n let pattern = \"\";\n let hasAmPm = false;\n\n for (let i = 0; i < format.length; i++) {\n const char = format[i];\n if (FORMAT_CHARS.has(char)) {\n pattern += \"#\";\n } else if (char === \"A\") {\n pattern += \"@@\";\n hasAmPm = true;\n if (format[i + 1] === \"A\") i++;\n } else {\n pattern += char;\n }\n }\n\n return { pattern, hasAmPm };\n};\n\n/**\n * Build a range mask template: two single-date templates joined by \" - \".\n */\nexport const buildRangeMaskTemplate = (format: string): MaskTemplate => {\n const single = buildMaskTemplate(format);\n\n return {\n pattern: `${single.pattern} - ${single.pattern}`,\n hasAmPm: single.hasAmPm,\n };\n};\n\n// Tokens like MMM/MMMM produce textual output (month names), not digits.\nconst TEXTUAL_WHEN_LONG = new Set([\"M\", \"d\"]);\n\n/**\n * Check if a format string uses only fixed-width numeric tokens (dd, MM, yyyy, etc).\n * Returns false for single-char tokens (d, M) and textual tokens (MMM, MMMM).\n */\nexport const isFixedWidthFormat = (format: string): boolean => {\n let i = 0;\n while (i < format.length) {\n const char = format[i];\n if (!FORMAT_CHARS.has(char)) {\n i++;\n continue;\n }\n\n let count = 0;\n while (i + count < format.length && format[i + count] === char) count++;\n\n if (count === 1) return false;\n if (count >= 3 && TEXTUAL_WHEN_LONG.has(char)) return false;\n\n i += count;\n }\n\n return true;\n};\n\nconst findDeletionPoint = (prev: string, input: string): number => {\n for (let i = 0; i < prev.length; i++) {\n if (i >= input.length || input[i] !== prev[i]) return i;\n }\n\n return prev.length - 1;\n};\n\nconst hasDigitsAfter = (\n text: string,\n pos: number,\n pattern: string\n): boolean => {\n for (let i = pos + 1; i < text.length && i < pattern.length; i++) {\n if (isSlot(pattern[i]) && text[i] !== \"_\") return true;\n }\n\n return false;\n};\n\nconst countValidBefore = (\n text: string,\n pos: number,\n hasAmPm: boolean\n): number => {\n let count = 0;\n for (let i = 0; i < pos && i < text.length; i++) {\n if (isValidChar(text[i].toUpperCase(), hasAmPm)) count++;\n }\n\n return count;\n};\n\nconst extractWithPattern = (text: string, pattern: string): string[] => {\n const chars: string[] = [];\n const upper = text.toUpperCase();\n let pIdx = 0;\n\n for (let i = 0; i < upper.length; i++) {\n const ch = upper[i];\n while (pIdx < pattern.length && !isSlot(pattern[pIdx])) pIdx++;\n if (pIdx >= pattern.length) break;\n\n if (pattern[pIdx] === \"#\" && DIGIT.test(ch)) {\n chars.push(ch);\n pIdx++;\n } else if (pattern[pIdx] === \"@\" && AMPM_CHAR.test(ch)) {\n chars.push(ch);\n pIdx++;\n }\n }\n\n return chars;\n};\n\nconst rebuildFromChars = (validChars: string[], pattern: string): string => {\n let result = \"\";\n let charIdx = 0;\n\n for (let i = 0; i < pattern.length && charIdx < validChars.length; i++) {\n if (!isSlot(pattern[i])) continue;\n\n result += validChars[charIdx];\n charIdx++;\n\n let nextSlot = i + 1;\n while (nextSlot < pattern.length && !isSlot(pattern[nextSlot])) nextSlot++;\n\n const hasMoreChars = charIdx < validChars.length;\n const hasMoreSlots = nextSlot < pattern.length;\n\n if (hasMoreChars || hasMoreSlots) {\n for (let s = i + 1; s < nextSlot; s++) result += pattern[s];\n }\n\n if (hasMoreChars) i = nextSlot - 1;\n }\n\n return result;\n};\n\nconst stripTrailingSeparators = (text: string): string => {\n let end = text.length;\n while (end > 0 && !VALID_CHAR.test(text[end - 1])) end--;\n\n return text.slice(0, end);\n};\n\nconst cursorSlotToDisplayPos = (\n result: string,\n cursorSlot: number,\n pattern: string,\n skipSeparators: boolean\n): number => {\n if (cursorSlot <= 0) return 0;\n\n let slotsFound = 0;\n for (let i = 0; i < result.length; i++) {\n if (!VALID_CHAR.test(result[i])) continue;\n\n slotsFound++;\n if (slotsFound !== cursorSlot) continue;\n\n let pos = i + 1;\n if (skipSeparators) {\n while (\n pos < result.length &&\n pos < pattern.length &&\n !isSlot(pattern[pos])\n ) {\n pos++;\n }\n }\n\n return pos;\n }\n\n return result.length;\n};\n\nconst isValidForSlot = (ch: string, slotChar: string): boolean =>\n slotChar === \"#\"\n ? DIGIT.test(ch)\n : slotChar === \"@\"\n ? AMPM_CHAR.test(ch)\n : false;\n\n/**\n * Apply the mask template to raw input text.\n *\n * - Auto-inserts separators as the user types.\n * - When the mask is full, typing in the middle replaces the digit at cursor.\n * - Backspacing in the middle replaces the digit with '_' placeholder\n * instead of shifting subsequent digits.\n * - AM/PM auto-completes: typing \"A\" or \"P\" expands to \"AM\" or \"PM\".\n */\nexport const applyMask = (\n inputText: string,\n template: MaskTemplate,\n previousText = \"\",\n nativeCursorPos?: number | null\n): { text: string; cursorPosition: number } => {\n const { pattern, hasAmPm } = template;\n\n if (!inputText) return { text: \"\", cursorPosition: 0 };\n\n const isDeleting = inputText.length < previousText.length;\n\n // When backspacing from a full mask, replace the deleted digit with '_'\n // instead of shifting. This keeps other fields (day/month/year) intact.\n if (isDeleting && previousText.length >= pattern.length) {\n const delPos = findDeletionPoint(previousText, inputText);\n\n if (\n !hasDigitsAfter(previousText, delPos, pattern) ||\n delPos >= pattern.length\n ) {\n // Deletion at or near the end — fall through to normal rebuild\n } else if (isSlot(pattern[delPos])) {\n return {\n text:\n previousText.substring(0, delPos) +\n \"_\" +\n previousText.substring(delPos + 1),\n cursorPosition: delPos,\n };\n } else {\n // Separator deleted — restore it\n return { text: previousText, cursorPosition: delPos };\n }\n }\n\n const totalSlots = [...pattern].filter(isSlot).length;\n const slotPatternPositions = [...pattern].reduce<number[]>(\n (acc, ch, i) => (isSlot(ch) ? [...acc, i] : acc),\n []\n );\n\n const cursorInInput = nativeCursorPos ?? inputText.length;\n const cursorSlot = countValidBefore(inputText, cursorInInput, hasAmPm);\n const prevChars = extractWithPattern(previousText, pattern);\n let validChars: string[];\n\n // Replace mode: single char typed on a full mask replaces the digit at cursor.\n const isSingleCharInsert =\n !isDeleting &&\n prevChars.length >= totalSlots &&\n inputText.length - previousText.length === 1;\n\n if (isSingleCharInsert) {\n const insertSlot = cursorSlot - 1;\n const typedChar = inputText[cursorInInput - 1]?.toUpperCase() ?? \"\";\n const slotChar =\n slotPatternPositions[insertSlot] != null\n ? pattern[slotPatternPositions[insertSlot]]\n : null;\n\n if (!slotChar || !isValidForSlot(typedChar, slotChar)) {\n return {\n text: previousText,\n cursorPosition: Math.min(cursorInInput, previousText.length),\n };\n }\n\n validChars = [...prevChars];\n validChars[insertSlot] = typedChar;\n } else {\n validChars = extractWithPattern(inputText, pattern).slice(0, totalSlots);\n }\n\n let result = rebuildFromChars(validChars, pattern);\n\n if (isDeleting) {\n result = stripTrailingSeparators(result);\n }\n\n if (hasAmPm && !isDeleting) {\n const ampmStart = pattern.indexOf(\"@\");\n if (ampmStart >= 0 && result.length > ampmStart) {\n const ampmPortion = result.slice(ampmStart);\n if (ampmPortion === \"A\") result = result.slice(0, ampmStart) + \"AM\";\n else if (ampmPortion === \"P\") result = result.slice(0, ampmStart) + \"PM\";\n }\n }\n\n return {\n text: result,\n cursorPosition: cursorSlotToDisplayPos(\n result,\n cursorSlot,\n pattern,\n !isDeleting\n ),\n };\n};\n","import pureDayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport type { Dayjs } from \"dayjs\";\nimport { dayjs } from \"@bigbinary/neeto-commons-frontend/utils\";\n\nimport type { TimeValue } from \"./types\";\n\npureDayjs.extend(customParseFormat);\n\nexport const generateRange = (\n start: number,\n end: number,\n step = 1\n): number[] => {\n const result: number[] = [];\n for (let i = start; i <= end; i += step) {\n result.push(i);\n }\n\n return result;\n};\n\nexport const to12Hour = (\n hour24: number\n): { hour12: number; period: \"AM\" | \"PM\" } => {\n const period = hour24 >= 12 ? \"PM\" : \"AM\";\n const hour12 = hour24 % 12 || 12;\n\n return { hour12, period };\n};\n\nexport const to24Hour = (hour12: number, period: \"AM\" | \"PM\"): number => {\n if (period === \"AM\") {\n return hour12 === 12 ? 0 : hour12;\n }\n\n return hour12 === 12 ? 12 : hour12 + 12;\n};\n\nexport const dateToTimeValue = (date: Date): TimeValue => ({\n hours: date.getHours(),\n minutes: date.getMinutes(),\n seconds: date.getSeconds(),\n});\n\nexport const coerceToTimeValue = (\n value: TimeValue | Date | Dayjs | string | null | undefined\n): TimeValue | null => {\n if (!value) return null;\n if (value instanceof Date) return dateToTimeValue(value);\n\n if (typeof value === \"string\") {\n const parsed = dayjs(value);\n if (!parsed.isValid()) return null;\n\n return {\n hours: parsed.hour(),\n minutes: parsed.minute(),\n seconds: parsed.second(),\n };\n }\n\n const dayjsLike = value as {\n toDate?: () => Date;\n hour?: () => number;\n minute?: () => number;\n second?: () => number;\n };\n\n if (typeof dayjsLike.hour === \"function\") {\n return {\n hours: dayjsLike.hour!(),\n minutes: dayjsLike.minute!(),\n seconds: dayjsLike.second?.() ?? 0,\n };\n }\n\n if (typeof dayjsLike.toDate === \"function\") {\n return dateToTimeValue(dayjsLike.toDate());\n }\n\n const { hours, minutes, seconds } = value as TimeValue;\n\n if (typeof hours !== \"number\" || typeof minutes !== \"number\") return null;\n\n return { hours, minutes, seconds: seconds ?? 0 };\n};\n\nexport const timeValueEquals = (\n a: TimeValue | null,\n b: TimeValue | null\n): boolean => {\n if (a === null && b === null) return true;\n if (!a || !b) return false;\n\n return (\n a.hours === b.hours &&\n a.minutes === b.minutes &&\n (a.seconds ?? 0) === (b.seconds ?? 0)\n );\n};\n\nexport const getDefaultTimeMaskFormat = (\n format: \"12\" | \"24\",\n showSeconds: boolean\n): string => {\n if (format === \"12\") return showSeconds ? \"hh:mm:ss AA\" : \"hh:mm AA\";\n\n return showSeconds ? \"HH:mm:ss\" : \"HH:mm\";\n};\n\nexport const getTimePlaceholder = (\n format: \"12\" | \"24\",\n showSeconds: boolean,\n displayFormat?: string\n): string => displayFormat ?? getDefaultTimeMaskFormat(format, showSeconds);\n\nexport const padNumber = (num: number, length = 2): string =>\n String(num).padStart(length, \"0\");\n\nexport const formatTimeDisplay = (\n time: TimeValue | null,\n format: \"12\" | \"24\",\n showSeconds: boolean\n): string => {\n if (!time) return \"\";\n\n if (format === \"12\") {\n const { hour12, period } = to12Hour(time.hours);\n const parts = [padNumber(hour12), padNumber(time.minutes)];\n if (showSeconds) parts.push(padNumber(time.seconds ?? 0));\n\n return `${parts.join(\":\")} ${period}`;\n }\n\n const parts = [padNumber(time.hours), padNumber(time.minutes)];\n if (showSeconds) parts.push(padNumber(time.seconds ?? 0));\n\n return parts.join(\":\");\n};\n\nexport const parseTimeString = (\n input: string,\n format: \"12\" | \"24\"\n): TimeValue | null => {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n if (format === \"12\") {\n const match = trimmed.match(\n /^(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?\\s*(AM|PM)$/i\n );\n if (!match) return null;\n\n const hour12 = parseInt(match[1], 10);\n const minutes = parseInt(match[2], 10);\n const seconds = match[3] ? parseInt(match[3], 10) : 0;\n const period = match[4].toUpperCase() as \"AM\" | \"PM\";\n\n if (hour12 < 1 || hour12 > 12 || minutes > 59 || seconds > 59) return null;\n\n return { hours: to24Hour(hour12, period), minutes, seconds };\n }\n\n const match = trimmed.match(/^(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?$/);\n if (!match) return null;\n\n const hours = parseInt(match[1], 10);\n const minutes = parseInt(match[2], 10);\n const seconds = match[3] ? parseInt(match[3], 10) : 0;\n\n if (hours > 23 || minutes > 59 || seconds > 59) return null;\n\n return { hours, minutes, seconds };\n};\n\n/**\n * Format a TimeValue using a dayjs-style format string (e.g. \"h:mm A\").\n */\nexport const formatTimeWithPattern = (\n time: TimeValue | null,\n pattern: string\n): string => {\n if (!time) return \"\";\n\n return pureDayjs(\"2000-01-01T00:00:00\")\n .hour(time.hours)\n .minute(time.minutes)\n .second(time.seconds ?? 0)\n .format(pattern);\n};\n\n/**\n * Parse a time string against a dayjs-style format pattern.\n * Returns null if the string does not match the pattern.\n */\nexport const parseTimeWithPattern = (\n input: string,\n pattern: string\n): TimeValue | null => {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const parsed = pureDayjs(trimmed, pattern, true);\n if (!parsed.isValid()) return null;\n\n return {\n hours: parsed.hour(),\n minutes: parsed.minute(),\n seconds: parsed.second(),\n };\n};\n\n/**\n * Convert TimeValue to a timezone-aware Dayjs.\n * Formats in browser-local time, then reparses through timezone-aware dayjs.\n */\nexport const timeValueToDayjs = (time: TimeValue): Dayjs => {\n const h = padNumber(time.hours);\n const m = padNumber(time.minutes);\n const s = padNumber(time.seconds ?? 0);\n const today = dayjs(new Date()).format(\"YYYY-MM-DD\");\n\n return dayjs(`${today} ${h}:${m}:${s}`);\n};\n"],"names":["parts","match","minutes","seconds"],"mappings":"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","x_google_ignoreList":[0]}
|