@bigbinary/neeto-atoms 1.0.56 → 1.0.57

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 (52) hide show
  1. package/dist/{DatePicker-D-0HMiNG.js → DatePicker-DGf2BiNq.js} +151 -125
  2. package/dist/DatePicker-DGf2BiNq.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-Bg2LywGY.js} +150 -124
  9. package/dist/cjs/DatePicker-Bg2LywGY.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/constants.d.ts +2 -0
  22. package/dist/components/DatePicker/types.d.ts +5 -1
  23. package/dist/components/DatePicker/utils.d.ts +1 -0
  24. package/dist/components/DatePicker.js +5 -5
  25. package/dist/components/TimePicker/constants.d.ts +17 -0
  26. package/dist/components/TimePicker/index.d.ts +1 -1
  27. package/dist/components/TimePicker/types.d.ts +19 -4
  28. package/dist/components/TimePicker/utils.d.ts +13 -0
  29. package/dist/components/TimePicker.js +4 -2
  30. package/dist/components/TimePicker.js.map +1 -1
  31. package/dist/components/index.js +3 -3
  32. package/dist/formik/BlockNavigation.js.map +1 -1
  33. package/dist/hooks/useControlledOpen.d.ts +5 -0
  34. package/dist/hooks/useCursorRestore.d.ts +8 -0
  35. package/dist/hooks/useOutsideClickClose.d.ts +8 -0
  36. package/dist/index.js +5 -5
  37. package/package.json +1 -1
  38. package/dist/DatePicker-D-0HMiNG.js.map +0 -1
  39. package/dist/TimePicker-CSjiggpr.js +0 -301
  40. package/dist/TimePicker-CSjiggpr.js.map +0 -1
  41. package/dist/TimePickerPanel-zWmOy3Eo.js.map +0 -1
  42. package/dist/cjs/DatePicker-JhQ7D2bu.js.map +0 -1
  43. package/dist/cjs/TimePicker-CU7qJpoT.js +0 -303
  44. package/dist/cjs/TimePicker-CU7qJpoT.js.map +0 -1
  45. package/dist/cjs/TimePickerPanel-B5h5khbs.js.map +0 -1
  46. /package/dist/{hooks → components/Select/hooks}/useAsyncOptions.d.ts +0 -0
  47. /package/dist/{hooks → components/Select/hooks}/useCreatableItems.d.ts +0 -0
  48. /package/dist/{hooks → components/Select/hooks}/useLazyLoadSentinel.d.ts +0 -0
  49. /package/dist/{hooks → components/Select/hooks}/useMultiSelectOptions.d.ts +0 -0
  50. /package/dist/{hooks → components/Select/hooks}/useMultiSelectState.d.ts +0 -0
  51. /package/dist/{hooks → components/Select/hooks}/useSelectState.d.ts +0 -0
  52. /package/dist/{hooks → formik/BlockNavigation/hooks}/useNavPrompt.d.ts +0 -0
@@ -1,12 +1,66 @@
1
1
  'use strict';
2
2
 
3
- var jsxRuntime = require('react/jsx-runtime');
4
3
  var React = require('react');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
5
  var utils$1 = require('./utils-BhM0B89p.js');
6
6
  var primitives_Button = require('./primitives/Button.js');
7
7
  var primitives_ScrollArea = require('./primitives/ScrollArea.js');
8
+ var pureDayjs = require('dayjs');
9
+ var customParseFormat = require('dayjs/plugin/customParseFormat');
8
10
  var utils = require('@bigbinary/neeto-commons-frontend/utils');
9
11
 
12
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
+
14
+ var pureDayjs__default = /*#__PURE__*/_interopDefault(pureDayjs);
15
+ var customParseFormat__default = /*#__PURE__*/_interopDefault(customParseFormat);
16
+
17
+ function useControlledOpen(controlledOpen, onOpenChange) {
18
+ const [internalOpen, setInternalOpen] = React.useState(false);
19
+ const isControlled = controlledOpen !== void 0;
20
+ const open = isControlled ? controlledOpen : internalOpen;
21
+ const setOpen = React.useCallback(
22
+ (next) => {
23
+ if (!isControlled) setInternalOpen(next);
24
+ onOpenChange?.(next);
25
+ },
26
+ [isControlled, onOpenChange]
27
+ );
28
+ return { open, setOpen };
29
+ }
30
+
31
+ function useCursorRestore(targets) {
32
+ React.useLayoutEffect(() => {
33
+ for (const { inputRef, cursorRef } of targets) {
34
+ const inputEl = inputRef.current;
35
+ const cursor = cursorRef.current;
36
+ if (cursor !== null && inputEl && document.activeElement === inputEl) {
37
+ inputEl.setSelectionRange(cursor, cursor);
38
+ cursorRef.current = null;
39
+ }
40
+ }
41
+ });
42
+ }
43
+
44
+ function useOutsideClickClose({
45
+ enabled,
46
+ containerRef,
47
+ popoverElementId,
48
+ onClose
49
+ }) {
50
+ React.useEffect(() => {
51
+ if (!enabled) return;
52
+ const handlePointerDown = (e) => {
53
+ const target = e.target;
54
+ if (containerRef.current?.contains(target)) return;
55
+ const popoverEl = document.getElementById(popoverElementId);
56
+ if (popoverEl?.contains(target)) return;
57
+ onClose();
58
+ };
59
+ document.addEventListener("pointerdown", handlePointerDown);
60
+ return () => document.removeEventListener("pointerdown", handlePointerDown);
61
+ }, [enabled, containerRef, popoverElementId, onClose]);
62
+ }
63
+
10
64
  const FORMAT_CHARS = /* @__PURE__ */ new Set(["d", "M", "y", "H", "h", "m", "s"]);
11
65
  const DIGIT = /\d/;
12
66
  const AMPM_CHAR = /[APM]/;
