@bigbinary/neeto-atoms 1.0.37 → 1.0.38
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-CCN3b1oz.js → DatePicker-IrQUHqdL.js} +89 -22
- package/dist/{DatePicker-CCN3b1oz.js.map → DatePicker-IrQUHqdL.js.map} +1 -1
- package/dist/{TimePicker-wPi2k6Z8.js → TimePicker-BzlF3JWj.js} +43 -29
- package/dist/TimePicker-BzlF3JWj.js.map +1 -0
- package/dist/{TimePickerPanel-DAhz3B2d.js → TimePickerPanel-CgEbjExH.js} +200 -2
- package/dist/TimePickerPanel-CgEbjExH.js.map +1 -0
- package/dist/cjs/{DatePicker-DRQubO2h.js → DatePicker-DdTclP8E.js} +88 -21
- package/dist/cjs/{DatePicker-DRQubO2h.js.map → DatePicker-DdTclP8E.js.map} +1 -1
- package/dist/cjs/{TimePicker-BG_vYH3r.js → TimePicker-Cwwa1DD8.js} +42 -28
- package/dist/cjs/TimePicker-Cwwa1DD8.js.map +1 -0
- package/dist/cjs/{TimePickerPanel-6xA-hjhm.js → TimePickerPanel-CAdLD7qW.js} +204 -3
- package/dist/cjs/TimePickerPanel-CAdLD7qW.js.map +1 -0
- package/dist/cjs/components/DatePicker.js +2 -2
- package/dist/cjs/components/TimePicker.js +2 -2
- package/dist/cjs/components/index.js +3 -3
- package/dist/cjs/index.js +3 -3
- package/dist/components/DatePicker/utils.d.ts +4 -0
- package/dist/components/DatePicker.js +2 -2
- package/dist/components/TimePicker/utils.d.ts +1 -0
- package/dist/components/TimePicker.js +2 -2
- package/dist/components/index.js +3 -3
- package/dist/index.js +3 -3
- package/dist/utils/inputMask.d.ts +38 -0
- package/package.json +1 -1
- package/dist/TimePicker-wPi2k6Z8.js.map +0 -1
- package/dist/TimePickerPanel-DAhz3B2d.js.map +0 -1
- package/dist/cjs/TimePicker-BG_vYH3r.js.map +0 -1
- package/dist/cjs/TimePickerPanel-6xA-hjhm.js.map +0 -1
|
@@ -5,7 +5,7 @@ var React = require('react');
|
|
|
5
5
|
var primitives_Popover = require('./primitives/Popover.js');
|
|
6
6
|
var primitives_Field = require('./primitives/Field.js');
|
|
7
7
|
var utils = require('./utils-BhM0B89p.js');
|
|
8
|
-
var TimePickerPanel = require('./TimePickerPanel-
|
|
8
|
+
var TimePickerPanel = require('./TimePickerPanel-CAdLD7qW.js');
|
|
9
9
|
var createLucideIcon = require('./createLucideIcon-D0tRgV6l.js');
|
|
10
10
|
var x = require('./x-Brw3FJst.js');
|
|
11
11
|
|
|
@@ -51,6 +51,8 @@ const TimePicker = React.forwardRef(
|
|
|
51
51
|
const errorId = `error_${generatedId}`;
|
|
52
52
|
const helpTextId = `helpText_${generatedId}`;
|
|
53
53
|
const containerRef = React.useRef(null);
|
|
54
|
+
const inputRef = React.useRef(null);
|
|
55
|
+
const cursorPosRef = React.useRef(null);
|
|
54
56
|
const popoverContentId = React.useRef(
|
|
55
57
|
`timepicker-popover-${generatedId}`
|
|
56
58
|
).current;
|
|
@@ -73,26 +75,15 @@ const TimePicker = React.forwardRef(
|
|
|
73
75
|
getInitialTime
|
|
74
76
|
);
|
|
75
77
|
const [inputText, setInputText] = React.useState("");
|
|
76
|
-
const
|
|
77
|
-
(time) =>
|
|
78
|
-
if (!time) return "";
|
|
79
|
-
if (format === "12") {
|
|
80
|
-
const { hour12, period } = TimePickerPanel.to12Hour(time.hours);
|
|
81
|
-
const parts2 = [TimePickerPanel.padNumber(hour12), TimePickerPanel.padNumber(time.minutes)];
|
|
82
|
-
if (showSeconds) parts2.push(TimePickerPanel.padNumber(time.seconds ?? 0));
|
|
83
|
-
return `${parts2.join(":")} ${period}`;
|
|
84
|
-
}
|
|
85
|
-
const parts = [TimePickerPanel.padNumber(time.hours), TimePickerPanel.padNumber(time.minutes)];
|
|
86
|
-
if (showSeconds) parts.push(TimePickerPanel.padNumber(time.seconds ?? 0));
|
|
87
|
-
return parts.join(":");
|
|
88
|
-
},
|
|
78
|
+
const displayTime = React.useCallback(
|
|
79
|
+
(time) => TimePickerPanel.formatTimeDisplay(time, format, showSeconds),
|
|
89
80
|
[format, showSeconds]
|
|
90
81
|
);
|
|
91
82
|
React.useEffect(() => {
|
|
92
83
|
const newTime = getInitialTime();
|
|
93
84
|
setInternalTime(newTime);
|
|
94
|
-
setInputText(
|
|
95
|
-
}, [getInitialTime,
|
|
85
|
+
setInputText(displayTime(newTime));
|
|
86
|
+
}, [getInitialTime, displayTime]);
|
|
96
87
|
React.useEffect(() => {
|
|
97
88
|
if (!open) return;
|
|
98
89
|
const handlePointerDown = (e) => {
|
|
@@ -101,19 +92,45 @@ const TimePicker = React.forwardRef(
|
|
|
101
92
|
const popoverEl = document.getElementById(popoverContentId);
|
|
102
93
|
if (popoverEl?.contains(target)) return;
|
|
103
94
|
setOpen(false);
|
|
104
|
-
setInputText(
|
|
95
|
+
setInputText(displayTime(internalTime));
|
|
105
96
|
};
|
|
106
97
|
document.addEventListener("pointerdown", handlePointerDown);
|
|
107
98
|
return () => document.removeEventListener("pointerdown", handlePointerDown);
|
|
108
|
-
}, [open, internalTime,
|
|
99
|
+
}, [open, internalTime, displayTime]);
|
|
100
|
+
const maskFormatStr = React.useMemo(() => {
|
|
101
|
+
if (format === "12") {
|
|
102
|
+
return showSeconds ? "hh:mm:ss AA" : "hh:mm AA";
|
|
103
|
+
}
|
|
104
|
+
return showSeconds ? "HH:mm:ss" : "HH:mm";
|
|
105
|
+
}, [format, showSeconds]);
|
|
106
|
+
const maskTemplate = React.useMemo(
|
|
107
|
+
() => TimePickerPanel.buildMaskTemplate(maskFormatStr),
|
|
108
|
+
[maskFormatStr]
|
|
109
|
+
);
|
|
109
110
|
const defaultPlaceholder = showSeconds ? format === "12" ? "hh:mm:ss AA" : "HH:mm:ss" : format === "12" ? "hh:mm AA" : "HH:mm";
|
|
110
111
|
const handlePanelChange = (time) => {
|
|
111
112
|
setInternalTime(time);
|
|
112
|
-
setInputText(
|
|
113
|
+
setInputText(displayTime(time));
|
|
113
114
|
onChange?.(time);
|
|
114
115
|
};
|
|
116
|
+
React.useLayoutEffect(() => {
|
|
117
|
+
if (cursorPosRef.current !== null && inputRef.current && document.activeElement === inputRef.current) {
|
|
118
|
+
inputRef.current.setSelectionRange(
|
|
119
|
+
cursorPosRef.current,
|
|
120
|
+
cursorPosRef.current
|
|
121
|
+
);
|
|
122
|
+
cursorPosRef.current = null;
|
|
123
|
+
}
|
|
124
|
+
});
|
|
115
125
|
const handleInputChange = (e) => {
|
|
116
|
-
const
|
|
126
|
+
const masked = TimePickerPanel.applyMask(
|
|
127
|
+
e.target.value,
|
|
128
|
+
maskTemplate,
|
|
129
|
+
inputText,
|
|
130
|
+
e.target.selectionStart
|
|
131
|
+
);
|
|
132
|
+
const text = masked.text;
|
|
133
|
+
cursorPosRef.current = masked.cursorPosition;
|
|
117
134
|
setInputText(text);
|
|
118
135
|
const parsed = TimePickerPanel.parseTimeString(text, format);
|
|
119
136
|
if (parsed) {
|
|
@@ -122,13 +139,9 @@ const TimePicker = React.forwardRef(
|
|
|
122
139
|
}
|
|
123
140
|
};
|
|
124
141
|
const handleInputKeyDown = (e) => {
|
|
125
|
-
if (e.key
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
} else if (e.key === "Escape") {
|
|
129
|
-
setInputText(formatTimeDisplay(internalTime));
|
|
130
|
-
setOpen(false);
|
|
131
|
-
}
|
|
142
|
+
if (e.key !== "Enter" && e.key !== "Escape") return;
|
|
143
|
+
setInputText(displayTime(internalTime));
|
|
144
|
+
setOpen(false);
|
|
132
145
|
};
|
|
133
146
|
const handleInputFocus = () => {
|
|
134
147
|
if (!open) setOpen(true);
|
|
@@ -169,6 +182,7 @@ const TimePicker = React.forwardRef(
|
|
|
169
182
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
170
183
|
"input",
|
|
171
184
|
{
|
|
185
|
+
ref: inputRef,
|
|
172
186
|
type: "text",
|
|
173
187
|
disabled,
|
|
174
188
|
"aria-label": label || "Pick a time",
|
|
@@ -263,4 +277,4 @@ const TimePicker = React.forwardRef(
|
|
|
263
277
|
TimePicker.displayName = "TimePicker";
|
|
264
278
|
|
|
265
279
|
exports.TimePicker = TimePicker;
|
|
266
|
-
//# sourceMappingURL=TimePicker-
|
|
280
|
+
//# sourceMappingURL=TimePicker-Cwwa1DD8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker-Cwwa1DD8.js","sources":["../../node_modules/lucide-react/dist/esm/icons/clock.js","../../src/components/TimePicker/TimePicker.tsx"],"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 React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { Clock, X } from \"lucide-react\";\nimport { Popover, PopoverAnchor, PopoverContent } from \"src/primitives/Popover\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nimport { TimePickerPanel } from \"./TimePickerPanel\";\nimport type { TimePickerProps, TimeValue } from \"./types\";\nimport { dateToTimeValue, formatTimeDisplay, parseTimeString } from \"./utils\";\nimport { applyMask, buildMaskTemplate } from \"src/utils/inputMask\";\n\nconst SIZE_CONFIG = {\n small: { trigger: \"h-7 text-xs\", icon: \"size-3.5\" },\n medium: { trigger: \"h-8 text-sm\", icon: \"size-4\" },\n large: { trigger: \"h-10 text-sm\", icon: \"size-4\" },\n} as const;\n\nconst TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(\n (\n {\n value,\n onChange,\n format = \"24\",\n showSeconds = false,\n minuteStep = 1,\n secondStep = 1,\n disabled = false,\n placeholder,\n label,\n error,\n helpText,\n size = \"medium\",\n required = false,\n timezone,\n labelProps,\n className,\n },\n ref\n ) => {\n const generatedId = useId();\n const errorId = `error_${generatedId}`;\n const helpTextId = `helpText_${generatedId}`;\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPosRef = useRef<number | null>(null);\n const popoverContentId = useRef(\n `timepicker-popover-${generatedId}`\n ).current;\n\n const [open, setOpen] = useState(false);\n\n const getInitialTime = useCallback((): TimeValue | null => {\n if (!value) return null;\n if (value instanceof Date) return dateToTimeValue(value);\n\n const dateLikeValue = value as { toDate?: () => Date };\n if (typeof dateLikeValue.toDate === \"function\") {\n return dateToTimeValue(dateLikeValue.toDate());\n }\n\n const timeValue = value as TimeValue;\n\n return {\n hours: timeValue.hours,\n minutes: timeValue.minutes,\n seconds: timeValue.seconds ?? 0,\n };\n }, [value]);\n\n const [internalTime, setInternalTime] = useState<TimeValue | null>(\n getInitialTime\n );\n const [inputText, setInputText] = useState(\"\");\n\n const displayTime = useCallback(\n (time: TimeValue | null) => formatTimeDisplay(time, format, showSeconds),\n [format, showSeconds]\n );\n\n useEffect(() => {\n const newTime = getInitialTime();\n setInternalTime(newTime);\n setInputText(displayTime(newTime));\n }, [getInitialTime, displayTime]);\n\n // Close on outside click\n useEffect(() => {\n if (!open) 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(popoverContentId);\n if (popoverEl?.contains(target)) return;\n\n setOpen(false);\n setInputText(displayTime(internalTime));\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n\n return () =>\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [open, internalTime, displayTime]);\n\n const maskFormatStr = useMemo(() => {\n if (format === \"12\") {\n return showSeconds ? \"hh:mm:ss AA\" : \"hh:mm AA\";\n }\n\n return showSeconds ? \"HH:mm:ss\" : \"HH:mm\";\n }, [format, showSeconds]);\n\n const maskTemplate = useMemo(\n () => buildMaskTemplate(maskFormatStr),\n [maskFormatStr]\n );\n\n const defaultPlaceholder = showSeconds\n ? format === \"12\"\n ? \"hh:mm:ss AA\"\n : \"HH:mm:ss\"\n : format === \"12\"\n ? \"hh:mm AA\"\n : \"HH:mm\";\n\n const handlePanelChange = (time: TimeValue) => {\n setInternalTime(time);\n setInputText(displayTime(time));\n onChange?.(time);\n };\n\n useLayoutEffect(() => {\n if (\n cursorPosRef.current !== null &&\n inputRef.current &&\n document.activeElement === inputRef.current\n ) {\n inputRef.current.setSelectionRange(\n cursorPosRef.current,\n cursorPosRef.current\n );\n cursorPosRef.current = null;\n }\n });\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const masked = applyMask(\n e.target.value,\n maskTemplate,\n inputText,\n e.target.selectionStart\n );\n const text = masked.text;\n cursorPosRef.current = masked.cursorPosition;\n\n setInputText(text);\n\n const parsed = parseTimeString(text, format);\n if (parsed) {\n setInternalTime(parsed);\n onChange?.(parsed);\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== \"Enter\" && e.key !== \"Escape\") return;\n\n setInputText(displayTime(internalTime));\n setOpen(false);\n };\n\n const handleInputFocus = () => {\n if (!open) setOpen(true);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n setInternalTime(null);\n setInputText(\"\");\n onChange?.({ hours: 0, minutes: 0, seconds: 0 });\n };\n\n const hasField = !!(label || error || helpText);\n const sizeConfig = SIZE_CONFIG[size];\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const triggerContent = (\n <Popover open={open}>\n <PopoverAnchor asChild>\n <div\n ref={containerRef}\n className={cn(\n \"relative flex w-full items-center gap-2 rounded-md border border-input bg-background pe-8 ps-3\",\n \"focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2\",\n disabled && \"cursor-not-allowed opacity-50\",\n !!error && \"border-destructive ring-destructive/20 ring-3\",\n sizeConfig.trigger,\n !hasField && className\n )}\n >\n {timezone ? (\n <span className=\"shrink-0 rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground\">\n {timezone.toUpperCase()}\n </span>\n ) : (\n <Clock\n className={cn(\n \"shrink-0 text-muted-foreground\",\n sizeConfig.icon\n )}\n />\n )}\n <input\n ref={inputRef}\n type=\"text\"\n disabled={disabled}\n aria-label={label || \"Pick a time\"}\n aria-describedby={ariaDescribedBy}\n aria-invalid={!!error || undefined}\n placeholder={placeholder ?? defaultPlaceholder}\n value={inputText}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n onFocus={handleInputFocus}\n className={cn(\n \"min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed\",\n sizeConfig.trigger.split(\" \").find(c => c.startsWith(\"text-\"))\n )}\n />\n <button\n type=\"button\"\n onPointerDown={e => e.preventDefault()}\n onClick={handleClear}\n className={cn(\n \"absolute inset-y-0 end-2 flex items-center text-muted-foreground hover:text-foreground focus:outline-none\",\n !(inputText && !disabled) && \"invisible\"\n )}\n aria-label=\"Clear time\"\n tabIndex={-1}\n >\n <X className={sizeConfig.icon} />\n </button>\n </div>\n </PopoverAnchor>\n {open && (\n <PopoverContent\n id={popoverContentId}\n className=\"w-auto p-0\"\n align=\"start\"\n onOpenAutoFocus={e => e.preventDefault()}\n onCloseAutoFocus={e => e.preventDefault()}\n onPointerDownOutside={e => e.preventDefault()}\n onInteractOutside={e => e.preventDefault()}\n >\n <TimePickerPanel\n value={internalTime ?? undefined}\n onChange={handlePanelChange}\n format={format}\n showSeconds={showSeconds}\n minuteStep={minuteStep}\n secondStep={secondStep}\n disabled={disabled}\n />\n </PopoverContent>\n )}\n </Popover>\n );\n\n if (!hasField) {\n return (\n <div ref={ref} className={className}>\n {triggerContent}\n </div>\n );\n }\n\n return (\n <Field\n ref={ref}\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {label && (\n <FieldLabel\n {...(labelProps as React.ComponentProps<typeof FieldLabel>)}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n <FieldContent>\n {triggerContent}\n {!!error && <FieldError id={errorId}>{error}</FieldError>}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nTimePicker.displayName = \"TimePicker\";\n\nexport { TimePicker };\n"],"names":["createLucideIcon","forwardRef","useId","useRef","useState","useCallback","dateToTimeValue","formatTimeDisplay","useEffect","useMemo","buildMaskTemplate","useLayoutEffect","applyMask","parseTimeString","jsxs","Popover","jsx","PopoverAnchor","cn","X","PopoverContent","TimePickerPanel","Field","FieldLabel","FieldContent","FieldError","FieldDescription"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -6,6 +6,192 @@ var utils = require('./utils-BhM0B89p.js');
|
|
|
6
6
|
var primitives_Button = require('./primitives/Button.js');
|
|
7
7
|
var primitives_ScrollArea = require('./primitives/ScrollArea.js');
|
|
8
8
|
|
|
9
|
+
const FORMAT_CHARS = /* @__PURE__ */ new Set(["d", "M", "y", "H", "h", "m", "s"]);
|
|
10
|
+
const DIGIT = /\d/;
|
|
11
|
+
const AMPM_CHAR = /[APM]/;
|
|
12
|
+
const VALID_CHAR = /[\dAPM]/i;
|
|
13
|
+
const isSlot = (ch) => ch === "#" || ch === "@";
|
|
14
|
+
const isValidChar = (ch, hasAmPm) => DIGIT.test(ch) || hasAmPm && AMPM_CHAR.test(ch);
|
|
15
|
+
const buildMaskTemplate = (format) => {
|
|
16
|
+
let pattern = "";
|
|
17
|
+
let hasAmPm = false;
|
|
18
|
+
for (const char of format) {
|
|
19
|
+
if (FORMAT_CHARS.has(char)) {
|
|
20
|
+
pattern += "#";
|
|
21
|
+
} else if (char === "A") {
|
|
22
|
+
pattern += "@";
|
|
23
|
+
hasAmPm = true;
|
|
24
|
+
} else {
|
|
25
|
+
pattern += char;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return { pattern, hasAmPm };
|
|
29
|
+
};
|
|
30
|
+
const buildRangeMaskTemplate = (format) => {
|
|
31
|
+
const single = buildMaskTemplate(format);
|
|
32
|
+
return {
|
|
33
|
+
pattern: `${single.pattern} - ${single.pattern}`,
|
|
34
|
+
hasAmPm: single.hasAmPm
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
const TEXTUAL_WHEN_LONG = /* @__PURE__ */ new Set(["M", "d"]);
|
|
38
|
+
const isFixedWidthFormat = (format) => {
|
|
39
|
+
let i = 0;
|
|
40
|
+
while (i < format.length) {
|
|
41
|
+
const char = format[i];
|
|
42
|
+
if (!FORMAT_CHARS.has(char)) {
|
|
43
|
+
i++;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
let count = 0;
|
|
47
|
+
while (i + count < format.length && format[i + count] === char) count++;
|
|
48
|
+
if (count === 1) return false;
|
|
49
|
+
if (count >= 3 && TEXTUAL_WHEN_LONG.has(char)) return false;
|
|
50
|
+
i += count;
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
};
|
|
54
|
+
const findDeletionPoint = (prev, input) => {
|
|
55
|
+
for (let i = 0; i < prev.length; i++) {
|
|
56
|
+
if (i >= input.length || input[i] !== prev[i]) return i;
|
|
57
|
+
}
|
|
58
|
+
return prev.length - 1;
|
|
59
|
+
};
|
|
60
|
+
const hasDigitsAfter = (text, pos, pattern) => {
|
|
61
|
+
for (let i = pos + 1; i < text.length && i < pattern.length; i++) {
|
|
62
|
+
if (isSlot(pattern[i]) && text[i] !== "_") return true;
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
};
|
|
66
|
+
const countValidBefore = (text, pos, hasAmPm) => {
|
|
67
|
+
let count = 0;
|
|
68
|
+
for (let i = 0; i < pos && i < text.length; i++) {
|
|
69
|
+
if (isValidChar(text[i].toUpperCase(), hasAmPm)) count++;
|
|
70
|
+
}
|
|
71
|
+
return count;
|
|
72
|
+
};
|
|
73
|
+
const extractWithPattern = (text, pattern) => {
|
|
74
|
+
const chars = [];
|
|
75
|
+
const upper = text.toUpperCase();
|
|
76
|
+
let pIdx = 0;
|
|
77
|
+
for (let i = 0; i < upper.length; i++) {
|
|
78
|
+
const ch = upper[i];
|
|
79
|
+
while (pIdx < pattern.length && !isSlot(pattern[pIdx])) pIdx++;
|
|
80
|
+
if (pIdx >= pattern.length) break;
|
|
81
|
+
if (pattern[pIdx] === "#" && DIGIT.test(ch)) {
|
|
82
|
+
chars.push(ch);
|
|
83
|
+
pIdx++;
|
|
84
|
+
} else if (pattern[pIdx] === "@" && AMPM_CHAR.test(ch)) {
|
|
85
|
+
chars.push(ch);
|
|
86
|
+
pIdx++;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return chars;
|
|
90
|
+
};
|
|
91
|
+
const rebuildFromChars = (validChars, pattern) => {
|
|
92
|
+
let result = "";
|
|
93
|
+
let charIdx = 0;
|
|
94
|
+
for (let i = 0; i < pattern.length && charIdx < validChars.length; i++) {
|
|
95
|
+
if (!isSlot(pattern[i])) continue;
|
|
96
|
+
result += validChars[charIdx];
|
|
97
|
+
charIdx++;
|
|
98
|
+
let nextSlot = i + 1;
|
|
99
|
+
while (nextSlot < pattern.length && !isSlot(pattern[nextSlot])) nextSlot++;
|
|
100
|
+
const hasMoreChars = charIdx < validChars.length;
|
|
101
|
+
const hasMoreSlots = nextSlot < pattern.length;
|
|
102
|
+
if (hasMoreChars || hasMoreSlots) {
|
|
103
|
+
for (let s = i + 1; s < nextSlot; s++) result += pattern[s];
|
|
104
|
+
}
|
|
105
|
+
if (hasMoreChars) i = nextSlot - 1;
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
};
|
|
109
|
+
const stripTrailingSeparators = (text) => {
|
|
110
|
+
let end = text.length;
|
|
111
|
+
while (end > 0 && !VALID_CHAR.test(text[end - 1])) end--;
|
|
112
|
+
return text.slice(0, end);
|
|
113
|
+
};
|
|
114
|
+
const cursorSlotToDisplayPos = (result, cursorSlot, pattern, skipSeparators) => {
|
|
115
|
+
if (cursorSlot <= 0) return 0;
|
|
116
|
+
let slotsFound = 0;
|
|
117
|
+
for (let i = 0; i < result.length; i++) {
|
|
118
|
+
if (!VALID_CHAR.test(result[i])) continue;
|
|
119
|
+
slotsFound++;
|
|
120
|
+
if (slotsFound !== cursorSlot) continue;
|
|
121
|
+
let pos = i + 1;
|
|
122
|
+
if (skipSeparators) {
|
|
123
|
+
while (pos < result.length && pos < pattern.length && !isSlot(pattern[pos])) {
|
|
124
|
+
pos++;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return pos;
|
|
128
|
+
}
|
|
129
|
+
return result.length;
|
|
130
|
+
};
|
|
131
|
+
const isValidForSlot = (ch, slotChar) => slotChar === "#" ? DIGIT.test(ch) : slotChar === "@" ? AMPM_CHAR.test(ch) : false;
|
|
132
|
+
const applyMask = (inputText, template, previousText = "", nativeCursorPos) => {
|
|
133
|
+
const { pattern, hasAmPm } = template;
|
|
134
|
+
if (!inputText) return { text: "", cursorPosition: 0 };
|
|
135
|
+
const isDeleting = inputText.length < previousText.length;
|
|
136
|
+
if (isDeleting && previousText.length >= pattern.length) {
|
|
137
|
+
const delPos = findDeletionPoint(previousText, inputText);
|
|
138
|
+
if (!hasDigitsAfter(previousText, delPos, pattern) || delPos >= pattern.length) ; else if (isSlot(pattern[delPos])) {
|
|
139
|
+
return {
|
|
140
|
+
text: previousText.substring(0, delPos) + "_" + previousText.substring(delPos + 1),
|
|
141
|
+
cursorPosition: delPos
|
|
142
|
+
};
|
|
143
|
+
} else {
|
|
144
|
+
return { text: previousText, cursorPosition: delPos };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const totalSlots = [...pattern].filter(isSlot).length;
|
|
148
|
+
const slotPatternPositions = [...pattern].reduce(
|
|
149
|
+
(acc, ch, i) => isSlot(ch) ? [...acc, i] : acc,
|
|
150
|
+
[]
|
|
151
|
+
);
|
|
152
|
+
const cursorInInput = nativeCursorPos ?? inputText.length;
|
|
153
|
+
const cursorSlot = countValidBefore(inputText, cursorInInput, hasAmPm);
|
|
154
|
+
const prevChars = extractWithPattern(previousText, pattern);
|
|
155
|
+
let validChars;
|
|
156
|
+
const isSingleCharInsert = !isDeleting && prevChars.length >= totalSlots && inputText.length - previousText.length === 1;
|
|
157
|
+
if (isSingleCharInsert) {
|
|
158
|
+
const insertSlot = cursorSlot - 1;
|
|
159
|
+
const typedChar = inputText[cursorInInput - 1]?.toUpperCase() ?? "";
|
|
160
|
+
const slotChar = slotPatternPositions[insertSlot] != null ? pattern[slotPatternPositions[insertSlot]] : null;
|
|
161
|
+
if (!slotChar || !isValidForSlot(typedChar, slotChar)) {
|
|
162
|
+
return {
|
|
163
|
+
text: previousText,
|
|
164
|
+
cursorPosition: Math.min(cursorInInput, previousText.length)
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
validChars = [...prevChars];
|
|
168
|
+
validChars[insertSlot] = typedChar;
|
|
169
|
+
} else {
|
|
170
|
+
validChars = extractWithPattern(inputText, pattern).slice(0, totalSlots);
|
|
171
|
+
}
|
|
172
|
+
let result = rebuildFromChars(validChars, pattern);
|
|
173
|
+
if (isDeleting) {
|
|
174
|
+
result = stripTrailingSeparators(result);
|
|
175
|
+
}
|
|
176
|
+
if (hasAmPm && !isDeleting) {
|
|
177
|
+
const ampmStart = pattern.indexOf("@");
|
|
178
|
+
if (ampmStart >= 0 && result.length > ampmStart) {
|
|
179
|
+
const ampmPortion = result.slice(ampmStart);
|
|
180
|
+
if (ampmPortion === "A") result = result.slice(0, ampmStart) + "AM";
|
|
181
|
+
else if (ampmPortion === "P") result = result.slice(0, ampmStart) + "PM";
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
text: result,
|
|
186
|
+
cursorPosition: cursorSlotToDisplayPos(
|
|
187
|
+
result,
|
|
188
|
+
cursorSlot,
|
|
189
|
+
pattern,
|
|
190
|
+
!isDeleting
|
|
191
|
+
)
|
|
192
|
+
};
|
|
193
|
+
};
|
|
194
|
+
|
|
9
195
|
const COLUMN_HEIGHT = 224;
|
|
10
196
|
const ITEM_HEIGHT = 32;
|
|
11
197
|
const PERIODS = ["AM", "PM"];
|
|
@@ -34,6 +220,18 @@ const dateToTimeValue = (date) => ({
|
|
|
34
220
|
seconds: date.getSeconds()
|
|
35
221
|
});
|
|
36
222
|
const padNumber = (num, length = 2) => String(num).padStart(length, "0");
|
|
223
|
+
const formatTimeDisplay = (time, format, showSeconds) => {
|
|
224
|
+
if (!time) return "";
|
|
225
|
+
if (format === "12") {
|
|
226
|
+
const { hour12, period } = to12Hour(time.hours);
|
|
227
|
+
const parts2 = [padNumber(hour12), padNumber(time.minutes)];
|
|
228
|
+
if (showSeconds) parts2.push(padNumber(time.seconds ?? 0));
|
|
229
|
+
return `${parts2.join(":")} ${period}`;
|
|
230
|
+
}
|
|
231
|
+
const parts = [padNumber(time.hours), padNumber(time.minutes)];
|
|
232
|
+
if (showSeconds) parts.push(padNumber(time.seconds ?? 0));
|
|
233
|
+
return parts.join(":");
|
|
234
|
+
};
|
|
37
235
|
const parseTimeString = (input, format) => {
|
|
38
236
|
const trimmed = input.trim();
|
|
39
237
|
if (!trimmed) return null;
|
|
@@ -226,8 +424,11 @@ const TimePickerPanel = React.forwardRef(
|
|
|
226
424
|
TimePickerPanel.displayName = "TimePickerPanel";
|
|
227
425
|
|
|
228
426
|
exports.TimePickerPanel = TimePickerPanel;
|
|
427
|
+
exports.applyMask = applyMask;
|
|
428
|
+
exports.buildMaskTemplate = buildMaskTemplate;
|
|
429
|
+
exports.buildRangeMaskTemplate = buildRangeMaskTemplate;
|
|
229
430
|
exports.dateToTimeValue = dateToTimeValue;
|
|
230
|
-
exports.
|
|
431
|
+
exports.formatTimeDisplay = formatTimeDisplay;
|
|
432
|
+
exports.isFixedWidthFormat = isFixedWidthFormat;
|
|
231
433
|
exports.parseTimeString = parseTimeString;
|
|
232
|
-
|
|
233
|
-
//# sourceMappingURL=TimePickerPanel-6xA-hjhm.js.map
|
|
434
|
+
//# sourceMappingURL=TimePickerPanel-CAdLD7qW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePickerPanel-CAdLD7qW.js","sources":["../../src/utils/inputMask.ts","../../src/components/TimePicker/constants.ts","../../src/components/TimePicker/utils.ts","../../src/components/TimePicker/TimeColumn.tsx","../../src/components/TimePicker/TimePickerPanel.tsx"],"sourcesContent":["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 (from AA) → ampm letter slots (@).\n * Everything else → literal separators.\n *\n * Examples:\n * \"dd/MM/yyyy\" → \"##/##/####\"\n * \"hh:mm AA\" → \"##:## @@\"\n */\nexport const buildMaskTemplate = (format: string): MaskTemplate => {\n let pattern = \"\";\n let hasAmPm = false;\n\n for (const char of format) {\n if (FORMAT_CHARS.has(char)) {\n pattern += \"#\";\n } else if (char === \"A\") {\n pattern += \"@\";\n hasAmPm = true;\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","export const COLUMN_HEIGHT = 224;\nexport const ITEM_HEIGHT = 32;\nexport const PERIODS = [\"AM\", \"PM\"] as const;\n","import type { TimeValue } from \"./types\";\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 timeValueToDate = (date: Date, time: TimeValue): Date => {\n const result = new Date(date);\n result.setHours(time.hours, time.minutes, time.seconds ?? 0, 0);\n\n return result;\n};\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 // Accept: \"2:30 PM\", \"02:30 PM\", \"2:3 PM\", \"2:30:15 PM\"\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 // Accept: \"14:3\", \"14:30\", \"2:5\", \"14:30:05\"\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","import React, { useEffect, useRef } from \"react\";\n\nimport { Button } from \"src/primitives/Button\";\nimport { ScrollArea } from \"src/primitives/ScrollArea\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nimport { COLUMN_HEIGHT, ITEM_HEIGHT } from \"./constants\";\nimport { padNumber } from \"./utils\";\n\ninterface TimeColumnProps {\n items: (number | string)[];\n selected: number | string;\n onSelect: (value: number | string) => void;\n disabled?: boolean;\n className?: string;\n padStart?: number;\n}\n\nconst TimeColumn: React.FC<TimeColumnProps> = ({\n items,\n selected,\n onSelect,\n disabled = false,\n className,\n padStart = 2,\n}) => {\n const selectedRef = useRef<HTMLButtonElement>(null);\n\n useEffect(() => {\n if (selectedRef.current) {\n selectedRef.current.scrollIntoView({\n block: \"center\",\n behavior: \"smooth\",\n });\n }\n }, [selected]);\n\n return (\n <ScrollArea\n className={cn(\"w-16\", className)}\n style={{ height: COLUMN_HEIGHT }}\n >\n <div\n className=\"flex flex-col items-center py-2\"\n role=\"listbox\"\n aria-label=\"Time selection\"\n >\n {items.map(item => {\n const isSelected = item === selected;\n const displayValue =\n typeof item === \"number\" ? padNumber(item, padStart) : item;\n\n return (\n <Button\n key={item}\n ref={isSelected ? selectedRef : undefined}\n variant={isSelected ? \"default\" : \"ghost\"}\n size=\"sm\"\n role=\"option\"\n aria-selected={isSelected}\n disabled={disabled}\n className={cn(\n \"w-12 justify-center font-mono text-sm\",\n !isSelected && \"text-muted-foreground\"\n )}\n style={{ height: ITEM_HEIGHT }}\n onClick={() => onSelect(item)}\n >\n {displayValue}\n </Button>\n );\n })}\n </div>\n </ScrollArea>\n );\n};\n\nTimeColumn.displayName = \"TimeColumn\";\n\nexport { TimeColumn };\n","import { forwardRef, useCallback, useEffect, useState } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\n\nimport { PERIODS } from \"./constants\";\nimport { TimeColumn } from \"./TimeColumn\";\nimport type { TimePickerPanelProps, TimeValue } from \"./types\";\nimport { generateRange, to12Hour, to24Hour } from \"./utils\";\n\nconst TimePickerPanel = forwardRef<HTMLDivElement, TimePickerPanelProps>(\n (\n {\n value,\n onChange,\n format = \"24\",\n showSeconds = false,\n minuteStep = 1,\n secondStep = 1,\n disabled = false,\n className,\n },\n ref\n ) => {\n const getInitialTime = useCallback(\n (): TimeValue => ({\n hours: value?.hours ?? 0,\n minutes: value?.minutes ?? 0,\n seconds: value?.seconds ?? 0,\n }),\n [value]\n );\n\n const [internalTime, setInternalTime] = useState<TimeValue>(getInitialTime);\n\n useEffect(() => {\n setInternalTime(getInitialTime());\n }, [getInitialTime]);\n\n const hours = format === \"12\" ? generateRange(1, 12) : generateRange(0, 23);\n const minutes = generateRange(0, 59, minuteStep);\n const seconds = generateRange(0, 59, secondStep);\n\n const { hour12, period } =\n format === \"12\"\n ? to12Hour(internalTime.hours)\n : { hour12: internalTime.hours, period: \"AM\" as const };\n\n const handleHourSelect = (hourValue: number | string) => {\n const hour = Number(hourValue);\n const newHours = format === \"12\" ? to24Hour(hour, period) : hour;\n const newTime = { ...internalTime, hours: newHours };\n setInternalTime(newTime);\n onChange?.(newTime);\n };\n\n const handleMinuteSelect = (minuteValue: number | string) => {\n const newTime = { ...internalTime, minutes: Number(minuteValue) };\n setInternalTime(newTime);\n onChange?.(newTime);\n };\n\n const handleSecondSelect = (secondValue: number | string) => {\n const newTime = { ...internalTime, seconds: Number(secondValue) };\n setInternalTime(newTime);\n onChange?.(newTime);\n };\n\n const handlePeriodSelect = (newPeriod: number | string) => {\n const newHours = to24Hour(hour12, newPeriod as \"AM\" | \"PM\");\n const newTime = { ...internalTime, hours: newHours };\n setInternalTime(newTime);\n onChange?.(newTime);\n };\n\n return (\n <div\n ref={ref}\n className={cn(\"flex\", className)}\n role=\"group\"\n aria-label=\"Time picker\"\n >\n <TimeColumn\n items={hours}\n selected={format === \"12\" ? hour12 : internalTime.hours}\n onSelect={handleHourSelect}\n disabled={disabled}\n />\n <div className=\"border-inline-end border-border\" />\n <TimeColumn\n items={minutes}\n selected={internalTime.minutes}\n onSelect={handleMinuteSelect}\n disabled={disabled}\n />\n {showSeconds && (\n <>\n <div className=\"border-inline-end border-border\" />\n <TimeColumn\n items={seconds}\n selected={internalTime.seconds ?? 0}\n onSelect={handleSecondSelect}\n disabled={disabled}\n />\n </>\n )}\n {format === \"12\" && (\n <>\n <div className=\"border-inline-end border-border\" />\n <TimeColumn\n items={[...PERIODS]}\n selected={period}\n onSelect={handlePeriodSelect}\n disabled={disabled}\n padStart={0}\n />\n </>\n )}\n </div>\n );\n }\n);\n\nTimePickerPanel.displayName = \"TimePickerPanel\";\n\nexport { TimePickerPanel };\n"],"names":["parts","match","minutes","seconds","useRef","useEffect","jsx","ScrollArea","cn","Button","forwardRef","useCallback","useState","jsxs","Fragment"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var DatePicker = require('../DatePicker-
|
|
3
|
+
var DatePicker = require('../DatePicker-DdTclP8E.js');
|
|
4
4
|
require('react/jsx-runtime');
|
|
5
5
|
require('react');
|
|
6
6
|
require('../Calendar-02KiUZTT.js');
|
|
@@ -32,8 +32,8 @@ require('../index-CyrAgb4H.js');
|
|
|
32
32
|
require('../primitives/Field.js');
|
|
33
33
|
require('../label-DJ7KkKYy.js');
|
|
34
34
|
require('../separator-DSL-aG1J.js');
|
|
35
|
+
require('../TimePickerPanel-CAdLD7qW.js');
|
|
35
36
|
require('../primitives/Button.js');
|
|
36
|
-
require('../TimePickerPanel-6xA-hjhm.js');
|
|
37
37
|
require('../primitives/ScrollArea.js');
|
|
38
38
|
require('../index-BY6wgiQV.js');
|
|
39
39
|
require('../index-EyWRfsCG.js');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var TimePicker = require('../TimePicker-
|
|
4
|
-
var TimePickerPanel = require('../TimePickerPanel-
|
|
3
|
+
var TimePicker = require('../TimePicker-Cwwa1DD8.js');
|
|
4
|
+
var TimePickerPanel = require('../TimePickerPanel-CAdLD7qW.js');
|
|
5
5
|
require('react/jsx-runtime');
|
|
6
6
|
require('react');
|
|
7
7
|
require('../primitives/Popover.js');
|
|
@@ -10,7 +10,7 @@ var Callout = require('../Callout-_XBx1JHL.js');
|
|
|
10
10
|
var Checkbox = require('../Checkbox-CxqWOvFN.js');
|
|
11
11
|
var ColorPicker = require('../ColorPicker-Co1Gffsu.js');
|
|
12
12
|
var DataTable = require('../DataTable-DRGW8JVP.js');
|
|
13
|
-
var DatePicker = require('../DatePicker-
|
|
13
|
+
var DatePicker = require('../DatePicker-DdTclP8E.js');
|
|
14
14
|
var Dialog = require('../Dialog-CBSuKeu_.js');
|
|
15
15
|
var Empty = require('../Empty-DqmmPlPJ.js');
|
|
16
16
|
var Input = require('../Input-CpuJXazH.js');
|
|
@@ -29,8 +29,8 @@ var Stepper = require('../Stepper-DZb25oBH.js');
|
|
|
29
29
|
var Switch = require('../Switch-BTkncHw2.js');
|
|
30
30
|
var Tabs = require('../Tabs-YPRmLtUM.js');
|
|
31
31
|
var Textarea = require('../Textarea-yWv-66yX.js');
|
|
32
|
-
var TimePicker = require('../TimePicker-
|
|
33
|
-
var TimePickerPanel = require('../TimePickerPanel-
|
|
32
|
+
var TimePicker = require('../TimePicker-Cwwa1DD8.js');
|
|
33
|
+
var TimePickerPanel = require('../TimePickerPanel-CAdLD7qW.js');
|
|
34
34
|
var Toastr = require('../Toastr-DYWd66L7.js');
|
|
35
35
|
var Tooltip = require('../Tooltip-Dph_R3Ct.js');
|
|
36
36
|
var TranslationProvider = require('../TranslationProvider-Dh5_Fzzk.js');
|
package/dist/cjs/index.js
CHANGED
|
@@ -18,7 +18,7 @@ var Callout = require('./Callout-_XBx1JHL.js');
|
|
|
18
18
|
var Checkbox = require('./Checkbox-CxqWOvFN.js');
|
|
19
19
|
var ColorPicker = require('./ColorPicker-Co1Gffsu.js');
|
|
20
20
|
var DataTable = require('./DataTable-DRGW8JVP.js');
|
|
21
|
-
var DatePicker = require('./DatePicker-
|
|
21
|
+
var DatePicker = require('./DatePicker-DdTclP8E.js');
|
|
22
22
|
var Dialog = require('./Dialog-CBSuKeu_.js');
|
|
23
23
|
var DirectionProvider = require('./DirectionProvider-BTtE4FcN.js');
|
|
24
24
|
var Empty = require('./Empty-DqmmPlPJ.js');
|
|
@@ -38,7 +38,7 @@ var Stepper = require('./Stepper-DZb25oBH.js');
|
|
|
38
38
|
var Switch = require('./Switch-BTkncHw2.js');
|
|
39
39
|
var Tabs = require('./Tabs-YPRmLtUM.js');
|
|
40
40
|
var Textarea = require('./Textarea-yWv-66yX.js');
|
|
41
|
-
var TimePicker = require('./TimePicker-
|
|
41
|
+
var TimePicker = require('./TimePicker-Cwwa1DD8.js');
|
|
42
42
|
var Toastr = require('./Toastr-DYWd66L7.js');
|
|
43
43
|
var Tooltip = require('./Tooltip-Dph_R3Ct.js');
|
|
44
44
|
var Tree = require('./Tree-DAyVPLnJ.js');
|
|
@@ -110,7 +110,7 @@ require('./primitives/Pagination.js');
|
|
|
110
110
|
require('./chevron-left-BldoOh5p.js');
|
|
111
111
|
require('./ellipsis-4aubOI2n.js');
|
|
112
112
|
require('./Calendar-02KiUZTT.js');
|
|
113
|
-
require('./TimePickerPanel-
|
|
113
|
+
require('./TimePickerPanel-CAdLD7qW.js');
|
|
114
114
|
require('./primitives/ScrollArea.js');
|
|
115
115
|
require('./index-EyWRfsCG.js');
|
|
116
116
|
require('./primitives/Empty.js');
|
|
@@ -8,3 +8,7 @@ export declare const parseDate: (str: string, formatStr: string) => Date | null;
|
|
|
8
8
|
export declare const clampDate: (date: Date, min?: Date, max?: Date) => Date;
|
|
9
9
|
export declare const applyTimeToDate: (date: Date, time: TimeValue) => Date;
|
|
10
10
|
export declare const getDisplayFormat: (dateFormat: string, timeFormat: string, showTime: boolean) => string;
|
|
11
|
+
/** Check if a date part string is complete enough to parse. */
|
|
12
|
+
export declare const isDatePartComplete: (part: string, maskEnabled: boolean, singleDateLen: number) => boolean;
|
|
13
|
+
/** Parse a range text like "01/01/2025 - 31/12/2025" into a [from, to] tuple. */
|
|
14
|
+
export declare const parseRangeText: (text: string, displayFormat: string, maskEnabled: boolean, singleDateLen: number) => [Date, Date] | null;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { D as DatePicker } from '../DatePicker-
|
|
1
|
+
export { D as DatePicker } from '../DatePicker-IrQUHqdL.js';
|
|
2
2
|
import 'react/jsx-runtime';
|
|
3
3
|
import 'react';
|
|
4
4
|
import '../Calendar-CjOBwDbx.js';
|
|
@@ -30,8 +30,8 @@ import '../index-Cor698lu.js';
|
|
|
30
30
|
import '../primitives/Field.js';
|
|
31
31
|
import '../label-BgLSVt4u.js';
|
|
32
32
|
import '../separator-ByRsc-y-.js';
|
|
33
|
+
import '../TimePickerPanel-CgEbjExH.js';
|
|
33
34
|
import '../primitives/Button.js';
|
|
34
|
-
import '../TimePickerPanel-DAhz3B2d.js';
|
|
35
35
|
import '../primitives/ScrollArea.js';
|
|
36
36
|
import '../index-d0BBQf5t.js';
|
|
37
37
|
import '../index-BfAAoDv6.js';
|
|
@@ -8,4 +8,5 @@ export declare const to24Hour: (hour12: number, period: "AM" | "PM") => number;
|
|
|
8
8
|
export declare const dateToTimeValue: (date: Date) => TimeValue;
|
|
9
9
|
export declare const timeValueToDate: (date: Date, time: TimeValue) => Date;
|
|
10
10
|
export declare const padNumber: (num: number, length?: number) => string;
|
|
11
|
+
export declare const formatTimeDisplay: (time: TimeValue | null, format: "12" | "24", showSeconds: boolean) => string;
|
|
11
12
|
export declare const parseTimeString: (input: string, format: "12" | "24") => TimeValue | null;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { T as TimePicker } from '../TimePicker-
|
|
2
|
-
export { T as TimePickerPanel } from '../TimePickerPanel-
|
|
1
|
+
export { T as TimePicker } from '../TimePicker-BzlF3JWj.js';
|
|
2
|
+
export { T as TimePickerPanel } from '../TimePickerPanel-CgEbjExH.js';
|
|
3
3
|
import 'react/jsx-runtime';
|
|
4
4
|
import 'react';
|
|
5
5
|
import '../primitives/Popover.js';
|
package/dist/components/index.js
CHANGED
|
@@ -8,7 +8,7 @@ export { C as Callout } from '../Callout-ClNFeMbn.js';
|
|
|
8
8
|
export { C as Checkbox } from '../Checkbox-C_Rd2-8Z.js';
|
|
9
9
|
export { C as ColorPicker } from '../ColorPicker-D7Y1gZNn.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-CEA8czNL.js';
|
|
11
|
-
export { D as DatePicker } from '../DatePicker-
|
|
11
|
+
export { D as DatePicker } from '../DatePicker-IrQUHqdL.js';
|
|
12
12
|
export { D as Dialog } from '../Dialog-BOcBeB8v.js';
|
|
13
13
|
export { E as Empty } from '../Empty-fV1Yplri.js';
|
|
14
14
|
export { I as Input } from '../Input-xjYQfsaz.js';
|
|
@@ -27,8 +27,8 @@ export { S as Stepper } from '../Stepper-7OpfOfas.js';
|
|
|
27
27
|
export { S as Switch } from '../Switch-OAB7pfNn.js';
|
|
28
28
|
export { T as Tabs } from '../Tabs-DTbbJITd.js';
|
|
29
29
|
export { T as Textarea } from '../Textarea-B2Uhx-Yy.js';
|
|
30
|
-
export { T as TimePicker } from '../TimePicker-
|
|
31
|
-
export { T as TimePickerPanel } from '../TimePickerPanel-
|
|
30
|
+
export { T as TimePicker } from '../TimePicker-BzlF3JWj.js';
|
|
31
|
+
export { T as TimePickerPanel } from '../TimePickerPanel-CgEbjExH.js';
|
|
32
32
|
export { T as Toastr } from '../Toastr-BimwuEnS.js';
|
|
33
33
|
export { T as Tooltip } from '../Tooltip-CA3irJ2q.js';
|
|
34
34
|
export { T as TranslationProvider } from '../TranslationProvider-BvRvUsPS.js';
|