@bigbinary/neeto-atoms 1.0.56 → 1.0.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/{DatePicker-D-0HMiNG.js → DatePicker-kulToqfM.js} +390 -133
  2. package/dist/DatePicker-kulToqfM.js.map +1 -0
  3. package/dist/Select-BiyQTuiQ.js.map +1 -1
  4. package/dist/TimePicker-DoL126Ql.js +444 -0
  5. package/dist/TimePicker-DoL126Ql.js.map +1 -0
  6. package/dist/{TimePickerPanel-zWmOy3Eo.js → TimePickerPanel--KDX5QwS.js} +116 -3
  7. package/dist/TimePickerPanel--KDX5QwS.js.map +1 -0
  8. package/dist/cjs/{DatePicker-JhQ7D2bu.js → DatePicker-BZd4rM2R.js} +388 -131
  9. package/dist/cjs/DatePicker-BZd4rM2R.js.map +1 -0
  10. package/dist/cjs/Select-DC23xcMU.js.map +1 -1
  11. package/dist/cjs/TimePicker-H3OpzvOm.js +446 -0
  12. package/dist/cjs/TimePicker-H3OpzvOm.js.map +1 -0
  13. package/dist/cjs/{TimePickerPanel-B5h5khbs.js → TimePickerPanel-DX6cjrSN.js} +130 -2
  14. package/dist/cjs/TimePickerPanel-DX6cjrSN.js.map +1 -0
  15. package/dist/cjs/components/DatePicker.js +5 -5
  16. package/dist/cjs/components/TimePicker.js +4 -2
  17. package/dist/cjs/components/TimePicker.js.map +1 -1
  18. package/dist/cjs/components/index.js +3 -3
  19. package/dist/cjs/formik/BlockNavigation.js.map +1 -1
  20. package/dist/cjs/index.js +5 -5
  21. package/dist/components/DatePicker/MonthPicker.d.ts +16 -0
  22. package/dist/components/DatePicker/YearPicker.d.ts +14 -0
  23. package/dist/components/DatePicker/constants.d.ts +2 -0
  24. package/dist/components/DatePicker/types.d.ts +21 -1
  25. package/dist/components/DatePicker/utils.d.ts +8 -0
  26. package/dist/components/DatePicker.js +5 -5
  27. package/dist/components/TimePicker/constants.d.ts +17 -0
  28. package/dist/components/TimePicker/index.d.ts +1 -1
  29. package/dist/components/TimePicker/types.d.ts +19 -4
  30. package/dist/components/TimePicker/utils.d.ts +13 -0
  31. package/dist/components/TimePicker.js +4 -2
  32. package/dist/components/TimePicker.js.map +1 -1
  33. package/dist/components/index.js +3 -3
  34. package/dist/formik/BlockNavigation.js.map +1 -1
  35. package/dist/hooks/useControlledOpen.d.ts +5 -0
  36. package/dist/hooks/useCursorRestore.d.ts +8 -0
  37. package/dist/hooks/useOutsideClickClose.d.ts +8 -0
  38. package/dist/index.js +5 -5
  39. package/package.json +1 -1
  40. package/dist/DatePicker-D-0HMiNG.js.map +0 -1
  41. package/dist/TimePicker-CSjiggpr.js +0 -301
  42. package/dist/TimePicker-CSjiggpr.js.map +0 -1
  43. package/dist/TimePickerPanel-zWmOy3Eo.js.map +0 -1
  44. package/dist/cjs/DatePicker-JhQ7D2bu.js.map +0 -1
  45. package/dist/cjs/TimePicker-CU7qJpoT.js +0 -303
  46. package/dist/cjs/TimePicker-CU7qJpoT.js.map +0 -1
  47. package/dist/cjs/TimePickerPanel-B5h5khbs.js.map +0 -1
  48. /package/dist/{hooks → components/Select/hooks}/useAsyncOptions.d.ts +0 -0
  49. /package/dist/{hooks → components/Select/hooks}/useCreatableItems.d.ts +0 -0
  50. /package/dist/{hooks → components/Select/hooks}/useLazyLoadSentinel.d.ts +0 -0
  51. /package/dist/{hooks → components/Select/hooks}/useMultiSelectOptions.d.ts +0 -0
  52. /package/dist/{hooks → components/Select/hooks}/useMultiSelectState.d.ts +0 -0
  53. /package/dist/{hooks → components/Select/hooks}/useSelectState.d.ts +0 -0
  54. /package/dist/{hooks → formik/BlockNavigation/hooks}/useNavPrompt.d.ts +0 -0