@@ -196,7 +250,25 @@ const applyMask = (inputText, template, previousText = "", nativeCursorPos) => {
196
250
  const COLUMN_HEIGHT = 224;
197
251
  const ITEM_HEIGHT = 32;
198
252
  const PERIODS = ["AM", "PM"];
253
+ const SIZE_CONFIG = {
254
+ small: {
255
+ trigger: "h-8 md:h-7",
256
+ input: "text-base md:text-xs",
257
+ icon: "size-3.5"
258
+ },
259
+ medium: {
260
+ trigger: "h-8",
261
+ input: "text-base md:text-sm",
262
+ icon: "size-4"
263
+ },
264
+ large: {
265
+ trigger: "h-10",
266
+ input: "text-base md:text-sm",
267
+ icon: "size-5"
268
+ }
269
+ };
199
270
 
271
+ pureDayjs__default.default.extend(customParseFormat__default.default);
200
272
  const generateRange = (start, end, step = 1) => {
201
273
  const result = [];
202
274
  for (let i = start; i <= end; i += step) {
@@ -220,6 +292,37 @@ const dateToTimeValue = (date) => ({
220
292
  minutes: date.getMinutes(),
221
293
  seconds: date.getSeconds()
222
294
  });
295
+ const coerceToTimeValue = (value) => {
296
+ if (!value) return null;
297
+ if (value instanceof Date) return dateToTimeValue(value);
298
+ const dayjsLike = value;
299
+ if (typeof dayjsLike.hour === "function") {
300
+ return {
301
+ hours: dayjsLike.hour(),
302
+ minutes: dayjsLike.minute(),
303
+ seconds: dayjsLike.second?.() ?? 0
304
+ };
305
+ }
306
+ if (typeof dayjsLike.toDate === "function") {
307
+ return dateToTimeValue(dayjsLike.toDate());
308
+ }
309
+ const timeValue = value;
310
+ return {
311
+ hours: timeValue.hours,
312
+ minutes: timeValue.minutes,
313
+ seconds: timeValue.seconds ?? 0
314
+ };
315
+ };
316
+ const timeValueEquals = (a, b) => {
317
+ if (a === null && b === null) return true;
318
+ if (!a || !b) return false;
319
+ return a.hours === b.hours && a.minutes === b.minutes && (a.seconds ?? 0) === (b.seconds ?? 0);
320
+ };
321
+ const getDefaultTimeMaskFormat = (format, showSeconds) => {
322
+ if (format === "12") return showSeconds ? "hh:mm:ss AA" : "hh:mm AA";
323
+ return showSeconds ? "HH:mm:ss" : "HH:mm";
324
+ };
325
+ const getTimePlaceholder = (format, showSeconds, displayFormat) => displayFormat ?? getDefaultTimeMaskFormat(format, showSeconds);
223
326
  const padNumber = (num, length = 2) => String(num).padStart(length, "0");
224
327
  const formatTimeDisplay = (time, format, showSeconds) => {
225
328
  if (!time) return "";
@@ -256,6 +359,21 @@ const parseTimeString = (input, format) => {
256
359
  if (hours > 23 || minutes > 59 || seconds > 59) return null;
257
360
  return { hours, minutes, seconds };
258
361
  };
362
+ const formatTimeWithPattern = (time, pattern) => {
363
+ if (!time) return "";
364
+ return pureDayjs__default.default("2000-01-01T00:00:00").hour(time.hours).minute(time.minutes).second(time.seconds ?? 0).format(pattern);
365
+ };
366
+ const parseTimeWithPattern = (input, pattern) => {
367
+ const trimmed = input.trim();
368
+ if (!trimmed) return null;
369
+ const parsed = pureDayjs__default.default(trimmed, pattern, true);
370
+ if (!parsed.isValid()) return null;
371
+ return {
372
+ hours: parsed.hour(),
373
+ minutes: parsed.minute(),
374
+ seconds: parsed.second()
375
+ };
376
+ };
259
377
  const timeValueToDayjs = (time) => {
260
378
  const h = padNumber(time.hours);
261
379
  const m = padNumber(time.minutes);
@@ -431,13 +549,23 @@ const TimePickerPanel = React.forwardRef(
431
549
  );
432
550
  TimePickerPanel.displayName = "TimePickerPanel";
433
551
 
552
+ exports.SIZE_CONFIG = SIZE_CONFIG;
434
553
  exports.TimePickerPanel = TimePickerPanel;
435
554
  exports.applyMask = applyMask;
436
555
  exports.buildMaskTemplate = buildMaskTemplate;
437
556
  exports.buildRangeMaskTemplate = buildRangeMaskTemplate;
557
+ exports.coerceToTimeValue = coerceToTimeValue;
438
558
  exports.dateToTimeValue = dateToTimeValue;
439
559
  exports.formatTimeDisplay = formatTimeDisplay;
560
+ exports.formatTimeWithPattern = formatTimeWithPattern;
561
+ exports.getDefaultTimeMaskFormat = getDefaultTimeMaskFormat;
562
+ exports.getTimePlaceholder = getTimePlaceholder;
440
563
  exports.isFixedWidthFormat = isFixedWidthFormat;
441
564
  exports.parseTimeString = parseTimeString;
565
+ exports.parseTimeWithPattern = parseTimeWithPattern;
566
+ exports.timeValueEquals = timeValueEquals;
442
567
  exports.timeValueToDayjs = timeValueToDayjs;
443
- //# sourceMappingURL=TimePickerPanel-B5h5khbs.js.map
568
+ exports.useControlledOpen = useControlledOpen;
569
+ exports.useCursorRestore = useCursorRestore;
570
+ exports.useOutsideClickClose = useOutsideClickClose;
571
+ //# sourceMappingURL=TimePickerPanel-DX6cjrSN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePickerPanel-DX6cjrSN.js","sources":["../../src/hooks/useControlledOpen.ts","../../src/hooks/useCursorRestore.ts","../../src/hooks/useOutsideClickClose.ts","../../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":["import { useCallback, useState } from \"react\";\n\n/** Manages popover open state, supporting both controlled and uncontrolled modes. */\nexport function useControlledOpen(\n controlledOpen: boolean | undefined,\n onOpenChange?: (open: boolean) => void\n): { open: boolean; setOpen: (next: boolean) => void } {\n const [internalOpen, setInternalOpen] = useState(false);\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n return { open, setOpen };\n}\n","import { MutableRefObject, RefObject, useLayoutEffect } from \"react\";\n\ntype CursorTarget = {\n inputRef: RefObject<HTMLInputElement | null>;\n cursorRef: MutableRefObject<number | null>;\n};\n\n/** Restores cursor selection range on the active input after each render, then clears the stored position. */\nexport function useCursorRestore(targets: CursorTarget[]): void {\n useLayoutEffect(() => {\n for (const { inputRef, cursorRef } of targets) {\n const inputEl = inputRef.current;\n const cursor = cursorRef.current;\n\n if (cursor !== null && inputEl && document.activeElement === inputEl) {\n inputEl.setSelectionRange(cursor, cursor);\n cursorRef.current = null;\n }\n }\n });\n}\n","import { RefObject, useEffect } from \"react\";\n\n/** Calls onClose when a pointerdown occurs outside both the container ref and a popover element. */\nexport function useOutsideClickClose({\n enabled,\n containerRef,\n popoverElementId,\n onClose,\n}: {\n enabled: boolean;\n containerRef: RefObject<HTMLElement | null>;\n popoverElementId: string;\n onClose: () => void;\n}): void {\n useEffect(() => {\n if (!enabled) return;\n\n const handlePointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement;\n if (containerRef.current?.contains(target)) return;\n\n const popoverEl = document.getElementById(popoverElementId);\n if (popoverEl?.contains(target)) return;\n\n onClose();\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [enabled, containerRef, popoverElementId, onClose]);\n}\n","export interface MaskTemplate {\n pattern: string;\n hasAmPm: boolean;\n}\n\nconst FORMAT_CHARS = new Set([\"d\", \"M\", \"y\", \"H\", \"h\", \"m\", \"s\"]);\n\nconst DIGIT = /\\d/;\nconst AMPM_CHAR = /[APM]/;\nconst VALID_CHAR = /[\\dAPM]/i;\n\nconst isSlot = (ch: string) => ch === \"#\" || ch === \"@\";\n\nconst isValidChar = (ch: string, hasAmPm: boolean) =>\n DIGIT.test(ch) || (hasAmPm && AMPM_CHAR.test(ch));\n\n/**\n * Convert a display format string into a mask template.\n *\n * Format chars (d, M, y, H, h, m, s) → digit slots (#).\n * A (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\nexport const SIZE_CONFIG = {\n small: {\n trigger: \"h-8 md:h-7\",\n input: \"text-base md:text-xs\",\n icon: \"size-3.5\",\n },\n medium: {\n trigger: \"h-8\",\n input: \"text-base md:text-sm\",\n icon: \"size-4\",\n },\n large: {\n trigger: \"h-10\",\n input: \"text-base md:text-sm\",\n icon: \"size-5\",\n },\n} as const;\n","import pureDayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport type { Dayjs } from \"dayjs\";\nimport { dayjs } from \"@bigbinary/neeto-commons-frontend/utils\";\n\nimport type { TimeValue } from \"./types\";\n\npureDayjs.extend(customParseFormat);\n\nexport const generateRange = (\n start: number,\n end: number,\n step = 1\n): number[] => {\n const result: number[] = [];\n for (let i = start; i <= end; i += step) {\n result.push(i);\n }\n\n return result;\n};\n\nexport const to12Hour = (\n hour24: number\n): { hour12: number; period: \"AM\" | \"PM\" } => {\n const period = hour24 >= 12 ? \"PM\" : \"AM\";\n const hour12 = hour24 % 12 || 12;\n\n return { hour12, period };\n};\n\nexport const to24Hour = (hour12: number, period: \"AM\" | \"PM\"): number => {\n if (period === \"AM\") {\n return hour12 === 12 ? 0 : hour12;\n }\n\n return hour12 === 12 ? 12 : hour12 + 12;\n};\n\nexport const dateToTimeValue = (date: Date): TimeValue => ({\n hours: date.getHours(),\n minutes: date.getMinutes(),\n seconds: date.getSeconds(),\n});\n\nexport const coerceToTimeValue = (\n value: TimeValue | Date | null | undefined\n): TimeValue | null => {\n if (!value) return null;\n if (value instanceof Date) return dateToTimeValue(value);\n\n const dayjsLike = value as {\n toDate?: () => Date;\n hour?: () => number;\n minute?: () => number;\n second?: () => number;\n };\n\n if (typeof dayjsLike.hour === \"function\") {\n return {\n hours: dayjsLike.hour!(),\n minutes: dayjsLike.minute!(),\n seconds: dayjsLike.second?.() ?? 0,\n };\n }\n\n if (typeof dayjsLike.toDate === \"function\") {\n return dateToTimeValue(dayjsLike.toDate());\n }\n\n const timeValue = value as TimeValue;\n\n return {\n hours: timeValue.hours,\n minutes: timeValue.minutes,\n seconds: timeValue.seconds ?? 0,\n };\n};\n\nexport const timeValueEquals = (\n a: TimeValue | null,\n b: TimeValue | null\n): boolean => {\n if (a === null && b === null) return true;\n if (!a || !b) return false;\n\n return (\n a.hours === b.hours &&\n a.minutes === b.minutes &&\n (a.seconds ?? 0) === (b.seconds ?? 0)\n );\n};\n\nexport const getDefaultTimeMaskFormat = (\n format: \"12\" | \"24\",\n showSeconds: boolean\n): string => {\n if (format === \"12\") return showSeconds ? \"hh:mm:ss AA\" : \"hh:mm AA\";\n\n return showSeconds ? \"HH:mm:ss\" : \"HH:mm\";\n};\n\nexport const getTimePlaceholder = (\n format: \"12\" | \"24\",\n showSeconds: boolean,\n displayFormat?: string\n): string => displayFormat ?? getDefaultTimeMaskFormat(format, showSeconds);\n\nexport const padNumber = (num: number, length = 2): string =>\n String(num).padStart(length, \"0\");\n\nexport const formatTimeDisplay = (\n time: TimeValue | null,\n format: \"12\" | \"24\",\n showSeconds: boolean\n): string => {\n if (!time) return \"\";\n\n if (format === \"12\") {\n const { hour12, period } = to12Hour(time.hours);\n const parts = [padNumber(hour12), padNumber(time.minutes)];\n if (showSeconds) parts.push(padNumber(time.seconds ?? 0));\n\n return `${parts.join(\":\")} ${period}`;\n }\n\n const parts = [padNumber(time.hours), padNumber(time.minutes)];\n if (showSeconds) parts.push(padNumber(time.seconds ?? 0));\n\n return parts.join(\":\");\n};\n\nexport const parseTimeString = (\n input: string,\n format: \"12\" | \"24\"\n): TimeValue | null => {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n if (format === \"12\") {\n const match = trimmed.match(\n /^(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?\\s*(AM|PM)$/i\n );\n if (!match) return null;\n\n const hour12 = parseInt(match[1], 10);\n const minutes = parseInt(match[2], 10);\n const seconds = match[3] ? parseInt(match[3], 10) : 0;\n const period = match[4].toUpperCase() as \"AM\" | \"PM\";\n\n if (hour12 < 1 || hour12 > 12 || minutes > 59 || seconds > 59) return null;\n\n return { hours: to24Hour(hour12, period), minutes, seconds };\n }\n\n const match = trimmed.match(/^(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?$/);\n if (!match) return null;\n\n const hours = parseInt(match[1], 10);\n const minutes = parseInt(match[2], 10);\n const seconds = match[3] ? parseInt(match[3], 10) : 0;\n\n if (hours > 23 || minutes > 59 || seconds > 59) return null;\n\n return { hours, minutes, seconds };\n};\n\n/**\n * Format a TimeValue using a dayjs-style format string (e.g. \"h:mm A\").\n */\nexport const formatTimeWithPattern = (\n time: TimeValue | null,\n pattern: string\n): string => {\n if (!time) return \"\";\n\n return pureDayjs(\"2000-01-01T00:00:00\")\n .hour(time.hours)\n .minute(time.minutes)\n .second(time.seconds ?? 0)\n .format(pattern);\n};\n\n/**\n * Parse a time string against a dayjs-style format pattern.\n * Returns null if the string does not match the pattern.\n */\nexport const parseTimeWithPattern = (\n input: string,\n pattern: string\n): TimeValue | null => {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const parsed = pureDayjs(trimmed, pattern, true);\n if (!parsed.isValid()) return null;\n\n return {\n hours: parsed.hour(),\n minutes: parsed.minute(),\n seconds: parsed.second(),\n };\n};\n\n/**\n * Convert TimeValue to a timezone-aware Dayjs.\n * Formats in browser-local time, then reparses through timezone-aware dayjs.\n */\nexport const timeValueToDayjs = (time: TimeValue): Dayjs => {\n const h = padNumber(time.hours);\n const m = padNumber(time.minutes);\n const s = padNumber(time.seconds ?? 0);\n const today = dayjs(new Date()).format(\"YYYY-MM-DD\");\n\n return dayjs(`${today} ${h}:${m}:${s}`);\n};\n","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":["useState","useCallback","useLayoutEffect","useEffect","pureDayjs","customParseFormat","parts","match","minutes","seconds","dayjs","useRef","jsx","ScrollArea","cn","Button","forwardRef","jsxs","Fragment"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var DatePicker = require('../DatePicker-JhQ7D2bu.js');
3
+ var DatePicker = require('../DatePicker-Bg2LywGY.js');
4
4
  require('react/jsx-runtime');
5
5
  require('react');
6
6
  require('../primitives/Calendar.js');
@@ -32,14 +32,14 @@ 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('dayjs');
36
- require('dayjs/plugin/customParseFormat');
37
- require('@bigbinary/neeto-commons-frontend/utils');
38
- require('../TimePickerPanel-B5h5khbs.js');
35
+ require('../TimePickerPanel-DX6cjrSN.js');
39
36
  require('../primitives/Button.js');
40
37
  require('../primitives/ScrollArea.js');
41
38
  require('../index-BY6wgiQV.js');
42
39
  require('../index-EyWRfsCG.js');
40
+ require('dayjs');
41
+ require('dayjs/plugin/customParseFormat');
42
+ require('@bigbinary/neeto-commons-frontend/utils');
43
43
  require('../x-Brw3FJst.js');
44
44
 
45
45
 
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var TimePicker = require('../TimePicker-CU7qJpoT.js');
4
- var TimePickerPanel = require('../TimePickerPanel-B5h5khbs.js');
3
+ var TimePicker = require('../TimePicker-H3OpzvOm.js');
4
+ var TimePickerPanel = require('../TimePickerPanel-DX6cjrSN.js');
5
5
  require('react/jsx-runtime');
6
6
  require('react');
7
7
  require('../primitives/Popover.js');
@@ -34,6 +34,8 @@ require('../index-DuNgWCXZ.js');
34
34
  require('../primitives/ScrollArea.js');
35
35
  require('../index-BY6wgiQV.js');
36
36
  require('../index-EyWRfsCG.js');
37
+ require('dayjs');
38
+ require('dayjs/plugin/customParseFormat');
37
39
  require('@bigbinary/neeto-commons-frontend/utils');
38
40
 
39
41
 
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"TimePicker.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -10,7 +10,7 @@ var Callout = require('../Callout-CYIrflF1.js');
10
10
  var Checkbox = require('../Checkbox-CxqWOvFN.js');
11
11
  var ColorPicker = require('../ColorPicker-rhCnblTv.js');
12
12
  var DataTable = require('../DataTable-CCIIXb4B.js');
13
- var DatePicker = require('../DatePicker-JhQ7D2bu.js');
13
+ var DatePicker = require('../DatePicker-Bg2LywGY.js');
14
14
  var Dialog = require('../Dialog-CBSuKeu_.js');
15
15
  var Empty = require('../Empty-aQaWK0p4.js');
16
16
  var Input = require('../Input-BQh-GS_w.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-CU7qJpoT.js');
33
- var TimePickerPanel = require('../TimePickerPanel-B5h5khbs.js');
32
+ var TimePicker = require('../TimePicker-H3OpzvOm.js');
33
+ var TimePickerPanel = require('../TimePickerPanel-DX6cjrSN.js');
34
34
  var Toastr = require('../Toastr-CQ-R8VcZ.js');
35
35
  var Tooltip = require('../Tooltip-Dph_R3Ct.js');
36
36
  var TranslationProvider = require('../TranslationProvider-Dh5_Fzzk.js');
@@ -1 +1 @@
1
- {"version":3,"file":"BlockNavigation.js","sources":["../../../src/hooks/useNavPrompt.ts","../../../src/formik/BlockNavigation/BlockNavigationAlert.tsx","../../../src/formik/BlockNavigation/index.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useHistory } from \"react-router-dom\";\n\ninterface UseNavPromptOptions {\n /** Whether navigation should be blocked. */\n shouldBlock?: boolean;\n}\n\ninterface UseNavPromptReturn {\n /** Whether a navigation attempt is currently blocked. */\n isBlocked: boolean;\n /** Unblock and continue the pending navigation. */\n continueNavigation: () => void;\n /** Dismiss the prompt without navigating. */\n hidePrompt: () => void;\n}\n\nconst useNavPrompt = ({\n shouldBlock = true,\n}: UseNavPromptOptions): UseNavPromptReturn => {\n const [isBlocked, setIsBlocked] = useState(false);\n\n const history = useHistory();\n\n const unblockRef = useRef<(() => void) | undefined>(undefined);\n const navRef = useRef<{ transition: string; action: string } | null>(null);\n\n const handleNavigation = useCallback(\n (action: string, transition: string) => {\n switch (action) {\n case \"PUSH\":\n history.push(transition);\n break;\n case \"REPLACE\":\n history.replace(transition);\n break;\n case \"POP\":\n history.goBack();\n break;\n }\n },\n [history]\n );\n\n const continueNavigation = useCallback(() => {\n if (isBlocked && unblockRef.current) {\n unblockRef.current();\n setIsBlocked(false);\n if (navRef.current) {\n const { action, transition } = navRef.current;\n handleNavigation(action, transition);\n }\n }\n }, [isBlocked, handleNavigation]);\n\n const hidePrompt = useCallback(() => setIsBlocked(false), []);\n\n useEffect(() => {\n if (shouldBlock) {\n unblockRef.current = history.block(\n (transition: { pathname: string }, action: string) => {\n setIsBlocked(true);\n navRef.current = { transition: transition.pathname, action };\n\n return false;\n }\n ) as unknown as () => void;\n\n return () => {\n unblockRef.current?.();\n };\n }\n\n return undefined;\n }, [shouldBlock, history]);\n\n return { isBlocked, continueNavigation, hidePrompt };\n};\n\nexport { useNavPrompt };\nexport type { UseNavPromptOptions, UseNavPromptReturn };\n","import { useRef } from \"react\";\n\nimport { Button } from \"src/components/Button\";\nimport { Dialog } from \"src/components/Dialog\";\n\nexport interface BlockNavigationAlertProps {\n /** Whether the alert dialog is open. */\n isOpen?: boolean;\n /** Called when the dialog should close. */\n onClose?: () => void;\n /** Called when the user chooses to stay. */\n onSubmit?: () => void;\n /** Called when the user chooses to discard and leave. */\n onDiscardChanges?: () => void;\n /** Custom title for the alert. */\n title?: string;\n /** Custom message for the alert body. */\n message?: string;\n /** Custom label for the discard/cancel button. */\n cancelButtonLabel?: string;\n /** Custom label for the stay/submit button. */\n submitButtonLabel?: string;\n}\n\nconst BlockNavigationAlert = ({\n isOpen = false,\n onClose,\n onSubmit,\n onDiscardChanges,\n title = \"You have unsaved changes\",\n message = \"Are you sure you want to leave? All unsaved changes will be lost.\",\n cancelButtonLabel = \"Discard and leave\",\n submitButtonLabel = \"Stay on this page\",\n}: BlockNavigationAlertProps) => {\n const submitButtonRef = useRef<HTMLButtonElement>(null);\n\n return (\n <Dialog\n isOpen={isOpen}\n onClose={onClose ?? (() => {})}\n closeButton\n closeOnEsc\n closeOnOutsideClick\n initialFocusRef={submitButtonRef}\n size=\"medium\"\n data-testid=\"alert-box\"\n >\n <Dialog.Header>\n <Dialog.Title data-testid=\"alert-title\">{title}</Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n <p\n data-testid=\"alert-message\"\n className=\"text-sm text-muted-foreground\"\n >\n {message}\n </p>\n </Dialog.Body>\n <Dialog.Footer className=\"flex items-center justify-end gap-2\">\n <Button\n data-testid=\"alert-cancel-button\"\n label={cancelButtonLabel}\n variant=\"destructive\"\n onClick={onDiscardChanges}\n />\n <Button\n data-testid=\"alert-submit-button\"\n label={submitButtonLabel}\n ref={submitButtonRef}\n onClick={onSubmit}\n />\n </Dialog.Footer>\n </Dialog>\n );\n};\n\nBlockNavigationAlert.displayName = \"BlockNavigationAlert\";\n\nexport { BlockNavigationAlert };\n","import { useFormikContext } from \"formik\";\n\nimport { useNavPrompt } from \"src/hooks/useNavPrompt\";\n\nimport {\n BlockNavigationAlert,\n type BlockNavigationAlertProps,\n} from \"./BlockNavigationAlert\";\n\nexport interface FormikBlockNavigationProps extends Omit<\n BlockNavigationAlertProps,\n \"isOpen\" | \"onClose\" | \"onSubmit\" | \"onDiscardChanges\"\n> {\n /** Force the navigation block regardless of Formik dirty state. */\n isDirty?: boolean;\n}\n\nconst FormikBlockNavigation = ({\n isDirty = false,\n ...otherProps\n}: FormikBlockNavigationProps) => {\n const formikContext = useFormikContext();\n const shouldBlock =\n isDirty || (Boolean(formikContext) && Boolean(formikContext.dirty));\n\n const { isBlocked, continueNavigation, hidePrompt } = useNavPrompt({\n shouldBlock,\n });\n\n const handleDiscardChanges = () => {\n if (formikContext) formikContext.resetForm();\n hidePrompt();\n continueNavigation();\n };\n\n return (\n <BlockNavigationAlert\n isOpen={isBlocked}\n onClose={hidePrompt}\n onDiscardChanges={handleDiscardChanges}\n onSubmit={hidePrompt}\n {...otherProps}\n />\n );\n};\n\nFormikBlockNavigation.displayName = \"FormikBlockNavigation\";\n\nexport { FormikBlockNavigation };\nexport type { BlockNavigationAlertProps };\n"],"names":["useState","useHistory","useRef","useCallback","useEffect","jsxs","Dialog","jsx","Button","useFormikContext"],"mappings":"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"}
1
+ {"version":3,"file":"BlockNavigation.js","sources":["../../../src/formik/BlockNavigation/hooks/useNavPrompt.ts","../../../src/formik/BlockNavigation/BlockNavigationAlert.tsx","../../../src/formik/BlockNavigation/index.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useHistory } from \"react-router-dom\";\n\ninterface UseNavPromptOptions {\n /** Whether navigation should be blocked. */\n shouldBlock?: boolean;\n}\n\ninterface UseNavPromptReturn {\n /** Whether a navigation attempt is currently blocked. */\n isBlocked: boolean;\n /** Unblock and continue the pending navigation. */\n continueNavigation: () => void;\n /** Dismiss the prompt without navigating. */\n hidePrompt: () => void;\n}\n\nconst useNavPrompt = ({\n shouldBlock = true,\n}: UseNavPromptOptions): UseNavPromptReturn => {\n const [isBlocked, setIsBlocked] = useState(false);\n\n const history = useHistory();\n\n const unblockRef = useRef<(() => void) | undefined>(undefined);\n const navRef = useRef<{ transition: string; action: string } | null>(null);\n\n const handleNavigation = useCallback(\n (action: string, transition: string) => {\n switch (action) {\n case \"PUSH\":\n history.push(transition);\n break;\n case \"REPLACE\":\n history.replace(transition);\n break;\n case \"POP\":\n history.goBack();\n break;\n }\n },\n [history]\n );\n\n const continueNavigation = useCallback(() => {\n if (isBlocked && unblockRef.current) {\n unblockRef.current();\n setIsBlocked(false);\n if (navRef.current) {\n const { action, transition } = navRef.current;\n handleNavigation(action, transition);\n }\n }\n }, [isBlocked, handleNavigation]);\n\n const hidePrompt = useCallback(() => setIsBlocked(false), []);\n\n useEffect(() => {\n if (shouldBlock) {\n unblockRef.current = history.block(\n (transition: { pathname: string }, action: string) => {\n setIsBlocked(true);\n navRef.current = { transition: transition.pathname, action };\n\n return false;\n }\n ) as unknown as () => void;\n\n return () => {\n unblockRef.current?.();\n };\n }\n\n return undefined;\n }, [shouldBlock, history]);\n\n return { isBlocked, continueNavigation, hidePrompt };\n};\n\nexport { useNavPrompt };\nexport type { UseNavPromptOptions, UseNavPromptReturn };\n","import { useRef } from \"react\";\n\nimport { Button } from \"src/components/Button\";\nimport { Dialog } from \"src/components/Dialog\";\n\nexport interface BlockNavigationAlertProps {\n /** Whether the alert dialog is open. */\n isOpen?: boolean;\n /** Called when the dialog should close. */\n onClose?: () => void;\n /** Called when the user chooses to stay. */\n onSubmit?: () => void;\n /** Called when the user chooses to discard and leave. */\n onDiscardChanges?: () => void;\n /** Custom title for the alert. */\n title?: string;\n /** Custom message for the alert body. */\n message?: string;\n /** Custom label for the discard/cancel button. */\n cancelButtonLabel?: string;\n /** Custom label for the stay/submit button. */\n submitButtonLabel?: string;\n}\n\nconst BlockNavigationAlert = ({\n isOpen = false,\n onClose,\n onSubmit,\n onDiscardChanges,\n title = \"You have unsaved changes\",\n message = \"Are you sure you want to leave? All unsaved changes will be lost.\",\n cancelButtonLabel = \"Discard and leave\",\n submitButtonLabel = \"Stay on this page\",\n}: BlockNavigationAlertProps) => {\n const submitButtonRef = useRef<HTMLButtonElement>(null);\n\n return (\n <Dialog\n isOpen={isOpen}\n onClose={onClose ?? (() => {})}\n closeButton\n closeOnEsc\n closeOnOutsideClick\n initialFocusRef={submitButtonRef}\n size=\"medium\"\n data-testid=\"alert-box\"\n >\n <Dialog.Header>\n <Dialog.Title data-testid=\"alert-title\">{title}</Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n <p\n data-testid=\"alert-message\"\n className=\"text-sm text-muted-foreground\"\n >\n {message}\n </p>\n </Dialog.Body>\n <Dialog.Footer className=\"flex items-center justify-end gap-2\">\n <Button\n data-testid=\"alert-cancel-button\"\n label={cancelButtonLabel}\n variant=\"destructive\"\n onClick={onDiscardChanges}\n />\n <Button\n data-testid=\"alert-submit-button\"\n label={submitButtonLabel}\n ref={submitButtonRef}\n onClick={onSubmit}\n />\n </Dialog.Footer>\n </Dialog>\n );\n};\n\nBlockNavigationAlert.displayName = \"BlockNavigationAlert\";\n\nexport { BlockNavigationAlert };\n","import { useFormikContext } from \"formik\";\n\nimport { useNavPrompt } from \"./hooks/useNavPrompt\";\n\nimport {\n BlockNavigationAlert,\n type BlockNavigationAlertProps,\n} from \"./BlockNavigationAlert\";\n\nexport interface FormikBlockNavigationProps extends Omit<\n BlockNavigationAlertProps,\n \"isOpen\" | \"onClose\" | \"onSubmit\" | \"onDiscardChanges\"\n> {\n /** Force the navigation block regardless of Formik dirty state. */\n isDirty?: boolean;\n}\n\nconst FormikBlockNavigation = ({\n isDirty = false,\n ...otherProps\n}: FormikBlockNavigationProps) => {\n const formikContext = useFormikContext();\n const shouldBlock =\n isDirty || (Boolean(formikContext) && Boolean(formikContext.dirty));\n\n const { isBlocked, continueNavigation, hidePrompt } = useNavPrompt({\n shouldBlock,\n });\n\n const handleDiscardChanges = () => {\n if (formikContext) formikContext.resetForm();\n hidePrompt();\n continueNavigation();\n };\n\n return (\n <BlockNavigationAlert\n isOpen={isBlocked}\n onClose={hidePrompt}\n onDiscardChanges={handleDiscardChanges}\n onSubmit={hidePrompt}\n {...otherProps}\n />\n );\n};\n\nFormikBlockNavigation.displayName = \"FormikBlockNavigation\";\n\nexport { FormikBlockNavigation };\nexport type { BlockNavigationAlertProps };\n"],"names":["useState","useHistory","useRef","useCallback","useEffect","jsxs","Dialog","jsx","Button","useFormikContext"],"mappings":"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"}
package/dist/cjs/index.js CHANGED
@@ -14,7 +14,7 @@ var Callout = require('./Callout-CYIrflF1.js');
14
14
  var Checkbox = require('./Checkbox-CxqWOvFN.js');
15
15
  var ColorPicker = require('./ColorPicker-rhCnblTv.js');
16
16
  var DataTable = require('./DataTable-CCIIXb4B.js');
17
- var DatePicker = require('./DatePicker-JhQ7D2bu.js');
17
+ var DatePicker = require('./DatePicker-Bg2LywGY.js');
18
18
  var Dialog = require('./Dialog-CBSuKeu_.js');
19
19
  var DirectionProvider = require('./DirectionProvider-BTtE4FcN.js');
20
20
  var Empty = require('./Empty-aQaWK0p4.js');
@@ -34,7 +34,7 @@ var Stepper = require('./Stepper-DZb25oBH.js');
34
34
  var Switch = require('./Switch-BTkncHw2.js');
35
35
  var Tabs = require('./Tabs-YPRmLtUM.js');
36
36
  var Textarea = require('./Textarea-yWv-66yX.js');
37
- var TimePicker = require('./TimePicker-CU7qJpoT.js');
37
+ var TimePicker = require('./TimePicker-H3OpzvOm.js');
38
38
  var Toastr = require('./Toastr-CQ-R8VcZ.js');
39
39
  var Tooltip = require('./Tooltip-Dph_R3Ct.js');
40
40
  var Tree = require('./Tree-DAyVPLnJ.js');
@@ -107,11 +107,11 @@ require('./primitives/Pagination.js');
107
107
  require('./chevron-left-BldoOh5p.js');
108
108
  require('./ellipsis-4aubOI2n.js');
109
109
  require('./primitives/Calendar.js');
110
- require('dayjs');
111
- require('dayjs/plugin/customParseFormat');
112
- require('./TimePickerPanel-B5h5khbs.js');
110
+ require('./TimePickerPanel-DX6cjrSN.js');
113
111
  require('./primitives/ScrollArea.js');
114
112
  require('./index-EyWRfsCG.js');
113
+ require('dayjs');
114
+ require('dayjs/plugin/customParseFormat');
115
115
  require('./primitives/Empty.js');
116
116
  require('./primitives/InputGroup.js');
117
117
  require('./input-group-8TZFHzVl.js');
@@ -1,5 +1,7 @@
1
+ import type { TimeValue } from "../TimePicker/types";
1
2
  export declare const DEFAULT_DATE_FORMAT = "dd/MM/yyyy";
2
3
  export declare const DEFAULT_TIME_FORMAT = "HH:mm:ss";
4
+ export declare const INITIAL_TIME_VALUE: TimeValue;
3
5
  export declare const SIZE_CONFIG: {
4
6
  readonly small: {
5
7
  readonly trigger: "h-8 md:h-7";
@@ -9,6 +9,8 @@ export interface DatePickerProps {
9
9
  defaultValue?: DateValue | [DateValue | null, DateValue | null];
10
10
  /** Callback on date change. Returns Dayjs objects for neeto ecosystem compatibility. */
11
11
  onChange?: (value: Dayjs | [Dayjs, Dayjs] | null, formatted: string | [string, string]) => void;
12
+ /** Callback when the trigger input loses focus. */
13
+ onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
12
14
  /** Single date or range selection. */
13
15
  type?: DatePickerType;
14
16
  /** Display format string (date-fns compatible, e.g. "dd/MM/yyyy"). */
@@ -49,7 +51,9 @@ export interface DatePickerProps {
49
51
  onOk?: (value: Date | [Date, Date] | null) => void;
50
52
  /** Whether OK button is needed to confirm selection. */
51
53
  needConfirm?: boolean;
52
- /** Callback when popover opens/closes. */
54
+ /** Controlled popover open state. Omit for uncontrolled. */
55
+ open?: boolean;
56
+ /** Callback when popover opens/closes (fires for both controlled and uncontrolled). */
53
57
  onOpenChange?: (open: boolean) => void;
54
58
  /** Additional CSS class names. */
55
59
  className?: string;
@@ -27,5 +27,6 @@ export declare const applyTimeToDate: (date: Date, time: TimeValue) => Date;
27
27
  export declare const applyTimezone: (date: Date) => Date;
28
28
  export declare const toDayjs: (date: Date) => Dayjs;
29
29
  export declare const getDisplayFormat: (dateFormat: string, timeFormat: string, showTime: boolean) => string;
30
+ export declare const getDatePlaceholder: (dateFormat: string, timeFormat: string, showTime: boolean, type: "date" | "range") => string;
30
31
  export declare const isDatePartComplete: (part: string, maskEnabled: boolean, singleDateLen: number) => boolean;
31
32
  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-D-0HMiNG.js';
1
+ export { D as DatePicker } from '../DatePicker-DGf2BiNq.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
4
4
  import '../primitives/Calendar.js';
@@ -30,13 +30,13 @@ 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 'dayjs';
34
- import 'dayjs/plugin/customParseFormat';
35
- import '@bigbinary/neeto-commons-frontend/utils';
36
- import '../TimePickerPanel-zWmOy3Eo.js';
33
+ import '../TimePickerPanel--KDX5QwS.js';
37
34
  import '../primitives/Button.js';
38
35
  import '../primitives/ScrollArea.js';
39
36
  import '../index-d0BBQf5t.js';
40
37
  import '../index-BfAAoDv6.js';
38
+ import 'dayjs';
39
+ import 'dayjs/plugin/customParseFormat';
40
+ import '@bigbinary/neeto-commons-frontend/utils';
41
41
  import '../x-_o2T3n6D.js';
42
42
  //# sourceMappingURL=DatePicker.js.map
@@ -1,3 +1,20 @@
1
1
  export declare const COLUMN_HEIGHT = 224;
2
2
  export declare const ITEM_HEIGHT = 32;
3
3
  export declare const PERIODS: readonly ["AM", "PM"];
4
+ export declare const SIZE_CONFIG: {
5
+ readonly small: {
6
+ readonly trigger: "h-8 md:h-7";
7
+ readonly input: "text-base md:text-xs";
8
+ readonly icon: "size-3.5";
9
+ };
10
+ readonly medium: {
11
+ readonly trigger: "h-8";
12
+ readonly input: "text-base md:text-sm";
13
+ readonly icon: "size-4";
14
+ };
15
+ readonly large: {
16
+ readonly trigger: "h-10";
17
+ readonly input: "text-base md:text-sm";
18
+ readonly icon: "size-5";
19
+ };
20
+ };
@@ -1,3 +1,3 @@
1
1
  export { TimePicker } from "./TimePicker";
2
2
  export { TimePickerPanel } from "./TimePickerPanel";
3
- export type { TimePickerProps, TimePickerPanelProps, TimeValue, TimePickerFormat, } from "./types";
3
+ export type { TimePickerProps, TimePickerPanelProps, TimeValue, TimePickerFormat, TimePickerType, } from "./types";
@@ -25,13 +25,20 @@ export interface TimePickerPanelProps {
25
25
  /** Additional CSS class names. */
26
26
  className?: string;
27
27
  }
28
+ export type TimePickerType = "time" | "range";
28
29
  export interface TimePickerProps {
29
- /** Current time value. Accepts TimeValue, Date, or Dayjs. */
30
- value?: TimeValue | Date;
31
- /** Callback when time changes. Returns Dayjs object and formatted string for neeto ecosystem compatibility. */
32
- onChange?: (value: unknown, timeString: string) => void;
30
+ /** Current time value. TimeValue/Date/Dayjs for single, [TimeValue|Date, TimeValue|Date] for range. */
31
+ value?: TimeValue | Date | [TimeValue | Date | null, TimeValue | Date | null] | null;
32
+ /** Callback when time changes. Returns Dayjs object (or [Dayjs, Dayjs] for range) and formatted string. */
33
+ onChange?: (value: unknown, timeString: string | [string, string]) => void;
34
+ /** Callback when the trigger input(s) lose focus. */
35
+ onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
36
+ /** Single time or range selection. */
37
+ type?: TimePickerType;
33
38
  /** 12-hour or 24-hour format. */
34
39
  format?: TimePickerFormat;
40
+ /** Custom display format string (dayjs syntax, e.g. "h:mm A"). Overrides default format/showSeconds for display & parsing. */
41
+ displayFormat?: string;
35
42
  /** Show seconds column. */
36
43
  showSeconds?: boolean;
37
44
  /** Minute step interval (e.g. 5 for 0, 5, 10...). */
@@ -54,6 +61,14 @@ export interface TimePickerProps {
54
61
  required?: boolean;
55
62
  /** Timezone display tag (replaces clock icon). */
56
63
  timezone?: string;
64
+ /** Controlled popover open state. Omit for uncontrolled. */
65
+ open?: boolean;
66
+ /** Callback when popover open state changes (fires for both controlled and uncontrolled). */
67
+ onOpenChange?: (open: boolean) => void;
68
+ /** Render an OK button; defer onChange until OK is clicked or popover closes. Defaults to true (matches antd). Pass false for live onChange. */
69
+ needConfirm?: boolean;
70
+ /** Callback when the OK button is clicked (only relevant when `needConfirm` is true). */
71
+ onOk?: (value: unknown) => void;
57
72
  /** Props forwarded to the label element. */
58
73
  labelProps?: Record<string, unknown>;
59
74
  /** Additional CSS class names. */
@@ -7,9 +7,22 @@ export declare const to12Hour: (hour24: number) => {
7
7
  };
8
8
  export declare const to24Hour: (hour12: number, period: "AM" | "PM") => number;
9
9
  export declare const dateToTimeValue: (date: Date) => TimeValue;
10
+ export declare const coerceToTimeValue: (value: TimeValue | Date | null | undefined) => TimeValue | null;
11
+ export declare const timeValueEquals: (a: TimeValue | null, b: TimeValue | null) => boolean;
12
+ export declare const getDefaultTimeMaskFormat: (format: "12" | "24", showSeconds: boolean) => string;
13
+ export declare const getTimePlaceholder: (format: "12" | "24", showSeconds: boolean, displayFormat?: string) => string;
10
14
  export declare const padNumber: (num: number, length?: number) => string;
11
15
  export declare const formatTimeDisplay: (time: TimeValue | null, format: "12" | "24", showSeconds: boolean) => string;
12
16
  export declare const parseTimeString: (input: string, format: "12" | "24") => TimeValue | null;
17
+ /**
18
+ * Format a TimeValue using a dayjs-style format string (e.g. "h:mm A").
19
+ */
20
+ export declare const formatTimeWithPattern: (time: TimeValue | null, pattern: string) => string;
21
+ /**
22
+ * Parse a time string against a dayjs-style format pattern.
23
+ * Returns null if the string does not match the pattern.
24
+ */
25
+ export declare const parseTimeWithPattern: (input: string, pattern: string) => TimeValue | null;
13
26
  /**
14
27
  * Convert TimeValue to a timezone-aware Dayjs.
15
28
  * Formats in browser-local time, then reparses through timezone-aware dayjs.
@@ -1,5 +1,5 @@
1
- export { T as TimePicker } from '../TimePicker-CSjiggpr.js';
2
- export { T as TimePickerPanel } from '../TimePickerPanel-zWmOy3Eo.js';
1
+ export { T as TimePicker } from '../TimePicker-DoL126Ql.js';
2
+ export { T as TimePickerPanel } from '../TimePickerPanel--KDX5QwS.js';
3
3
  import 'react/jsx-runtime';
4
4
  import 'react';
5
5
  import '../primitives/Popover.js';
@@ -32,5 +32,7 @@ import '../index-CfriMyrd.js';
32
32
  import '../primitives/ScrollArea.js';
33
33
  import '../index-d0BBQf5t.js';
34
34
  import '../index-BfAAoDv6.js';
35
+ import 'dayjs';
36
+ import 'dayjs/plugin/customParseFormat';
35
37
  import '@bigbinary/neeto-commons-frontend/utils';
36
38
  //# sourceMappingURL=TimePicker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"TimePicker.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}