@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,446 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var primitives_Popover = require('./primitives/Popover.js');
6
+ var primitives_Field = require('./primitives/Field.js');
7
+ var utils = require('./utils-BhM0B89p.js');
8
+ var TimePickerPanel = require('./TimePickerPanel-DX6cjrSN.js');
9
+ var createLucideIcon = require('./createLucideIcon-D0tRgV6l.js');
10
+ var x = require('./x-Brw3FJst.js');
11
+
12
+ /**
13
+ * @license lucide-react v0.577.0 - ISC
14
+ *
15
+ * This source code is licensed under the ISC license.
16
+ * See the LICENSE file in the root directory of this source tree.
17
+ */
18
+
19
+
20
+ const __iconNode = [
21
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
22
+ ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }]
23
+ ];
24
+ const Clock = createLucideIcon.createLucideIcon("clock", __iconNode);
25
+
26
+ const TimePicker = React.forwardRef(
27
+ ({
28
+ value,
29
+ onChange,
30
+ onBlur,
31
+ type = "time",
32
+ format = "24",
33
+ displayFormat,
34
+ showSeconds = false,
35
+ minuteStep = 1,
36
+ secondStep = 1,
37
+ disabled = false,
38
+ placeholder,
39
+ label,
40
+ error,
41
+ helpText,
42
+ size = "medium",
43
+ required = false,
44
+ timezone,
45
+ open: openProp,
46
+ onOpenChange,
47
+ needConfirm = true,
48
+ onOk,
49
+ labelProps,
50
+ className
51
+ }, ref) => {
52
+ const generatedId = React.useId();
53
+ const errorId = `error_${generatedId}`;
54
+ const helpTextId = `helpText_${generatedId}`;
55
+ const containerRef = React.useRef(null);
56
+ const fromInputRef = React.useRef(null);
57
+ const toInputRef = React.useRef(null);
58
+ const fromCursorRef = React.useRef(null);
59
+ const toCursorRef = React.useRef(null);
60
+ const popoverContentId = React.useRef(
61
+ `timepicker-popover-${generatedId}`
62
+ ).current;
63
+ const committedRef = React.useRef({ from: null, to: null });
64
+ const { open, setOpen } = TimePickerPanel.useControlledOpen(openProp, onOpenChange);
65
+ const isRange = type === "range";
66
+ const getInitialTimes = React.useCallback(() => {
67
+ if (isRange) {
68
+ if (!value || !Array.isArray(value)) {
69
+ return { from: null, to: null };
70
+ }
71
+ return {
72
+ from: TimePickerPanel.coerceToTimeValue(value[0]),
73
+ to: TimePickerPanel.coerceToTimeValue(value[1])
74
+ };
75
+ }
76
+ return {
77
+ from: TimePickerPanel.coerceToTimeValue(value),
78
+ to: null
79
+ };
80
+ }, [value, isRange]);
81
+ const formatOne = React.useCallback(
82
+ (time) => displayFormat ? TimePickerPanel.formatTimeWithPattern(time, displayFormat) : TimePickerPanel.formatTimeDisplay(time, format, showSeconds),
83
+ [displayFormat, format, showSeconds]
84
+ );
85
+ const [activeSide, setActiveSide] = React.useState("from");
86
+ const [fromTime, setFromTime] = React.useState(() => getInitialTimes().from);
87
+ const [toTime, setToTime] = React.useState(() => getInitialTimes().to);
88
+ const [fromText, setFromText] = React.useState(
89
+ () => formatOne(getInitialTimes().from)
90
+ );
91
+ const [toText, setToText] = React.useState(() => formatOne(getInitialTimes().to));
92
+ const parseOne = (text) => displayFormat ? TimePickerPanel.parseTimeWithPattern(text, displayFormat) : TimePickerPanel.parseTimeString(text, format);
93
+ const emitChange = (from, to) => {
94
+ if (isRange) {
95
+ if (!from || !to) {
96
+ onChange?.(null, ["", ""]);
97
+ return;
98
+ }
99
+ onChange?.(
100
+ [TimePickerPanel.timeValueToDayjs(from), TimePickerPanel.timeValueToDayjs(to)],
101
+ [formatOne(from), formatOne(to)]
102
+ );
103
+ return;
104
+ }
105
+ if (!from) {
106
+ onChange?.(null, "");
107
+ return;
108
+ }
109
+ onChange?.(TimePickerPanel.timeValueToDayjs(from), formatOne(from));
110
+ };
111
+ const commitPendingOnClose = React.useCallback(() => {
112
+ if (!needConfirm) {
113
+ setFromText(formatOne(fromTime));
114
+ setToText(formatOne(toTime));
115
+ return;
116
+ }
117
+ const { from: committedFrom, to: committedTo } = committedRef.current;
118
+ const unchanged = TimePickerPanel.timeValueEquals(fromTime, committedFrom) && TimePickerPanel.timeValueEquals(toTime, committedTo);
119
+ if (unchanged) return;
120
+ emitChange(fromTime, toTime);
121
+ committedRef.current = { from: fromTime, to: toTime };
122
+ }, [needConfirm, fromTime, toTime, formatOne, isRange, onChange]);
123
+ const closePopover = React.useCallback(() => {
124
+ commitPendingOnClose();
125
+ setOpen(false);
126
+ }, [commitPendingOnClose, setOpen]);
127
+ TimePickerPanel.useOutsideClickClose({
128
+ enabled: open,
129
+ containerRef,
130
+ popoverElementId: popoverContentId,
131
+ onClose: closePopover
132
+ });
133
+ const maskTemplate = React.useMemo(
134
+ () => displayFormat ? null : TimePickerPanel.buildMaskTemplate(TimePickerPanel.getDefaultTimeMaskFormat(format, showSeconds)),
135
+ [displayFormat, format, showSeconds]
136
+ );
137
+ const handleOk = () => {
138
+ if (isRange && activeSide === "from" && fromTime && !toTime) {
139
+ setActiveSide("to");
140
+ toInputRef.current?.focus();
141
+ return;
142
+ }
143
+ committedRef.current = { from: fromTime, to: toTime };
144
+ emitChange(fromTime, toTime);
145
+ if (isRange) {
146
+ if (fromTime && toTime) {
147
+ onOk?.([TimePickerPanel.timeValueToDayjs(fromTime), TimePickerPanel.timeValueToDayjs(toTime)]);
148
+ } else {
149
+ onOk?.(null);
150
+ }
151
+ } else {
152
+ onOk?.(fromTime ? TimePickerPanel.timeValueToDayjs(fromTime) : null);
153
+ }
154
+ setOpen(false);
155
+ };
156
+ const handlePanelChange = (time) => {
157
+ if (!isRange) {
158
+ setFromTime(time);
159
+ setFromText(formatOne(time));
160
+ if (!needConfirm) emitChange(time, null);
161
+ return;
162
+ }
163
+ if (activeSide === "from") {
164
+ setFromTime(time);
165
+ setFromText(formatOne(time));
166
+ if (!needConfirm) emitChange(time, toTime);
167
+ return;
168
+ }
169
+ setToTime(time);
170
+ setToText(formatOne(time));
171
+ if (!needConfirm) emitChange(fromTime, time);
172
+ };
173
+ const buildInputChangeHandler = (side) => (e) => {
174
+ let text = e.target.value;
175
+ const previousText = side === "from" ? fromText : toText;
176
+ if (maskTemplate) {
177
+ const masked = TimePickerPanel.applyMask(
178
+ text,
179
+ maskTemplate,
180
+ previousText,
181
+ e.target.selectionStart
182
+ );
183
+ text = masked.text;
184
+ if (side === "from") fromCursorRef.current = masked.cursorPosition;
185
+ else toCursorRef.current = masked.cursorPosition;
186
+ }
187
+ if (side === "from") setFromText(text);
188
+ else setToText(text);
189
+ const parsed = parseOne(text);
190
+ if (!parsed) return;
191
+ if (side === "from") {
192
+ setFromTime(parsed);
193
+ if (!needConfirm) emitChange(parsed, toTime);
194
+ } else {
195
+ setToTime(parsed);
196
+ if (!needConfirm) emitChange(fromTime, parsed);
197
+ }
198
+ };
199
+ const handleInputKeyDown = (e) => {
200
+ if (e.key === "Escape") {
201
+ const { from, to } = committedRef.current;
202
+ setFromTime(from);
203
+ setToTime(to);
204
+ setFromText(formatOne(from));
205
+ setToText(formatOne(to));
206
+ setOpen(false);
207
+ return;
208
+ }
209
+ if (e.key !== "Enter") return;
210
+ if (needConfirm) {
211
+ handleOk();
212
+ return;
213
+ }
214
+ setFromText(formatOne(fromTime));
215
+ setToText(formatOne(toTime));
216
+ setOpen(false);
217
+ };
218
+ const handleInputFocus = (side) => {
219
+ setActiveSide(side);
220
+ if (!open) setOpen(true);
221
+ };
222
+ const handleInputBlur = (e) => {
223
+ const next = e.relatedTarget;
224
+ if (next && containerRef.current?.contains(next)) return;
225
+ const popoverEl = document.getElementById(popoverContentId);
226
+ if (next && popoverEl?.contains(next)) return;
227
+ onBlur?.(e);
228
+ };
229
+ const handleClear = (e) => {
230
+ e.stopPropagation();
231
+ e.preventDefault();
232
+ setFromTime(null);
233
+ setToTime(null);
234
+ setFromText("");
235
+ setToText("");
236
+ committedRef.current = { from: null, to: null };
237
+ onChange?.(null, isRange ? ["", ""] : "");
238
+ };
239
+ React.useEffect(() => {
240
+ if (value === void 0) return;
241
+ const next = getInitialTimes();
242
+ setFromTime(next.from);
243
+ setToTime(next.to);
244
+ if (open) return;
245
+ setFromText(formatOne(next.from));
246
+ setToText(formatOne(next.to));
247
+ committedRef.current = { from: next.from, to: next.to };
248
+ }, [value, getInitialTimes, formatOne, open]);
249
+ React.useEffect(() => {
250
+ if (!open) return;
251
+ committedRef.current = { from: fromTime, to: toTime };
252
+ }, [open]);
253
+ TimePickerPanel.useCursorRestore([
254
+ { inputRef: fromInputRef, cursorRef: fromCursorRef },
255
+ { inputRef: toInputRef, cursorRef: toCursorRef }
256
+ ]);
257
+ const singlePlaceholder = TimePickerPanel.getTimePlaceholder(
258
+ format,
259
+ showSeconds,
260
+ displayFormat
261
+ );
262
+ const hasField = !!(label || error || helpText);
263
+ const sizeConfig = TimePickerPanel.SIZE_CONFIG[size];
264
+ const hasAnyValue = !!(fromText || toText);
265
+ const activeTime = activeSide === "from" ? fromTime : toTime;
266
+ const ariaDescribedBy = [error ? errorId : null, helpText ? helpTextId : null].filter(Boolean).join(" ") || void 0;
267
+ const inputBaseClass = utils.cn(
268
+ "min-w-0 bg-transparent outline-none placeholder:text-muted-foreground",
269
+ "disabled:cursor-not-allowed",
270
+ sizeConfig.input
271
+ );
272
+ const triggerContent = /* @__PURE__ */ jsxRuntime.jsxs(primitives_Popover.Popover, { open, children: [
273
+ /* @__PURE__ */ jsxRuntime.jsx(primitives_Popover.PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
274
+ "div",
275
+ {
276
+ ref: containerRef,
277
+ className: utils.cn(
278
+ "relative flex w-full items-center gap-2 rounded-md border border-input bg-background pe-8 ps-3",
279
+ "focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2",
280
+ disabled && "cursor-not-allowed opacity-50",
281
+ !!error && "border-destructive ring-destructive/20 ring-3",
282
+ sizeConfig.trigger,
283
+ !hasField && className
284
+ ),
285
+ children: [
286
+ timezone ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground", children: timezone.toUpperCase() }) : /* @__PURE__ */ jsxRuntime.jsx(
287
+ Clock,
288
+ {
289
+ className: utils.cn(
290
+ "shrink-0 text-muted-foreground",
291
+ sizeConfig.icon
292
+ )
293
+ }
294
+ ),
295
+ isRange ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
296
+ /* @__PURE__ */ jsxRuntime.jsx(
297
+ "input",
298
+ {
299
+ ref: fromInputRef,
300
+ type: "text",
301
+ disabled,
302
+ "aria-label": label ? `${label} start time` : "Pick a start time",
303
+ "aria-describedby": ariaDescribedBy,
304
+ "aria-invalid": !!error || void 0,
305
+ placeholder: placeholder ?? singlePlaceholder,
306
+ value: fromText,
307
+ onChange: buildInputChangeHandler("from"),
308
+ onKeyDown: handleInputKeyDown,
309
+ onFocus: () => handleInputFocus("from"),
310
+ onBlur: handleInputBlur,
311
+ className: utils.cn(inputBaseClass, "flex-1")
312
+ }
313
+ ),
314
+ /* @__PURE__ */ jsxRuntime.jsx(
315
+ "span",
316
+ {
317
+ "aria-hidden": "true",
318
+ className: "shrink-0 text-muted-foreground",
319
+ children: "~"
320
+ }
321
+ ),
322
+ /* @__PURE__ */ jsxRuntime.jsx(
323
+ "input",
324
+ {
325
+ ref: toInputRef,
326
+ type: "text",
327
+ disabled,
328
+ "aria-label": label ? `${label} end time` : "Pick an end time",
329
+ "aria-describedby": ariaDescribedBy,
330
+ "aria-invalid": !!error || void 0,
331
+ placeholder: placeholder ?? singlePlaceholder,
332
+ value: toText,
333
+ onChange: buildInputChangeHandler("to"),
334
+ onKeyDown: handleInputKeyDown,
335
+ onFocus: () => handleInputFocus("to"),
336
+ onBlur: handleInputBlur,
337
+ className: utils.cn(inputBaseClass, "flex-1")
338
+ }
339
+ )
340
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(
341
+ "input",
342
+ {
343
+ ref: fromInputRef,
344
+ type: "text",
345
+ disabled,
346
+ "aria-label": label || "Pick a time",
347
+ "aria-describedby": ariaDescribedBy,
348
+ "aria-invalid": !!error || void 0,
349
+ placeholder: placeholder ?? singlePlaceholder,
350
+ value: fromText,
351
+ onChange: buildInputChangeHandler("from"),
352
+ onKeyDown: handleInputKeyDown,
353
+ onFocus: () => handleInputFocus("from"),
354
+ onBlur: handleInputBlur,
355
+ className: utils.cn(inputBaseClass, "flex-1")
356
+ }
357
+ ),
358
+ /* @__PURE__ */ jsxRuntime.jsx(
359
+ "button",
360
+ {
361
+ type: "button",
362
+ onPointerDown: (e) => e.preventDefault(),
363
+ onClick: handleClear,
364
+ className: utils.cn(
365
+ "absolute inset-y-0 end-2 flex items-center text-muted-foreground hover:text-foreground focus:outline-none",
366
+ !(hasAnyValue && !disabled) && "invisible"
367
+ ),
368
+ "aria-label": isRange ? "Clear time range" : "Clear time",
369
+ tabIndex: -1,
370
+ children: /* @__PURE__ */ jsxRuntime.jsx(x.X, { className: sizeConfig.icon })
371
+ }
372
+ )
373
+ ]
374
+ }
375
+ ) }),
376
+ open && /* @__PURE__ */ jsxRuntime.jsxs(
377
+ primitives_Popover.PopoverContent,
378
+ {
379
+ id: popoverContentId,
380
+ className: "w-auto p-0",
381
+ align: "start",
382
+ onOpenAutoFocus: (e) => e.preventDefault(),
383
+ onCloseAutoFocus: (e) => e.preventDefault(),
384
+ onPointerDownOutside: (e) => e.preventDefault(),
385
+ onInteractOutside: (e) => e.preventDefault(),
386
+ children: [
387
+ /* @__PURE__ */ jsxRuntime.jsx(
388
+ TimePickerPanel.TimePickerPanel,
389
+ {
390
+ value: activeTime ?? void 0,
391
+ onChange: handlePanelChange,
392
+ format,
393
+ showSeconds,
394
+ minuteStep,
395
+ secondStep,
396
+ disabled
397
+ }
398
+ ),
399
+ needConfirm && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-end border-t border-border px-3 py-2", children: /* @__PURE__ */ jsxRuntime.jsx(
400
+ "button",
401
+ {
402
+ type: "button",
403
+ onClick: handleOk,
404
+ 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",
405
+ children: "OK"
406
+ }
407
+ ) })
408
+ ]
409
+ }
410
+ )
411
+ ] });
412
+ if (!hasField) {
413
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className, children: triggerContent });
414
+ }
415
+ return /* @__PURE__ */ jsxRuntime.jsxs(
416
+ primitives_Field.Field,
417
+ {
418
+ ref,
419
+ "data-disabled": disabled || void 0,
420
+ "data-invalid": !!error || void 0,
421
+ className,
422
+ children: [
423
+ label && /* @__PURE__ */ jsxRuntime.jsxs(
424
+ primitives_Field.FieldLabel,
425
+ {
426
+ ...labelProps,
427
+ children: [
428
+ label,
429
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-destructive", children: "*" })
430
+ ]
431
+ }
432
+ ),
433
+ /* @__PURE__ */ jsxRuntime.jsxs(primitives_Field.FieldContent, { children: [
434
+ triggerContent,
435
+ !!error && /* @__PURE__ */ jsxRuntime.jsx(primitives_Field.FieldError, { id: errorId, children: error }),
436
+ helpText && /* @__PURE__ */ jsxRuntime.jsx(primitives_Field.FieldDescription, { id: helpTextId, children: helpText })
437
+ ] })
438
+ ]
439
+ }
440
+ );
441
+ }
442
+ );
443
+ TimePicker.displayName = "TimePicker";
444
+
445
+ exports.TimePicker = TimePicker;
446
+ //# sourceMappingURL=TimePicker-H3OpzvOm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePicker-H3OpzvOm.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":["createLucideIcon","forwardRef","useId","useRef","useControlledOpen","useCallback","coerceToTimeValue","formatTimeWithPattern","formatTimeDisplay","useState","parseTimeWithPattern","parseTimeString","timeValueToDayjs","timeValueEquals","useOutsideClickClose","useMemo","buildMaskTemplate","getDefaultTimeMaskFormat","applyMask","useEffect","useCursorRestore","getTimePlaceholder","SIZE_CONFIG","cn","jsxs","Popover","jsx","PopoverAnchor","Fragment","X","PopoverContent","TimePickerPanel","Field","FieldLabel","FieldContent","FieldError","FieldDescription"],"mappings":"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","x_google_ignoreList":[0]}