@@ -0,0 +1,444 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { forwardRef, useId, useRef, useCallback, useState, useMemo, useEffect } from 'react';
3
+ import { Popover, PopoverAnchor, PopoverContent } from './primitives/Popover.js';
4
+ import { Field, FieldLabel, FieldContent, FieldError, FieldDescription } from './primitives/Field.js';
5
+ import { c as cn } from './utils-BJnb9o5c.js';
6
+ import { u as useControlledOpen, c as coerceToTimeValue, f as formatTimeWithPattern, a as formatTimeDisplay, t as timeValueEquals, b as useOutsideClickClose, d as buildMaskTemplate, g as getDefaultTimeMaskFormat, e as useCursorRestore, S as SIZE_CONFIG, T as TimePickerPanel, h as timeValueToDayjs, i as getTimePlaceholder, j as applyMask, p as parseTimeWithPattern, k as parseTimeString } from './TimePickerPanel--KDX5QwS.js';
7
+ import { c as createLucideIcon } from './createLucideIcon-C8ycilSN.js';
8
+ import { X } from './x-_o2T3n6D.js';
9
+
10
+ /**
11
+ * @license lucide-react v0.577.0 - ISC
12
+ *
13
+ * This source code is licensed under the ISC license.
14
+ * See the LICENSE file in the root directory of this source tree.
15
+ */
16
+
17
+
18
+ const __iconNode = [
19
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
20
+ ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }]
21
+ ];
22
+ const Clock = createLucideIcon("clock", __iconNode);
23
+
24
+ const TimePicker = forwardRef(
25
+ ({
26
+ value,
27
+ onChange,
28
+ onBlur,
29
+ type = "time",
30
+ format = "24",
31
+ displayFormat,
32
+ showSeconds = false,
33
+ minuteStep = 1,
34
+ secondStep = 1,
35
+ disabled = false,
36
+ placeholder,
37
+ label,
38
+ error,
39
+ helpText,
40
+ size = "medium",
41
+ required = false,
42
+ timezone,
43
+ open: openProp,
44
+ onOpenChange,
45
+ needConfirm = true,
46
+ onOk,
47
+ labelProps,
48
+ className
49
+ }, ref) => {
50
+ const generatedId = useId();
51
+ const errorId = `error_${generatedId}`;
52
+ const helpTextId = `helpText_${generatedId}`;
53
+ const containerRef = useRef(null);
54
+ const fromInputRef = useRef(null);
55
+ const toInputRef = useRef(null);
56
+ const fromCursorRef = useRef(null);
57
+ const toCursorRef = useRef(null);
58
+ const popoverContentId = useRef(
59
+ `timepicker-popover-${generatedId}`
60
+ ).current;
61
+ const committedRef = useRef({ from: null, to: null });
62
+ const { open, setOpen } = useControlledOpen(openProp, onOpenChange);
63
+ const isRange = type === "range";
64
+ const getInitialTimes = useCallback(() => {
65
+ if (isRange) {
66
+ if (!value || !Array.isArray(value)) {
67
+ return { from: null, to: null };
68
+ }
69
+ return {
70
+ from: coerceToTimeValue(value[0]),
71
+ to: coerceToTimeValue(value[1])
72
+ };
73
+ }
74
+ return {
75
+ from: coerceToTimeValue(value),
76
+ to: null
77
+ };
78
+ }, [value, isRange]);
79
+ const formatOne = useCallback(
80
+ (time) => displayFormat ? formatTimeWithPattern(time, displayFormat) : formatTimeDisplay(time, format, showSeconds),
81
+ [displayFormat, format, showSeconds]
82
+ );
83
+ const [activeSide, setActiveSide] = useState("from");
84
+ const [fromTime, setFromTime] = useState(() => getInitialTimes().from);
85
+ const [toTime, setToTime] = useState(() => getInitialTimes().to);
86
+ const [fromText, setFromText] = useState(
87
+ () => formatOne(getInitialTimes().from)
88
+ );
89
+ const [toText, setToText] = useState(() => formatOne(getInitialTimes().to));
90
+ const parseOne = (text) => displayFormat ? parseTimeWithPattern(text, displayFormat) : parseTimeString(text, format);
91
+ const emitChange = (from, to) => {
92
+ if (isRange) {
93
+ if (!from || !to) {
94
+ onChange?.(null, ["", ""]);
95
+ return;
96
+ }
97
+ onChange?.(
98
+ [timeValueToDayjs(from), timeValueToDayjs(to)],
99
+ [formatOne(from), formatOne(to)]
100
+ );
101
+ return;
102
+ }
103
+ if (!from) {
104
+ onChange?.(null, "");
105
+ return;
106
+ }
107
+ onChange?.(timeValueToDayjs(from), formatOne(from));
108
+ };
109
+ const commitPendingOnClose = useCallback(() => {
110
+ if (!needConfirm) {
111
+ setFromText(formatOne(fromTime));
112
+ setToText(formatOne(toTime));
113
+ return;
114
+ }
115
+ const { from: committedFrom, to: committedTo } = committedRef.current;
116
+ const unchanged = timeValueEquals(fromTime, committedFrom) && timeValueEquals(toTime, committedTo);
117
+ if (unchanged) return;
118
+ emitChange(fromTime, toTime);
119
+ committedRef.current = { from: fromTime, to: toTime };
120
+ }, [needConfirm, fromTime, toTime, formatOne, isRange, onChange]);
121
+ const closePopover = useCallback(() => {
122
+ commitPendingOnClose();
123
+ setOpen(false);
124
+ }, [commitPendingOnClose, setOpen]);
125
+ useOutsideClickClose({
126
+ enabled: open,
127
+ containerRef,
128
+ popoverElementId: popoverContentId,
129
+ onClose: closePopover
130
+ });
131
+ const maskTemplate = useMemo(
132
+ () => displayFormat ? null : buildMaskTemplate(getDefaultTimeMaskFormat(format, showSeconds)),
133
+ [displayFormat, format, showSeconds]
134
+ );
135
+ const handleOk = () => {
136
+ if (isRange && activeSide === "from" && fromTime && !toTime) {
137
+ setActiveSide("to");
138
+ toInputRef.current?.focus();
139
+ return;
140
+ }
141
+ committedRef.current = { from: fromTime, to: toTime };
142
+ emitChange(fromTime, toTime);
143
+ if (isRange) {
144
+ if (fromTime && toTime) {
145
+ onOk?.([timeValueToDayjs(fromTime), timeValueToDayjs(toTime)]);
146
+ } else {
147
+ onOk?.(null);
148
+ }
149
+ } else {
150
+ onOk?.(fromTime ? timeValueToDayjs(fromTime) : null);
151
+ }
152
+ setOpen(false);
153
+ };
154
+ const handlePanelChange = (time) => {
155
+ if (!isRange) {
156
+ setFromTime(time);
157
+ setFromText(formatOne(time));
158
+ if (!needConfirm) emitChange(time, null);
159
+ return;
160
+ }
161
+ if (activeSide === "from") {
162
+ setFromTime(time);
163
+ setFromText(formatOne(time));
164
+ if (!needConfirm) emitChange(time, toTime);
165
+ return;
166
+ }
167
+ setToTime(time);
168
+ setToText(formatOne(time));
169
+ if (!needConfirm) emitChange(fromTime, time);
170
+ };
171
+ const buildInputChangeHandler = (side) => (e) => {
172
+ let text = e.target.value;
173
+ const previousText = side === "from" ? fromText : toText;
174
+ if (maskTemplate) {
175
+ const masked = applyMask(
176
+ text,
177
+ maskTemplate,
178
+ previousText,
179
+ e.target.selectionStart
180
+ );
181
+ text = masked.text;
182
+ if (side === "from") fromCursorRef.current = masked.cursorPosition;
183
+ else toCursorRef.current = masked.cursorPosition;
184
+ }
185
+ if (side === "from") setFromText(text);
186
+ else setToText(text);
187
+ const parsed = parseOne(text);
188
+ if (!parsed) return;
189
+ if (side === "from") {
190
+ setFromTime(parsed);
191
+ if (!needConfirm) emitChange(parsed, toTime);
192
+ } else {
193
+ setToTime(parsed);
194
+ if (!needConfirm) emitChange(fromTime, parsed);
195
+ }
196
+ };
197
+ const handleInputKeyDown = (e) => {
198
+ if (e.key === "Escape") {
199
+ const { from, to } = committedRef.current;
200
+ setFromTime(from);
201
+ setToTime(to);
202
+ setFromText(formatOne(from));
203
+ setToText(formatOne(to));
204
+ setOpen(false);
205
+ return;
206
+ }
207
+ if (e.key !== "Enter") return;
208
+ if (needConfirm) {
209
+ handleOk();
210
+ return;
211
+ }
212
+ setFromText(formatOne(fromTime));
213
+ setToText(formatOne(toTime));
214
+ setOpen(false);
215
+ };
216
+ const handleInputFocus = (side) => {
217
+ setActiveSide(side);
218
+ if (!open) setOpen(true);
219
+ };
220
+ const handleInputBlur = (e) => {
221
+ const next = e.relatedTarget;
222
+ if (next && containerRef.current?.contains(next)) return;
223
+ const popoverEl = document.getElementById(popoverContentId);
224
+ if (next && popoverEl?.contains(next)) return;
225
+ onBlur?.(e);
226
+ };
227
+ const handleClear = (e) => {
228
+ e.stopPropagation();
229
+ e.preventDefault();
230
+ setFromTime(null);
231
+ setToTime(null);
232
+ setFromText("");
233
+ setToText("");
234
+ committedRef.current = { from: null, to: null };
235
+ onChange?.(null, isRange ? ["", ""] : "");
236
+ };
237
+ useEffect(() => {
238
+ if (value === void 0) return;
239
+ const next = getInitialTimes();
240
+ setFromTime(next.from);
241
+ setToTime(next.to);
242
+ if (open) return;
243
+ setFromText(formatOne(next.from));
244
+ setToText(formatOne(next.to));
245
+ committedRef.current = { from: next.from, to: next.to };
246
+ }, [value, getInitialTimes, formatOne, open]);
247
+ useEffect(() => {
248
+ if (!open) return;
249
+ committedRef.current = { from: fromTime, to: toTime };
250
+ }, [open]);
251
+ useCursorRestore([
252
+ { inputRef: fromInputRef, cursorRef: fromCursorRef },
253
+ { inputRef: toInputRef, cursorRef: toCursorRef }
254
+ ]);
255
+ const singlePlaceholder = getTimePlaceholder(
256
+ format,
257
+ showSeconds,
258
+ displayFormat
259
+ );
260
+ const hasField = !!(label || error || helpText);
261
+ const sizeConfig = SIZE_CONFIG[size];
262
+ const hasAnyValue = !!(fromText || toText);
263
+ const activeTime = activeSide === "from" ? fromTime : toTime;
264
+ const ariaDescribedBy = [error ? errorId : null, helpText ? helpTextId : null].filter(Boolean).join(" ") || void 0;
265
+ const inputBaseClass = cn(
266
+ "min-w-0 bg-transparent outline-none placeholder:text-muted-foreground",
267
+ "disabled:cursor-not-allowed",
268
+ sizeConfig.input
269
+ );
270
+ const triggerContent = /* @__PURE__ */ jsxs(Popover, { open, children: [
271
+ /* @__PURE__ */ jsx(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs(
272
+ "div",
273
+ {
274
+ ref: containerRef,
275
+ className: cn(
276
+ "relative flex w-full items-center gap-2 rounded-md border border-input bg-background pe-8 ps-3",
277
+ "focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2",
278
+ disabled && "cursor-not-allowed opacity-50",
279
+ !!error && "border-destructive ring-destructive/20 ring-3",
280
+ sizeConfig.trigger,
281
+ !hasField && className
282
+ ),
283
+ children: [
284
+ timezone ? /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground", children: timezone.toUpperCase() }) : /* @__PURE__ */ jsx(
285
+ Clock,
286
+ {
287
+ className: cn(
288
+ "shrink-0 text-muted-foreground",
289
+ sizeConfig.icon
290
+ )
291
+ }
292
+ ),
293
+ isRange ? /* @__PURE__ */ jsxs(Fragment, { children: [
294
+ /* @__PURE__ */ jsx(
295
+ "input",
296
+ {
297
+ ref: fromInputRef,
298
+ type: "text",
299
+ disabled,
300
+ "aria-label": label ? `${label} start time` : "Pick a start time",
301
+ "aria-describedby": ariaDescribedBy,
302
+ "aria-invalid": !!error || void 0,
303
+ placeholder: placeholder ?? singlePlaceholder,
304
+ value: fromText,
305
+ onChange: buildInputChangeHandler("from"),
306
+ onKeyDown: handleInputKeyDown,
307
+ onFocus: () => handleInputFocus("from"),
308
+ onBlur: handleInputBlur,
309
+ className: cn(inputBaseClass, "flex-1")
310
+ }
311
+ ),
312
+ /* @__PURE__ */ jsx(
313
+ "span",
314
+ {
315
+ "aria-hidden": "true",
316
+ className: "shrink-0 text-muted-foreground",
317
+ children: "~"
318
+ }
319
+ ),
320
+ /* @__PURE__ */ jsx(
321
+ "input",
322
+ {
323
+ ref: toInputRef,
324
+ type: "text",
325
+ disabled,
326
+ "aria-label": label ? `${label} end time` : "Pick an end time",
327
+ "aria-describedby": ariaDescribedBy,
328
+ "aria-invalid": !!error || void 0,
329
+ placeholder: placeholder ?? singlePlaceholder,
330
+ value: toText,
331
+ onChange: buildInputChangeHandler("to"),
332
+ onKeyDown: handleInputKeyDown,
333
+ onFocus: () => handleInputFocus("to"),
334
+ onBlur: handleInputBlur,
335
+ className: cn(inputBaseClass, "flex-1")
336
+ }
337
+ )
338
+ ] }) : /* @__PURE__ */ jsx(
339
+ "input",
340
+ {
341
+ ref: fromInputRef,
342
+ type: "text",
343
+ disabled,
344
+ "aria-label": label || "Pick a time",
345
+ "aria-describedby": ariaDescribedBy,
346
+ "aria-invalid": !!error || void 0,
347
+ placeholder: placeholder ?? singlePlaceholder,
348
+ value: fromText,
349
+ onChange: buildInputChangeHandler("from"),
350
+ onKeyDown: handleInputKeyDown,
351
+ onFocus: () => handleInputFocus("from"),
352
+ onBlur: handleInputBlur,
353
+ className: cn(inputBaseClass, "flex-1")
354
+ }
355
+ ),
356
+ /* @__PURE__ */ jsx(
357
+ "button",
358
+ {
359
+ type: "button",
360
+ onPointerDown: (e) => e.preventDefault(),
361
+ onClick: handleClear,
362
+ className: cn(
363
+ "absolute inset-y-0 end-2 flex items-center text-muted-foreground hover:text-foreground focus:outline-none",
364
+ !(hasAnyValue && !disabled) && "invisible"
365
+ ),
366
+ "aria-label": isRange ? "Clear time range" : "Clear time",
367
+ tabIndex: -1,
368
+ children: /* @__PURE__ */ jsx(X, { className: sizeConfig.icon })
369
+ }
370
+ )
371
+ ]
372
+ }
373
+ ) }),
374
+ open && /* @__PURE__ */ jsxs(
375
+ PopoverContent,
376
+ {
377
+ id: popoverContentId,
378
+ className: "w-auto p-0",
379
+ align: "start",
380
+ onOpenAutoFocus: (e) => e.preventDefault(),
381
+ onCloseAutoFocus: (e) => e.preventDefault(),
382
+ onPointerDownOutside: (e) => e.preventDefault(),
383
+ onInteractOutside: (e) => e.preventDefault(),
384
+ children: [
385
+ /* @__PURE__ */ jsx(
386
+ TimePickerPanel,
387
+ {
388
+ value: activeTime ?? void 0,
389
+ onChange: handlePanelChange,
390
+ format,
391
+ showSeconds,
392
+ minuteStep,
393
+ secondStep,
394
+ disabled
395
+ }
396
+ ),
397
+ needConfirm && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-end border-t border-border px-3 py-2", children: /* @__PURE__ */ jsx(
398
+ "button",
399
+ {
400
+ type: "button",
401
+ onClick: handleOk,
402
+ className: "rounded bg-primary px-3 py-1 text-sm font-medium text-primary-foreground hover:bg-primary/90 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
403
+ children: "OK"
404
+ }
405
+ ) })
406
+ ]
407
+ }
408
+ )
409
+ ] });
410
+ if (!hasField) {
411
+ return /* @__PURE__ */ jsx("div", { ref, className, children: triggerContent });
412
+ }
413
+ return /* @__PURE__ */ jsxs(
414
+ Field,
415
+ {
416
+ ref,
417
+ "data-disabled": disabled || void 0,
418
+ "data-invalid": !!error || void 0,
419
+ className,
420
+ children: [
421
+ label && /* @__PURE__ */ jsxs(
422
+ FieldLabel,
423
+ {
424
+ ...labelProps,
425
+ children: [
426
+ label,
427
+ required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-destructive", children: "*" })
428
+ ]
429
+ }
430
+ ),
431
+ /* @__PURE__ */ jsxs(FieldContent, { children: [
432
+ triggerContent,
433
+ !!error && /* @__PURE__ */ jsx(FieldError, { id: errorId, children: error }),
434
+ helpText && /* @__PURE__ */ jsx(FieldDescription, { id: helpTextId, children: helpText })
435
+ ] })
436
+ ]
437
+ }
438
+ );
439
+ }
440
+ );
441
+ TimePicker.displayName = "TimePicker";
442
+
443
+ export { TimePicker as T };
444
+ //# sourceMappingURL=TimePicker-DoL126Ql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePicker-DoL126Ql.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 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\";\nimport { useControlledOpen } from \"src/hooks/useControlledOpen\";\nimport { useCursorRestore } from \"src/hooks/useCursorRestore\";\nimport { useOutsideClickClose } from \"src/hooks/useOutsideClickClose\";\n\nimport { TimePickerPanel } from \"./TimePickerPanel\";\nimport { SIZE_CONFIG } from \"./constants\";\nimport type { TimePickerProps, TimeValue } from \"./types\";\nimport {\n coerceToTimeValue,\n formatTimeDisplay,\n formatTimeWithPattern,\n getDefaultTimeMaskFormat,\n getTimePlaceholder,\n parseTimeString,\n parseTimeWithPattern,\n timeValueEquals,\n timeValueToDayjs,\n} from \"./utils\";\nimport { applyMask, buildMaskTemplate } from \"src/utils/inputMask\";\n\ntype RangeSide = \"from\" | \"to\";\n\nconst TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(\n (\n {\n value,\n onChange,\n onBlur,\n type = \"time\",\n format = \"24\",\n displayFormat,\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 open: openProp,\n onOpenChange,\n needConfirm = true,\n onOk,\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 fromInputRef = useRef<HTMLInputElement>(null);\n const toInputRef = useRef<HTMLInputElement>(null);\n const fromCursorRef = useRef<number | null>(null);\n const toCursorRef = useRef<number | null>(null);\n\n const popoverContentId = useRef(\n `timepicker-popover-${generatedId}`\n ).current;\n\n const committedRef = useRef<{\n from: TimeValue | null;\n to: TimeValue | null;\n }>({ from: null, to: null });\n\n const { open, setOpen } = useControlledOpen(openProp, onOpenChange);\n\n const isRange = type === \"range\";\n\n const getInitialTimes = useCallback(() => {\n if (isRange) {\n if (!value || !Array.isArray(value)) {\n return { from: null, to: null };\n }\n\n return {\n from: coerceToTimeValue(value[0] as TimeValue | Date | null),\n to: coerceToTimeValue(value[1] as TimeValue | Date | null),\n };\n }\n\n return {\n from: coerceToTimeValue(value as TimeValue | Date | null | undefined),\n to: null,\n };\n }, [value, isRange]);\n\n const formatOne = useCallback(\n (time: TimeValue | null) =>\n displayFormat\n ? formatTimeWithPattern(time, displayFormat)\n : formatTimeDisplay(time, format, showSeconds),\n [displayFormat, format, showSeconds]\n );\n\n const [activeSide, setActiveSide] = useState<RangeSide>(\"from\");\n const [fromTime, setFromTime] = useState(() => getInitialTimes().from);\n const [toTime, setToTime] = useState(() => getInitialTimes().to);\n\n const [fromText, setFromText] = useState(() =>\n formatOne(getInitialTimes().from)\n );\n const [toText, setToText] = useState(() => formatOne(getInitialTimes().to));\n\n const parseOne = (text: string): TimeValue | null =>\n displayFormat\n ? parseTimeWithPattern(text, displayFormat)\n : parseTimeString(text, format);\n\n const emitChange = (from: TimeValue | null, to: TimeValue | null) => {\n if (isRange) {\n if (!from || !to) {\n onChange?.(null, [\"\", \"\"]);\n\n return;\n }\n\n onChange?.(\n [timeValueToDayjs(from), timeValueToDayjs(to)],\n [formatOne(from), formatOne(to)]\n );\n\n return;\n }\n\n if (!from) {\n onChange?.(null, \"\");\n\n return;\n }\n\n onChange?.(timeValueToDayjs(from), formatOne(from));\n };\n\n const commitPendingOnClose = useCallback(() => {\n if (!needConfirm) {\n setFromText(formatOne(fromTime));\n setToText(formatOne(toTime));\n\n return;\n }\n\n const { from: committedFrom, to: committedTo } = committedRef.current;\n const unchanged =\n timeValueEquals(fromTime, committedFrom) &&\n timeValueEquals(toTime, committedTo);\n if (unchanged) return;\n\n emitChange(fromTime, toTime);\n committedRef.current = { from: fromTime, to: toTime };\n }, [needConfirm, fromTime, toTime, formatOne, isRange, onChange]);\n\n const closePopover = useCallback(() => {\n commitPendingOnClose();\n setOpen(false);\n }, [commitPendingOnClose, setOpen]);\n\n useOutsideClickClose({\n enabled: open,\n containerRef,\n popoverElementId: popoverContentId,\n onClose: closePopover,\n });\n\n const maskTemplate = useMemo(\n () =>\n displayFormat\n ? null\n : buildMaskTemplate(getDefaultTimeMaskFormat(format, showSeconds)),\n [displayFormat, format, showSeconds]\n );\n\n const handleOk = () => {\n if (isRange && activeSide === \"from\" && fromTime && !toTime) {\n setActiveSide(\"to\");\n toInputRef.current?.focus();\n\n return;\n }\n\n committedRef.current = { from: fromTime, to: toTime };\n emitChange(fromTime, toTime);\n\n if (isRange) {\n if (fromTime && toTime) {\n onOk?.([timeValueToDayjs(fromTime), timeValueToDayjs(toTime)]);\n } else {\n onOk?.(null);\n }\n } else {\n onOk?.(fromTime ? timeValueToDayjs(fromTime) : null);\n }\n\n setOpen(false);\n };\n\n const handlePanelChange = (time: TimeValue) => {\n if (!isRange) {\n setFromTime(time);\n setFromText(formatOne(time));\n if (!needConfirm) emitChange(time, null);\n\n return;\n }\n\n if (activeSide === \"from\") {\n setFromTime(time);\n setFromText(formatOne(time));\n if (!needConfirm) emitChange(time, toTime);\n\n return;\n }\n\n setToTime(time);\n setToText(formatOne(time));\n if (!needConfirm) emitChange(fromTime, time);\n };\n\n const buildInputChangeHandler =\n (side: RangeSide) => (e: React.ChangeEvent<HTMLInputElement>) => {\n let text = e.target.value;\n const previousText = side === \"from\" ? fromText : toText;\n\n if (maskTemplate) {\n const masked = applyMask(\n text,\n maskTemplate,\n previousText,\n e.target.selectionStart\n );\n text = masked.text;\n\n if (side === \"from\") fromCursorRef.current = masked.cursorPosition;\n else toCursorRef.current = masked.cursorPosition;\n }\n\n if (side === \"from\") setFromText(text);\n else setToText(text);\n\n const parsed = parseOne(text);\n if (!parsed) return;\n\n if (side === \"from\") {\n setFromTime(parsed);\n if (!needConfirm) emitChange(parsed, toTime);\n } else {\n setToTime(parsed);\n if (!needConfirm) emitChange(fromTime, parsed);\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Escape\") {\n const { from, to } = committedRef.current;\n setFromTime(from);\n setToTime(to);\n setFromText(formatOne(from));\n setToText(formatOne(to));\n setOpen(false);\n\n return;\n }\n\n if (e.key !== \"Enter\") return;\n\n if (needConfirm) {\n handleOk();\n\n return;\n }\n\n setFromText(formatOne(fromTime));\n setToText(formatOne(toTime));\n setOpen(false);\n };\n\n const handleInputFocus = (side: RangeSide) => {\n setActiveSide(side);\n if (!open) setOpen(true);\n };\n\n const handleInputBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const next = e.relatedTarget as HTMLElement | null;\n if (next && containerRef.current?.contains(next)) return;\n\n const popoverEl = document.getElementById(popoverContentId);\n if (next && popoverEl?.contains(next)) return;\n\n onBlur?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n setFromTime(null);\n setToTime(null);\n setFromText(\"\");\n setToText(\"\");\n\n committedRef.current = { from: null, to: null };\n onChange?.(null, isRange ? [\"\", \"\"] : \"\");\n };\n\n useEffect(() => {\n if (value === undefined) return;\n\n const next = getInitialTimes();\n setFromTime(next.from);\n setToTime(next.to);\n if (open) return;\n\n setFromText(formatOne(next.from));\n setToText(formatOne(next.to));\n committedRef.current = { from: next.from, to: next.to };\n }, [value, getInitialTimes, formatOne, open]);\n\n useEffect(() => {\n if (!open) return;\n\n committedRef.current = { from: fromTime, to: toTime };\n }, [open]);\n\n useCursorRestore([\n { inputRef: fromInputRef, cursorRef: fromCursorRef },\n { inputRef: toInputRef, cursorRef: toCursorRef },\n ]);\n\n const singlePlaceholder = getTimePlaceholder(\n format,\n showSeconds,\n displayFormat\n );\n\n const hasField = !!(label || error || helpText);\n const sizeConfig = SIZE_CONFIG[size];\n const hasAnyValue = !!(fromText || toText);\n const activeTime = activeSide === \"from\" ? fromTime : toTime;\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const inputBaseClass = cn(\n \"min-w-0 bg-transparent outline-none placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed\",\n sizeConfig.input\n );\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 {isRange ? (\n <>\n <input\n ref={fromInputRef}\n type=\"text\"\n disabled={disabled}\n aria-label={\n label ? `${label} start time` : \"Pick a start time\"\n }\n aria-describedby={ariaDescribedBy}\n aria-invalid={!!error || undefined}\n placeholder={placeholder ?? singlePlaceholder}\n value={fromText}\n onChange={buildInputChangeHandler(\"from\")}\n onKeyDown={handleInputKeyDown}\n onFocus={() => handleInputFocus(\"from\")}\n onBlur={handleInputBlur}\n className={cn(inputBaseClass, \"flex-1\")}\n />\n <span\n aria-hidden=\"true\"\n className=\"shrink-0 text-muted-foreground\"\n >\n ~\n </span>\n <input\n ref={toInputRef}\n type=\"text\"\n disabled={disabled}\n aria-label={label ? `${label} end time` : \"Pick an end time\"}\n aria-describedby={ariaDescribedBy}\n aria-invalid={!!error || undefined}\n placeholder={placeholder ?? singlePlaceholder}\n value={toText}\n onChange={buildInputChangeHandler(\"to\")}\n onKeyDown={handleInputKeyDown}\n onFocus={() => handleInputFocus(\"to\")}\n onBlur={handleInputBlur}\n className={cn(inputBaseClass, \"flex-1\")}\n />\n </>\n ) : (\n <input\n ref={fromInputRef}\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 ?? singlePlaceholder}\n value={fromText}\n onChange={buildInputChangeHandler(\"from\")}\n onKeyDown={handleInputKeyDown}\n onFocus={() => handleInputFocus(\"from\")}\n onBlur={handleInputBlur}\n className={cn(inputBaseClass, \"flex-1\")}\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 !(hasAnyValue && !disabled) && \"invisible\"\n )}\n aria-label={isRange ? \"Clear time range\" : \"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={activeTime ?? undefined}\n onChange={handlePanelChange}\n format={format}\n showSeconds={showSeconds}\n minuteStep={minuteStep}\n secondStep={secondStep}\n disabled={disabled}\n />\n {needConfirm && (\n <div className=\"flex items-center justify-end border-t border-border px-3 py-2\">\n <button\n type=\"button\"\n onClick={handleOk}\n className=\"rounded bg-primary px-3 py-1 text-sm font-medium text-primary-foreground hover:bg-primary/90 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n OK\n </button>\n </div>\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":[],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,10 +1,59 @@
1
+ import { useState, useCallback, useLayoutEffect, useEffect, useRef, forwardRef } from 'react';
1
2
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { useRef, useEffect, forwardRef, useCallback, useState } from 'react';
3
3
  import { c as cn } from './utils-BJnb9o5c.js';
