@featherk/composables 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +62 -15
  2. package/dist/address.cjs +2 -0
  3. package/dist/address.cjs.map +1 -0
  4. package/dist/address.mjs +6 -0
  5. package/dist/address.mjs.map +1 -0
  6. package/dist/chunks/useActiveIdRegistry-BG8VR__Z.mjs +43 -0
  7. package/dist/chunks/useActiveIdRegistry-BG8VR__Z.mjs.map +1 -0
  8. package/dist/chunks/useActiveIdRegistry-C1b00tqW.cjs +2 -0
  9. package/dist/chunks/useActiveIdRegistry-C1b00tqW.cjs.map +1 -0
  10. package/dist/chunks/useCompositeId-DyrJ0Fqj.cjs +2 -0
  11. package/dist/chunks/useCompositeId-DyrJ0Fqj.cjs.map +1 -0
  12. package/dist/chunks/useCompositeId-xg87ehXQ.mjs +9 -0
  13. package/dist/chunks/useCompositeId-xg87ehXQ.mjs.map +1 -0
  14. package/dist/chunks/useFieldsetValidationKit-7W1XDbbr.cjs +2 -0
  15. package/dist/chunks/useFieldsetValidationKit-7W1XDbbr.cjs.map +1 -0
  16. package/dist/chunks/useFieldsetValidationKit-x0Rh48mE.mjs +64 -0
  17. package/dist/chunks/useFieldsetValidationKit-x0Rh48mE.mjs.map +1 -0
  18. package/dist/chunks/useGridRowAction-Di25yeqb.cjs +2 -0
  19. package/dist/chunks/useGridRowAction-Di25yeqb.cjs.map +1 -0
  20. package/dist/chunks/useGridRowAction-akjwkV_F.mjs +532 -0
  21. package/dist/chunks/useGridRowAction-akjwkV_F.mjs.map +1 -0
  22. package/dist/chunks/useIntersectionObserver-A4xQV_pl.mjs +23 -0
  23. package/dist/chunks/useIntersectionObserver-A4xQV_pl.mjs.map +1 -0
  24. package/dist/chunks/useIntersectionObserver-CfgNAo2N.cjs +2 -0
  25. package/dist/chunks/useIntersectionObserver-CfgNAo2N.cjs.map +1 -0
  26. package/dist/chunks/useMaskedDateInput-COOksUM_.mjs +276 -0
  27. package/dist/chunks/useMaskedDateInput-COOksUM_.mjs.map +1 -0
  28. package/dist/chunks/useMaskedDateInput-wRnYlR3L.cjs +2 -0
  29. package/dist/chunks/useMaskedDateInput-wRnYlR3L.cjs.map +1 -0
  30. package/dist/chunks/useMaskedDateRangeInput-DST5aQe0.cjs +2 -0
  31. package/dist/chunks/useMaskedDateRangeInput-DST5aQe0.cjs.map +1 -0
  32. package/dist/chunks/useMaskedDateRangeInput-owYSg36r.mjs +328 -0
  33. package/dist/chunks/useMaskedDateRangeInput-owYSg36r.mjs.map +1 -0
  34. package/dist/chunks/useMaskedTimeInput-DPd2lysd.cjs +2 -0
  35. package/dist/chunks/useMaskedTimeInput-DPd2lysd.cjs.map +1 -0
  36. package/dist/chunks/useMaskedTimeInput-DjtBdvsf.mjs +363 -0
  37. package/dist/chunks/useMaskedTimeInput-DjtBdvsf.mjs.map +1 -0
  38. package/dist/chunks/usePopupMenu-CZLtgrXk.mjs +296 -0
  39. package/dist/chunks/usePopupMenu-CZLtgrXk.mjs.map +1 -0
  40. package/dist/chunks/usePopupMenu-DeTWakUH.cjs +2 -0
  41. package/dist/chunks/usePopupMenu-DeTWakUH.cjs.map +1 -0
  42. package/dist/chunks/usePopupTrap-DQudM6YA.cjs +2 -0
  43. package/dist/chunks/usePopupTrap-DQudM6YA.cjs.map +1 -0
  44. package/dist/chunks/usePopupTrap-DeuXHLZR.mjs +105 -0
  45. package/dist/chunks/usePopupTrap-DeuXHLZR.mjs.map +1 -0
  46. package/dist/chunks/useUSAddress-BYZZfbHc.cjs +2 -0
  47. package/dist/chunks/useUSAddress-BYZZfbHc.cjs.map +1 -0
  48. package/dist/chunks/useUSAddress-CRcqdqrZ.mjs +291 -0
  49. package/dist/chunks/useUSAddress-CRcqdqrZ.mjs.map +1 -0
  50. package/dist/chunks/useWindow-C4XFBuJA.mjs +210 -0
  51. package/dist/chunks/useWindow-C4XFBuJA.mjs.map +1 -0
  52. package/dist/chunks/useWindow-Yia2I6zX.cjs +2 -0
  53. package/dist/chunks/useWindow-Yia2I6zX.cjs.map +1 -0
  54. package/dist/date/useMaskedDateInput.d.ts +4 -0
  55. package/dist/date.cjs +2 -0
  56. package/dist/date.cjs.map +1 -0
  57. package/dist/date.mjs +5 -0
  58. package/dist/date.mjs.map +1 -0
  59. package/dist/{docs-manifest.js → docs-manifest.mjs} +24 -24
  60. package/dist/form.cjs +2 -0
  61. package/dist/form.cjs.map +1 -0
  62. package/dist/form.mjs +6 -0
  63. package/dist/form.mjs.map +1 -0
  64. package/dist/geometry.cjs +2 -0
  65. package/dist/geometry.cjs.map +1 -0
  66. package/dist/geometry.mjs +60 -0
  67. package/dist/geometry.mjs.map +1 -0
  68. package/dist/grid.cjs +2 -0
  69. package/dist/grid.cjs.map +1 -0
  70. package/dist/grid.mjs +7 -0
  71. package/dist/grid.mjs.map +1 -0
  72. package/dist/id.cjs +2 -0
  73. package/dist/id.cjs.map +1 -0
  74. package/dist/id.mjs +5 -0
  75. package/dist/id.mjs.map +1 -0
  76. package/dist/index.cjs +2 -0
  77. package/dist/index.cjs.map +1 -0
  78. package/dist/index.d.ts +3 -3
  79. package/dist/index.mjs +37 -0
  80. package/dist/index.mjs.map +1 -0
  81. package/dist/menu.cjs +2 -0
  82. package/dist/menu.cjs.map +1 -0
  83. package/dist/menu.mjs +5 -0
  84. package/dist/menu.mjs.map +1 -0
  85. package/dist/observer.cjs +2 -0
  86. package/dist/observer.cjs.map +1 -0
  87. package/dist/observer.mjs +5 -0
  88. package/dist/observer.mjs.map +1 -0
  89. package/dist/range/useMaskedDateRangeInput.d.ts +4 -0
  90. package/dist/range.cjs +2 -0
  91. package/dist/range.cjs.map +1 -0
  92. package/dist/range.mjs +5 -0
  93. package/dist/range.mjs.map +1 -0
  94. package/dist/registry.cjs +2 -0
  95. package/dist/registry.cjs.map +1 -0
  96. package/dist/registry.mjs +6 -0
  97. package/dist/registry.mjs.map +1 -0
  98. package/dist/time/useMaskedTimeInput.d.ts +4 -0
  99. package/dist/time.cjs +2 -0
  100. package/dist/time.cjs.map +1 -0
  101. package/dist/time.mjs +5 -0
  102. package/dist/time.mjs.map +1 -0
  103. package/dist/trap.cjs +2 -0
  104. package/dist/trap.cjs.map +1 -0
  105. package/dist/trap.mjs +7 -0
  106. package/dist/trap.mjs.map +1 -0
  107. package/dist/window.cjs +2 -0
  108. package/dist/window.cjs.map +1 -0
  109. package/dist/window.mjs +6 -0
  110. package/dist/window.mjs.map +1 -0
  111. package/docs/date/useMaskedDateInput.md +3 -0
  112. package/docs/range/useMaskedDateRangeInput.md +6 -7
  113. package/docs/time/useMaskedTimeInput.md +3 -0
  114. package/package.json +38 -36
  115. package/dist/featherk-composables.es.js +0 -2628
  116. package/dist/featherk-composables.es.js.map +0 -1
  117. package/dist/featherk-composables.umd.js +0 -2
  118. package/dist/featherk-composables.umd.js.map +0 -1
  119. /package/dist/{docs-manifest.d.ts → docs-manifest.d.mts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMaskedDateInput-wRnYlR3L.cjs","sources":["../../src/date/useMaskedDateInput.ts"],"sourcesContent":["import {\n computed,\n nextTick,\n onMounted,\n readonly,\n ref,\n watch,\n type Ref,\n} from \"vue\";\n\nexport type ChangePayload = { value: Date | null; event: any };\n\nexport function useMaskedDateInput(args: {\n id: string;\n onChange: (p: ChangePayload) => void;\n onShowCalendar: (e: KeyboardEvent) => void;\n externalValue?: Ref<string | Date | null | undefined>;\n min?: Date | null | undefined;\n max?: Date | null | undefined;\n /** When true, empty/incomplete value is considered invalid after blur */\n required?: boolean;\n /** Optional default date for this field (e.g., today). */\n defaultValue?: Date | null;\n dateFormat?: string;\n debug?: boolean;\n}) {\n const raw = ref(\"\");\n const cursorPos = ref<number | undefined>(undefined);\n const debugEnabled = ref<boolean>(!!args.debug);\n const placeholder = ref<string>(args.dateFormat ?? \"mm/dd/yyyy\");\n const isRequired = computed(() => !!args.required);\n const MIN_YEAR = 1000;\n const isTouched = ref(false);\n\n const steppers: string[] = [\"ArrowUp\", \"ArrowDown\"];\n const cursorKeys: string[] = [\"ArrowLeft\", \"ArrowRight\"];\n\n const digitsOnly = computed(() => (raw.value ?? \"\").replace(/\\D/g, \"\"));\n\n const datePart = (pos: number) => {\n if (pos <= 2) return \"mm\";\n if (pos <= 5) return \"dd\";\n if (digitsOnly.value.length <= 10) return \"yyyy\";\n return \"mm\";\n };\n\n const month = computed(() => {\n const m = raw.value\n ? raw.value.substring(0, 2).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n return parseInt(m).toString().padStart(2, \"0\");\n });\n const day = computed(() => {\n const d = raw.value\n ? raw.value.substring(3, 5).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n return parseInt(d).toString().padStart(2, \"0\");\n });\n const year = computed(() => {\n const y = raw.value\n ? raw.value.substring(6, 10).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n return parseInt(y).toString().padStart(4, \"0\");\n });\n\n const emitParsedIfComplete = (event: any) => {\n if (digitsOnly.value.length === 0) {\n args.onChange({ value: null, event });\n return;\n }\n if (digitsOnly.value.length < 8) {\n args.onChange({ value: null, event });\n return;\n }\n if ((raw.value ?? \"\").length === 10 && digitsOnly.value.length === 8) {\n const [mmStr, ddStr, yyyyStr] = raw.value.split(\"/\");\n const mm = parseInt(mmStr);\n const dd = parseInt(ddStr);\n const yyyy = parseInt(yyyyStr);\n // Prevent auto-correction: only emit if parts are a real calendar date\n if (isValidParts(yyyy, mm, dd)) {\n const d = createDate(yyyy, mm, dd);\n if (inRange(d)) {\n args.onChange({ value: d, event });\n } else {\n args.onChange({ value: null, event });\n }\n } else {\n args.onChange({ value: null, event });\n }\n }\n };\n const inRange = (d: Date) => {\n const min = args.min ?? undefined;\n const max = args.max ?? undefined;\n if (min && d < min) return false;\n if (max && d > max) return false;\n return true;\n };\n\n const parsedRawDate = computed<Date | null>(() => {\n if ((raw.value ?? \"\").length === 10 && digitsOnly.value.length === 8) {\n const [mmStr, ddStr, yyyyStr] = (raw.value ?? \"\").split(\"/\");\n const mm = parseInt(mmStr);\n const dd = parseInt(ddStr);\n const yyyy = parseInt(yyyyStr);\n if (isValidParts(yyyy, mm, dd)) {\n return createDate(yyyy, mm, dd);\n }\n }\n return null;\n });\n\n const isComplete = computed(() => {\n return (raw.value ?? \"\").length === 10 && digitsOnly.value.length === 8;\n });\n\n // Helpers to centralize validity checks and baseline selection\n const createDate = (yy: number, mm: number, dd: number) => {\n const date = new Date(0);\n date.setFullYear(yy, mm - 1, dd);\n date.setHours(0, 0, 0, 0);\n return date;\n };\n\n const daysInMonth = (yy: number, mm: number) => {\n return createDate(yy, mm + 1, 0).getDate();\n };\n\n const isValidParts = (yy: number, mm: number, dd: number) => {\n return (\n mm >= 1 &&\n mm <= 12 &&\n yy >= MIN_YEAR &&\n dd >= 1 &&\n dd <= daysInMonth(yy, mm)\n );\n };\n\n const handleChange = (event: any): void => {\n raw.value = event.value as string;\n const src = event.event?.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n emitParsedIfComplete(event);\n };\n\n const handleClick = (event: MouseEvent): void => {\n cursorPos.value = (event.target as HTMLInputElement).selectionStart ?? 0;\n };\n\n const applyStep = (\n direction: \"ArrowUp\" | \"ArrowDown\",\n sourceEl: HTMLInputElement | null | undefined,\n event: Event,\n ): void => {\n const pos = sourceEl?.selectionStart ?? cursorPos.value ?? 0;\n cursorPos.value = pos;\n let m = parseInt(month.value);\n let d = parseInt(day.value);\n let y = parseInt(year.value);\n\n // If input is invalid or incomplete, set to today's date and ignore the step\n const hasEightDigits = digitsOnly.value.length >= 8;\n if (!hasEightDigits || !isValidParts(y, m, d)) {\n const today = args.defaultValue ?? new Date();\n m = today.getMonth() + 1;\n d = today.getDate();\n y = today.getFullYear();\n raw.value = `${String(m).padStart(2, \"0\")}/${String(d).padStart(\n 2,\n \"0\",\n )}/${String(y)}`;\n\n const setDate = createDate(y, m, d);\n args.onChange({ value: inRange(setDate) ? setDate : null, event });\n\n focusAndRestore({ useRAF: true });\n return;\n }\n\n const part = datePart(pos);\n\n if (part === \"mm\") {\n m = direction === \"ArrowUp\" ? (m < 12 ? m + 1 : 1) : m > 1 ? m - 1 : 12;\n } else if (part === \"dd\") {\n const days = new Date(y, m, 0).getDate();\n d =\n direction === \"ArrowUp\" ? (d < days ? d + 1 : 1) : d > 1 ? d - 1 : days;\n } else if (part === \"yyyy\") {\n y = direction === \"ArrowUp\" ? y + 1 : Math.max(1, y - 1);\n }\n\n raw.value = `${String(m).padStart(2, \"0\")}/${String(d).padStart(\n 2,\n \"0\",\n )}/${String(y)}`;\n\n const [mmStr, ddStr, yyyyStr] = raw.value.split(\"/\");\n const steppedDate = createDate(\n parseInt(yyyyStr),\n parseInt(mmStr),\n parseInt(ddStr),\n );\n if (\n steppedDate.toString() !== \"Invalid Date\" &&\n parseInt(yyyyStr) >= 1000\n ) {\n args.onChange({\n value: inRange(steppedDate) ? steppedDate : null,\n event,\n });\n } else {\n args.onChange({ value: null, event });\n }\n\n focusAndRestore({ useRAF: true });\n };\n\n // Wheel events can target the MaskedTextBox wrapper, so fall back to the input by id.\n const resolveInput = (event: Event): HTMLInputElement | null =>\n event.target instanceof HTMLInputElement\n ? event.target\n : (document.getElementById(args.id) as HTMLInputElement | null);\n\n // Native disabled/readonly is the source of truth, so plain Kendo inputs get the guard too.\n const isEditable = (el: HTMLInputElement | null): boolean =>\n !el?.disabled && !el?.readOnly;\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (!isEditable(resolveInput(event))) return;\n if (event.code === \"Space\" || event.key === \" \") {\n // Justified: Space opens the calendar popup instead of inserting a space.\n event.preventDefault();\n // Justified: Parent containers such as grid keyboard handlers should not consume this.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n // Alt+Down opens the menu; allow Alt combos to pass through\n if (event.key === \"ArrowDown\" && event.altKey) {\n // Justified: Alt+Down is reserved for opening the calendar popup.\n event.preventDefault();\n // Justified: Prevent parent keyboard navigation from treating this as row movement.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n if (steppers.includes(event.key)) {\n if (event.altKey) return;\n // Justified: ArrowUp/Down act as date-part steppers instead of native caret/page behavior.\n event.preventDefault();\n // Justified: Prevent parent containers such as the grid from also handling these arrows.\n event.stopPropagation();\n const src = event.target as HTMLInputElement;\n applyStep(event.key as \"ArrowUp\" | \"ArrowDown\", src, event);\n return;\n }\n };\n\n const handleWheel = (event: WheelEvent): void => {\n const input = resolveInput(event);\n // Let the page scroll when the input can't be edited.\n if (!isEditable(input)) return;\n // Map mouse wheel to stepper behavior (up/down) based on caret segment\n // Prevent page scroll when interacting with the input\n event.preventDefault();\n const direction = event.deltaY < 0 ? \"ArrowUp\" : \"ArrowDown\";\n applyStep(direction, input, event);\n };\n\n const handleKeyUp = (event: KeyboardEvent): void => {\n const src = event.target as HTMLInputElement;\n if (cursorKeys.includes(event.key)) {\n // Do not prevent default for caret navigation\n cursorPos.value = src?.selectionStart ?? 0;\n return;\n }\n if (steppers.includes(event.key)) {\n if (event.altKey) return;\n cursorPos.value = src?.selectionStart ?? 0;\n }\n };\n\n const handleBlur = (event: FocusEvent): void => {\n isTouched.value = true;\n\n // If required, no default provided, and value is still undefined/blank,\n // coerce external value from undefined -> \"\" so downstream validation\n // treats this as an incomplete required field.\n if (\n isRequired.value &&\n !args.defaultValue &&\n args.externalValue &&\n args.externalValue.value === undefined &&\n digitsOnly.value.length === 0\n ) {\n (args.externalValue as Ref<any>).value = \"\";\n }\n\n // Also ensure caret position is captured on blur\n const src = event.target as HTMLInputElement | null;\n if (src) {\n cursorPos.value = src.selectionStart ?? 0;\n }\n };\n\n // Centralized focus + caret restore helper to avoid duplicated logic.\n const focusAndRestore = (opts?: {\n /** milliseconds to delay the focus (useful to wait for popups to close) */\n delay?: number;\n /** when true, use requestAnimationFrame to schedule the focus */\n useRAF?: boolean;\n /** explicit caret position override; otherwise uses `cursorPos` or end */\n pos?: number | undefined;\n }) => {\n const run = () => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (!inputEl) return;\n const p = opts?.pos ?? cursorPos.value ?? inputEl.value.length;\n try {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n } catch {\n // ignore if element not focusable or selection not supported\n }\n };\n\n nextTick(() => {\n if (opts?.delay && opts.delay > 0) {\n setTimeout(run, opts.delay);\n return;\n }\n if (opts?.useRAF) {\n requestAnimationFrame(run);\n return;\n }\n run();\n });\n };\n\n // Sync external value into raw when provided\n if (args.externalValue) {\n watch(\n args.externalValue,\n (newVal) => {\n if (newVal) {\n const date = new Date(newVal as any);\n if (date.toString() !== \"Invalid Date\") {\n const m = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const d = date.getDate().toString().padStart(2, \"0\");\n const y = date.getFullYear().toString();\n raw.value = `${m}/${d}/${y}`;\n\n // When external value is updated (e.g., user selects a date\n // from the calendar), refocus the input and restore caret.\n // Delay slightly to avoid Kendo calendar focus/DOM operations\n // overriding our focus call.\n focusAndRestore({ delay: 50 });\n return;\n }\n }\n // If external value is null/invalid, keep current raw as-is\n },\n { immediate: true },\n );\n }\n\n const debugLines = computed(() => {\n return [\n [\"Date\", `${month.value} / ${day.value} / ${year.value}`],\n [\"Digits only\", digitsOnly.value],\n [\n \"min\",\n args.min?.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }) ?? null,\n ],\n [\n \"max\",\n args.max?.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }) ?? null,\n ],\n ];\n });\n\n // Range validation based on provided min/max and current external value\n const isValid = computed(() => {\n // Optional field preserves existing forgiving behavior\n if (!isRequired.value) {\n if (!isComplete.value) return true;\n const candidate = parsedRawDate.value;\n if (!candidate) return false; // complete but invalid parts\n return inRange(candidate);\n }\n\n // Required field: do not flag invalid until after blur\n if (!isTouched.value) return true;\n\n const candidate = parsedRawDate.value;\n if (!isComplete.value) return false; // incomplete after blur\n if (!candidate) return false; // complete but invalid parts\n return inRange(candidate);\n });\n\n const reason = computed<string | undefined>(() => {\n // When not required, only report reasons for completed-but-bad values\n if (!isRequired.value) {\n if (!isComplete.value) return undefined;\n const candidate = parsedRawDate.value;\n if (!candidate) return \"invalid-date\";\n if (!inRange(candidate)) return \"out-of-bounds\";\n return \"valid\";\n }\n\n // Required: only validate after blur\n if (!isTouched.value) return undefined;\n\n if (digitsOnly.value.length === 0 || !isComplete.value) {\n return \"incomplete\";\n }\n\n const candidate = parsedRawDate.value;\n if (!candidate) return \"invalid-date\";\n if (!inRange(candidate)) return \"out-of-bounds\";\n return \"valid\";\n });\n\n const validationMessage = computed(() => {\n const r = reason.value;\n if (!r || r === \"valid\") return \"\";\n\n if (r === \"incomplete\") {\n return \"Required\";\n }\n\n if (r === \"invalid-date\") {\n return `Must be in ${placeholder.value} format.`;\n }\n\n const minStr = args.min\n ? args.min.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n })\n : null;\n const maxStr = args.max\n ? args.max.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n })\n : null;\n if (r === \"out-of-bounds\") {\n if (minStr && maxStr) return `Must be between ${minStr} and ${maxStr}.`;\n if (minStr) return `Must be on or after ${minStr}.`;\n if (maxStr) return `Must be on or before ${maxStr}.`;\n }\n\n return \"\";\n });\n\n const initStyling = () => {\n // Adds our `fk-datepicker` class to the parent of the Kendo datepicker\n // This is separated so callers can invoke styling on demand.\n nextTick(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n\n if (!inputEl) {\n console.warn(`ID (#${args.id}) not found for styling.`);\n return;\n }\n const datePicker = inputEl.closest(\".k-datepicker\");\n if (!datePicker) {\n console.warn(`.k-datepicker parent not found for #${args.id} styling.`);\n return;\n }\n\n // Add class to parent to avoid it being wiped away by Kendo's DOM manipulation\n const parent = datePicker.parentElement;\n if (parent) {\n // Idempotent: if we've already added our class, do nothing.\n if (parent.classList.contains(\"fk-datepicker\")) {\n return;\n }\n parent.classList.add(\"fk-datepicker\");\n } else {\n console.warn(\n `Parent of .k-datepicker not found for #${args.id} styling.`,\n );\n }\n });\n };\n\n onMounted(() => {\n initStyling();\n });\n\n return {\n id: args.id,\n min: args.min,\n max: args.max,\n raw,\n cursorPos,\n debugEnabled,\n debugLines,\n placeholder,\n isValid,\n reason: readonly(reason),\n validationMessage,\n digitsOnly,\n month: readonly(month),\n day: readonly(day),\n year: readonly(year),\n datePart,\n handleChange,\n handleKeyDown,\n handleWheel,\n handleKeyUp,\n handleClick,\n handleBlur,\n // Expose so consumers can re-run styling when needed\n initStyling,\n };\n}\n\nexport type UseMaskedDateInputReturn = ReturnType<typeof useMaskedDateInput>;\n"],"names":["useMaskedDateInput","args","raw","ref","cursorPos","debugEnabled","placeholder","isRequired","computed","MIN_YEAR","isTouched","steppers","cursorKeys","digitsOnly","datePart","pos","month","m","day","d","year","y","emitParsedIfComplete","event","mmStr","ddStr","yyyyStr","mm","dd","yyyy","isValidParts","createDate","inRange","min","max","parsedRawDate","isComplete","yy","date","daysInMonth","handleChange","src","handleClick","applyStep","direction","sourceEl","today","setDate","focusAndRestore","part","days","steppedDate","resolveInput","isEditable","el","handleKeyDown","handleWheel","input","handleKeyUp","handleBlur","opts","run","inputEl","p","nextTick","watch","newVal","debugLines","isValid","candidate","reason","validationMessage","r","minStr","maxStr","initStyling","datePicker","parent","onMounted","readonly"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const a=require("vue");function he(n){const o=a.ref(""),d=a.ref(void 0),oe=a.ref(!!n.debug),E=a.ref(!1),V=1440*60*1e3,L=365*V,_=new Date,re=new Date(_.getTime()-L),se=new Date(_.getTime()+L);n.min=n.min??re,n.max=n.max??se;const $=a.computed(()=>(o.value??"").replace(/\D/g,"")),C=(e,t)=>new Date(e,t,0).getDate(),K=(e,t,l)=>t>=1&&t<=12&&e>=1e3&&l>=1&&l<=C(e,t),S=e=>Date.UTC(e.getFullYear(),e.getMonth(),e.getDate()),y=e=>{if(!e)return null;const t=n.min??new Date(Date.now()-90*V),l=n.max??new Date,r=S(e);return r<S(t)||r>S(l)?null:e},T=(e,t)=>n.allowReverse??!1?!0:e<=t,R=a.computed(()=>(o.value?.length??0)>=23&&$.value.length>=16),M=e=>{if((e??"").length<23||$.value.length<16)return{start:null,end:null};const t=e.substring(0,10),l=e.substring(13,23),[r,c,m]=t.split("/").map(v=>parseInt(v||"0",10)),[b,g,h]=l.split("/").map(v=>parseInt(v||"0",10)),w=new Date(m,r-1,c),x=new Date(h,b-1,g),P=K(m,r,c)&&w.toString()!=="Invalid Date",U=K(h,b,g)&&x.toString()!=="Invalid Date";return{start:P?w:null,end:U?x:null}},F=n.externalValid??a.ref(!0),O=a.computed(()=>M(o.value)),D=a.computed(()=>{const e=y(O.value.start),t=y(O.value.end);return{start:e,end:t}}),k=a.computed(()=>{if(!R.value)return;const e=D.value.start,t=D.value.end;if(!e||!t)return;const l=Math.abs(S(t)-S(e));return Math.round(l/864e5+1)}),N=a.ref(!1),A=a.computed(()=>{if(!N.value)return;const{start:e,end:t}=O.value;if(!R.value)return"incomplete";if(!e||!t)return"invalid-date";if(!D.value.start||!D.value.end)return"out-of-bounds";const l=D.value.start,r=D.value.end;return T(l,r)?typeof n.maxSpanDays=="number"&&k.value!==void 0&&k.value>n.maxSpanDays?"span-exceeds-limit":"valid":"reversed-range"}),H=a.computed(()=>{const e=A.value;return e===void 0||e==="valid"}),ue=a.computed(()=>{const{min:e,max:t}=n,l=A.value;if(!l)return"";switch(l){case"incomplete":return"Required";case"invalid-date":return"One or both dates invalid.";case"reversed-range":return"End Date must be on or after Start Date.";case"out-of-bounds":return e&&t?`Dates must be between ${f(e)} and ${f(t)}.`:"Dates must be within the allowed range.";case"span-exceeds-limit":return typeof n.maxSpanDays=="number"?`Date range exceeds ${n.maxSpanDays} days.`:"Date range exceeds maximum allowed span.";default:return""}}),W=["ArrowUp","ArrowDown"],ce=["ArrowLeft","ArrowRight"],Y=(e,t)=>String(e).padStart(t,"0"),f=e=>`${Y(e.getMonth()+1,2)}/${Y(e.getDate(),2)}/${Y(e.getFullYear(),4)}`,X=e=>e<=2?{side:"start",part:"mm"}:e<=5?{side:"start",part:(e<=3,"dd")}:e<=11?{side:"start",part:"yyyy"}:e<=15?{side:"end",part:"mm"}:e<=18?{side:"end",part:"dd"}:{side:"end",part:"yyyy"},j=(e,t,l)=>{const r=t?.selectionStart??d.value??0;d.value=r;const{start:c,end:m}=M(o.value);if(!c&&!m){const s=new Date,p=f(s);o.value=`${p} - ${p}`,n.onChange({value:{start:s,end:s},event:l}),a.nextTick(()=>{requestAnimationFrame(()=>{const u=document.getElementById(n.id),i=d.value??0;u&&(u.focus(),u.setSelectionRange(i,i))})});return}const b=new Date,g=X(r);let h=c?new Date(c):new Date(b),w=m?new Date(m):new Date(b);const x=(s,p)=>{if(p==="mm"){const u=s.getMonth()+1,i=e==="ArrowUp"?u<12?u+1:1:u>1?u-1:12;s.setMonth(i-1);const I=C(s.getFullYear(),i);s.getDate()>I&&s.setDate(I)}else if(p==="dd"){const u=C(s.getFullYear(),s.getMonth()+1),i=s.getDate(),I=e==="ArrowUp"?i<u?i+1:1:i>1?i-1:u;s.setDate(I)}else if(p==="yyyy"){const u=s.getFullYear();s.setFullYear(e==="ArrowUp"?u+1:Math.max(1,u-1));const i=C(s.getFullYear(),s.getMonth()+1);s.getDate()>i&&s.setDate(i)}};g.side==="start"?x(h,g.part):x(w,g.part);const P=f(h),U=f(w);o.value=`${P} - ${U}`;const v=y(h),B=y(w);v&&B&&T(v,B)?n.onChange({value:{start:v,end:B},event:l}):n.onChange({value:null,event:l}),a.nextTick(()=>{requestAnimationFrame(()=>{const s=document.getElementById(n.id),p=d.value??0;s&&(s.focus(),s.setSelectionRange(p,p))})})},ie=e=>{const{start:t,end:l}=M(o.value);if(!t||!l){n.onChange({value:null,event:e});return}const r=y(t),c=y(l);if(!r||!c){n.onChange({value:null,event:e});return}if(!T(r,c)){n.onChange({value:null,event:e});return}n.onChange({value:{start:r,end:c},event:e})},de=e=>{const t=e.value??"",l=e.event;if(!t&&l&&l.type==="click"){J(l);return}o.value=t;const r=l?.target;d.value=r?.selectionStart??0,ie(e)},me=e=>{d.value=e.target.selectionStart??0},z=e=>e.target instanceof HTMLInputElement?e.target:document.getElementById(n.id),G=e=>!e?.disabled&&!e?.readOnly,pe=e=>{if(G(z(e))){if(e.code==="Space"||e.key===" "){e.preventDefault(),e.stopPropagation(),n.onShowCalendar(e);return}if(e.key==="ArrowDown"&&e.altKey){e.preventDefault(),e.stopPropagation(),n.onShowCalendar(e);return}if(W.includes(e.key)){e.preventDefault(),e.stopPropagation();const t=e.target;j(e.key,t,e);return}}},fe=e=>{const t=z(e);if(!G(t))return;e.preventDefault();const l=e.deltaY<0?"ArrowUp":"ArrowDown";j(l,t,e)},ve=e=>{if(ce.includes(e.key)||W.includes(e.key)){const t=e.target;d.value=t?.selectionStart??0}},q=()=>{N.value=!0,(n.manageValid??!0)&&(F.value=H.value)},ye=e=>{q()},J=e=>{o.value="",d.value=0,n.onChange({value:null,event:e}),q(),a.nextTick(()=>{const t=document.getElementById(n.id);t&&(t.focus(),t.setSelectionRange(0,0))})};n.externalValue&&a.watch(n.externalValue,e=>{const t=e?.start??null,l=e?.end??null;if(t&&l){if(o.value=`${f(t)} - ${f(l)}`,n.isOpen?.value&&E.value&&n.onRequestClose){const r=typeof n.closeDelay=="number"?n.closeDelay:n.closeDelay?.value??0;setTimeout(()=>{n.onRequestClose?.(),E.value=!1,q()},r)}return}},{immediate:!0});const Q=a.computed(()=>o.value&&o.value.substring(0,2).replace(/\D/g,"0")||"0"),Z=a.computed(()=>o.value&&o.value.substring(3,5).replace(/\D/g,"0")||"0"),ee=a.computed(()=>o.value&&o.value.substring(6,10).replace(/\D/g,"0")||"0"),te=a.computed(()=>o.value&&o.value.substring(13,15).replace(/\D/g,"0")||"0"),ne=a.computed(()=>o.value&&o.value.substring(16,18).replace(/\D/g,"0")||"0"),ae=a.computed(()=>o.value&&o.value.substring(19,23).replace(/\D/g,"0")||"0"),De=a.computed(()=>{const{start:e,end:t}=M(o.value);return[{label:"Raw",value:o.value},{label:"Min Date",value:`${n.min?n.min.toDateString():"-"}`},{label:"Max Date",value:`${n.max?n.max.toDateString():"-"}`},{label:"Start",value:`${String(Q.value).padStart(2,"0")} / ${String(Z.value).padStart(2,"0")} / ${String(ee.value).padStart(4,"0")}`},{label:"End",value:`${String(te.value).padStart(2,"0")} / ${String(ne.value).padStart(2,"0")} / ${String(ae.value).padStart(4,"0")}`},{label:"Digits only",value:$.value},{label:"Mask complete",value:`${R.value}`},{label:"Parsed",value:`${e?e.toDateString():"-"} | ${t?t.toDateString():"-"}`},{label:"Valid (managed)",value:`${F.value??"-"}`},{label:"Span (days)",value:`${k.value??"-"}`},{label:"Reason",value:`${A.value??"-"}`},{label:"Cursor in",value:`${d.value??"-"} (${(()=>{const l=d.value??0,r=X(l);return`${r.side}.${r.part}`})()})`}]}),le=()=>{a.nextTick(()=>{const e=document.getElementById(n.id);if(!e){console.warn(`#${n.id} not found for styling.`);return}const t=e.closest("div");if(!t){console.warn(`Parent div of #${n.id} not found for styling.`);return}t.classList.contains("fk-daterangepicker")||t.classList.add("fk-daterangepicker")})};a.onMounted(()=>{le()});const ge=()=>{a.nextTick(()=>{try{const e=Array.from(document.querySelectorAll(".k-animation-container"));if(!e.length)return;const l=[...e].reverse().find(m=>m.querySelector(".k-calendar"))?.querySelector(".k-calendar");if(!l)return;const r=l.querySelectorAll(".k-calendar-table");let c=!1;r.forEach(m=>{m.tabIndex===0&&(c?m.tabIndex=-1:c=!0)})}catch(e){console.warn(e)}})};return n.isOpen&&a.watch(n.isOpen,e=>{e&&setTimeout(()=>ge(),0)},{immediate:!1}),{id:n.id,min:n.min,max:n.max,raw:o,cursorPos:d,debugEnabled:oe,debugLines:De,digitsOnly:$,valid:F,validComputed:a.readonly(H),reason:a.readonly(A),validationMessage:a.readonly(ue),spanDays:a.readonly(k),month1:a.readonly(Q),day1:a.readonly(Z),year1:a.readonly(ee),month2:a.readonly(te),day2:a.readonly(ne),year2:a.readonly(ae),handleChange:de,handleKeyDown:pe,handleWheel:fe,handleKeyUp:ve,handleClick:me,handleBlur:ye,handleClear:J,onCalendarChange:()=>{E.value=!0},initStyling:le}}exports.useMaskedDateRangeInput=he;
2
+ //# sourceMappingURL=useMaskedDateRangeInput-DST5aQe0.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMaskedDateRangeInput-DST5aQe0.cjs","sources":["../../src/range/useMaskedDateRangeInput.ts"],"sourcesContent":["import {\n computed,\n nextTick,\n onMounted,\n readonly,\n ref,\n watch,\n type Ref,\n} from \"vue\";\nimport type { SelectionRange } from \"@progress/kendo-vue-dateinputs\";\n\nexport type RangeChangePayload = { value: SelectionRange | null; event: any };\n\ntype Part = \"mm\" | \"dd\" | \"yyyy\";\n\ntype Side = \"start\" | \"end\";\n\nexport function useMaskedDateRangeInput(args: {\n id: string; // id of the MaskedTextBox input element\n onChange: (p: RangeChangePayload) => void;\n onShowCalendar: (e: KeyboardEvent) => void;\n externalValue?: Ref<SelectionRange | null | undefined>;\n externalValid?: Ref<boolean | undefined>;\n manageValid?: boolean; // default true: mirror computed validity into externalValid\n maxSpanDays?: number; // optional maximum allowed span between start and end (in days)\n min?: Date;\n max?: Date;\n allowReverse?: boolean; // default false\n // Popup control hooks\n isOpen?: Ref<boolean>;\n onRequestClose?: () => void;\n closeDelay?: Ref<number> | number;\n debug?: boolean;\n}) {\n const raw = ref(\"\");\n const cursorPos = ref<number | undefined>(undefined);\n const debugEnabled = ref<boolean>(!!args.debug);\n const calendarChanged = ref<boolean>(false);\n\n const ONE_DAY = 24 * 60 * 60 * 1000;\n const ONE_YEAR = 365 * ONE_DAY;\n const TODAY = new Date();\n const MIN_DATE = new Date(TODAY.getTime() - ONE_YEAR);\n const MAX_DATE = new Date(TODAY.getTime() + ONE_YEAR);\n\n args.min = args.min ?? MIN_DATE;\n args.max = args.max ?? MAX_DATE;\n\n // Define helpers early to avoid \"used before initialization\" issues\n const digitsOnly = computed(() => (raw.value ?? \"\").replace(/\\D/g, \"\"));\n const daysInMonth = (yy: number, mm: number) => new Date(yy, mm, 0).getDate();\n const isValidParts = (yy: number, mm: number, dd: number) => {\n return (\n mm >= 1 && mm <= 12 && yy >= 1000 && dd >= 1 && dd <= daysInMonth(yy, mm)\n );\n };\n // Compare dates by date-only (UTC midnight) to avoid time-of-day issues\n const toUtcMidnightMs = (d: Date) =>\n Date.UTC(d.getFullYear(), d.getMonth(), d.getDate());\n const clampToMinMax = (d: Date | null): Date | null => {\n if (!d) return null;\n // default to 90days ago if min/max not provided\n const min = args.min ?? new Date(Date.now() - 90 * ONE_DAY);\n // default to today\n const max = args.max ?? new Date();\n const dMs = toUtcMidnightMs(d);\n if (dMs < toUtcMidnightMs(min) || dMs > toUtcMidnightMs(max)) return null;\n return d;\n };\n const rangeIsOrdered = (start: Date, end: Date) => {\n return (args.allowReverse ?? false) ? true : start <= end;\n };\n const maskComplete = computed(() => {\n return (raw.value?.length ?? 0) >= 23 && digitsOnly.value.length >= 16;\n });\n\n const parseFromRaw = (\n s: string,\n ): { start: Date | null; end: Date | null } => {\n // Expect MM/DD/YYYY - MM/DD/YYYY\n if ((s ?? \"\").length < 23 || digitsOnly.value.length < 16)\n return { start: null, end: null };\n const left = s.substring(0, 10);\n const right = s.substring(13, 23);\n const [mm1, dd1, yyyy1] = left\n .split(\"/\")\n .map((x) => parseInt(x || \"0\", 10));\n const [mm2, dd2, yyyy2] = right\n .split(\"/\")\n .map((x) => parseInt(x || \"0\", 10));\n const sDate = new Date(yyyy1, mm1 - 1, dd1);\n const eDate = new Date(yyyy2, mm2 - 1, dd2);\n const sOk =\n isValidParts(yyyy1, mm1, dd1) && sDate.toString() !== \"Invalid Date\";\n const eOk =\n isValidParts(yyyy2, mm2, dd2) && eDate.toString() !== \"Invalid Date\";\n return { start: sOk ? sDate : null, end: eOk ? eDate : null };\n };\n\n // validity state shared with consumer when provided\n // Initialize to true to avoid showing validation errors before first blur\n const valid = args.externalValid ?? ref<boolean | undefined>(true);\n // Derived validity and reason\n const parsed = computed(() => parseFromRaw(raw.value));\n const clamped = computed(() => {\n const s = clampToMinMax(parsed.value.start);\n const e = clampToMinMax(parsed.value.end);\n return { start: s, end: e };\n });\n\n // Span in days between clamped start/end; undefined when incomplete or out-of-bounds\n const spanDays = computed<number | undefined>(() => {\n if (!maskComplete.value) return undefined;\n const s = clamped.value.start;\n const e = clamped.value.end;\n if (!s || !e) return undefined;\n const diffMs = Math.abs(toUtcMidnightMs(e) - toUtcMidnightMs(s));\n return Math.round(diffMs / 86400000 + 1); // NOTE: FEATHER-1155\n });\n\n // Set on first blur/clear; nothing is flagged before the user leaves the field\n const isTouched = ref(false);\n\n const reasonComputed = computed<string | undefined>(() => {\n if (!isTouched.value) return undefined;\n\n const { start, end } = parsed.value;\n if (!maskComplete.value) return \"incomplete\";\n if (!start || !end) return \"invalid-date\";\n if (!clamped.value.start || !clamped.value.end) return \"out-of-bounds\";\n const s = clamped.value.start;\n const e = clamped.value.end;\n if (!rangeIsOrdered(s, e)) return \"reversed-range\";\n if (typeof args.maxSpanDays === \"number\" && spanDays.value !== undefined) {\n if (spanDays.value > args.maxSpanDays) return \"span-exceeds-limit\";\n }\n return \"valid\";\n });\n\n const validComputed = computed<boolean | undefined>(() => {\n const r = reasonComputed.value;\n return r === undefined || r === \"valid\";\n });\n\n // User-facing validation message derived from the same live reason as validComputed\n const validationMessage = computed<string>(() => {\n const { min, max } = args;\n const r = reasonComputed.value;\n\n if (!r) return \"\";\n\n switch (r) {\n case \"incomplete\":\n return \"Required\";\n case \"invalid-date\":\n return \"One or both dates invalid.\";\n case \"reversed-range\":\n return \"End Date must be on or after Start Date.\";\n case \"out-of-bounds\":\n if (min && max) {\n return `Dates must be between ${formatDate(min)} and ${formatDate(max)}.`;\n }\n return \"Dates must be within the allowed range.\";\n case \"span-exceeds-limit\":\n return typeof args.maxSpanDays === \"number\"\n ? `Date range exceeds ${args.maxSpanDays} days.`\n : \"Date range exceeds maximum allowed span.\";\n case \"valid\":\n default:\n return \"\";\n }\n });\n // // Mirror computed validity into external ref when enabled\n // watch(\n // validComputed,\n // (v) => {\n // if (args.manageValid ?? true) {\n // valid.value = v;\n // }\n // },\n // { immediate: true },\n // );\n\n const steppers: string[] = [\"ArrowUp\", \"ArrowDown\"];\n const cursorKeys: string[] = [\"ArrowLeft\", \"ArrowRight\"]; // tracked to keep caret\n\n const fmt = (n: number, w: number) => String(n).padStart(w, \"0\");\n const formatDate = (d: Date) =>\n `${fmt(d.getMonth() + 1, 2)}/${fmt(d.getDate(), 2)}/${fmt(\n d.getFullYear(),\n 4,\n )}`;\n\n // rangeIsOrdered declared earlier\n\n const datePartForPos = (pos: number): { side: Side; part: Part } => {\n // Mask: 00/00/0000 - 00/00/0000\n // Index map (digits start at 0..9 for start, 13..22 for end)\n if (pos <= 2) return { side: \"start\", part: \"mm\" };\n if (pos <= 5) return { side: \"start\", part: pos <= 3 ? \"dd\" : \"dd\" };\n if (pos <= 11) return { side: \"start\", part: \"yyyy\" };\n if (pos <= 15) return { side: \"end\", part: \"mm\" };\n if (pos <= 18) return { side: \"end\", part: \"dd\" };\n return { side: \"end\", part: \"yyyy\" };\n };\n\n const applyStep = (\n direction: \"ArrowUp\" | \"ArrowDown\",\n sourceEl: HTMLInputElement | null | undefined,\n event: Event,\n ): void => {\n const pos = sourceEl?.selectionStart ?? cursorPos.value ?? 0;\n cursorPos.value = pos;\n\n // Current parsed values\n const { start, end } = parseFromRaw(raw.value);\n\n // If SelectionRange is null/undefined (both sides missing), default to today and ignore the step\n if (!start && !end) {\n const today = new Date();\n const tStr = formatDate(today);\n raw.value = `${tStr} - ${tStr}`;\n args.onChange({ value: { start: today, end: today }, event });\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n return;\n }\n\n // Build baseline from user's parsed input; clamp only when emitting\n const today = new Date();\n\n const which = datePartForPos(pos);\n\n // Baseline dates: prefer parsed values (even if out-of-bounds); otherwise today\n let s = start ? new Date(start) : new Date(today);\n let e = end ? new Date(end) : new Date(today);\n\n const mutate = (d: Date, part: Part) => {\n if (part === \"mm\") {\n const m = d.getMonth() + 1;\n const next =\n direction === \"ArrowUp\" ? (m < 12 ? m + 1 : 1) : m > 1 ? m - 1 : 12;\n d.setMonth(next - 1);\n // Fix day overflow after month change\n const days = daysInMonth(d.getFullYear(), next);\n if (d.getDate() > days) d.setDate(days);\n } else if (part === \"dd\") {\n const days = daysInMonth(d.getFullYear(), d.getMonth() + 1);\n const day = d.getDate();\n const next =\n direction === \"ArrowUp\"\n ? day < days\n ? day + 1\n : 1\n : day > 1\n ? day - 1\n : days;\n d.setDate(next);\n } else if (part === \"yyyy\") {\n const y = d.getFullYear();\n d.setFullYear(direction === \"ArrowUp\" ? y + 1 : Math.max(1, y - 1));\n // Fix Feb 29 overflow, etc.\n const days = daysInMonth(d.getFullYear(), d.getMonth() + 1);\n if (d.getDate() > days) d.setDate(days);\n }\n };\n\n if (which.side === \"start\") mutate(s, which.part);\n else mutate(e, which.part);\n\n // Compose new raw string: keep the untouched side as-is from current raw if parseable\n const sText = formatDate(s);\n const eText = formatDate(e);\n raw.value = `${sText} - ${eText}`;\n\n // Emit if valid and ordered and within min/max; else null\n const sClamped = clampToMinMax(s);\n const eClamped = clampToMinMax(e);\n if (sClamped && eClamped && rangeIsOrdered(sClamped, eClamped)) {\n args.onChange({ value: { start: sClamped, end: eClamped }, event });\n } else {\n args.onChange({ value: null, event });\n }\n\n // Restore caret\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n };\n\n const emitParsedIfComplete = (event: any) => {\n const { start, end } = parseFromRaw(raw.value);\n if (!start || !end) {\n args.onChange({ value: null, event });\n return;\n }\n const sClamped = clampToMinMax(start);\n const eClamped = clampToMinMax(end);\n if (!sClamped || !eClamped) {\n args.onChange({ value: null, event });\n return;\n }\n if (!rangeIsOrdered(sClamped, eClamped)) {\n args.onChange({ value: null, event });\n return;\n }\n args.onChange({ value: { start: sClamped, end: eClamped }, event });\n };\n\n const handleChange = (event: any): void => {\n const newValue = (event.value ?? \"\") as string;\n const originalEvent = event.event as Event | undefined;\n\n // No clear event handler from Kendo...\n // Kendo's clear button sets the value to empty and raises change;\n // treat that as an explicit clear action.\n if (!newValue && originalEvent && (originalEvent as any).type === \"click\") {\n handleClear(originalEvent);\n return;\n }\n\n raw.value = newValue;\n const src = originalEvent?.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n // Do not coerce user's input; only emit parsed range when complete and valid\n emitParsedIfComplete(event);\n };\n\n const handleClick = (event: MouseEvent): void => {\n cursorPos.value = (event.target as HTMLInputElement).selectionStart ?? 0;\n };\n\n // Wheel events can target the MaskedTextBox wrapper, so fall back to the input by id.\n const resolveInput = (event: Event): HTMLInputElement | null =>\n event.target instanceof HTMLInputElement\n ? event.target\n : (document.getElementById(args.id) as HTMLInputElement | null);\n\n // Native disabled/readonly is the source of truth, so plain Kendo inputs get the guard too.\n const isEditable = (el: HTMLInputElement | null): boolean =>\n !el?.disabled && !el?.readOnly;\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (!isEditable(resolveInput(event))) return;\n // Space already opens calendar\n if (event.code === \"Space\" || event.key === \" \") {\n // Do not let Space modify the input; only open the calendar\n // Justified: Space opens the calendar popup instead of inserting a space.\n event.preventDefault();\n // Justified: Parent containers such as grid keyboard handlers should not consume this.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n // Alt + ArrowDown: open calendar popup without changing the value via stepper\n if (event.key === \"ArrowDown\" && event.altKey) {\n // Justified: Alt+Down is reserved for opening the calendar popup.\n event.preventDefault();\n // Justified: Prevent parent keyboard navigation from treating this as row movement.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n if (steppers.includes(event.key)) {\n // Justified: ArrowUp/Down act as range-part steppers instead of native caret/page behavior.\n event.preventDefault();\n // Justified: Prevent parent containers such as the grid from also handling these arrows.\n event.stopPropagation();\n const src = event.target as HTMLInputElement;\n applyStep(event.key as \"ArrowUp\" | \"ArrowDown\", src, event);\n return;\n }\n };\n\n const handleWheel = (event: WheelEvent): void => {\n const input = resolveInput(event);\n // Let the page scroll when the input can't be edited.\n if (!isEditable(input)) return;\n // Prevent page scroll when interacting with the input\n event.preventDefault();\n const direction = event.deltaY < 0 ? \"ArrowUp\" : \"ArrowDown\";\n applyStep(direction, input, event);\n };\n\n const handleKeyUp = (event: KeyboardEvent): void => {\n if (cursorKeys.includes(event.key) || steppers.includes(event.key)) {\n const src = event.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n }\n };\n\n const applyBlurValidation = () => {\n isTouched.value = true;\n\n if (args.manageValid ?? true) {\n valid.value = validComputed.value;\n }\n };\n\n const handleBlur = (_event: FocusEvent): void => {\n applyBlurValidation();\n };\n\n const handleClear = (event?: Event): void => {\n raw.value = \"\";\n cursorPos.value = 0;\n\n // Emit cleared range to consumer\n args.onChange({ value: null, event });\n\n // Run the same validation flow as on blur\n applyBlurValidation();\n\n // Return focus to the masked input so the user can retype\n nextTick(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(0, 0);\n }\n });\n };\n\n // Sync external range into raw when provided\n if (args.externalValue) {\n watch(\n args.externalValue,\n (newVal) => {\n const start = newVal?.start ?? null;\n const end = newVal?.end ?? null;\n if (start && end) {\n raw.value = `${formatDate(start)} - ${formatDate(end)}`;\n // If the change originated from calendar and popup is open, request close\n if (\n args.isOpen?.value &&\n calendarChanged.value &&\n args.onRequestClose\n ) {\n const delay =\n typeof args.closeDelay === \"number\"\n ? args.closeDelay\n : (args.closeDelay?.value ?? 0);\n setTimeout(() => {\n args.onRequestClose?.();\n calendarChanged.value = false;\n applyBlurValidation();\n }, delay);\n }\n return;\n }\n // If external is null/invalid, keep current raw as-is to preserve user's typing\n },\n { immediate: true },\n );\n }\n\n const month1 = computed(() =>\n raw.value ? raw.value.substring(0, 2).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const day1 = computed(() =>\n raw.value ? raw.value.substring(3, 5).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const year1 = computed(() =>\n raw.value ? raw.value.substring(6, 10).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const month2 = computed(() =>\n raw.value ? raw.value.substring(13, 15).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const day2 = computed(() =>\n raw.value ? raw.value.substring(16, 18).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const year2 = computed(() =>\n raw.value ? raw.value.substring(19, 23).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n\n const debugLines = computed((): Array<{ label: string; value: string }> => {\n const { start, end } = parseFromRaw(raw.value);\n return [\n {\n label: \"Raw\",\n value: raw.value,\n },\n {\n label: \"Min Date\",\n value: `${args.min ? args.min.toDateString() : \"-\"}`,\n },\n {\n label: \"Max Date\",\n value: `${args.max ? args.max.toDateString() : \"-\"}`,\n },\n {\n label: \"Start\",\n value: `${String(month1.value).padStart(2, \"0\")} / ${String(\n day1.value,\n ).padStart(2, \"0\")} / ${String(year1.value).padStart(4, \"0\")}`,\n },\n {\n label: \"End\",\n value: `${String(month2.value).padStart(2, \"0\")} / ${String(\n day2.value,\n ).padStart(2, \"0\")} / ${String(year2.value).padStart(4, \"0\")}`,\n },\n { label: \"Digits only\", value: digitsOnly.value },\n { label: \"Mask complete\", value: `${maskComplete.value}` },\n {\n label: \"Parsed\",\n value: `${start ? start.toDateString() : \"-\"} | ${\n end ? end.toDateString() : \"-\"\n }`,\n },\n {\n label: \"Valid (managed)\",\n value: `${valid.value ?? \"-\"}`,\n },\n { label: \"Span (days)\", value: `${spanDays.value ?? \"-\"}` },\n {\n label: \"Reason\",\n value: `${reasonComputed.value ?? \"-\"}`,\n },\n {\n label: \"Cursor in\",\n value: `${cursorPos.value ?? \"-\"} (${(() => {\n const p = cursorPos.value ?? 0;\n const w = datePartForPos(p);\n return `${w.side}.${w.part}`;\n })()})`,\n },\n ];\n });\n\n const initStyling = () => {\n // Idempotent application of the `fk-daterangepicker` class to the input's parent\n nextTick(() => {\n const rangeInput = document.getElementById(args.id) as HTMLElement | null;\n if (!rangeInput) {\n console.warn(`#${args.id} not found for styling.`);\n return;\n }\n const parentDiv = rangeInput.closest(\"div\");\n if (!parentDiv) {\n console.warn(`Parent div of #${args.id} not found for styling.`);\n return;\n }\n if (parentDiv.classList.contains(\"fk-daterangepicker\")) return;\n parentDiv.classList.add(\"fk-daterangepicker\");\n });\n };\n\n onMounted(() => {\n initStyling();\n });\n\n // Accessibility fix: ensure only one month grid has tabIndex=0\n const calendarMonthTabIndexFix = () => {\n nextTick(() => {\n try {\n const containers = Array.from(\n document.querySelectorAll(\".k-animation-container\"),\n ) as HTMLElement[];\n if (!containers.length) return;\n\n // Prefer the most recently added visible container that has a calendar\n const candidate = [...containers]\n .reverse()\n .find((c) => c.querySelector(\".k-calendar\"));\n const calendarRoot = candidate?.querySelector(\n \".k-calendar\",\n ) as HTMLElement | null;\n if (!calendarRoot) return;\n\n const months = calendarRoot.querySelectorAll(\n \".k-calendar-table\",\n ) as NodeListOf<HTMLElement>;\n let foundTab0 = false;\n months.forEach((m) => {\n if (m.tabIndex === 0) {\n if (!foundTab0) {\n foundTab0 = true;\n } else {\n m.tabIndex = -1;\n }\n }\n });\n } catch (e) {\n // no-op; defensive\n console.warn(e);\n }\n });\n };\n\n // When popup opens, run the fix after render\n if (args.isOpen) {\n watch(\n args.isOpen,\n (open) => {\n if (open) {\n // Allow popup DOM to mount first\n setTimeout(() => calendarMonthTabIndexFix(), 0);\n }\n },\n { immediate: false },\n );\n }\n\n return {\n id: args.id,\n min: args.min,\n max: args.max,\n raw,\n cursorPos,\n debugEnabled: debugEnabled,\n debugLines: debugLines,\n digitsOnly: digitsOnly,\n valid,\n validComputed: readonly(validComputed),\n reason: readonly(reasonComputed),\n validationMessage: readonly(validationMessage),\n spanDays: readonly(spanDays),\n month1: readonly(month1),\n day1: readonly(day1),\n year1: readonly(year1),\n month2: readonly(month2),\n day2: readonly(day2),\n year2: readonly(year2),\n handleChange,\n handleKeyDown,\n handleWheel,\n handleKeyUp,\n handleClick,\n handleBlur,\n handleClear,\n onCalendarChange: () => {\n calendarChanged.value = true;\n },\n initStyling,\n };\n}\n\nexport type UseMaskedDateRangeInputReturn = ReturnType<\n typeof useMaskedDateRangeInput\n>;\n"],"names":["useMaskedDateRangeInput","args","raw","ref","cursorPos","debugEnabled","calendarChanged","ONE_DAY","ONE_YEAR","TODAY","MIN_DATE","MAX_DATE","digitsOnly","computed","daysInMonth","yy","mm","isValidParts","dd","toUtcMidnightMs","d","clampToMinMax","min","max","dMs","rangeIsOrdered","start","end","maskComplete","parseFromRaw","s","left","right","mm1","dd1","yyyy1","x","mm2","dd2","yyyy2","sDate","eDate","sOk","eOk","valid","parsed","clamped","e","spanDays","diffMs","isTouched","reasonComputed","validComputed","r","validationMessage","formatDate","steppers","cursorKeys","fmt","n","w","datePartForPos","pos","applyStep","direction","sourceEl","event","today","tStr","nextTick","inputEl","p","which","mutate","part","m","next","days","day","y","sText","eText","sClamped","eClamped","emitParsedIfComplete","handleChange","newValue","originalEvent","handleClear","src","handleClick","resolveInput","isEditable","el","handleKeyDown","handleWheel","input","handleKeyUp","applyBlurValidation","handleBlur","_event","watch","newVal","delay","month1","day1","year1","month2","day2","year2","debugLines","initStyling","rangeInput","parentDiv","onMounted","calendarMonthTabIndexFix","containers","calendarRoot","c","months","foundTab0","open","readonly"],"mappings":"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"}
@@ -0,0 +1,328 @@
1
+ import { ref as b, computed as s, watch as ue, onMounted as xe, readonly as p, nextTick as M } from "vue";
2
+ function Ce(n) {
3
+ const l = b(""), d = b(void 0), ie = b(!!n.debug), F = b(!1), K = 1440 * 60 * 1e3, N = 365 * K, H = /* @__PURE__ */ new Date(), ce = new Date(H.getTime() - N), de = new Date(H.getTime() + N);
4
+ n.min = n.min ?? ce, n.max = n.max ?? de;
5
+ const k = s(() => (l.value ?? "").replace(/\D/g, "")), A = (e, t) => new Date(e, t, 0).getDate(), W = (e, t, a) => t >= 1 && t <= 12 && e >= 1e3 && a >= 1 && a <= A(e, t), x = (e) => Date.UTC(e.getFullYear(), e.getMonth(), e.getDate()), D = (e) => {
6
+ if (!e) return null;
7
+ const t = n.min ?? new Date(Date.now() - 90 * K), a = n.max ?? /* @__PURE__ */ new Date(), o = x(e);
8
+ return o < x(t) || o > x(a) ? null : e;
9
+ }, O = (e, t) => n.allowReverse ?? !1 ? !0 : e <= t, Y = s(() => (l.value?.length ?? 0) >= 23 && k.value.length >= 16), E = (e) => {
10
+ if ((e ?? "").length < 23 || k.value.length < 16)
11
+ return { start: null, end: null };
12
+ const t = e.substring(0, 10), a = e.substring(13, 23), [o, i, m] = t.split("/").map((y) => parseInt(y || "0", 10)), [$, h, w] = a.split("/").map((y) => parseInt(y || "0", 10)), S = new Date(m, o - 1, i), C = new Date(w, $ - 1, h), V = W(m, o, i) && S.toString() !== "Invalid Date", L = W(w, $, h) && C.toString() !== "Invalid Date";
13
+ return { start: V ? S : null, end: L ? C : null };
14
+ }, P = n.externalValid ?? b(!0), q = s(() => E(l.value)), g = s(() => {
15
+ const e = D(q.value.start), t = D(q.value.end);
16
+ return { start: e, end: t };
17
+ }), I = s(() => {
18
+ if (!Y.value) return;
19
+ const e = g.value.start, t = g.value.end;
20
+ if (!e || !t) return;
21
+ const a = Math.abs(x(t) - x(e));
22
+ return Math.round(a / 864e5 + 1);
23
+ }), X = b(!1), T = s(() => {
24
+ if (!X.value) return;
25
+ const { start: e, end: t } = q.value;
26
+ if (!Y.value) return "incomplete";
27
+ if (!e || !t) return "invalid-date";
28
+ if (!g.value.start || !g.value.end) return "out-of-bounds";
29
+ const a = g.value.start, o = g.value.end;
30
+ return O(a, o) ? typeof n.maxSpanDays == "number" && I.value !== void 0 && I.value > n.maxSpanDays ? "span-exceeds-limit" : "valid" : "reversed-range";
31
+ }), j = s(() => {
32
+ const e = T.value;
33
+ return e === void 0 || e === "valid";
34
+ }), me = s(() => {
35
+ const { min: e, max: t } = n, a = T.value;
36
+ if (!a) return "";
37
+ switch (a) {
38
+ case "incomplete":
39
+ return "Required";
40
+ case "invalid-date":
41
+ return "One or both dates invalid.";
42
+ case "reversed-range":
43
+ return "End Date must be on or after Start Date.";
44
+ case "out-of-bounds":
45
+ return e && t ? `Dates must be between ${f(e)} and ${f(t)}.` : "Dates must be within the allowed range.";
46
+ case "span-exceeds-limit":
47
+ return typeof n.maxSpanDays == "number" ? `Date range exceeds ${n.maxSpanDays} days.` : "Date range exceeds maximum allowed span.";
48
+ default:
49
+ return "";
50
+ }
51
+ }), z = ["ArrowUp", "ArrowDown"], pe = ["ArrowLeft", "ArrowRight"], U = (e, t) => String(e).padStart(t, "0"), f = (e) => `${U(e.getMonth() + 1, 2)}/${U(e.getDate(), 2)}/${U(
52
+ e.getFullYear(),
53
+ 4
54
+ )}`, G = (e) => e <= 2 ? { side: "start", part: "mm" } : e <= 5 ? { side: "start", part: (e <= 3, "dd") } : e <= 11 ? { side: "start", part: "yyyy" } : e <= 15 ? { side: "end", part: "mm" } : e <= 18 ? { side: "end", part: "dd" } : { side: "end", part: "yyyy" }, J = (e, t, a) => {
55
+ const o = t?.selectionStart ?? d.value ?? 0;
56
+ d.value = o;
57
+ const { start: i, end: m } = E(l.value);
58
+ if (!i && !m) {
59
+ const r = /* @__PURE__ */ new Date(), v = f(r);
60
+ l.value = `${v} - ${v}`, n.onChange({ value: { start: r, end: r }, event: a }), M(() => {
61
+ requestAnimationFrame(() => {
62
+ const u = document.getElementById(
63
+ n.id
64
+ ), c = d.value ?? 0;
65
+ u && (u.focus(), u.setSelectionRange(c, c));
66
+ });
67
+ });
68
+ return;
69
+ }
70
+ const $ = /* @__PURE__ */ new Date(), h = G(o);
71
+ let w = i ? new Date(i) : new Date($), S = m ? new Date(m) : new Date($);
72
+ const C = (r, v) => {
73
+ if (v === "mm") {
74
+ const u = r.getMonth() + 1, c = e === "ArrowUp" ? u < 12 ? u + 1 : 1 : u > 1 ? u - 1 : 12;
75
+ r.setMonth(c - 1);
76
+ const R = A(r.getFullYear(), c);
77
+ r.getDate() > R && r.setDate(R);
78
+ } else if (v === "dd") {
79
+ const u = A(r.getFullYear(), r.getMonth() + 1), c = r.getDate(), R = e === "ArrowUp" ? c < u ? c + 1 : 1 : c > 1 ? c - 1 : u;
80
+ r.setDate(R);
81
+ } else if (v === "yyyy") {
82
+ const u = r.getFullYear();
83
+ r.setFullYear(e === "ArrowUp" ? u + 1 : Math.max(1, u - 1));
84
+ const c = A(r.getFullYear(), r.getMonth() + 1);
85
+ r.getDate() > c && r.setDate(c);
86
+ }
87
+ };
88
+ h.side === "start" ? C(w, h.part) : C(S, h.part);
89
+ const V = f(w), L = f(S);
90
+ l.value = `${V} - ${L}`;
91
+ const y = D(w), _ = D(S);
92
+ y && _ && O(y, _) ? n.onChange({ value: { start: y, end: _ }, event: a }) : n.onChange({ value: null, event: a }), M(() => {
93
+ requestAnimationFrame(() => {
94
+ const r = document.getElementById(
95
+ n.id
96
+ ), v = d.value ?? 0;
97
+ r && (r.focus(), r.setSelectionRange(v, v));
98
+ });
99
+ });
100
+ }, ve = (e) => {
101
+ const { start: t, end: a } = E(l.value);
102
+ if (!t || !a) {
103
+ n.onChange({ value: null, event: e });
104
+ return;
105
+ }
106
+ const o = D(t), i = D(a);
107
+ if (!o || !i) {
108
+ n.onChange({ value: null, event: e });
109
+ return;
110
+ }
111
+ if (!O(o, i)) {
112
+ n.onChange({ value: null, event: e });
113
+ return;
114
+ }
115
+ n.onChange({ value: { start: o, end: i }, event: e });
116
+ }, fe = (e) => {
117
+ const t = e.value ?? "", a = e.event;
118
+ if (!t && a && a.type === "click") {
119
+ ee(a);
120
+ return;
121
+ }
122
+ l.value = t;
123
+ const o = a?.target;
124
+ d.value = o?.selectionStart ?? 0, ve(e);
125
+ }, ye = (e) => {
126
+ d.value = e.target.selectionStart ?? 0;
127
+ }, Q = (e) => e.target instanceof HTMLInputElement ? e.target : document.getElementById(n.id), Z = (e) => !e?.disabled && !e?.readOnly, De = (e) => {
128
+ if (Z(Q(e))) {
129
+ if (e.code === "Space" || e.key === " ") {
130
+ e.preventDefault(), e.stopPropagation(), n.onShowCalendar(e);
131
+ return;
132
+ }
133
+ if (e.key === "ArrowDown" && e.altKey) {
134
+ e.preventDefault(), e.stopPropagation(), n.onShowCalendar(e);
135
+ return;
136
+ }
137
+ if (z.includes(e.key)) {
138
+ e.preventDefault(), e.stopPropagation();
139
+ const t = e.target;
140
+ J(e.key, t, e);
141
+ return;
142
+ }
143
+ }
144
+ }, ge = (e) => {
145
+ const t = Q(e);
146
+ if (!Z(t)) return;
147
+ e.preventDefault();
148
+ const a = e.deltaY < 0 ? "ArrowUp" : "ArrowDown";
149
+ J(a, t, e);
150
+ }, he = (e) => {
151
+ if (pe.includes(e.key) || z.includes(e.key)) {
152
+ const t = e.target;
153
+ d.value = t?.selectionStart ?? 0;
154
+ }
155
+ }, B = () => {
156
+ X.value = !0, (n.manageValid ?? !0) && (P.value = j.value);
157
+ }, we = (e) => {
158
+ B();
159
+ }, ee = (e) => {
160
+ l.value = "", d.value = 0, n.onChange({ value: null, event: e }), B(), M(() => {
161
+ const t = document.getElementById(
162
+ n.id
163
+ );
164
+ t && (t.focus(), t.setSelectionRange(0, 0));
165
+ });
166
+ };
167
+ n.externalValue && ue(
168
+ n.externalValue,
169
+ (e) => {
170
+ const t = e?.start ?? null, a = e?.end ?? null;
171
+ if (t && a) {
172
+ if (l.value = `${f(t)} - ${f(a)}`, n.isOpen?.value && F.value && n.onRequestClose) {
173
+ const o = typeof n.closeDelay == "number" ? n.closeDelay : n.closeDelay?.value ?? 0;
174
+ setTimeout(() => {
175
+ n.onRequestClose?.(), F.value = !1, B();
176
+ }, o);
177
+ }
178
+ return;
179
+ }
180
+ },
181
+ { immediate: !0 }
182
+ );
183
+ const te = s(
184
+ () => l.value && l.value.substring(0, 2).replace(/\D/g, "0") || "0"
185
+ ), ne = s(
186
+ () => l.value && l.value.substring(3, 5).replace(/\D/g, "0") || "0"
187
+ ), ae = s(
188
+ () => l.value && l.value.substring(6, 10).replace(/\D/g, "0") || "0"
189
+ ), le = s(
190
+ () => l.value && l.value.substring(13, 15).replace(/\D/g, "0") || "0"
191
+ ), oe = s(
192
+ () => l.value && l.value.substring(16, 18).replace(/\D/g, "0") || "0"
193
+ ), re = s(
194
+ () => l.value && l.value.substring(19, 23).replace(/\D/g, "0") || "0"
195
+ ), Se = s(() => {
196
+ const { start: e, end: t } = E(l.value);
197
+ return [
198
+ {
199
+ label: "Raw",
200
+ value: l.value
201
+ },
202
+ {
203
+ label: "Min Date",
204
+ value: `${n.min ? n.min.toDateString() : "-"}`
205
+ },
206
+ {
207
+ label: "Max Date",
208
+ value: `${n.max ? n.max.toDateString() : "-"}`
209
+ },
210
+ {
211
+ label: "Start",
212
+ value: `${String(te.value).padStart(2, "0")} / ${String(
213
+ ne.value
214
+ ).padStart(2, "0")} / ${String(ae.value).padStart(4, "0")}`
215
+ },
216
+ {
217
+ label: "End",
218
+ value: `${String(le.value).padStart(2, "0")} / ${String(
219
+ oe.value
220
+ ).padStart(2, "0")} / ${String(re.value).padStart(4, "0")}`
221
+ },
222
+ { label: "Digits only", value: k.value },
223
+ { label: "Mask complete", value: `${Y.value}` },
224
+ {
225
+ label: "Parsed",
226
+ value: `${e ? e.toDateString() : "-"} | ${t ? t.toDateString() : "-"}`
227
+ },
228
+ {
229
+ label: "Valid (managed)",
230
+ value: `${P.value ?? "-"}`
231
+ },
232
+ { label: "Span (days)", value: `${I.value ?? "-"}` },
233
+ {
234
+ label: "Reason",
235
+ value: `${T.value ?? "-"}`
236
+ },
237
+ {
238
+ label: "Cursor in",
239
+ value: `${d.value ?? "-"} (${(() => {
240
+ const a = d.value ?? 0, o = G(a);
241
+ return `${o.side}.${o.part}`;
242
+ })()})`
243
+ }
244
+ ];
245
+ }), se = () => {
246
+ M(() => {
247
+ const e = document.getElementById(n.id);
248
+ if (!e) {
249
+ console.warn(`#${n.id} not found for styling.`);
250
+ return;
251
+ }
252
+ const t = e.closest("div");
253
+ if (!t) {
254
+ console.warn(`Parent div of #${n.id} not found for styling.`);
255
+ return;
256
+ }
257
+ t.classList.contains("fk-daterangepicker") || t.classList.add("fk-daterangepicker");
258
+ });
259
+ };
260
+ xe(() => {
261
+ se();
262
+ });
263
+ const be = () => {
264
+ M(() => {
265
+ try {
266
+ const e = Array.from(
267
+ document.querySelectorAll(".k-animation-container")
268
+ );
269
+ if (!e.length) return;
270
+ const a = [...e].reverse().find((m) => m.querySelector(".k-calendar"))?.querySelector(
271
+ ".k-calendar"
272
+ );
273
+ if (!a) return;
274
+ const o = a.querySelectorAll(
275
+ ".k-calendar-table"
276
+ );
277
+ let i = !1;
278
+ o.forEach((m) => {
279
+ m.tabIndex === 0 && (i ? m.tabIndex = -1 : i = !0);
280
+ });
281
+ } catch (e) {
282
+ console.warn(e);
283
+ }
284
+ });
285
+ };
286
+ return n.isOpen && ue(
287
+ n.isOpen,
288
+ (e) => {
289
+ e && setTimeout(() => be(), 0);
290
+ },
291
+ { immediate: !1 }
292
+ ), {
293
+ id: n.id,
294
+ min: n.min,
295
+ max: n.max,
296
+ raw: l,
297
+ cursorPos: d,
298
+ debugEnabled: ie,
299
+ debugLines: Se,
300
+ digitsOnly: k,
301
+ valid: P,
302
+ validComputed: p(j),
303
+ reason: p(T),
304
+ validationMessage: p(me),
305
+ spanDays: p(I),
306
+ month1: p(te),
307
+ day1: p(ne),
308
+ year1: p(ae),
309
+ month2: p(le),
310
+ day2: p(oe),
311
+ year2: p(re),
312
+ handleChange: fe,
313
+ handleKeyDown: De,
314
+ handleWheel: ge,
315
+ handleKeyUp: he,
316
+ handleClick: ye,
317
+ handleBlur: we,
318
+ handleClear: ee,
319
+ onCalendarChange: () => {
320
+ F.value = !0;
321
+ },
322
+ initStyling: se
323
+ };
324
+ }
325
+ export {
326
+ Ce as u
327
+ };
328
+ //# sourceMappingURL=useMaskedDateRangeInput-owYSg36r.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMaskedDateRangeInput-owYSg36r.mjs","sources":["../../src/range/useMaskedDateRangeInput.ts"],"sourcesContent":["import {\n computed,\n nextTick,\n onMounted,\n readonly,\n ref,\n watch,\n type Ref,\n} from \"vue\";\nimport type { SelectionRange } from \"@progress/kendo-vue-dateinputs\";\n\nexport type RangeChangePayload = { value: SelectionRange | null; event: any };\n\ntype Part = \"mm\" | \"dd\" | \"yyyy\";\n\ntype Side = \"start\" | \"end\";\n\nexport function useMaskedDateRangeInput(args: {\n id: string; // id of the MaskedTextBox input element\n onChange: (p: RangeChangePayload) => void;\n onShowCalendar: (e: KeyboardEvent) => void;\n externalValue?: Ref<SelectionRange | null | undefined>;\n externalValid?: Ref<boolean | undefined>;\n manageValid?: boolean; // default true: mirror computed validity into externalValid\n maxSpanDays?: number; // optional maximum allowed span between start and end (in days)\n min?: Date;\n max?: Date;\n allowReverse?: boolean; // default false\n // Popup control hooks\n isOpen?: Ref<boolean>;\n onRequestClose?: () => void;\n closeDelay?: Ref<number> | number;\n debug?: boolean;\n}) {\n const raw = ref(\"\");\n const cursorPos = ref<number | undefined>(undefined);\n const debugEnabled = ref<boolean>(!!args.debug);\n const calendarChanged = ref<boolean>(false);\n\n const ONE_DAY = 24 * 60 * 60 * 1000;\n const ONE_YEAR = 365 * ONE_DAY;\n const TODAY = new Date();\n const MIN_DATE = new Date(TODAY.getTime() - ONE_YEAR);\n const MAX_DATE = new Date(TODAY.getTime() + ONE_YEAR);\n\n args.min = args.min ?? MIN_DATE;\n args.max = args.max ?? MAX_DATE;\n\n // Define helpers early to avoid \"used before initialization\" issues\n const digitsOnly = computed(() => (raw.value ?? \"\").replace(/\\D/g, \"\"));\n const daysInMonth = (yy: number, mm: number) => new Date(yy, mm, 0).getDate();\n const isValidParts = (yy: number, mm: number, dd: number) => {\n return (\n mm >= 1 && mm <= 12 && yy >= 1000 && dd >= 1 && dd <= daysInMonth(yy, mm)\n );\n };\n // Compare dates by date-only (UTC midnight) to avoid time-of-day issues\n const toUtcMidnightMs = (d: Date) =>\n Date.UTC(d.getFullYear(), d.getMonth(), d.getDate());\n const clampToMinMax = (d: Date | null): Date | null => {\n if (!d) return null;\n // default to 90days ago if min/max not provided\n const min = args.min ?? new Date(Date.now() - 90 * ONE_DAY);\n // default to today\n const max = args.max ?? new Date();\n const dMs = toUtcMidnightMs(d);\n if (dMs < toUtcMidnightMs(min) || dMs > toUtcMidnightMs(max)) return null;\n return d;\n };\n const rangeIsOrdered = (start: Date, end: Date) => {\n return (args.allowReverse ?? false) ? true : start <= end;\n };\n const maskComplete = computed(() => {\n return (raw.value?.length ?? 0) >= 23 && digitsOnly.value.length >= 16;\n });\n\n const parseFromRaw = (\n s: string,\n ): { start: Date | null; end: Date | null } => {\n // Expect MM/DD/YYYY - MM/DD/YYYY\n if ((s ?? \"\").length < 23 || digitsOnly.value.length < 16)\n return { start: null, end: null };\n const left = s.substring(0, 10);\n const right = s.substring(13, 23);\n const [mm1, dd1, yyyy1] = left\n .split(\"/\")\n .map((x) => parseInt(x || \"0\", 10));\n const [mm2, dd2, yyyy2] = right\n .split(\"/\")\n .map((x) => parseInt(x || \"0\", 10));\n const sDate = new Date(yyyy1, mm1 - 1, dd1);\n const eDate = new Date(yyyy2, mm2 - 1, dd2);\n const sOk =\n isValidParts(yyyy1, mm1, dd1) && sDate.toString() !== \"Invalid Date\";\n const eOk =\n isValidParts(yyyy2, mm2, dd2) && eDate.toString() !== \"Invalid Date\";\n return { start: sOk ? sDate : null, end: eOk ? eDate : null };\n };\n\n // validity state shared with consumer when provided\n // Initialize to true to avoid showing validation errors before first blur\n const valid = args.externalValid ?? ref<boolean | undefined>(true);\n // Derived validity and reason\n const parsed = computed(() => parseFromRaw(raw.value));\n const clamped = computed(() => {\n const s = clampToMinMax(parsed.value.start);\n const e = clampToMinMax(parsed.value.end);\n return { start: s, end: e };\n });\n\n // Span in days between clamped start/end; undefined when incomplete or out-of-bounds\n const spanDays = computed<number | undefined>(() => {\n if (!maskComplete.value) return undefined;\n const s = clamped.value.start;\n const e = clamped.value.end;\n if (!s || !e) return undefined;\n const diffMs = Math.abs(toUtcMidnightMs(e) - toUtcMidnightMs(s));\n return Math.round(diffMs / 86400000 + 1); // NOTE: FEATHER-1155\n });\n\n // Set on first blur/clear; nothing is flagged before the user leaves the field\n const isTouched = ref(false);\n\n const reasonComputed = computed<string | undefined>(() => {\n if (!isTouched.value) return undefined;\n\n const { start, end } = parsed.value;\n if (!maskComplete.value) return \"incomplete\";\n if (!start || !end) return \"invalid-date\";\n if (!clamped.value.start || !clamped.value.end) return \"out-of-bounds\";\n const s = clamped.value.start;\n const e = clamped.value.end;\n if (!rangeIsOrdered(s, e)) return \"reversed-range\";\n if (typeof args.maxSpanDays === \"number\" && spanDays.value !== undefined) {\n if (spanDays.value > args.maxSpanDays) return \"span-exceeds-limit\";\n }\n return \"valid\";\n });\n\n const validComputed = computed<boolean | undefined>(() => {\n const r = reasonComputed.value;\n return r === undefined || r === \"valid\";\n });\n\n // User-facing validation message derived from the same live reason as validComputed\n const validationMessage = computed<string>(() => {\n const { min, max } = args;\n const r = reasonComputed.value;\n\n if (!r) return \"\";\n\n switch (r) {\n case \"incomplete\":\n return \"Required\";\n case \"invalid-date\":\n return \"One or both dates invalid.\";\n case \"reversed-range\":\n return \"End Date must be on or after Start Date.\";\n case \"out-of-bounds\":\n if (min && max) {\n return `Dates must be between ${formatDate(min)} and ${formatDate(max)}.`;\n }\n return \"Dates must be within the allowed range.\";\n case \"span-exceeds-limit\":\n return typeof args.maxSpanDays === \"number\"\n ? `Date range exceeds ${args.maxSpanDays} days.`\n : \"Date range exceeds maximum allowed span.\";\n case \"valid\":\n default:\n return \"\";\n }\n });\n // // Mirror computed validity into external ref when enabled\n // watch(\n // validComputed,\n // (v) => {\n // if (args.manageValid ?? true) {\n // valid.value = v;\n // }\n // },\n // { immediate: true },\n // );\n\n const steppers: string[] = [\"ArrowUp\", \"ArrowDown\"];\n const cursorKeys: string[] = [\"ArrowLeft\", \"ArrowRight\"]; // tracked to keep caret\n\n const fmt = (n: number, w: number) => String(n).padStart(w, \"0\");\n const formatDate = (d: Date) =>\n `${fmt(d.getMonth() + 1, 2)}/${fmt(d.getDate(), 2)}/${fmt(\n d.getFullYear(),\n 4,\n )}`;\n\n // rangeIsOrdered declared earlier\n\n const datePartForPos = (pos: number): { side: Side; part: Part } => {\n // Mask: 00/00/0000 - 00/00/0000\n // Index map (digits start at 0..9 for start, 13..22 for end)\n if (pos <= 2) return { side: \"start\", part: \"mm\" };\n if (pos <= 5) return { side: \"start\", part: pos <= 3 ? \"dd\" : \"dd\" };\n if (pos <= 11) return { side: \"start\", part: \"yyyy\" };\n if (pos <= 15) return { side: \"end\", part: \"mm\" };\n if (pos <= 18) return { side: \"end\", part: \"dd\" };\n return { side: \"end\", part: \"yyyy\" };\n };\n\n const applyStep = (\n direction: \"ArrowUp\" | \"ArrowDown\",\n sourceEl: HTMLInputElement | null | undefined,\n event: Event,\n ): void => {\n const pos = sourceEl?.selectionStart ?? cursorPos.value ?? 0;\n cursorPos.value = pos;\n\n // Current parsed values\n const { start, end } = parseFromRaw(raw.value);\n\n // If SelectionRange is null/undefined (both sides missing), default to today and ignore the step\n if (!start && !end) {\n const today = new Date();\n const tStr = formatDate(today);\n raw.value = `${tStr} - ${tStr}`;\n args.onChange({ value: { start: today, end: today }, event });\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n return;\n }\n\n // Build baseline from user's parsed input; clamp only when emitting\n const today = new Date();\n\n const which = datePartForPos(pos);\n\n // Baseline dates: prefer parsed values (even if out-of-bounds); otherwise today\n let s = start ? new Date(start) : new Date(today);\n let e = end ? new Date(end) : new Date(today);\n\n const mutate = (d: Date, part: Part) => {\n if (part === \"mm\") {\n const m = d.getMonth() + 1;\n const next =\n direction === \"ArrowUp\" ? (m < 12 ? m + 1 : 1) : m > 1 ? m - 1 : 12;\n d.setMonth(next - 1);\n // Fix day overflow after month change\n const days = daysInMonth(d.getFullYear(), next);\n if (d.getDate() > days) d.setDate(days);\n } else if (part === \"dd\") {\n const days = daysInMonth(d.getFullYear(), d.getMonth() + 1);\n const day = d.getDate();\n const next =\n direction === \"ArrowUp\"\n ? day < days\n ? day + 1\n : 1\n : day > 1\n ? day - 1\n : days;\n d.setDate(next);\n } else if (part === \"yyyy\") {\n const y = d.getFullYear();\n d.setFullYear(direction === \"ArrowUp\" ? y + 1 : Math.max(1, y - 1));\n // Fix Feb 29 overflow, etc.\n const days = daysInMonth(d.getFullYear(), d.getMonth() + 1);\n if (d.getDate() > days) d.setDate(days);\n }\n };\n\n if (which.side === \"start\") mutate(s, which.part);\n else mutate(e, which.part);\n\n // Compose new raw string: keep the untouched side as-is from current raw if parseable\n const sText = formatDate(s);\n const eText = formatDate(e);\n raw.value = `${sText} - ${eText}`;\n\n // Emit if valid and ordered and within min/max; else null\n const sClamped = clampToMinMax(s);\n const eClamped = clampToMinMax(e);\n if (sClamped && eClamped && rangeIsOrdered(sClamped, eClamped)) {\n args.onChange({ value: { start: sClamped, end: eClamped }, event });\n } else {\n args.onChange({ value: null, event });\n }\n\n // Restore caret\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n };\n\n const emitParsedIfComplete = (event: any) => {\n const { start, end } = parseFromRaw(raw.value);\n if (!start || !end) {\n args.onChange({ value: null, event });\n return;\n }\n const sClamped = clampToMinMax(start);\n const eClamped = clampToMinMax(end);\n if (!sClamped || !eClamped) {\n args.onChange({ value: null, event });\n return;\n }\n if (!rangeIsOrdered(sClamped, eClamped)) {\n args.onChange({ value: null, event });\n return;\n }\n args.onChange({ value: { start: sClamped, end: eClamped }, event });\n };\n\n const handleChange = (event: any): void => {\n const newValue = (event.value ?? \"\") as string;\n const originalEvent = event.event as Event | undefined;\n\n // No clear event handler from Kendo...\n // Kendo's clear button sets the value to empty and raises change;\n // treat that as an explicit clear action.\n if (!newValue && originalEvent && (originalEvent as any).type === \"click\") {\n handleClear(originalEvent);\n return;\n }\n\n raw.value = newValue;\n const src = originalEvent?.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n // Do not coerce user's input; only emit parsed range when complete and valid\n emitParsedIfComplete(event);\n };\n\n const handleClick = (event: MouseEvent): void => {\n cursorPos.value = (event.target as HTMLInputElement).selectionStart ?? 0;\n };\n\n // Wheel events can target the MaskedTextBox wrapper, so fall back to the input by id.\n const resolveInput = (event: Event): HTMLInputElement | null =>\n event.target instanceof HTMLInputElement\n ? event.target\n : (document.getElementById(args.id) as HTMLInputElement | null);\n\n // Native disabled/readonly is the source of truth, so plain Kendo inputs get the guard too.\n const isEditable = (el: HTMLInputElement | null): boolean =>\n !el?.disabled && !el?.readOnly;\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (!isEditable(resolveInput(event))) return;\n // Space already opens calendar\n if (event.code === \"Space\" || event.key === \" \") {\n // Do not let Space modify the input; only open the calendar\n // Justified: Space opens the calendar popup instead of inserting a space.\n event.preventDefault();\n // Justified: Parent containers such as grid keyboard handlers should not consume this.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n // Alt + ArrowDown: open calendar popup without changing the value via stepper\n if (event.key === \"ArrowDown\" && event.altKey) {\n // Justified: Alt+Down is reserved for opening the calendar popup.\n event.preventDefault();\n // Justified: Prevent parent keyboard navigation from treating this as row movement.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n if (steppers.includes(event.key)) {\n // Justified: ArrowUp/Down act as range-part steppers instead of native caret/page behavior.\n event.preventDefault();\n // Justified: Prevent parent containers such as the grid from also handling these arrows.\n event.stopPropagation();\n const src = event.target as HTMLInputElement;\n applyStep(event.key as \"ArrowUp\" | \"ArrowDown\", src, event);\n return;\n }\n };\n\n const handleWheel = (event: WheelEvent): void => {\n const input = resolveInput(event);\n // Let the page scroll when the input can't be edited.\n if (!isEditable(input)) return;\n // Prevent page scroll when interacting with the input\n event.preventDefault();\n const direction = event.deltaY < 0 ? \"ArrowUp\" : \"ArrowDown\";\n applyStep(direction, input, event);\n };\n\n const handleKeyUp = (event: KeyboardEvent): void => {\n if (cursorKeys.includes(event.key) || steppers.includes(event.key)) {\n const src = event.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n }\n };\n\n const applyBlurValidation = () => {\n isTouched.value = true;\n\n if (args.manageValid ?? true) {\n valid.value = validComputed.value;\n }\n };\n\n const handleBlur = (_event: FocusEvent): void => {\n applyBlurValidation();\n };\n\n const handleClear = (event?: Event): void => {\n raw.value = \"\";\n cursorPos.value = 0;\n\n // Emit cleared range to consumer\n args.onChange({ value: null, event });\n\n // Run the same validation flow as on blur\n applyBlurValidation();\n\n // Return focus to the masked input so the user can retype\n nextTick(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(0, 0);\n }\n });\n };\n\n // Sync external range into raw when provided\n if (args.externalValue) {\n watch(\n args.externalValue,\n (newVal) => {\n const start = newVal?.start ?? null;\n const end = newVal?.end ?? null;\n if (start && end) {\n raw.value = `${formatDate(start)} - ${formatDate(end)}`;\n // If the change originated from calendar and popup is open, request close\n if (\n args.isOpen?.value &&\n calendarChanged.value &&\n args.onRequestClose\n ) {\n const delay =\n typeof args.closeDelay === \"number\"\n ? args.closeDelay\n : (args.closeDelay?.value ?? 0);\n setTimeout(() => {\n args.onRequestClose?.();\n calendarChanged.value = false;\n applyBlurValidation();\n }, delay);\n }\n return;\n }\n // If external is null/invalid, keep current raw as-is to preserve user's typing\n },\n { immediate: true },\n );\n }\n\n const month1 = computed(() =>\n raw.value ? raw.value.substring(0, 2).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const day1 = computed(() =>\n raw.value ? raw.value.substring(3, 5).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const year1 = computed(() =>\n raw.value ? raw.value.substring(6, 10).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const month2 = computed(() =>\n raw.value ? raw.value.substring(13, 15).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const day2 = computed(() =>\n raw.value ? raw.value.substring(16, 18).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const year2 = computed(() =>\n raw.value ? raw.value.substring(19, 23).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n\n const debugLines = computed((): Array<{ label: string; value: string }> => {\n const { start, end } = parseFromRaw(raw.value);\n return [\n {\n label: \"Raw\",\n value: raw.value,\n },\n {\n label: \"Min Date\",\n value: `${args.min ? args.min.toDateString() : \"-\"}`,\n },\n {\n label: \"Max Date\",\n value: `${args.max ? args.max.toDateString() : \"-\"}`,\n },\n {\n label: \"Start\",\n value: `${String(month1.value).padStart(2, \"0\")} / ${String(\n day1.value,\n ).padStart(2, \"0\")} / ${String(year1.value).padStart(4, \"0\")}`,\n },\n {\n label: \"End\",\n value: `${String(month2.value).padStart(2, \"0\")} / ${String(\n day2.value,\n ).padStart(2, \"0\")} / ${String(year2.value).padStart(4, \"0\")}`,\n },\n { label: \"Digits only\", value: digitsOnly.value },\n { label: \"Mask complete\", value: `${maskComplete.value}` },\n {\n label: \"Parsed\",\n value: `${start ? start.toDateString() : \"-\"} | ${\n end ? end.toDateString() : \"-\"\n }`,\n },\n {\n label: \"Valid (managed)\",\n value: `${valid.value ?? \"-\"}`,\n },\n { label: \"Span (days)\", value: `${spanDays.value ?? \"-\"}` },\n {\n label: \"Reason\",\n value: `${reasonComputed.value ?? \"-\"}`,\n },\n {\n label: \"Cursor in\",\n value: `${cursorPos.value ?? \"-\"} (${(() => {\n const p = cursorPos.value ?? 0;\n const w = datePartForPos(p);\n return `${w.side}.${w.part}`;\n })()})`,\n },\n ];\n });\n\n const initStyling = () => {\n // Idempotent application of the `fk-daterangepicker` class to the input's parent\n nextTick(() => {\n const rangeInput = document.getElementById(args.id) as HTMLElement | null;\n if (!rangeInput) {\n console.warn(`#${args.id} not found for styling.`);\n return;\n }\n const parentDiv = rangeInput.closest(\"div\");\n if (!parentDiv) {\n console.warn(`Parent div of #${args.id} not found for styling.`);\n return;\n }\n if (parentDiv.classList.contains(\"fk-daterangepicker\")) return;\n parentDiv.classList.add(\"fk-daterangepicker\");\n });\n };\n\n onMounted(() => {\n initStyling();\n });\n\n // Accessibility fix: ensure only one month grid has tabIndex=0\n const calendarMonthTabIndexFix = () => {\n nextTick(() => {\n try {\n const containers = Array.from(\n document.querySelectorAll(\".k-animation-container\"),\n ) as HTMLElement[];\n if (!containers.length) return;\n\n // Prefer the most recently added visible container that has a calendar\n const candidate = [...containers]\n .reverse()\n .find((c) => c.querySelector(\".k-calendar\"));\n const calendarRoot = candidate?.querySelector(\n \".k-calendar\",\n ) as HTMLElement | null;\n if (!calendarRoot) return;\n\n const months = calendarRoot.querySelectorAll(\n \".k-calendar-table\",\n ) as NodeListOf<HTMLElement>;\n let foundTab0 = false;\n months.forEach((m) => {\n if (m.tabIndex === 0) {\n if (!foundTab0) {\n foundTab0 = true;\n } else {\n m.tabIndex = -1;\n }\n }\n });\n } catch (e) {\n // no-op; defensive\n console.warn(e);\n }\n });\n };\n\n // When popup opens, run the fix after render\n if (args.isOpen) {\n watch(\n args.isOpen,\n (open) => {\n if (open) {\n // Allow popup DOM to mount first\n setTimeout(() => calendarMonthTabIndexFix(), 0);\n }\n },\n { immediate: false },\n );\n }\n\n return {\n id: args.id,\n min: args.min,\n max: args.max,\n raw,\n cursorPos,\n debugEnabled: debugEnabled,\n debugLines: debugLines,\n digitsOnly: digitsOnly,\n valid,\n validComputed: readonly(validComputed),\n reason: readonly(reasonComputed),\n validationMessage: readonly(validationMessage),\n spanDays: readonly(spanDays),\n month1: readonly(month1),\n day1: readonly(day1),\n year1: readonly(year1),\n month2: readonly(month2),\n day2: readonly(day2),\n year2: readonly(year2),\n handleChange,\n handleKeyDown,\n handleWheel,\n handleKeyUp,\n handleClick,\n handleBlur,\n handleClear,\n onCalendarChange: () => {\n calendarChanged.value = true;\n },\n initStyling,\n };\n}\n\nexport type UseMaskedDateRangeInputReturn = ReturnType<\n typeof useMaskedDateRangeInput\n>;\n"],"names":["useMaskedDateRangeInput","args","raw","ref","cursorPos","debugEnabled","calendarChanged","ONE_DAY","ONE_YEAR","TODAY","MIN_DATE","MAX_DATE","digitsOnly","computed","daysInMonth","yy","mm","isValidParts","dd","toUtcMidnightMs","d","clampToMinMax","min","max","dMs","rangeIsOrdered","start","end","maskComplete","parseFromRaw","s","left","right","mm1","dd1","yyyy1","x","mm2","dd2","yyyy2","sDate","eDate","sOk","eOk","valid","parsed","clamped","e","spanDays","diffMs","isTouched","reasonComputed","validComputed","r","validationMessage","formatDate","steppers","cursorKeys","fmt","n","w","datePartForPos","pos","applyStep","direction","sourceEl","event","today","tStr","nextTick","inputEl","p","which","mutate","part","m","next","days","day","y","sText","eText","sClamped","eClamped","emitParsedIfComplete","handleChange","newValue","originalEvent","handleClear","src","handleClick","resolveInput","isEditable","el","handleKeyDown","handleWheel","input","handleKeyUp","applyBlurValidation","handleBlur","_event","watch","newVal","delay","month1","day1","year1","month2","day2","year2","debugLines","initStyling","rangeInput","parentDiv","onMounted","calendarMonthTabIndexFix","containers","calendarRoot","c","months","foundTab0","open","readonly"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const i=require("vue");function re(n){const o=i.ref(""),m=i.ref(void 0),z=i.ref(!!n.debug),U=i.ref(n.timeFormat??"hh:mm AM"),A=i.computed(()=>!!n.required),w=i.ref(!1),C=["ArrowUp","ArrowDown"],G=["ArrowLeft","ArrowRight"],M=i.computed(()=>(o.value??"").replace(/\D/g,"")),J={H:/[0-9]/,h:/[0-9]/,M:/[0-9]/,m:/[0-9]/,A:/[AaPp]/,a:/[Mm]/},R=e=>e<=2?"hh":e<=5?"mm":"ampm",q=i.computed(()=>{const e=o.value&&o.value.substring(0,2).replace(/\D/g,"0")||"0",t=parseInt(e);return Math.min(Math.max(t,0),23)}),k=i.computed(()=>{const e=o.value&&o.value.substring(3,5).replace(/\D/g,"0")||"0",t=parseInt(e);return Math.min(Math.max(t,0),59)}),P=i.computed(()=>(o.value?.substring(6,8)||"AM").toUpperCase().startsWith("P")?"PM":"AM"),D=i.computed(()=>{const e=parseInt(o.value?.substring(0,2).replace(/\D/g,"0")||"0"),t=P.value;return e===12?t==="AM"?0:12:t==="PM"?e+12:e}),L=i.computed(()=>v.value?`${String(D.value).padStart(2,"0")}:${String(k.value).padStart(2,"0")}:00`:null),v=i.computed(()=>/^(\d{2}):(\d{2})\s([AP]M)$/i.test(o.value??"")),x=(e,t,u)=>{let r=e%12;return r===0&&(r=12),`${String(r).padStart(2,"0")}:${String(t).padStart(2,"0")} ${u}`},S=e=>{const t=e.match(/^(\d{2}):(\d{2})\s([AP]M)$/i);if(!t)return null;const u=parseInt(t[1]),r=parseInt(t[2]),l=t[3].toUpperCase();if(u<1||u>12||r<0||r>59)return null;let f=u%12;l==="PM"&&(f+=12);const a=new Date;return a.setSeconds(0,0),a.setHours(f),a.setMinutes(r),a},N=e=>{if(M.value.length===0){n.onChange({value:null,event:e});return}if(!v.value){n.onChange({value:null,event:e});return}const t=S(o.value);t&&h(t)?n.onChange({value:t,event:e}):n.onChange({value:null,event:e})},$=e=>e.getHours()*60+e.getMinutes(),h=e=>{const t=n.min??void 0,u=n.max??void 0,r=$(e);if(t){const l=$(t);if(r<l)return!1}if(u){const l=$(u);if(r>l)return!1}return!0},F=e=>{const t=e.getHours(),u=t>=12?"PM":"AM";o.value=x(t,e.getMinutes(),u)},I=(e,t)=>{n.onChange({value:e,event:t})},H=()=>{i.nextTick(()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{const e=document.getElementById(n.id);if(e){e.focus();const t=(e.value??"").length;e.setSelectionRange(t,t)}})})})},Q=e=>{const t=e?.event?.target;return t?t.closest(".k-time-now")?"now":t.closest(".k-time-accept")?"set":null:null},y=(e,t)=>{e&&h(e)?I(e,t):I(null,t)},X=(...e)=>{const t=e[0];if(!t)return;const u=Q(t);if(u==="now"){const l=new Date;F(l),y(l,t),H();return}if(t?.value instanceof Date){const l=new Date(t.value);F(l),y(l,t),u==="set"&&H();return}if(t?.value===null){o.value="",I(null,t);return}o.value=t.value;const r=t.event?.target;m.value=r?.selectionStart??0;try{const l=m.value??0;if(R(l)==="ampm"&&(o.value??"").length>=8){const f=o.value.charAt(6);/[Aa]/.test(f)?(o.value=`${o.value.slice(0,6)}AM${o.value.slice(8)}`,i.nextTick(()=>{requestAnimationFrame(()=>{const a=document.getElementById(n.id);a&&(a.focus(),a.setSelectionRange(8,8))})})):/[Pp]/.test(f)&&(o.value=`${o.value.slice(0,6)}PM${o.value.slice(8)}`,i.nextTick(()=>{requestAnimationFrame(()=>{const a=document.getElementById(n.id);a&&(a.focus(),a.setSelectionRange(8,8))})}))}}catch{}N(t)},Z=e=>{m.value=e.target.selectionStart??0},B=(e,t,u)=>{const r=t?.selectionStart??m.value??0;m.value=r;const l=R(r),f=(o.value??"").match(/^(\d{2}):(\d{2})\s([AP]M)$/i);if(!f){if((o.value??"").length===0||M.value.length===0){const c=new Date,d=c.getHours(),p=d>=12?"PM":"AM";o.value=x(d,c.getMinutes(),p);const ue=S(o.value);y(ue,u),i.nextTick(()=>{requestAnimationFrame(()=>{const E=document.getElementById(n.id),j=m.value??0;E&&(E.focus(),E.setSelectionRange(j,j))})})}return}let a=parseInt(f[1]),s=parseInt(f[2]),b=f[3].toUpperCase();if(l==="hh")e==="ArrowUp"?a=a<12?a+1:1:a=a>1?a-1:12;else if(l==="mm"){const c=n.minuteStepRef?.value??n.minuteStep??1;if(c===1)e==="ArrowUp"?s=s<59?s+1:0:s=s>0?s-1:59;else if(e==="ArrowUp"){const d=s%c;let p=d===0?s+c:s+(c-d);p>=60&&(p=0),s=p}else{const d=s%c;let p=d===0?s-c:s-d;p<0&&(p=60-c),s=p}}else l==="ampm"&&(b=b==="AM"?"PM":"AM");o.value=`${String(a).padStart(2,"0")}:${String(s).padStart(2,"0")} ${b}`;const oe=S(o.value);y(oe,u),i.nextTick(()=>{requestAnimationFrame(()=>{const c=document.getElementById(n.id),d=m.value??0;c&&(c.focus(),c.setSelectionRange(d,d))})})},V=e=>e.target instanceof HTMLInputElement?e.target:document.getElementById(n.id),K=e=>!e?.disabled&&!e?.readOnly,_=e=>{if(K(V(e))){if(e.code==="Space"||e.key===" "){e.preventDefault(),e.stopPropagation(),n.onShowPicker(e);return}if(e.key==="ArrowDown"&&e.altKey){e.preventDefault(),e.stopPropagation(),n.onShowPicker(e);return}if(C.includes(e.key)){if(e.altKey)return;e.preventDefault(),e.stopPropagation();const t=e.target;B(e.key,t,e);return}}},ee=e=>{const t=V(e);if(!K(t))return;e.preventDefault();const u=e.deltaY<0?"ArrowUp":"ArrowDown";B(u,t,e)},te=e=>{const t=e.target;if(G.includes(e.key)){m.value=t?.selectionStart??0;return}if(C.includes(e.key)){if(e.altKey)return;m.value=t?.selectionStart??0}},ne=e=>{w.value=!0,A.value&&n.externalValue&&n.externalValue.value===void 0&&M.value.length===0&&(n.externalValue.value="");const t=e.target;t&&(m.value=t.selectionStart??0)};n.externalValue&&i.watch(n.externalValue,e=>{if(e){const t=new Date(e);if(t.toString()!=="Invalid Date"){const u=t.getHours(),r=u>=12?"PM":"AM";o.value=x(u,t.getMinutes(),r);return}}},{immediate:!0});const ie=i.computed(()=>[["Time",o.value||"--:-- --"],["Hour (12h)",q.value],["Hour (24h)",D.value],["Minute",k.value],["Period",P.value],["Time (24h)",L.value??"--:--:--"],["Digits only",M.value],["Parsed Date",g.value?.toLocaleDateString("en-US",{hour:"2-digit",minute:"2-digit"})??null],["min",n.min?.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})??null],["max",n.max?.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})??null],["valid",O.value],["reason",T.value],["validationMessage",W.value]]),g=i.computed(()=>S(o.value)??null),O=i.computed(()=>{if(!A.value){if(!v.value)return!0;const t=g.value;return t?h(t):!1}if(!w.value)return!0;const e=g.value;return!v.value||!e?!1:h(e)}),T=i.computed(()=>{if(!A.value){if(!v.value)return;const t=g.value;return t?h(t)?"valid":"out-of-bounds":"invalid-time"}if(!w.value)return;if(M.value.length===0||!v.value)return"incomplete";const e=g.value;return e?h(e)?"valid":"out-of-bounds":"invalid-time"}),W=i.computed(()=>{const e=T.value;if(!e||e==="valid")return"";if(e==="incomplete")return"Required";if(e==="invalid-time")return`Must be in ${U.value} format.`;const t={hour:"2-digit",minute:"2-digit"},u=n.min?n.min.toLocaleTimeString("en-US",t):null,r=n.max?n.max.toLocaleTimeString("en-US",t):null;if(e==="out-of-bounds"){if(u&&r)return`Must be between ${u} and ${r}.`;if(u)return`Must be ${u} or later.`;if(r)return`Must be ${r} or earlier.`}return""}),Y=()=>{i.nextTick(()=>{const e=document.getElementById(n.id);if(!e){console.warn(`#${n.id} not found for styling.`);return}const t=e.closest(".k-timepicker");if(!t){console.warn(`.k-timepicker parent of #${n.id} not found for styling.`);return}const u=t.parentElement;if(!u){console.warn(`Parent of .k-timepicker not found for #${n.id} styling.`);return}u.classList.contains("fk-timepicker")||u.classList.add("fk-timepicker")})};return i.onMounted(()=>{Y()}),{id:n.id,min:n.min,max:n.max,raw:o,rules:J,debugEnabled:z,debugLines:ie,placeholder:U,isValid:O,reason:i.readonly(T),validationMessage:W,isComplete:v,inRangeTime:h,cursorPos:m,hour:i.readonly(q),hour24:i.readonly(D),minute:i.readonly(k),period:i.readonly(P),time24:i.readonly(L),parsedRawTime:i.readonly(g),handleChange:X,handleKeyDown:_,handleKeyUp:te,handleClick:Z,handleWheel:ee,handleBlur:ne,initStyling:Y}}exports.useMaskedTimeInput=re;
2
+ //# sourceMappingURL=useMaskedTimeInput-DPd2lysd.cjs.map