@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.
- package/README.md +62 -15
- package/dist/address.cjs +2 -0
- package/dist/address.cjs.map +1 -0
- package/dist/address.mjs +6 -0
- package/dist/address.mjs.map +1 -0
- package/dist/chunks/useActiveIdRegistry-BG8VR__Z.mjs +43 -0
- package/dist/chunks/useActiveIdRegistry-BG8VR__Z.mjs.map +1 -0
- package/dist/chunks/useActiveIdRegistry-C1b00tqW.cjs +2 -0
- package/dist/chunks/useActiveIdRegistry-C1b00tqW.cjs.map +1 -0
- package/dist/chunks/useCompositeId-DyrJ0Fqj.cjs +2 -0
- package/dist/chunks/useCompositeId-DyrJ0Fqj.cjs.map +1 -0
- package/dist/chunks/useCompositeId-xg87ehXQ.mjs +9 -0
- package/dist/chunks/useCompositeId-xg87ehXQ.mjs.map +1 -0
- package/dist/chunks/useFieldsetValidationKit-7W1XDbbr.cjs +2 -0
- package/dist/chunks/useFieldsetValidationKit-7W1XDbbr.cjs.map +1 -0
- package/dist/chunks/useFieldsetValidationKit-x0Rh48mE.mjs +64 -0
- package/dist/chunks/useFieldsetValidationKit-x0Rh48mE.mjs.map +1 -0
- package/dist/chunks/useGridRowAction-Di25yeqb.cjs +2 -0
- package/dist/chunks/useGridRowAction-Di25yeqb.cjs.map +1 -0
- package/dist/chunks/useGridRowAction-akjwkV_F.mjs +532 -0
- package/dist/chunks/useGridRowAction-akjwkV_F.mjs.map +1 -0
- package/dist/chunks/useIntersectionObserver-A4xQV_pl.mjs +23 -0
- package/dist/chunks/useIntersectionObserver-A4xQV_pl.mjs.map +1 -0
- package/dist/chunks/useIntersectionObserver-CfgNAo2N.cjs +2 -0
- package/dist/chunks/useIntersectionObserver-CfgNAo2N.cjs.map +1 -0
- package/dist/chunks/useMaskedDateInput-COOksUM_.mjs +276 -0
- package/dist/chunks/useMaskedDateInput-COOksUM_.mjs.map +1 -0
- package/dist/chunks/useMaskedDateInput-wRnYlR3L.cjs +2 -0
- package/dist/chunks/useMaskedDateInput-wRnYlR3L.cjs.map +1 -0
- package/dist/chunks/useMaskedDateRangeInput-DST5aQe0.cjs +2 -0
- package/dist/chunks/useMaskedDateRangeInput-DST5aQe0.cjs.map +1 -0
- package/dist/chunks/useMaskedDateRangeInput-owYSg36r.mjs +328 -0
- package/dist/chunks/useMaskedDateRangeInput-owYSg36r.mjs.map +1 -0
- package/dist/chunks/useMaskedTimeInput-DPd2lysd.cjs +2 -0
- package/dist/chunks/useMaskedTimeInput-DPd2lysd.cjs.map +1 -0
- package/dist/chunks/useMaskedTimeInput-DjtBdvsf.mjs +363 -0
- package/dist/chunks/useMaskedTimeInput-DjtBdvsf.mjs.map +1 -0
- package/dist/chunks/usePopupMenu-CZLtgrXk.mjs +296 -0
- package/dist/chunks/usePopupMenu-CZLtgrXk.mjs.map +1 -0
- package/dist/chunks/usePopupMenu-DeTWakUH.cjs +2 -0
- package/dist/chunks/usePopupMenu-DeTWakUH.cjs.map +1 -0
- package/dist/chunks/usePopupTrap-DQudM6YA.cjs +2 -0
- package/dist/chunks/usePopupTrap-DQudM6YA.cjs.map +1 -0
- package/dist/chunks/usePopupTrap-DeuXHLZR.mjs +105 -0
- package/dist/chunks/usePopupTrap-DeuXHLZR.mjs.map +1 -0
- package/dist/chunks/useUSAddress-BYZZfbHc.cjs +2 -0
- package/dist/chunks/useUSAddress-BYZZfbHc.cjs.map +1 -0
- package/dist/chunks/useUSAddress-CRcqdqrZ.mjs +291 -0
- package/dist/chunks/useUSAddress-CRcqdqrZ.mjs.map +1 -0
- package/dist/chunks/useWindow-C4XFBuJA.mjs +210 -0
- package/dist/chunks/useWindow-C4XFBuJA.mjs.map +1 -0
- package/dist/chunks/useWindow-Yia2I6zX.cjs +2 -0
- package/dist/chunks/useWindow-Yia2I6zX.cjs.map +1 -0
- package/dist/date/useMaskedDateInput.d.ts +4 -0
- package/dist/date.cjs +2 -0
- package/dist/date.cjs.map +1 -0
- package/dist/date.mjs +5 -0
- package/dist/date.mjs.map +1 -0
- package/dist/{docs-manifest.js → docs-manifest.mjs} +24 -24
- package/dist/form.cjs +2 -0
- package/dist/form.cjs.map +1 -0
- package/dist/form.mjs +6 -0
- package/dist/form.mjs.map +1 -0
- package/dist/geometry.cjs +2 -0
- package/dist/geometry.cjs.map +1 -0
- package/dist/geometry.mjs +60 -0
- package/dist/geometry.mjs.map +1 -0
- package/dist/grid.cjs +2 -0
- package/dist/grid.cjs.map +1 -0
- package/dist/grid.mjs +7 -0
- package/dist/grid.mjs.map +1 -0
- package/dist/id.cjs +2 -0
- package/dist/id.cjs.map +1 -0
- package/dist/id.mjs +5 -0
- package/dist/id.mjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.mjs +37 -0
- package/dist/index.mjs.map +1 -0
- package/dist/menu.cjs +2 -0
- package/dist/menu.cjs.map +1 -0
- package/dist/menu.mjs +5 -0
- package/dist/menu.mjs.map +1 -0
- package/dist/observer.cjs +2 -0
- package/dist/observer.cjs.map +1 -0
- package/dist/observer.mjs +5 -0
- package/dist/observer.mjs.map +1 -0
- package/dist/range/useMaskedDateRangeInput.d.ts +4 -0
- package/dist/range.cjs +2 -0
- package/dist/range.cjs.map +1 -0
- package/dist/range.mjs +5 -0
- package/dist/range.mjs.map +1 -0
- package/dist/registry.cjs +2 -0
- package/dist/registry.cjs.map +1 -0
- package/dist/registry.mjs +6 -0
- package/dist/registry.mjs.map +1 -0
- package/dist/time/useMaskedTimeInput.d.ts +4 -0
- package/dist/time.cjs +2 -0
- package/dist/time.cjs.map +1 -0
- package/dist/time.mjs +5 -0
- package/dist/time.mjs.map +1 -0
- package/dist/trap.cjs +2 -0
- package/dist/trap.cjs.map +1 -0
- package/dist/trap.mjs +7 -0
- package/dist/trap.mjs.map +1 -0
- package/dist/window.cjs +2 -0
- package/dist/window.cjs.map +1 -0
- package/dist/window.mjs +6 -0
- package/dist/window.mjs.map +1 -0
- package/docs/date/useMaskedDateInput.md +3 -0
- package/docs/range/useMaskedDateRangeInput.md +6 -7
- package/docs/time/useMaskedTimeInput.md +3 -0
- package/package.json +38 -36
- package/dist/featherk-composables.es.js +0 -2628
- package/dist/featherk-composables.es.js.map +0 -1
- package/dist/featherk-composables.umd.js +0 -2
- package/dist/featherk-composables.umd.js.map +0 -1
- /package/dist/{docs-manifest.d.ts → docs-manifest.d.mts} +0 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { shallowRef as T, ref as y, watch as O, nextTick as c, readonly as P } from "vue";
|
|
2
|
+
import { useFocusTrap as F } from "@vueuse/integrations/useFocusTrap";
|
|
3
|
+
import { onClickOutside as E } from "@vueuse/core";
|
|
4
|
+
const R = {
|
|
5
|
+
outsideClick: !1,
|
|
6
|
+
returnFocusToTrigger: !1,
|
|
7
|
+
focusTrapOptions: {
|
|
8
|
+
returnFocusOnDeactivate: !1
|
|
9
|
+
}
|
|
10
|
+
}, q = {
|
|
11
|
+
outsideClick: !1
|
|
12
|
+
};
|
|
13
|
+
function A(e) {
|
|
14
|
+
const o = T(null), m = [
|
|
15
|
+
".k-animation-container .k-popup",
|
|
16
|
+
".k-popup",
|
|
17
|
+
".k-timepicker-popup",
|
|
18
|
+
".k-menu-popup"
|
|
19
|
+
], s = Array.isArray(e.popupSelector) ? e.popupSelector : [e.popupSelector ?? m].flat(), k = (n) => n ? typeof e.initialFocus == "string" ? n.querySelector(e.initialFocus) ?? n : typeof e.initialFocus == "function" ? e.initialFocus(n) ?? n : n.querySelector(
|
|
20
|
+
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
|
|
21
|
+
) ?? n : null, { activate: f, deactivate: p } = F(o, {
|
|
22
|
+
escapeDeactivates: !1,
|
|
23
|
+
clickOutsideDeactivates: !1,
|
|
24
|
+
// Without this, focus-trap's own default (false) preventDefault()s and
|
|
25
|
+
// swallows every outside pointerdown/click while active - not just ones
|
|
26
|
+
// that would close it - blocking interaction with anything else on the
|
|
27
|
+
// page (e.g. another trigger in the same row) until the trap deactivates.
|
|
28
|
+
allowOutsideClick: !0,
|
|
29
|
+
fallbackFocus: () => o.value,
|
|
30
|
+
initialFocus: () => k(o.value),
|
|
31
|
+
...e.focusTrapOptions ?? {}
|
|
32
|
+
});
|
|
33
|
+
let r = null, a = y(null);
|
|
34
|
+
const g = () => {
|
|
35
|
+
if (e.resolvePopupEl) return e.resolvePopupEl();
|
|
36
|
+
const n = (t, i) => {
|
|
37
|
+
const l = Array.from(t.querySelectorAll(i));
|
|
38
|
+
if (!l.length) return null;
|
|
39
|
+
const d = l.filter(
|
|
40
|
+
(v) => v.offsetParent !== null || v.getClientRects().length > 0
|
|
41
|
+
);
|
|
42
|
+
return d[d.length - 1] ?? l[l.length - 1] ?? null;
|
|
43
|
+
}, u = e.triggerEl?.value?.closest?.(".k-animation-container") ?? document.body;
|
|
44
|
+
for (const t of s) {
|
|
45
|
+
const i = n(u, t);
|
|
46
|
+
if (i) return i;
|
|
47
|
+
}
|
|
48
|
+
for (const t of s) {
|
|
49
|
+
const i = n(document, t);
|
|
50
|
+
if (i) return i;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
};
|
|
54
|
+
return e.outsideClick !== !1 && E(
|
|
55
|
+
o,
|
|
56
|
+
(n) => {
|
|
57
|
+
e.isOpen.value && (a.value = "outside", e.onRequestClose?.("outside", n));
|
|
58
|
+
},
|
|
59
|
+
e.outsideClick
|
|
60
|
+
), O(
|
|
61
|
+
() => e.isOpen.value,
|
|
62
|
+
(n) => {
|
|
63
|
+
n ? (a.value = null, c(() => {
|
|
64
|
+
const u = g();
|
|
65
|
+
u && (u.tabIndex < 0 && (u.tabIndex = -1), o.value = u, setTimeout(() => {
|
|
66
|
+
try {
|
|
67
|
+
f();
|
|
68
|
+
} catch (t) {
|
|
69
|
+
console.warn(
|
|
70
|
+
"usePopupTrap: focus trap failed to activate",
|
|
71
|
+
t
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}, 0), r || (r = (t) => {
|
|
75
|
+
t.key === "Escape" && (a.value = "escape", e.isOpen.value && e.onRequestClose?.("escape", t));
|
|
76
|
+
}, document.addEventListener("keydown", r, !0)));
|
|
77
|
+
})) : (p(), r && (document.removeEventListener("keydown", r, !0), r = null), o.value = null, a.value === "outside" && c(() => {
|
|
78
|
+
const u = () => {
|
|
79
|
+
const t = e.triggerEl?.value, i = t?.querySelector("input"), l = document.activeElement;
|
|
80
|
+
l && (l === i || t && t.contains(l)) && (i ?? t)?.blur?.();
|
|
81
|
+
};
|
|
82
|
+
requestAnimationFrame(() => setTimeout(u, 0));
|
|
83
|
+
}), e.returnFocusToTrigger !== !1 && a.value === "escape" && e.triggerEl?.value && c(() => {
|
|
84
|
+
const u = () => {
|
|
85
|
+
const t = e.triggerEl?.value;
|
|
86
|
+
if (!t) return;
|
|
87
|
+
(t.querySelector("input") ?? t)?.focus?.();
|
|
88
|
+
};
|
|
89
|
+
requestAnimationFrame(() => setTimeout(u, 0));
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
), {
|
|
93
|
+
popupRef: o,
|
|
94
|
+
activate: f,
|
|
95
|
+
deactivate: p,
|
|
96
|
+
lastCloseReason: P(a),
|
|
97
|
+
setPopupEl: (n) => o.value = n
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
q as D,
|
|
102
|
+
R as P,
|
|
103
|
+
A as u
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=usePopupTrap-DeuXHLZR.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePopupTrap-DeuXHLZR.mjs","sources":["../../src/trap/usePopupTrap.ts"],"sourcesContent":["import { nextTick, readonly, ref, shallowRef, watch, type Ref } from \"vue\";\nimport { useFocusTrap } from \"@vueuse/integrations/useFocusTrap\";\nimport { onClickOutside, type OnClickOutsideOptions } from \"@vueuse/core\";\n\nexport type CloseReason = \"escape\" | \"outside\";\nexport type PopupTrapOutsideClickOptions = Pick<\n OnClickOutsideOptions,\n \"ignore\"\n>;\nexport type InitialFocus =\n | string\n | ((root: HTMLElement) => HTMLElement | null | undefined);\n\n/**\n * Dismissal and focus-restoration options for pairing with `usePopupMenu`.\n *\n * `usePopupMenu` owns outside dismissal and menu-close focus restoration.\n * These settings disable the trap's outside listener and both competing\n * restoration paths in `usePopupTrap` and the underlying\n * `focus-trap` implementation. Spread this preset last so those integration\n * settings take precedence.\n */\nexport const POPUP_MENU_TRAP_OPTIONS = {\n outsideClick: false,\n returnFocusToTrigger: false,\n focusTrapOptions: {\n returnFocusOnDeactivate: false,\n },\n} as const;\n\nexport const DIALOG_TRAP_OPTIONS = {\n outsideClick: false,\n} as const;\n\nexport function usePopupTrap(opts: {\n isOpen: Ref<boolean>;\n onRequestClose?: (reason: CloseReason, ev?: Event) => void;\n popupSelector?: string | string[];\n triggerEl?: Ref<HTMLElement | null>;\n resolvePopupEl?: () => HTMLElement | null;\n initialFocus?: InitialFocus;\n outsideClick?: false | PopupTrapOutsideClickOptions;\n focusTrapOptions?: Parameters<typeof useFocusTrap>[1];\n returnFocusToTrigger?: boolean;\n}) {\n const popupRef = shallowRef<HTMLElement | null>(null);\n\n const defaultSelectors = [\n \".k-animation-container .k-popup\",\n \".k-popup\",\n \".k-timepicker-popup\",\n \".k-menu-popup\",\n ];\n\n const selectors = Array.isArray(opts.popupSelector)\n ? opts.popupSelector\n : [opts.popupSelector ?? defaultSelectors].flat();\n\n const pickInitialFocus = (root: HTMLElement) => {\n if (!root) return null as unknown as HTMLElement;\n if (typeof opts.initialFocus === \"string\") {\n const found = root.querySelector(opts.initialFocus) as HTMLElement | null;\n return found ?? root;\n }\n if (typeof opts.initialFocus === \"function\") {\n return (opts.initialFocus(root) as HTMLElement | null) ?? root;\n }\n const candidate = root.querySelector(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n ) as HTMLElement | null;\n return candidate ?? root;\n };\n\n const { activate, deactivate } = useFocusTrap(popupRef, {\n escapeDeactivates: false,\n clickOutsideDeactivates: false,\n // Without this, focus-trap's own default (false) preventDefault()s and\n // swallows every outside pointerdown/click while active - not just ones\n // that would close it - blocking interaction with anything else on the\n // page (e.g. another trigger in the same row) until the trap deactivates.\n allowOutsideClick: true,\n fallbackFocus: () => popupRef.value as HTMLElement,\n initialFocus: () => pickInitialFocus(popupRef.value as HTMLElement),\n ...(opts.focusTrapOptions ?? {}),\n });\n\n let escapeHandler: ((e: KeyboardEvent) => void) | null = null;\n let lastCloseReason = ref<CloseReason | null>(null);\n\n const findPopup = (): HTMLElement | null => {\n if (opts.resolvePopupEl) return opts.resolvePopupEl();\n\n const pickLastVisible = (root: ParentNode, sel: string) => {\n const list = Array.from(root.querySelectorAll(sel)) as HTMLElement[];\n if (!list.length) return null as HTMLElement | null;\n const visible = list.filter(\n (el) => el.offsetParent !== null || el.getClientRects().length > 0,\n );\n return visible[visible.length - 1] ?? list[list.length - 1] ?? null;\n };\n\n const scopeRoot =\n opts.triggerEl?.value?.closest?.(\".k-animation-container\") ??\n document.body;\n\n for (const sel of selectors) {\n const el = pickLastVisible(scopeRoot, sel);\n if (el) return el;\n }\n\n for (const sel of selectors) {\n const el = pickLastVisible(document, sel);\n if (el) return el;\n }\n\n return null;\n };\n\n if (opts.outsideClick !== false) {\n onClickOutside(\n popupRef,\n (event) => {\n if (!opts.isOpen.value) return;\n lastCloseReason.value = \"outside\";\n opts.onRequestClose?.(\"outside\", event);\n },\n opts.outsideClick,\n );\n }\n\n watch(\n () => opts.isOpen.value,\n (open) => {\n if (open) {\n // Reset on open so the previous reason remains visible while closed\n lastCloseReason.value = null;\n nextTick(() => {\n const popup = findPopup();\n if (!popup) return;\n // Guarantees a valid fallback/initial focus target even when no\n // descendant is currently tabbable (e.g. Kendo Menu items only gain\n // a live tabindex via its own roving-tabindex JS on interaction) -\n // without this, focus-trap's activate() throws and silently no-ops,\n // leaving Tab to escape the popup entirely.\n if (popup.tabIndex < 0) popup.tabIndex = -1;\n popupRef.value = popup;\n setTimeout(() => {\n try {\n activate();\n } catch (error) {\n console.warn(\n \"usePopupTrap: focus trap failed to activate\",\n error,\n );\n }\n }, 0);\n\n if (!escapeHandler) {\n escapeHandler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n lastCloseReason.value = \"escape\";\n if (opts.isOpen.value) {\n opts.onRequestClose?.(\"escape\", e);\n }\n }\n };\n // Capture on document to catch Escape even when focus\n // stays on the trigger (e.g., TimeInput masked field).\n document.addEventListener(\"keydown\", escapeHandler, true);\n }\n });\n } else {\n deactivate();\n if (escapeHandler) {\n document.removeEventListener(\"keydown\", escapeHandler, true);\n escapeHandler = null;\n }\n popupRef.value = null;\n\n // On outside close, ensure trigger/input is not focused\n if (lastCloseReason.value === \"outside\") {\n nextTick(() => {\n const doBlur = () => {\n const root = opts.triggerEl?.value as HTMLElement | null;\n const input = root?.querySelector(\"input\") as HTMLElement | null;\n const active = document.activeElement as HTMLElement | null;\n // Only blur if focus is still on the trigger/input to avoid interfering\n if (\n active &&\n (active === input || (root && root.contains(active)))\n ) {\n (input ?? root)?.blur?.();\n }\n };\n requestAnimationFrame(() => setTimeout(doBlur, 0));\n });\n }\n\n if (\n opts.returnFocusToTrigger !== false &&\n lastCloseReason.value === \"escape\"\n ) {\n if (opts.triggerEl?.value) {\n // Schedule after Vue updates and after event/click propagation\n nextTick(() => {\n const doFocus = () => {\n const root = opts.triggerEl?.value as HTMLElement | null;\n if (!root) return;\n const input = root.querySelector(\"input\") as HTMLElement | null;\n const target = (input ?? root) as HTMLElement | null;\n target?.focus?.();\n };\n requestAnimationFrame(() => setTimeout(doFocus, 0));\n });\n }\n }\n }\n },\n );\n\n return {\n popupRef,\n activate,\n deactivate,\n lastCloseReason: readonly(lastCloseReason),\n setPopupEl: (el: HTMLElement | null) => (popupRef.value = el),\n };\n}\n"],"names":["POPUP_MENU_TRAP_OPTIONS","DIALOG_TRAP_OPTIONS","usePopupTrap","opts","popupRef","shallowRef","defaultSelectors","selectors","pickInitialFocus","root","activate","deactivate","useFocusTrap","escapeHandler","lastCloseReason","ref","findPopup","pickLastVisible","sel","list","visible","el","scopeRoot","onClickOutside","event","watch","open","nextTick","popup","error","e","doBlur","input","active","doFocus","readonly"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const a=require("vue"),ee=require("./useFieldsetValidationKit-7W1XDbbr.cjs"),ae="Enter a valid ZIP code with exactly 5 or 9 digits.",x=e=>{const t=e.replace(/\D/g,"").slice(0,9);return t.length>5?`${t.slice(0,5)}-${t.slice(5)}`:t},te=(e,t)=>e.slice(0,Math.max(0,t)).replace(/\D/g,"").length,le=e=>e<=5?e:Math.min(e+1,10),N=e=>{const t=a.ref(x(e.initialValue??"")),i=a.ref(!1),u=a.ref(e.errorMessage?.trim()||ae),l=a.computed(()=>t.value.replace(/\D/g,"")),s=a.computed(()=>{const r=l.value.length;return r===5||r===9}),n=a.computed(()=>i.value&&!s.value),b=a.computed(()=>!i.value||s.value),A=a.computed(()=>i.value),f=(r,o)=>{const v=le(o);a.nextTick(()=>{r.isConnected&&r.setSelectionRange(v,v)})};return{zipDisplay:t,submitted:i,errorMessage:u,wrapperClass:"fk-zip-textbox",zipRaw:l,isZipValid:s,showZipError:n,textBoxValid:b,textBoxValidate:A,handleZipInput:(...r)=>{const o=r[0],c=o?.event?.target,p=o?.value,m=Array.isArray(p)?p.join(""):String(p??""),I=c?.selectionStart!==void 0&&c.selectionStart!==null?te(c.value,c.selectionStart):m.replace(/\D/g,"").length;t.value=x(m),c&&f(c,I)},submitAndValidate:r=>{i.value=!0;const o=s.value;return!o&&r?.focus&&a.nextTick(()=>{document.getElementById(e.id)?.focus()}),o},buildPayload:()=>({zip:l.value})}},se=[{label:"Alabama",value:"AL"},{label:"Alaska",value:"AK"},{label:"Arizona",value:"AZ"},{label:"Arkansas",value:"AR"},{label:"California",value:"CA"},{label:"Colorado",value:"CO"},{label:"Connecticut",value:"CT"},{label:"Delaware",value:"DE"},{label:"Florida",value:"FL"},{label:"Georgia",value:"GA"},{label:"Hawaii",value:"HI"},{label:"Idaho",value:"ID"},{label:"Illinois",value:"IL"},{label:"Indiana",value:"IN"},{label:"Iowa",value:"IA"},{label:"Kansas",value:"KS"},{label:"Kentucky",value:"KY"},{label:"Louisiana",value:"LA"},{label:"Maine",value:"ME"},{label:"Maryland",value:"MD"},{label:"Massachusetts",value:"MA"},{label:"Michigan",value:"MI"},{label:"Minnesota",value:"MN"},{label:"Mississippi",value:"MS"},{label:"Missouri",value:"MO"},{label:"Montana",value:"MT"},{label:"Nebraska",value:"NE"},{label:"Nevada",value:"NV"},{label:"New Hampshire",value:"NH"},{label:"New Jersey",value:"NJ"},{label:"New Mexico",value:"NM"},{label:"New York",value:"NY"},{label:"North Carolina",value:"NC"},{label:"North Dakota",value:"ND"},{label:"Ohio",value:"OH"},{label:"Oklahoma",value:"OK"},{label:"Oregon",value:"OR"},{label:"Pennsylvania",value:"PA"},{label:"Rhode Island",value:"RI"},{label:"South Carolina",value:"SC"},{label:"South Dakota",value:"SD"},{label:"Tennessee",value:"TN"},{label:"Texas",value:"TX"},{label:"Utah",value:"UT"},{label:"Vermont",value:"VT"},{label:"Virginia",value:"VA"},{label:"Washington",value:"WA"},{label:"West Virginia",value:"WV"},{label:"Wisconsin",value:"WI"},{label:"Wyoming",value:"WY"}];function D(e){if(e&&typeof e=="object"&&"value"in e){const t=e.value;return typeof t=="string"?t:String(t??"")}return""}function ie(){const e=a.reactive({address1:"",address2:"",city:"",state:null,zip:""});return{formData:e,onAddress1Input:(...n)=>{e.address1=D(n[0])},onAddress2Input:(...n)=>{e.address2=D(n[0])},onCityInput:(...n)=>{e.city=D(n[0])},onStateChange:n=>{e.state=n.value},resetFormData:()=>{e.address1="",e.address2="",e.city="",e.state=null,e.zip=""}}}function ue(e,t="zip"){const i=N({id:t}),{zipDisplay:u,zipRaw:l,isZipValid:s,wrapperClass:n,handleZipInput:b}=i;return a.watch(l,f=>{e.zip=f}),{zipDisplay:u,isZipValid:s,zipWrapperClass:n,onZipInput:b,resetZip:()=>{u.value="",e.zip=""}}}function ne(e){const t=a.computed(()=>e.formData.address1.trim()!==""),i=a.computed(()=>e.formData.city.trim()!==""),u=a.computed(()=>!!e.formData.state),l=a.computed(()=>a.toValue(e.isZipValid)),s=a.computed(()=>t.value&&i.value&&u.value&&l.value);return{strictAddress1Valid:t,strictCityValid:i,strictStateValid:u,strictZipValid:l,strictAddressValid:s}}function re(e){if(!e)return;e.querySelector('.k-invalid input, .k-invalid[tabindex="0"]')?.focus()}function oe(e,t){const i=e??t.currentTarget,u=t.relatedTarget;return!i||!i.contains(u)}function de(e){const t=a.ref(a.toValue(e.fieldsetRef));a.watchEffect(()=>{t.value=a.toValue(e.fieldsetRef)});const i=a.ref(!1),u=a.ref(!1),l=a.computed(()=>a.toValue(e.required)??!0),{formData:s,onAddress1Input:n,onAddress2Input:b,onCityInput:A,onStateChange:f,resetFormData:S}=ie(),z=`${e.addressId}-zip`,{zipDisplay:C,isZipValid:r,zipWrapperClass:o,onZipInput:v,resetZip:c}=ue(s,z),{strictAddress1Valid:p,strictCityValid:m,strictStateValid:I,strictZipValid:T,strictAddressValid:V}=ne({formData:s,isZipValid:r}),M=ee.useFieldsetValidationKit(t,{submitted:i,isValid:()=>V.value}),{touched:E,fieldsetValidate:R,onFocusout:k,reset:w}=M,O=M.createFieldValidationsMap({address1:p,city:m,state:I,zip:T,address:V}),{address1:U,city:W,state:B,zip:K,address:P}=O,L=a.computed(()=>l.value?R.value:!1),q=a.computed(()=>l.value?U.value:!0),H=a.computed(()=>l.value?W.value:!0),_=a.computed(()=>l.value?B.value:!0),Y=a.computed(()=>l.value?K.value:!0),G=a.computed(()=>l.value?P.value:!0),$={value:null,label:"State"},j=se.map(({label:d,value:h})=>({label:d,value:h})),g=a.computed(()=>({address1:s.address1.trim(),address2:s.address2.trim(),city:s.city.trim(),state:(s.state??"").trim().toUpperCase(),zip:s.zip.replace(/\D/g,"")})),F=a.computed(()=>s.address1.trim()===""&&s.address2.trim()===""&&s.city.trim()===""&&(s.state??"").trim()===""&&s.zip.replace(/\D/g,"")===""),y=a.computed(()=>!F.value),J=a.computed(()=>!l.value&&y.value&&(!p.value||!m.value||!I.value)),X=a.computed(()=>{const d=s.zip.replace(/\D/g,"");return!l.value&&y.value&&d.length!==5&&d.length!==9}),Z=a.computed(()=>!l.value&&y.value&&!V.value),Q=a.computed(()=>!l.value&&Z.value&&(u.value||i.value));return a.watch(g,()=>{l.value||(u.value=!1)}),a.watch(l,d=>{d||(i.value=!1,u.value=!1,w())}),{formData:s,submitted:i,touched:E,addressValidate:L,address1Valid:q,cityValid:H,stateValid:_,zipValid:Y,addressValid:G,optionalFeedbackActive:Q,optionalPartialInvalid:Z,optionalMissingRequiredFields:J,optionalZipInvalid:X,stateDefaultItem:$,stateOptions:j,zipDisplay:C,zipWrapperClass:o,onAddress1Input:n,onAddress2Input:b,onCityInput:A,onStateChange:f,onZipInput:v,onFieldsetFocusout:d=>{const h=oe(t.value,d);k(d),!l.value&&h&&(u.value=!0)},normalizedPayload:g,validateForSubmit:async()=>l.value?(i.value=!0,V.value?{isValid:!0,payload:g.value}:(await a.nextTick(),re(t.value),{isValid:!1,payload:null})):F.value||V.value?(i.value=!1,{isValid:!0,payload:g.value}):(i.value=!0,{isValid:!1,payload:null}),reset:()=>{i.value=!1,u.value=!1,w(),S(),c()}}}exports.useUSAddress=de;exports.useZipTextBox=N;
|
|
2
|
+
//# sourceMappingURL=useUSAddress-BYZZfbHc.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUSAddress-BYZZfbHc.cjs","sources":["../../src/address/useZipTextBox.ts","../../src/address/usStates.ts","../../src/address/_useUSAddressFormData.ts","../../src/address/_useUSAddressZip.ts","../../src/address/_useUSAddressValidation.ts","../../src/address/useUSAddress.ts"],"sourcesContent":["import { computed, nextTick, ref } from \"vue\";\nimport type { ComputedRef, Ref } from \"vue\";\nimport type { TextBoxChangeEvent } from \"@progress/kendo-vue-inputs\";\n\nconst DEFAULT_ZIP_ERROR_MESSAGE =\n \"Enter a valid ZIP code with exactly 5 or 9 digits.\";\n\nconst formatZipDisplay = (input: string): string => {\n const digits = input.replace(/\\D/g, \"\").slice(0, 9);\n return digits.length > 5\n ? `${digits.slice(0, 5)}-${digits.slice(5)}`\n : digits;\n};\n\n// Translate a formatted caret into the number of ZIP digits before it.\nconst countDigitsBeforeIndex = (value: string, index: number): number => {\n return value.slice(0, Math.max(0, index)).replace(/\\D/g, \"\").length;\n};\n\n// Map a digit index back to the formatted ZIP display position.\nconst digitIndexToDisplayIndex = (digitIndex: number): number => {\n if (digitIndex <= 5) {\n return digitIndex;\n }\n\n return Math.min(digitIndex + 1, 10);\n};\n\nexport type ZipPayload = {\n zip: string;\n};\n\nexport type UseZipTextBoxOptions = {\n /** The `id` of the Kendo `TextBox` input element. Must match the `id` prop\n * passed to `<TextBox>`. Used by `submitAndValidate({ focus: true })` to focus\n * the field when validation fails. */\n id: string;\n initialValue?: string;\n errorMessage?: string;\n required?: boolean;\n};\n\nexport type UseZipTextBoxState = {\n zipDisplay: Ref<string>;\n submitted: Ref<boolean>;\n errorMessage: Ref<string>;\n};\n\nexport type UseZipTextBoxBindings = {\n /** Bind to `:wrapperClass` on `<TextBox>` so Kendo applies `fk-zip-textbox`\n * to its wrapper element on every render — no manual DOM manipulation needed. */\n readonly wrapperClass: string;\n};\n\nexport type UseZipTextBoxDerived = {\n readonly zipRaw: ComputedRef<string>;\n readonly isZipValid: ComputedRef<boolean>;\n readonly showZipError: ComputedRef<boolean>;\n readonly textBoxValid: ComputedRef<boolean>;\n readonly textBoxValidate: ComputedRef<boolean>;\n};\n\nexport type UseZipTextBoxActions = {\n handleZipInput: (...args: unknown[]) => void;\n submitAndValidate: (opts?: { focus?: boolean }) => boolean;\n buildPayload: () => ZipPayload;\n};\n\nexport type UseZipTextBoxApi = {} & UseZipTextBoxState &\n UseZipTextBoxBindings &\n UseZipTextBoxDerived &\n UseZipTextBoxActions;\n\nexport const useZipTextBox = (\n options: UseZipTextBoxOptions,\n): UseZipTextBoxApi => {\n const zipDisplay = ref(formatZipDisplay(options.initialValue ?? \"\"));\n const submitted = ref(false);\n const errorMessage = ref(\n options.errorMessage?.trim() || DEFAULT_ZIP_ERROR_MESSAGE,\n );\n\n const zipRaw = computed(() => zipDisplay.value.replace(/\\D/g, \"\"));\n const isZipValid = computed(() => {\n const length = zipRaw.value.length;\n return length === 5 || length === 9;\n });\n const showZipError = computed(() => submitted.value && !isZipValid.value);\n const textBoxValid = computed(() => !submitted.value || isZipValid.value);\n const textBoxValidate = computed(() => submitted.value);\n\n // Restore the caret after Vue re-renders the formatted ZIP value.\n const restoreCaret = (\n inputElement: HTMLInputElement,\n digitIndex: number,\n ): void => {\n const caretIndex = digitIndexToDisplayIndex(digitIndex);\n\n nextTick(() => {\n if (!inputElement.isConnected) {\n return;\n }\n\n inputElement.setSelectionRange(caretIndex, caretIndex);\n });\n };\n\n const handleZipInput = (...args: unknown[]) => {\n const event = args[0] as TextBoxChangeEvent | undefined;\n const nativeEvent = event?.event as InputEvent | undefined;\n const inputElement = nativeEvent?.target as HTMLInputElement | null;\n const nextValue = event?.value;\n const inputValue = Array.isArray(nextValue)\n ? nextValue.join(\"\")\n : String(nextValue ?? \"\");\n\n // Capture the caret before rewriting the controlled value.\n const digitIndex =\n inputElement?.selectionStart !== undefined &&\n inputElement.selectionStart !== null\n ? countDigitsBeforeIndex(\n inputElement.value,\n inputElement.selectionStart,\n )\n : inputValue.replace(/\\D/g, \"\").length;\n\n zipDisplay.value = formatZipDisplay(inputValue);\n\n // Put the caret back where the user was typing.\n if (inputElement) {\n restoreCaret(inputElement, digitIndex);\n }\n };\n\n const submitAndValidate = (opts?: { focus?: boolean }): boolean => {\n submitted.value = true;\n const valid = isZipValid.value;\n if (!valid && opts?.focus) {\n nextTick(() => {\n const inputEl = document.getElementById(\n options.id,\n ) as HTMLInputElement | null;\n inputEl?.focus();\n });\n }\n return valid;\n };\n\n const buildPayload = (): ZipPayload => {\n return { zip: zipRaw.value };\n };\n\n return {\n // writable state\n zipDisplay,\n submitted,\n errorMessage,\n // bindings\n wrapperClass: \"fk-zip-textbox\",\n // derived state\n zipRaw,\n isZipValid,\n showZipError,\n textBoxValid,\n textBoxValidate,\n // actions\n handleZipInput,\n submitAndValidate,\n buildPayload,\n };\n};\n","export type UsStateOption = {\n label: string;\n value: string;\n};\n\nexport const US_STATES_BY_ABBREVIATION: UsStateOption[] = [\n { label: \"Alabama\", value: \"AL\" },\n { label: \"Alaska\", value: \"AK\" },\n { label: \"Arizona\", value: \"AZ\" },\n { label: \"Arkansas\", value: \"AR\" },\n { label: \"California\", value: \"CA\" },\n { label: \"Colorado\", value: \"CO\" },\n { label: \"Connecticut\", value: \"CT\" },\n { label: \"Delaware\", value: \"DE\" },\n { label: \"Florida\", value: \"FL\" },\n { label: \"Georgia\", value: \"GA\" },\n { label: \"Hawaii\", value: \"HI\" },\n { label: \"Idaho\", value: \"ID\" },\n { label: \"Illinois\", value: \"IL\" },\n { label: \"Indiana\", value: \"IN\" },\n { label: \"Iowa\", value: \"IA\" },\n { label: \"Kansas\", value: \"KS\" },\n { label: \"Kentucky\", value: \"KY\" },\n { label: \"Louisiana\", value: \"LA\" },\n { label: \"Maine\", value: \"ME\" },\n { label: \"Maryland\", value: \"MD\" },\n { label: \"Massachusetts\", value: \"MA\" },\n { label: \"Michigan\", value: \"MI\" },\n { label: \"Minnesota\", value: \"MN\" },\n { label: \"Mississippi\", value: \"MS\" },\n { label: \"Missouri\", value: \"MO\" },\n { label: \"Montana\", value: \"MT\" },\n { label: \"Nebraska\", value: \"NE\" },\n { label: \"Nevada\", value: \"NV\" },\n { label: \"New Hampshire\", value: \"NH\" },\n { label: \"New Jersey\", value: \"NJ\" },\n { label: \"New Mexico\", value: \"NM\" },\n { label: \"New York\", value: \"NY\" },\n { label: \"North Carolina\", value: \"NC\" },\n { label: \"North Dakota\", value: \"ND\" },\n { label: \"Ohio\", value: \"OH\" },\n { label: \"Oklahoma\", value: \"OK\" },\n { label: \"Oregon\", value: \"OR\" },\n { label: \"Pennsylvania\", value: \"PA\" },\n { label: \"Rhode Island\", value: \"RI\" },\n { label: \"South Carolina\", value: \"SC\" },\n { label: \"South Dakota\", value: \"SD\" },\n { label: \"Tennessee\", value: \"TN\" },\n { label: \"Texas\", value: \"TX\" },\n { label: \"Utah\", value: \"UT\" },\n { label: \"Vermont\", value: \"VT\" },\n { label: \"Virginia\", value: \"VA\" },\n { label: \"Washington\", value: \"WA\" },\n { label: \"West Virginia\", value: \"WV\" },\n { label: \"Wisconsin\", value: \"WI\" },\n { label: \"Wyoming\", value: \"WY\" },\n];\n","import { reactive } from \"vue\";\n\nexport interface USAddressFormData {\n address1: string;\n address2: string;\n city: string;\n state: string | null;\n zip: string;\n}\n\n/**\n * Reads the value from an input event payload.\n * @param payload - The input event payload.\n * @returns The string value of the input.\n */\nfunction readInputValue(payload: unknown): string {\n if (payload && typeof payload === \"object\" && \"value\" in payload) {\n const value = (payload as { value: unknown }).value;\n return typeof value === \"string\" ? value : String(value ?? \"\");\n }\n return \"\";\n}\n\n/**\n * Manages the form data model for a US address.\n *\n * Note: this is internal UI data state, not just the US \"state\" (AL, CA, etc.) field.\n * @returns An object containing form data and field event handlers.\n */\nexport function useUSAddressFormData() {\n const formData = reactive<USAddressFormData>({\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: null,\n zip: \"\",\n });\n\n const onAddress1Input = (...args: unknown[]) => {\n formData.address1 = readInputValue(args[0]);\n };\n\n const onAddress2Input = (...args: unknown[]) => {\n formData.address2 = readInputValue(args[0]);\n };\n\n const onCityInput = (...args: unknown[]) => {\n formData.city = readInputValue(args[0]);\n };\n\n const onStateChange = (event: { value: string | null }) => {\n formData.state = event.value;\n };\n\n const resetFormData = () => {\n formData.address1 = \"\";\n formData.address2 = \"\";\n formData.city = \"\";\n formData.state = null;\n formData.zip = \"\";\n };\n\n return {\n formData,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n resetFormData,\n };\n}\n","import { watch } from \"vue\";\nimport { useZipTextBox } from \"./useZipTextBox\";\nimport type { USAddressFormData } from \"./_useUSAddressFormData\";\n\n/**\n * Manages the ZIP code field for a US address.\n * @param formData - The form data object containing the ZIP code.\n * @returns An object containing ZIP code display, validity, wrapper class, input handler, and reset function.\n */\nexport function useUSAddressZip(\n formData: USAddressFormData,\n zipInputId = \"zip\",\n) {\n const zipField = useZipTextBox({ id: zipInputId });\n const {\n zipDisplay,\n zipRaw,\n isZipValid,\n wrapperClass: zipWrapperClass,\n handleZipInput: onZipInput,\n } = zipField;\n\n watch(zipRaw, (value) => {\n formData.zip = value;\n });\n\n const resetZip = () => {\n zipDisplay.value = \"\";\n formData.zip = \"\";\n };\n\n return {\n zipDisplay,\n isZipValid,\n zipWrapperClass,\n onZipInput,\n resetZip,\n };\n}\n","import { computed, toValue, type MaybeRefOrGetter } from \"vue\";\nimport type { USAddressFormData } from \"./_useUSAddressFormData\";\n\ninterface UseUSAddressValidationOptions {\n formData: USAddressFormData;\n isZipValid: MaybeRefOrGetter<boolean>;\n}\n\n/**\n * Manages the validation state for a US address.\n * @param options - The options object containing form data and ZIP code validity.\n * @returns An object containing validation state for each field and the overall address.\n */\nexport function useUSAddressValidation(options: UseUSAddressValidationOptions) {\n /**\n * Strict validity values represent the actual rule outcomes for each field,\n * independent of whether validation messages are currently shown in the UI.\n */\n const strictAddress1Valid = computed(\n () => options.formData.address1.trim() !== \"\",\n );\n const strictCityValid = computed(() => options.formData.city.trim() !== \"\");\n const strictStateValid = computed(() => !!options.formData.state);\n const strictZipValid = computed(() => toValue(options.isZipValid));\n\n const strictAddressValid = computed(\n () =>\n strictAddress1Valid.value &&\n strictCityValid.value &&\n strictStateValid.value &&\n strictZipValid.value,\n );\n\n return {\n strictAddress1Valid,\n strictCityValid,\n strictStateValid,\n strictZipValid,\n strictAddressValid,\n };\n}\n","import {\n computed,\n nextTick,\n ref,\n toValue,\n watch,\n watchEffect,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport { useFieldsetValidationKit } from \"../form/useFieldsetValidationKit\";\nimport { US_STATES_BY_ABBREVIATION } from \"./usStates\";\nimport { useUSAddressFormData } from \"./_useUSAddressFormData\";\nimport { useUSAddressZip } from \"./_useUSAddressZip\";\nimport { useUSAddressValidation } from \"./_useUSAddressValidation\";\n\ninterface UseUSAddressOptions {\n fieldsetRef: MaybeRefOrGetter<HTMLFieldSetElement | null>;\n addressId: string;\n required?: MaybeRefOrGetter<boolean>;\n}\n\nexport interface USAddressSubmitPayload {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n}\n\n/**\n * Focuses the first invalid input within a container.\n * @param container - The container element to search within.\n */\nfunction focusFirstInvalid(container: HTMLElement | null) {\n if (!container) return;\n const target = container.querySelector<HTMLElement>(\n '.k-invalid input, .k-invalid[tabindex=\"0\"]',\n );\n target?.focus();\n}\n\nfunction focusoutLeavesFieldset(\n fieldsetRef: HTMLFieldSetElement | null,\n event: FocusEvent,\n) {\n const fieldset = fieldsetRef ?? (event.currentTarget as HTMLElement | null);\n const next = event.relatedTarget as Node | null;\n\n return !fieldset || !fieldset.contains(next);\n}\n\n/**\n * Composable for managing a US address form.\n * @param options - The options object containing fieldset reference and address id.\n * @returns An object containing form state, validation state, and handlers.\n */\nexport function useUSAddress(options: UseUSAddressOptions) {\n const fieldsetRef = ref<HTMLFieldSetElement | null>(\n toValue(options.fieldsetRef),\n );\n\n watchEffect(() => {\n fieldsetRef.value = toValue(options.fieldsetRef);\n });\n\n const submitted = ref(false);\n const optionalFeedbackReviewed = ref(false);\n const isRequired = computed(() => toValue(options.required) ?? true);\n const {\n formData,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n resetFormData,\n } = useUSAddressFormData();\n\n const zipInputId = `${options.addressId}-zip`;\n\n const { zipDisplay, isZipValid, zipWrapperClass, onZipInput, resetZip } =\n useUSAddressZip(formData, zipInputId);\n\n const {\n strictAddress1Valid,\n strictCityValid,\n strictStateValid,\n strictZipValid,\n strictAddressValid,\n } = useUSAddressValidation({\n formData,\n isZipValid,\n });\n\n const validationKit = useFieldsetValidationKit(fieldsetRef, {\n submitted,\n isValid: () => strictAddressValid.value,\n });\n\n const { touched, fieldsetValidate, onFocusout, reset } = validationKit;\n\n const fieldValidations = validationKit.createFieldValidationsMap({\n address1: strictAddress1Valid,\n city: strictCityValid,\n state: strictStateValid,\n zip: strictZipValid,\n address: strictAddressValid,\n });\n\n const {\n address1: rawAddress1Valid,\n city: rawCityValid,\n state: rawStateValid,\n zip: rawZipValid,\n address: rawAddressValid,\n } = fieldValidations;\n\n const addressValidate = computed(() =>\n isRequired.value ? fieldsetValidate.value : false,\n );\n\n const address1Valid = computed(() =>\n isRequired.value ? rawAddress1Valid.value : true,\n );\n\n const cityValid = computed(() =>\n isRequired.value ? rawCityValid.value : true,\n );\n\n const stateValid = computed(() =>\n isRequired.value ? rawStateValid.value : true,\n );\n\n const zipValid = computed(() =>\n isRequired.value ? rawZipValid.value : true,\n );\n\n const addressValid = computed(() =>\n isRequired.value ? rawAddressValid.value : true,\n );\n\n const stateDefaultItem = { value: null, label: \"State\" };\n const stateOptions = US_STATES_BY_ABBREVIATION.map(({ label, value }) => ({\n label,\n value,\n }));\n\n const normalizedPayload = computed<USAddressSubmitPayload>(() => ({\n address1: formData.address1.trim(),\n address2: formData.address2.trim(),\n city: formData.city.trim(),\n state: (formData.state ?? \"\").trim().toUpperCase(),\n zip: formData.zip.replace(/\\D/g, \"\"),\n }));\n\n const isAddressEmpty = computed(() => {\n return (\n formData.address1.trim() === \"\" &&\n formData.address2.trim() === \"\" &&\n formData.city.trim() === \"\" &&\n (formData.state ?? \"\").trim() === \"\" &&\n formData.zip.replace(/\\D/g, \"\") === \"\"\n );\n });\n\n /**\n * Indicates whether any input has been provided in the optional address fields.\n * @returns True if any address field has input, false otherwise.\n */\n const optionalAddressHasAnyInput = computed(() => !isAddressEmpty.value);\n\n /**\n * Indicates whether any required fields are missing in the optional address section.\n * @returns True if any required field is missing, false otherwise.\n */\n const optionalMissingRequiredFields = computed(() => {\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n (!strictAddress1Valid.value ||\n !strictCityValid.value ||\n !strictStateValid.value)\n );\n });\n\n /**\n * Indicates whether the optional zip code field is invalid.\n * @returns True if the zip code is invalid, false otherwise.\n */\n const optionalZipInvalid = computed(() => {\n const zipDigits = formData.zip.replace(/\\D/g, \"\");\n\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n });\n\n /**\n * Indicates whether any part of the optional address is invalid.\n * @returns True if any part of the optional address is invalid, false otherwise.\n */\n const optionalPartialInvalid = computed(() => {\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n !strictAddressValid.value\n );\n });\n\n /**\n * Indicates whether optional address feedback should be active.\n * @returns True if feedback should be active, false otherwise.\n */\n const optionalFeedbackActive = computed(() => {\n return (\n !isRequired.value &&\n optionalPartialInvalid.value &&\n (optionalFeedbackReviewed.value || submitted.value)\n );\n });\n\n // Resets the optional feedback reviewed state when the normalized payload\n // changes and the address is not required.\n watch(normalizedPayload, () => {\n if (!isRequired.value) {\n optionalFeedbackReviewed.value = false;\n }\n });\n\n watch(isRequired, (required) => {\n if (!required) {\n submitted.value = false;\n optionalFeedbackReviewed.value = false;\n reset();\n }\n });\n\n /**\n * Validates address state for parent-owned submit flow.\n * Activates UI error visibility.\n * @returns An object containing the validity status and the normalized payload.\n */\n const validateForSubmit = async () => {\n if (!isRequired.value) {\n if (isAddressEmpty.value || strictAddressValid.value) {\n submitted.value = false;\n return {\n isValid: true as const,\n payload: normalizedPayload.value,\n };\n }\n\n submitted.value = true;\n return { isValid: false as const, payload: null };\n }\n\n submitted.value = true;\n\n if (!strictAddressValid.value) {\n await nextTick();\n focusFirstInvalid(fieldsetRef.value);\n return { isValid: false as const, payload: null };\n }\n\n return {\n isValid: true as const,\n payload: normalizedPayload.value,\n };\n };\n\n /**\n * Resets the US address form.\n * Deactivates UI error visibility.\n */\n const resetAddress = () => {\n submitted.value = false;\n optionalFeedbackReviewed.value = false;\n reset();\n resetFormData();\n resetZip();\n };\n\n const onFieldsetFocusout = (event: FocusEvent) => {\n const leftFieldset = focusoutLeavesFieldset(fieldsetRef.value, event);\n\n onFocusout(event);\n\n if (!isRequired.value && leftFieldset) {\n optionalFeedbackReviewed.value = true;\n }\n };\n\n return {\n formData,\n submitted,\n touched,\n addressValidate,\n address1Valid,\n cityValid,\n stateValid,\n zipValid,\n addressValid,\n optionalFeedbackActive,\n optionalPartialInvalid,\n optionalMissingRequiredFields,\n optionalZipInvalid,\n stateDefaultItem,\n stateOptions,\n zipDisplay,\n zipWrapperClass,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n onZipInput,\n onFieldsetFocusout,\n normalizedPayload,\n validateForSubmit,\n reset: resetAddress,\n };\n}\n"],"names":["DEFAULT_ZIP_ERROR_MESSAGE","formatZipDisplay","input","digits","countDigitsBeforeIndex","value","index","digitIndexToDisplayIndex","digitIndex","useZipTextBox","options","zipDisplay","ref","submitted","errorMessage","zipRaw","computed","isZipValid","length","showZipError","textBoxValid","textBoxValidate","restoreCaret","inputElement","caretIndex","nextTick","args","event","nextValue","inputValue","opts","valid","US_STATES_BY_ABBREVIATION","readInputValue","payload","useUSAddressFormData","formData","reactive","useUSAddressZip","zipInputId","zipField","zipWrapperClass","onZipInput","watch","useUSAddressValidation","strictAddress1Valid","strictCityValid","strictStateValid","strictZipValid","toValue","strictAddressValid","focusFirstInvalid","container","focusoutLeavesFieldset","fieldsetRef","fieldset","next","useUSAddress","watchEffect","optionalFeedbackReviewed","isRequired","onAddress1Input","onAddress2Input","onCityInput","onStateChange","resetFormData","resetZip","validationKit","useFieldsetValidationKit","touched","fieldsetValidate","onFocusout","reset","fieldValidations","rawAddress1Valid","rawCityValid","rawStateValid","rawZipValid","rawAddressValid","addressValidate","address1Valid","cityValid","stateValid","zipValid","addressValid","stateDefaultItem","stateOptions","label","normalizedPayload","isAddressEmpty","optionalAddressHasAnyInput","optionalMissingRequiredFields","optionalZipInvalid","zipDigits","optionalPartialInvalid","optionalFeedbackActive","required","leftFieldset"],"mappings":"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"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { ref as b, computed as s, nextTick as C, reactive as le, watch as M, toValue as h, watchEffect as se } from "vue";
|
|
2
|
+
import { a as ie } from "./useFieldsetValidationKit-x0Rh48mE.mjs";
|
|
3
|
+
const ne = "Enter a valid ZIP code with exactly 5 or 9 digits.", T = (e) => {
|
|
4
|
+
const a = e.replace(/\D/g, "").slice(0, 9);
|
|
5
|
+
return a.length > 5 ? `${a.slice(0, 5)}-${a.slice(5)}` : a;
|
|
6
|
+
}, ue = (e, a) => e.slice(0, Math.max(0, a)).replace(/\D/g, "").length, re = (e) => e <= 5 ? e : Math.min(e + 1, 10), oe = (e) => {
|
|
7
|
+
const a = b(T(e.initialValue ?? "")), i = b(!1), n = b(
|
|
8
|
+
e.errorMessage?.trim() || ne
|
|
9
|
+
), t = s(() => a.value.replace(/\D/g, "")), l = s(() => {
|
|
10
|
+
const r = t.value.length;
|
|
11
|
+
return r === 5 || r === 9;
|
|
12
|
+
}), u = s(() => i.value && !l.value), f = s(() => !i.value || l.value), I = s(() => i.value), V = (r, o) => {
|
|
13
|
+
const v = re(o);
|
|
14
|
+
C(() => {
|
|
15
|
+
r.isConnected && r.setSelectionRange(v, v);
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
return {
|
|
19
|
+
// writable state
|
|
20
|
+
zipDisplay: a,
|
|
21
|
+
submitted: i,
|
|
22
|
+
errorMessage: n,
|
|
23
|
+
// bindings
|
|
24
|
+
wrapperClass: "fk-zip-textbox",
|
|
25
|
+
// derived state
|
|
26
|
+
zipRaw: t,
|
|
27
|
+
isZipValid: l,
|
|
28
|
+
showZipError: u,
|
|
29
|
+
textBoxValid: f,
|
|
30
|
+
textBoxValidate: I,
|
|
31
|
+
// actions
|
|
32
|
+
handleZipInput: (...r) => {
|
|
33
|
+
const o = r[0], c = o?.event?.target, p = o?.value, A = Array.isArray(p) ? p.join("") : String(p ?? ""), g = c?.selectionStart !== void 0 && c.selectionStart !== null ? ue(
|
|
34
|
+
c.value,
|
|
35
|
+
c.selectionStart
|
|
36
|
+
) : A.replace(/\D/g, "").length;
|
|
37
|
+
a.value = T(A), c && V(c, g);
|
|
38
|
+
},
|
|
39
|
+
submitAndValidate: (r) => {
|
|
40
|
+
i.value = !0;
|
|
41
|
+
const o = l.value;
|
|
42
|
+
return !o && r?.focus && C(() => {
|
|
43
|
+
document.getElementById(
|
|
44
|
+
e.id
|
|
45
|
+
)?.focus();
|
|
46
|
+
}), o;
|
|
47
|
+
},
|
|
48
|
+
buildPayload: () => ({ zip: t.value })
|
|
49
|
+
};
|
|
50
|
+
}, de = [
|
|
51
|
+
{ label: "Alabama", value: "AL" },
|
|
52
|
+
{ label: "Alaska", value: "AK" },
|
|
53
|
+
{ label: "Arizona", value: "AZ" },
|
|
54
|
+
{ label: "Arkansas", value: "AR" },
|
|
55
|
+
{ label: "California", value: "CA" },
|
|
56
|
+
{ label: "Colorado", value: "CO" },
|
|
57
|
+
{ label: "Connecticut", value: "CT" },
|
|
58
|
+
{ label: "Delaware", value: "DE" },
|
|
59
|
+
{ label: "Florida", value: "FL" },
|
|
60
|
+
{ label: "Georgia", value: "GA" },
|
|
61
|
+
{ label: "Hawaii", value: "HI" },
|
|
62
|
+
{ label: "Idaho", value: "ID" },
|
|
63
|
+
{ label: "Illinois", value: "IL" },
|
|
64
|
+
{ label: "Indiana", value: "IN" },
|
|
65
|
+
{ label: "Iowa", value: "IA" },
|
|
66
|
+
{ label: "Kansas", value: "KS" },
|
|
67
|
+
{ label: "Kentucky", value: "KY" },
|
|
68
|
+
{ label: "Louisiana", value: "LA" },
|
|
69
|
+
{ label: "Maine", value: "ME" },
|
|
70
|
+
{ label: "Maryland", value: "MD" },
|
|
71
|
+
{ label: "Massachusetts", value: "MA" },
|
|
72
|
+
{ label: "Michigan", value: "MI" },
|
|
73
|
+
{ label: "Minnesota", value: "MN" },
|
|
74
|
+
{ label: "Mississippi", value: "MS" },
|
|
75
|
+
{ label: "Missouri", value: "MO" },
|
|
76
|
+
{ label: "Montana", value: "MT" },
|
|
77
|
+
{ label: "Nebraska", value: "NE" },
|
|
78
|
+
{ label: "Nevada", value: "NV" },
|
|
79
|
+
{ label: "New Hampshire", value: "NH" },
|
|
80
|
+
{ label: "New Jersey", value: "NJ" },
|
|
81
|
+
{ label: "New Mexico", value: "NM" },
|
|
82
|
+
{ label: "New York", value: "NY" },
|
|
83
|
+
{ label: "North Carolina", value: "NC" },
|
|
84
|
+
{ label: "North Dakota", value: "ND" },
|
|
85
|
+
{ label: "Ohio", value: "OH" },
|
|
86
|
+
{ label: "Oklahoma", value: "OK" },
|
|
87
|
+
{ label: "Oregon", value: "OR" },
|
|
88
|
+
{ label: "Pennsylvania", value: "PA" },
|
|
89
|
+
{ label: "Rhode Island", value: "RI" },
|
|
90
|
+
{ label: "South Carolina", value: "SC" },
|
|
91
|
+
{ label: "South Dakota", value: "SD" },
|
|
92
|
+
{ label: "Tennessee", value: "TN" },
|
|
93
|
+
{ label: "Texas", value: "TX" },
|
|
94
|
+
{ label: "Utah", value: "UT" },
|
|
95
|
+
{ label: "Vermont", value: "VT" },
|
|
96
|
+
{ label: "Virginia", value: "VA" },
|
|
97
|
+
{ label: "Washington", value: "WA" },
|
|
98
|
+
{ label: "West Virginia", value: "WV" },
|
|
99
|
+
{ label: "Wisconsin", value: "WI" },
|
|
100
|
+
{ label: "Wyoming", value: "WY" }
|
|
101
|
+
];
|
|
102
|
+
function z(e) {
|
|
103
|
+
if (e && typeof e == "object" && "value" in e) {
|
|
104
|
+
const a = e.value;
|
|
105
|
+
return typeof a == "string" ? a : String(a ?? "");
|
|
106
|
+
}
|
|
107
|
+
return "";
|
|
108
|
+
}
|
|
109
|
+
function ce() {
|
|
110
|
+
const e = le({
|
|
111
|
+
address1: "",
|
|
112
|
+
address2: "",
|
|
113
|
+
city: "",
|
|
114
|
+
state: null,
|
|
115
|
+
zip: ""
|
|
116
|
+
});
|
|
117
|
+
return {
|
|
118
|
+
formData: e,
|
|
119
|
+
onAddress1Input: (...u) => {
|
|
120
|
+
e.address1 = z(u[0]);
|
|
121
|
+
},
|
|
122
|
+
onAddress2Input: (...u) => {
|
|
123
|
+
e.address2 = z(u[0]);
|
|
124
|
+
},
|
|
125
|
+
onCityInput: (...u) => {
|
|
126
|
+
e.city = z(u[0]);
|
|
127
|
+
},
|
|
128
|
+
onStateChange: (u) => {
|
|
129
|
+
e.state = u.value;
|
|
130
|
+
},
|
|
131
|
+
resetFormData: () => {
|
|
132
|
+
e.address1 = "", e.address2 = "", e.city = "", e.state = null, e.zip = "";
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function ve(e, a = "zip") {
|
|
137
|
+
const i = oe({ id: a }), {
|
|
138
|
+
zipDisplay: n,
|
|
139
|
+
zipRaw: t,
|
|
140
|
+
isZipValid: l,
|
|
141
|
+
wrapperClass: u,
|
|
142
|
+
handleZipInput: f
|
|
143
|
+
} = i;
|
|
144
|
+
return M(t, (V) => {
|
|
145
|
+
e.zip = V;
|
|
146
|
+
}), {
|
|
147
|
+
zipDisplay: n,
|
|
148
|
+
isZipValid: l,
|
|
149
|
+
zipWrapperClass: u,
|
|
150
|
+
onZipInput: f,
|
|
151
|
+
resetZip: () => {
|
|
152
|
+
n.value = "", e.zip = "";
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function pe(e) {
|
|
157
|
+
const a = s(
|
|
158
|
+
() => e.formData.address1.trim() !== ""
|
|
159
|
+
), i = s(() => e.formData.city.trim() !== ""), n = s(() => !!e.formData.state), t = s(() => h(e.isZipValid)), l = s(
|
|
160
|
+
() => a.value && i.value && n.value && t.value
|
|
161
|
+
);
|
|
162
|
+
return {
|
|
163
|
+
strictAddress1Valid: a,
|
|
164
|
+
strictCityValid: i,
|
|
165
|
+
strictStateValid: n,
|
|
166
|
+
strictZipValid: t,
|
|
167
|
+
strictAddressValid: l
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function be(e) {
|
|
171
|
+
if (!e) return;
|
|
172
|
+
e.querySelector(
|
|
173
|
+
'.k-invalid input, .k-invalid[tabindex="0"]'
|
|
174
|
+
)?.focus();
|
|
175
|
+
}
|
|
176
|
+
function fe(e, a) {
|
|
177
|
+
const i = e ?? a.currentTarget, n = a.relatedTarget;
|
|
178
|
+
return !i || !i.contains(n);
|
|
179
|
+
}
|
|
180
|
+
function ye(e) {
|
|
181
|
+
const a = b(
|
|
182
|
+
h(e.fieldsetRef)
|
|
183
|
+
);
|
|
184
|
+
se(() => {
|
|
185
|
+
a.value = h(e.fieldsetRef);
|
|
186
|
+
});
|
|
187
|
+
const i = b(!1), n = b(!1), t = s(() => h(e.required) ?? !0), {
|
|
188
|
+
formData: l,
|
|
189
|
+
onAddress1Input: u,
|
|
190
|
+
onAddress2Input: f,
|
|
191
|
+
onCityInput: I,
|
|
192
|
+
onStateChange: V,
|
|
193
|
+
resetFormData: F
|
|
194
|
+
} = ce(), Z = `${e.addressId}-zip`, { zipDisplay: w, isZipValid: r, zipWrapperClass: o, onZipInput: v, resetZip: c } = ve(l, Z), {
|
|
195
|
+
strictAddress1Valid: p,
|
|
196
|
+
strictCityValid: A,
|
|
197
|
+
strictStateValid: g,
|
|
198
|
+
strictZipValid: k,
|
|
199
|
+
strictAddressValid: m
|
|
200
|
+
} = pe({
|
|
201
|
+
formData: l,
|
|
202
|
+
isZipValid: r
|
|
203
|
+
}), x = ie(a, {
|
|
204
|
+
submitted: i,
|
|
205
|
+
isValid: () => m.value
|
|
206
|
+
}), { touched: O, fieldsetValidate: W, onFocusout: U, reset: N } = x, B = x.createFieldValidationsMap({
|
|
207
|
+
address1: p,
|
|
208
|
+
city: A,
|
|
209
|
+
state: g,
|
|
210
|
+
zip: k,
|
|
211
|
+
address: m
|
|
212
|
+
}), {
|
|
213
|
+
address1: K,
|
|
214
|
+
city: P,
|
|
215
|
+
state: L,
|
|
216
|
+
zip: H,
|
|
217
|
+
address: _
|
|
218
|
+
} = B, Y = s(
|
|
219
|
+
() => t.value ? W.value : !1
|
|
220
|
+
), q = s(
|
|
221
|
+
() => t.value ? K.value : !0
|
|
222
|
+
), G = s(
|
|
223
|
+
() => t.value ? P.value : !0
|
|
224
|
+
), $ = s(
|
|
225
|
+
() => t.value ? L.value : !0
|
|
226
|
+
), j = s(
|
|
227
|
+
() => t.value ? H.value : !0
|
|
228
|
+
), J = s(
|
|
229
|
+
() => t.value ? _.value : !0
|
|
230
|
+
), X = { value: null, label: "State" }, Q = de.map(({ label: d, value: S }) => ({
|
|
231
|
+
label: d,
|
|
232
|
+
value: S
|
|
233
|
+
})), y = s(() => ({
|
|
234
|
+
address1: l.address1.trim(),
|
|
235
|
+
address2: l.address2.trim(),
|
|
236
|
+
city: l.city.trim(),
|
|
237
|
+
state: (l.state ?? "").trim().toUpperCase(),
|
|
238
|
+
zip: l.zip.replace(/\D/g, "")
|
|
239
|
+
})), E = s(() => l.address1.trim() === "" && l.address2.trim() === "" && l.city.trim() === "" && (l.state ?? "").trim() === "" && l.zip.replace(/\D/g, "") === ""), D = s(() => !E.value), ee = s(() => !t.value && D.value && (!p.value || !A.value || !g.value)), ae = s(() => {
|
|
240
|
+
const d = l.zip.replace(/\D/g, "");
|
|
241
|
+
return !t.value && D.value && d.length !== 5 && d.length !== 9;
|
|
242
|
+
}), R = s(() => !t.value && D.value && !m.value), te = s(() => !t.value && R.value && (n.value || i.value));
|
|
243
|
+
return M(y, () => {
|
|
244
|
+
t.value || (n.value = !1);
|
|
245
|
+
}), M(t, (d) => {
|
|
246
|
+
d || (i.value = !1, n.value = !1, N());
|
|
247
|
+
}), {
|
|
248
|
+
formData: l,
|
|
249
|
+
submitted: i,
|
|
250
|
+
touched: O,
|
|
251
|
+
addressValidate: Y,
|
|
252
|
+
address1Valid: q,
|
|
253
|
+
cityValid: G,
|
|
254
|
+
stateValid: $,
|
|
255
|
+
zipValid: j,
|
|
256
|
+
addressValid: J,
|
|
257
|
+
optionalFeedbackActive: te,
|
|
258
|
+
optionalPartialInvalid: R,
|
|
259
|
+
optionalMissingRequiredFields: ee,
|
|
260
|
+
optionalZipInvalid: ae,
|
|
261
|
+
stateDefaultItem: X,
|
|
262
|
+
stateOptions: Q,
|
|
263
|
+
zipDisplay: w,
|
|
264
|
+
zipWrapperClass: o,
|
|
265
|
+
onAddress1Input: u,
|
|
266
|
+
onAddress2Input: f,
|
|
267
|
+
onCityInput: I,
|
|
268
|
+
onStateChange: V,
|
|
269
|
+
onZipInput: v,
|
|
270
|
+
onFieldsetFocusout: (d) => {
|
|
271
|
+
const S = fe(a.value, d);
|
|
272
|
+
U(d), !t.value && S && (n.value = !0);
|
|
273
|
+
},
|
|
274
|
+
normalizedPayload: y,
|
|
275
|
+
validateForSubmit: async () => t.value ? (i.value = !0, m.value ? {
|
|
276
|
+
isValid: !0,
|
|
277
|
+
payload: y.value
|
|
278
|
+
} : (await C(), be(a.value), { isValid: !1, payload: null })) : E.value || m.value ? (i.value = !1, {
|
|
279
|
+
isValid: !0,
|
|
280
|
+
payload: y.value
|
|
281
|
+
}) : (i.value = !0, { isValid: !1, payload: null }),
|
|
282
|
+
reset: () => {
|
|
283
|
+
i.value = !1, n.value = !1, N(), F(), c();
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
export {
|
|
288
|
+
oe as a,
|
|
289
|
+
ye as u
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=useUSAddress-CRcqdqrZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUSAddress-CRcqdqrZ.mjs","sources":["../../src/address/useZipTextBox.ts","../../src/address/usStates.ts","../../src/address/_useUSAddressFormData.ts","../../src/address/_useUSAddressZip.ts","../../src/address/_useUSAddressValidation.ts","../../src/address/useUSAddress.ts"],"sourcesContent":["import { computed, nextTick, ref } from \"vue\";\nimport type { ComputedRef, Ref } from \"vue\";\nimport type { TextBoxChangeEvent } from \"@progress/kendo-vue-inputs\";\n\nconst DEFAULT_ZIP_ERROR_MESSAGE =\n \"Enter a valid ZIP code with exactly 5 or 9 digits.\";\n\nconst formatZipDisplay = (input: string): string => {\n const digits = input.replace(/\\D/g, \"\").slice(0, 9);\n return digits.length > 5\n ? `${digits.slice(0, 5)}-${digits.slice(5)}`\n : digits;\n};\n\n// Translate a formatted caret into the number of ZIP digits before it.\nconst countDigitsBeforeIndex = (value: string, index: number): number => {\n return value.slice(0, Math.max(0, index)).replace(/\\D/g, \"\").length;\n};\n\n// Map a digit index back to the formatted ZIP display position.\nconst digitIndexToDisplayIndex = (digitIndex: number): number => {\n if (digitIndex <= 5) {\n return digitIndex;\n }\n\n return Math.min(digitIndex + 1, 10);\n};\n\nexport type ZipPayload = {\n zip: string;\n};\n\nexport type UseZipTextBoxOptions = {\n /** The `id` of the Kendo `TextBox` input element. Must match the `id` prop\n * passed to `<TextBox>`. Used by `submitAndValidate({ focus: true })` to focus\n * the field when validation fails. */\n id: string;\n initialValue?: string;\n errorMessage?: string;\n required?: boolean;\n};\n\nexport type UseZipTextBoxState = {\n zipDisplay: Ref<string>;\n submitted: Ref<boolean>;\n errorMessage: Ref<string>;\n};\n\nexport type UseZipTextBoxBindings = {\n /** Bind to `:wrapperClass` on `<TextBox>` so Kendo applies `fk-zip-textbox`\n * to its wrapper element on every render — no manual DOM manipulation needed. */\n readonly wrapperClass: string;\n};\n\nexport type UseZipTextBoxDerived = {\n readonly zipRaw: ComputedRef<string>;\n readonly isZipValid: ComputedRef<boolean>;\n readonly showZipError: ComputedRef<boolean>;\n readonly textBoxValid: ComputedRef<boolean>;\n readonly textBoxValidate: ComputedRef<boolean>;\n};\n\nexport type UseZipTextBoxActions = {\n handleZipInput: (...args: unknown[]) => void;\n submitAndValidate: (opts?: { focus?: boolean }) => boolean;\n buildPayload: () => ZipPayload;\n};\n\nexport type UseZipTextBoxApi = {} & UseZipTextBoxState &\n UseZipTextBoxBindings &\n UseZipTextBoxDerived &\n UseZipTextBoxActions;\n\nexport const useZipTextBox = (\n options: UseZipTextBoxOptions,\n): UseZipTextBoxApi => {\n const zipDisplay = ref(formatZipDisplay(options.initialValue ?? \"\"));\n const submitted = ref(false);\n const errorMessage = ref(\n options.errorMessage?.trim() || DEFAULT_ZIP_ERROR_MESSAGE,\n );\n\n const zipRaw = computed(() => zipDisplay.value.replace(/\\D/g, \"\"));\n const isZipValid = computed(() => {\n const length = zipRaw.value.length;\n return length === 5 || length === 9;\n });\n const showZipError = computed(() => submitted.value && !isZipValid.value);\n const textBoxValid = computed(() => !submitted.value || isZipValid.value);\n const textBoxValidate = computed(() => submitted.value);\n\n // Restore the caret after Vue re-renders the formatted ZIP value.\n const restoreCaret = (\n inputElement: HTMLInputElement,\n digitIndex: number,\n ): void => {\n const caretIndex = digitIndexToDisplayIndex(digitIndex);\n\n nextTick(() => {\n if (!inputElement.isConnected) {\n return;\n }\n\n inputElement.setSelectionRange(caretIndex, caretIndex);\n });\n };\n\n const handleZipInput = (...args: unknown[]) => {\n const event = args[0] as TextBoxChangeEvent | undefined;\n const nativeEvent = event?.event as InputEvent | undefined;\n const inputElement = nativeEvent?.target as HTMLInputElement | null;\n const nextValue = event?.value;\n const inputValue = Array.isArray(nextValue)\n ? nextValue.join(\"\")\n : String(nextValue ?? \"\");\n\n // Capture the caret before rewriting the controlled value.\n const digitIndex =\n inputElement?.selectionStart !== undefined &&\n inputElement.selectionStart !== null\n ? countDigitsBeforeIndex(\n inputElement.value,\n inputElement.selectionStart,\n )\n : inputValue.replace(/\\D/g, \"\").length;\n\n zipDisplay.value = formatZipDisplay(inputValue);\n\n // Put the caret back where the user was typing.\n if (inputElement) {\n restoreCaret(inputElement, digitIndex);\n }\n };\n\n const submitAndValidate = (opts?: { focus?: boolean }): boolean => {\n submitted.value = true;\n const valid = isZipValid.value;\n if (!valid && opts?.focus) {\n nextTick(() => {\n const inputEl = document.getElementById(\n options.id,\n ) as HTMLInputElement | null;\n inputEl?.focus();\n });\n }\n return valid;\n };\n\n const buildPayload = (): ZipPayload => {\n return { zip: zipRaw.value };\n };\n\n return {\n // writable state\n zipDisplay,\n submitted,\n errorMessage,\n // bindings\n wrapperClass: \"fk-zip-textbox\",\n // derived state\n zipRaw,\n isZipValid,\n showZipError,\n textBoxValid,\n textBoxValidate,\n // actions\n handleZipInput,\n submitAndValidate,\n buildPayload,\n };\n};\n","export type UsStateOption = {\n label: string;\n value: string;\n};\n\nexport const US_STATES_BY_ABBREVIATION: UsStateOption[] = [\n { label: \"Alabama\", value: \"AL\" },\n { label: \"Alaska\", value: \"AK\" },\n { label: \"Arizona\", value: \"AZ\" },\n { label: \"Arkansas\", value: \"AR\" },\n { label: \"California\", value: \"CA\" },\n { label: \"Colorado\", value: \"CO\" },\n { label: \"Connecticut\", value: \"CT\" },\n { label: \"Delaware\", value: \"DE\" },\n { label: \"Florida\", value: \"FL\" },\n { label: \"Georgia\", value: \"GA\" },\n { label: \"Hawaii\", value: \"HI\" },\n { label: \"Idaho\", value: \"ID\" },\n { label: \"Illinois\", value: \"IL\" },\n { label: \"Indiana\", value: \"IN\" },\n { label: \"Iowa\", value: \"IA\" },\n { label: \"Kansas\", value: \"KS\" },\n { label: \"Kentucky\", value: \"KY\" },\n { label: \"Louisiana\", value: \"LA\" },\n { label: \"Maine\", value: \"ME\" },\n { label: \"Maryland\", value: \"MD\" },\n { label: \"Massachusetts\", value: \"MA\" },\n { label: \"Michigan\", value: \"MI\" },\n { label: \"Minnesota\", value: \"MN\" },\n { label: \"Mississippi\", value: \"MS\" },\n { label: \"Missouri\", value: \"MO\" },\n { label: \"Montana\", value: \"MT\" },\n { label: \"Nebraska\", value: \"NE\" },\n { label: \"Nevada\", value: \"NV\" },\n { label: \"New Hampshire\", value: \"NH\" },\n { label: \"New Jersey\", value: \"NJ\" },\n { label: \"New Mexico\", value: \"NM\" },\n { label: \"New York\", value: \"NY\" },\n { label: \"North Carolina\", value: \"NC\" },\n { label: \"North Dakota\", value: \"ND\" },\n { label: \"Ohio\", value: \"OH\" },\n { label: \"Oklahoma\", value: \"OK\" },\n { label: \"Oregon\", value: \"OR\" },\n { label: \"Pennsylvania\", value: \"PA\" },\n { label: \"Rhode Island\", value: \"RI\" },\n { label: \"South Carolina\", value: \"SC\" },\n { label: \"South Dakota\", value: \"SD\" },\n { label: \"Tennessee\", value: \"TN\" },\n { label: \"Texas\", value: \"TX\" },\n { label: \"Utah\", value: \"UT\" },\n { label: \"Vermont\", value: \"VT\" },\n { label: \"Virginia\", value: \"VA\" },\n { label: \"Washington\", value: \"WA\" },\n { label: \"West Virginia\", value: \"WV\" },\n { label: \"Wisconsin\", value: \"WI\" },\n { label: \"Wyoming\", value: \"WY\" },\n];\n","import { reactive } from \"vue\";\n\nexport interface USAddressFormData {\n address1: string;\n address2: string;\n city: string;\n state: string | null;\n zip: string;\n}\n\n/**\n * Reads the value from an input event payload.\n * @param payload - The input event payload.\n * @returns The string value of the input.\n */\nfunction readInputValue(payload: unknown): string {\n if (payload && typeof payload === \"object\" && \"value\" in payload) {\n const value = (payload as { value: unknown }).value;\n return typeof value === \"string\" ? value : String(value ?? \"\");\n }\n return \"\";\n}\n\n/**\n * Manages the form data model for a US address.\n *\n * Note: this is internal UI data state, not just the US \"state\" (AL, CA, etc.) field.\n * @returns An object containing form data and field event handlers.\n */\nexport function useUSAddressFormData() {\n const formData = reactive<USAddressFormData>({\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: null,\n zip: \"\",\n });\n\n const onAddress1Input = (...args: unknown[]) => {\n formData.address1 = readInputValue(args[0]);\n };\n\n const onAddress2Input = (...args: unknown[]) => {\n formData.address2 = readInputValue(args[0]);\n };\n\n const onCityInput = (...args: unknown[]) => {\n formData.city = readInputValue(args[0]);\n };\n\n const onStateChange = (event: { value: string | null }) => {\n formData.state = event.value;\n };\n\n const resetFormData = () => {\n formData.address1 = \"\";\n formData.address2 = \"\";\n formData.city = \"\";\n formData.state = null;\n formData.zip = \"\";\n };\n\n return {\n formData,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n resetFormData,\n };\n}\n","import { watch } from \"vue\";\nimport { useZipTextBox } from \"./useZipTextBox\";\nimport type { USAddressFormData } from \"./_useUSAddressFormData\";\n\n/**\n * Manages the ZIP code field for a US address.\n * @param formData - The form data object containing the ZIP code.\n * @returns An object containing ZIP code display, validity, wrapper class, input handler, and reset function.\n */\nexport function useUSAddressZip(\n formData: USAddressFormData,\n zipInputId = \"zip\",\n) {\n const zipField = useZipTextBox({ id: zipInputId });\n const {\n zipDisplay,\n zipRaw,\n isZipValid,\n wrapperClass: zipWrapperClass,\n handleZipInput: onZipInput,\n } = zipField;\n\n watch(zipRaw, (value) => {\n formData.zip = value;\n });\n\n const resetZip = () => {\n zipDisplay.value = \"\";\n formData.zip = \"\";\n };\n\n return {\n zipDisplay,\n isZipValid,\n zipWrapperClass,\n onZipInput,\n resetZip,\n };\n}\n","import { computed, toValue, type MaybeRefOrGetter } from \"vue\";\nimport type { USAddressFormData } from \"./_useUSAddressFormData\";\n\ninterface UseUSAddressValidationOptions {\n formData: USAddressFormData;\n isZipValid: MaybeRefOrGetter<boolean>;\n}\n\n/**\n * Manages the validation state for a US address.\n * @param options - The options object containing form data and ZIP code validity.\n * @returns An object containing validation state for each field and the overall address.\n */\nexport function useUSAddressValidation(options: UseUSAddressValidationOptions) {\n /**\n * Strict validity values represent the actual rule outcomes for each field,\n * independent of whether validation messages are currently shown in the UI.\n */\n const strictAddress1Valid = computed(\n () => options.formData.address1.trim() !== \"\",\n );\n const strictCityValid = computed(() => options.formData.city.trim() !== \"\");\n const strictStateValid = computed(() => !!options.formData.state);\n const strictZipValid = computed(() => toValue(options.isZipValid));\n\n const strictAddressValid = computed(\n () =>\n strictAddress1Valid.value &&\n strictCityValid.value &&\n strictStateValid.value &&\n strictZipValid.value,\n );\n\n return {\n strictAddress1Valid,\n strictCityValid,\n strictStateValid,\n strictZipValid,\n strictAddressValid,\n };\n}\n","import {\n computed,\n nextTick,\n ref,\n toValue,\n watch,\n watchEffect,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport { useFieldsetValidationKit } from \"../form/useFieldsetValidationKit\";\nimport { US_STATES_BY_ABBREVIATION } from \"./usStates\";\nimport { useUSAddressFormData } from \"./_useUSAddressFormData\";\nimport { useUSAddressZip } from \"./_useUSAddressZip\";\nimport { useUSAddressValidation } from \"./_useUSAddressValidation\";\n\ninterface UseUSAddressOptions {\n fieldsetRef: MaybeRefOrGetter<HTMLFieldSetElement | null>;\n addressId: string;\n required?: MaybeRefOrGetter<boolean>;\n}\n\nexport interface USAddressSubmitPayload {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n}\n\n/**\n * Focuses the first invalid input within a container.\n * @param container - The container element to search within.\n */\nfunction focusFirstInvalid(container: HTMLElement | null) {\n if (!container) return;\n const target = container.querySelector<HTMLElement>(\n '.k-invalid input, .k-invalid[tabindex=\"0\"]',\n );\n target?.focus();\n}\n\nfunction focusoutLeavesFieldset(\n fieldsetRef: HTMLFieldSetElement | null,\n event: FocusEvent,\n) {\n const fieldset = fieldsetRef ?? (event.currentTarget as HTMLElement | null);\n const next = event.relatedTarget as Node | null;\n\n return !fieldset || !fieldset.contains(next);\n}\n\n/**\n * Composable for managing a US address form.\n * @param options - The options object containing fieldset reference and address id.\n * @returns An object containing form state, validation state, and handlers.\n */\nexport function useUSAddress(options: UseUSAddressOptions) {\n const fieldsetRef = ref<HTMLFieldSetElement | null>(\n toValue(options.fieldsetRef),\n );\n\n watchEffect(() => {\n fieldsetRef.value = toValue(options.fieldsetRef);\n });\n\n const submitted = ref(false);\n const optionalFeedbackReviewed = ref(false);\n const isRequired = computed(() => toValue(options.required) ?? true);\n const {\n formData,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n resetFormData,\n } = useUSAddressFormData();\n\n const zipInputId = `${options.addressId}-zip`;\n\n const { zipDisplay, isZipValid, zipWrapperClass, onZipInput, resetZip } =\n useUSAddressZip(formData, zipInputId);\n\n const {\n strictAddress1Valid,\n strictCityValid,\n strictStateValid,\n strictZipValid,\n strictAddressValid,\n } = useUSAddressValidation({\n formData,\n isZipValid,\n });\n\n const validationKit = useFieldsetValidationKit(fieldsetRef, {\n submitted,\n isValid: () => strictAddressValid.value,\n });\n\n const { touched, fieldsetValidate, onFocusout, reset } = validationKit;\n\n const fieldValidations = validationKit.createFieldValidationsMap({\n address1: strictAddress1Valid,\n city: strictCityValid,\n state: strictStateValid,\n zip: strictZipValid,\n address: strictAddressValid,\n });\n\n const {\n address1: rawAddress1Valid,\n city: rawCityValid,\n state: rawStateValid,\n zip: rawZipValid,\n address: rawAddressValid,\n } = fieldValidations;\n\n const addressValidate = computed(() =>\n isRequired.value ? fieldsetValidate.value : false,\n );\n\n const address1Valid = computed(() =>\n isRequired.value ? rawAddress1Valid.value : true,\n );\n\n const cityValid = computed(() =>\n isRequired.value ? rawCityValid.value : true,\n );\n\n const stateValid = computed(() =>\n isRequired.value ? rawStateValid.value : true,\n );\n\n const zipValid = computed(() =>\n isRequired.value ? rawZipValid.value : true,\n );\n\n const addressValid = computed(() =>\n isRequired.value ? rawAddressValid.value : true,\n );\n\n const stateDefaultItem = { value: null, label: \"State\" };\n const stateOptions = US_STATES_BY_ABBREVIATION.map(({ label, value }) => ({\n label,\n value,\n }));\n\n const normalizedPayload = computed<USAddressSubmitPayload>(() => ({\n address1: formData.address1.trim(),\n address2: formData.address2.trim(),\n city: formData.city.trim(),\n state: (formData.state ?? \"\").trim().toUpperCase(),\n zip: formData.zip.replace(/\\D/g, \"\"),\n }));\n\n const isAddressEmpty = computed(() => {\n return (\n formData.address1.trim() === \"\" &&\n formData.address2.trim() === \"\" &&\n formData.city.trim() === \"\" &&\n (formData.state ?? \"\").trim() === \"\" &&\n formData.zip.replace(/\\D/g, \"\") === \"\"\n );\n });\n\n /**\n * Indicates whether any input has been provided in the optional address fields.\n * @returns True if any address field has input, false otherwise.\n */\n const optionalAddressHasAnyInput = computed(() => !isAddressEmpty.value);\n\n /**\n * Indicates whether any required fields are missing in the optional address section.\n * @returns True if any required field is missing, false otherwise.\n */\n const optionalMissingRequiredFields = computed(() => {\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n (!strictAddress1Valid.value ||\n !strictCityValid.value ||\n !strictStateValid.value)\n );\n });\n\n /**\n * Indicates whether the optional zip code field is invalid.\n * @returns True if the zip code is invalid, false otherwise.\n */\n const optionalZipInvalid = computed(() => {\n const zipDigits = formData.zip.replace(/\\D/g, \"\");\n\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n });\n\n /**\n * Indicates whether any part of the optional address is invalid.\n * @returns True if any part of the optional address is invalid, false otherwise.\n */\n const optionalPartialInvalid = computed(() => {\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n !strictAddressValid.value\n );\n });\n\n /**\n * Indicates whether optional address feedback should be active.\n * @returns True if feedback should be active, false otherwise.\n */\n const optionalFeedbackActive = computed(() => {\n return (\n !isRequired.value &&\n optionalPartialInvalid.value &&\n (optionalFeedbackReviewed.value || submitted.value)\n );\n });\n\n // Resets the optional feedback reviewed state when the normalized payload\n // changes and the address is not required.\n watch(normalizedPayload, () => {\n if (!isRequired.value) {\n optionalFeedbackReviewed.value = false;\n }\n });\n\n watch(isRequired, (required) => {\n if (!required) {\n submitted.value = false;\n optionalFeedbackReviewed.value = false;\n reset();\n }\n });\n\n /**\n * Validates address state for parent-owned submit flow.\n * Activates UI error visibility.\n * @returns An object containing the validity status and the normalized payload.\n */\n const validateForSubmit = async () => {\n if (!isRequired.value) {\n if (isAddressEmpty.value || strictAddressValid.value) {\n submitted.value = false;\n return {\n isValid: true as const,\n payload: normalizedPayload.value,\n };\n }\n\n submitted.value = true;\n return { isValid: false as const, payload: null };\n }\n\n submitted.value = true;\n\n if (!strictAddressValid.value) {\n await nextTick();\n focusFirstInvalid(fieldsetRef.value);\n return { isValid: false as const, payload: null };\n }\n\n return {\n isValid: true as const,\n payload: normalizedPayload.value,\n };\n };\n\n /**\n * Resets the US address form.\n * Deactivates UI error visibility.\n */\n const resetAddress = () => {\n submitted.value = false;\n optionalFeedbackReviewed.value = false;\n reset();\n resetFormData();\n resetZip();\n };\n\n const onFieldsetFocusout = (event: FocusEvent) => {\n const leftFieldset = focusoutLeavesFieldset(fieldsetRef.value, event);\n\n onFocusout(event);\n\n if (!isRequired.value && leftFieldset) {\n optionalFeedbackReviewed.value = true;\n }\n };\n\n return {\n formData,\n submitted,\n touched,\n addressValidate,\n address1Valid,\n cityValid,\n stateValid,\n zipValid,\n addressValid,\n optionalFeedbackActive,\n optionalPartialInvalid,\n optionalMissingRequiredFields,\n optionalZipInvalid,\n stateDefaultItem,\n stateOptions,\n zipDisplay,\n zipWrapperClass,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n onZipInput,\n onFieldsetFocusout,\n normalizedPayload,\n validateForSubmit,\n reset: resetAddress,\n };\n}\n"],"names":["DEFAULT_ZIP_ERROR_MESSAGE","formatZipDisplay","input","digits","countDigitsBeforeIndex","value","index","digitIndexToDisplayIndex","digitIndex","useZipTextBox","options","zipDisplay","ref","submitted","errorMessage","zipRaw","computed","isZipValid","length","showZipError","textBoxValid","textBoxValidate","restoreCaret","inputElement","caretIndex","nextTick","args","event","nextValue","inputValue","opts","valid","US_STATES_BY_ABBREVIATION","readInputValue","payload","useUSAddressFormData","formData","reactive","useUSAddressZip","zipInputId","zipField","zipWrapperClass","onZipInput","watch","useUSAddressValidation","strictAddress1Valid","strictCityValid","strictStateValid","strictZipValid","toValue","strictAddressValid","focusFirstInvalid","container","focusoutLeavesFieldset","fieldsetRef","fieldset","next","useUSAddress","watchEffect","optionalFeedbackReviewed","isRequired","onAddress1Input","onAddress2Input","onCityInput","onStateChange","resetFormData","resetZip","validationKit","useFieldsetValidationKit","touched","fieldsetValidate","onFocusout","reset","fieldValidations","rawAddress1Valid","rawCityValid","rawStateValid","rawZipValid","rawAddressValid","addressValidate","address1Valid","cityValid","stateValid","zipValid","addressValid","stateDefaultItem","stateOptions","label","normalizedPayload","isAddressEmpty","optionalAddressHasAnyInput","optionalMissingRequiredFields","optionalZipInvalid","zipDigits","optionalPartialInvalid","optionalFeedbackActive","required","leftFieldset"],"mappings":"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"}
|