4
4
  import { Button } from './primitives/Button.js';
5
5
  import { ScrollArea } from './primitives/ScrollArea.js';
6
+ import pureDayjs from 'dayjs';
7
+ import customParseFormat from 'dayjs/plugin/customParseFormat';
6
8
  import { dayjs } from '@bigbinary/neeto-commons-frontend/utils';
7
9
 
10
+ function useControlledOpen(controlledOpen, onOpenChange) {
11
+ const [internalOpen, setInternalOpen] = useState(false);
12
+ const isControlled = controlledOpen !== void 0;
13
+ const open = isControlled ? controlledOpen : internalOpen;
14
+ const setOpen = useCallback(
15
+ (next) => {
16
+ if (!isControlled) setInternalOpen(next);
17
+ onOpenChange?.(next);
18
+ },
19
+ [isControlled, onOpenChange]
20
+ );
21
+ return { open, setOpen };
22
+ }
23
+
24
+ function useCursorRestore(targets) {
25
+ useLayoutEffect(() => {
26
+ for (const { inputRef, cursorRef } of targets) {
27
+ const inputEl = inputRef.current;
28
+ const cursor = cursorRef.current;
29
+ if (cursor !== null && inputEl && document.activeElement === inputEl) {
30
+ inputEl.setSelectionRange(cursor, cursor);
31
+ cursorRef.current = null;
32
+ }
33
+ }
34
+ });
35
+ }
36
+
37
+ function useOutsideClickClose({
38
+ enabled,
39
+ containerRef,
40
+ popoverElementId,
41
+ onClose
42
+ }) {
43
+ useEffect(() => {
44
+ if (!enabled) return;
45
+ const handlePointerDown = (e) => {
46
+ const target = e.target;
47
+ if (containerRef.current?.contains(target)) return;
48
+ const popoverEl = document.getElementById(popoverElementId);
49
+ if (popoverEl?.contains(target)) return;
50
+ onClose();
51
+ };
52
+ document.addEventListener("pointerdown", handlePointerDown);
53
+ return () => document.removeEventListener("pointerdown", handlePointerDown);
54
+ }, [enabled, containerRef, popoverElementId, onClose]);
55
+ }
56
+
8
57
  const FORMAT_CHARS = /* @__PURE__ */ new Set(["d", "M", "y", "H", "h", "m", "s"]);
9
58
  const DIGIT = /\d/;
10
59
  const AMPM_CHAR = /[APM]/;
@@ -194,7 +243,25 @@ const applyMask = (inputText, template, previousText = "", nativeCursorPos) => {
194
243
  const COLUMN_HEIGHT = 224;
195
244
  const ITEM_HEIGHT = 32;
196
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
+ };
197
263
 
264
+ pureDayjs.extend(customParseFormat);
198
265
  const generateRange = (start, end, step = 1) => {
199
266
  const result = [];
200
267
  for (let i = start; i <= end; i += step) {
@@ -218,6 +285,37 @@ const dateToTimeValue = (date) => ({
218
285
  minutes: date.getMinutes(),
219
286
  seconds: date.getSeconds()
220
287
  });
288
+ const coerceToTimeValue = (value) => {
289
+ if (!value) return null;
290
+ if (value instanceof Date) return dateToTimeValue(value);
291
+ const dayjsLike = value;
292
+ if (typeof dayjsLike.hour === "function") {
293
+ return {
294
+ hours: dayjsLike.hour(),
295
+ minutes: dayjsLike.minute(),
296
+ seconds: dayjsLike.second?.() ?? 0
297
+ };
298
+ }
299
+ if (typeof dayjsLike.toDate === "function") {
300
+ return dateToTimeValue(dayjsLike.toDate());
301
+ }
302
+ const timeValue = value;
303
+ return {
304
+ hours: timeValue.hours,
305
+ minutes: timeValue.minutes,
306
+ seconds: timeValue.seconds ?? 0
307
+ };
308
+ };
309
+ const timeValueEquals = (a, b) => {
310
+ if (a === null && b === null) return true;
311
+ if (!a || !b) return false;
312
+ return a.hours === b.hours && a.minutes === b.minutes && (a.seconds ?? 0) === (b.seconds ?? 0);
313
+ };
314
+ const getDefaultTimeMaskFormat = (format, showSeconds) => {
315
+ if (format === "12") return showSeconds ? "hh:mm:ss AA" : "hh:mm AA";
316
+ return showSeconds ? "HH:mm:ss" : "HH:mm";
317
+ };
318
+ const getTimePlaceholder = (format, showSeconds, displayFormat) => displayFormat ?? getDefaultTimeMaskFormat(format, showSeconds);
221
319
  const padNumber = (num, length = 2) => String(num).padStart(length, "0");
222
320
  const formatTimeDisplay = (time, format, showSeconds) => {
223
321
  if (!time) return "";
@@ -254,6 +352,21 @@ const parseTimeString = (input, format) => {
254
352
  if (hours > 23 || minutes > 59 || seconds > 59) return null;
255
353
  return { hours, minutes, seconds };
256
354
  };
355
+ const formatTimeWithPattern = (time, pattern) => {
356
+ if (!time) return "";
357
+ return pureDayjs("2000-01-01T00:00:00").hour(time.hours).minute(time.minutes).second(time.seconds ?? 0).format(pattern);
358
+ };
359
+ const parseTimeWithPattern = (input, pattern) => {
360
+ const trimmed = input.trim();
361
+ if (!trimmed) return null;
362
+ const parsed = pureDayjs(trimmed, pattern, true);
363
+ if (!parsed.isValid()) return null;
364
+ return {
365
+ hours: parsed.hour(),
366
+ minutes: parsed.minute(),
367
+ seconds: parsed.second()
368
+ };
369
+ };
257
370
  const timeValueToDayjs = (time) => {
258
371
  const h = padNumber(time.hours);
259
372
  const m = padNumber(time.minutes);
@@ -429,5 +542,5 @@ const TimePickerPanel = forwardRef(
429
542
  );
430
543
  TimePickerPanel.displayName = "TimePickerPanel";
431
544
 
432
- export { TimePickerPanel as T, applyMask as a, buildMaskTemplate as b, buildRangeMaskTemplate as c, dateToTimeValue as d, formatTimeDisplay as f, isFixedWidthFormat as i, parseTimeString as p, timeValueToDayjs as t };
433
- //# sourceMappingURL=TimePickerPanel-zWmOy3Eo.js.map
545
+ 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 };
546
+ //# sourceMappingURL=TimePickerPanel--KDX5QwS.js.map