UNPKG

smartstepper

Version:

SmartStepper is a modern, customizable React stepper component for building multi-step forms, wizards, and onboarding flows. Integrates with react-hook-form, supports Yup/Zod validation, and offers a flexible, config-driven API for dynamic forms.

1,100 lines (1,099 loc) 35.7 kB
import * as e from "react"; import t, { cloneElement as n, createContext as r, isValidElement as i, useContext as a, useMemo as o, useState as s } from "react"; import { jsx as c } from "react/jsx-runtime"; //#region node_modules/.pnpm/react-hook-form@7.59.0_react@18.2.0/node_modules/react-hook-form/dist/index.esm.mjs var l = (e) => e.type === "checkbox", u = (e) => e instanceof Date, d = (e) => e == null, f = (e) => typeof e == "object", p = (e) => !d(e) && !Array.isArray(e) && f(e) && !u(e), ee = (e) => p(e) && e.target ? l(e.target) ? e.target.checked : e.target.value : e, m = (e) => e.substring(0, e.search(/\.\d+(\.|$)/)) || e, h = (e, t) => e.has(m(t)), g = (e) => { let t = e.constructor && e.constructor.prototype; return p(t) && t.hasOwnProperty("isPrototypeOf"); }, _ = typeof window < "u" && window.HTMLElement !== void 0 && typeof document < "u"; function v(e) { let t, n = Array.isArray(e), r = typeof FileList < "u" ? e instanceof FileList : !1; if (e instanceof Date) t = new Date(e); else if (e instanceof Set) t = new Set(e); else if (!(_ && (e instanceof Blob || r)) && (n || p(e))) if (t = n ? [] : {}, !n && !g(e)) t = e; else for (let n in e) e.hasOwnProperty(n) && (t[n] = v(e[n])); else return e; return t; } var y = (e) => /^\w*$/.test(e), b = (e) => e === void 0, x = (e) => Array.isArray(e) ? e.filter(Boolean) : [], S = (e) => x(e.replace(/["|']|\]/g, "").split(/\.|\[/)), C = (e, t, n) => { if (!t || !p(e)) return n; let r = (y(t) ? [t] : S(t)).reduce((e, t) => d(e) ? e : e[t], e); return b(r) || r === e ? b(e[t]) ? n : e[t] : r; }, w = (e) => typeof e == "boolean", T = (e, t, n) => { let r = -1, i = y(t) ? [t] : S(t), a = i.length, o = a - 1; for (; ++r < a;) { let t = i[r], a = n; if (r !== o) { let n = e[t]; a = p(n) || Array.isArray(n) ? n : isNaN(+i[r + 1]) ? {} : []; } if (t === "__proto__" || t === "constructor" || t === "prototype") return; e[t] = a, e = e[t]; } }, E = { BLUR: "blur", FOCUS_OUT: "focusout", CHANGE: "change" }, D = { onBlur: "onBlur", onChange: "onChange", onSubmit: "onSubmit", onTouched: "onTouched", all: "all" }, O = { max: "max", min: "min", maxLength: "maxLength", minLength: "minLength", pattern: "pattern", required: "required", validate: "validate" }, k = t.createContext(null); k.displayName = "HookFormContext"; var A = () => t.useContext(k), j = (e, t, n, r = !0) => { let i = { defaultValues: t._defaultValues }; for (let a in e) Object.defineProperty(i, a, { get: () => { let i = a; return t._proxyFormState[i] !== D.all && (t._proxyFormState[i] = !r || D.all), n && (n[i] = !0), e[i]; } }); return i; }, M = typeof window < "u" ? e.useLayoutEffect : e.useEffect; function te(e) { let n = A(), { control: r = n.control, disabled: i, name: a, exact: o } = e || {}, [s, c] = t.useState(r._formState), l = t.useRef({ isDirty: !1, isLoading: !1, dirtyFields: !1, touchedFields: !1, validatingFields: !1, isValidating: !1, isValid: !1, errors: !1 }); return M(() => r._subscribe({ name: a, formState: l.current, exact: o, callback: (e) => { !i && c({ ...r._formState, ...e }); } }), [ a, i, o ]), t.useEffect(() => { l.current.isValid && r._setValid(!0); }, [r]), t.useMemo(() => j(s, r, l.current, !1), [s, r]); } var N = (e) => typeof e == "string", ne = (e, t, n, r, i) => N(e) ? (r && t.watch.add(e), C(n, e, i)) : Array.isArray(e) ? e.map((e) => (r && t.watch.add(e), C(n, e))) : (r && (t.watchAll = !0), n); function re(e) { let n = A(), { control: r = n.control, name: i, defaultValue: a, disabled: o, exact: s } = e || {}, c = t.useRef(a), [l, u] = t.useState(r._getWatch(i, c.current)); return M(() => r._subscribe({ name: i, formState: { values: !0 }, exact: s, callback: (e) => !o && u(ne(i, r._names, e.values || r._formValues, !1, c.current)) }), [ i, r, o, s ]), t.useEffect(() => r._removeUnmounted()), l; } function P(e) { let n = A(), { name: r, disabled: i, control: a = n.control, shouldUnregister: o } = e, s = h(a._names.array, r), c = re({ control: a, name: r, defaultValue: C(a._formValues, r, C(a._defaultValues, r, e.defaultValue)), exact: !0 }), l = te({ control: a, name: r, exact: !0 }), u = t.useRef(e), d = t.useRef(a.register(r, { ...e.rules, value: c, ...w(e.disabled) ? { disabled: e.disabled } : {} })), f = t.useMemo(() => Object.defineProperties({}, { invalid: { enumerable: !0, get: () => !!C(l.errors, r) }, isDirty: { enumerable: !0, get: () => !!C(l.dirtyFields, r) }, isTouched: { enumerable: !0, get: () => !!C(l.touchedFields, r) }, isValidating: { enumerable: !0, get: () => !!C(l.validatingFields, r) }, error: { enumerable: !0, get: () => C(l.errors, r) } }), [l, r]), p = t.useCallback((e) => d.current.onChange({ target: { value: ee(e), name: r }, type: E.CHANGE }), [r]), m = t.useCallback(() => d.current.onBlur({ target: { value: C(a._formValues, r), name: r }, type: E.BLUR }), [r, a._formValues]), g = t.useCallback((e) => { let t = C(a._fields, r); t && e && (t._f.ref = { focus: () => e.focus && e.focus(), select: () => e.select && e.select(), setCustomValidity: (t) => e.setCustomValidity(t), reportValidity: () => e.reportValidity() }); }, [a._fields, r]), _ = t.useMemo(() => ({ name: r, value: c, ...w(i) || l.disabled ? { disabled: l.disabled || i } : {}, onChange: p, onBlur: m, ref: g }), [ r, i, l.disabled, p, m, g, c ]); return t.useEffect(() => { let e = a._options.shouldUnregister || o; a.register(r, { ...u.current.rules, ...w(u.current.disabled) ? { disabled: u.current.disabled } : {} }); let t = (e, t) => { let n = C(a._fields, e); n && n._f && (n._f.mount = t); }; if (t(r, !0), e) { let e = v(C(a._options.defaultValues, r)); T(a._defaultValues, r, e), b(C(a._formValues, r)) && T(a._formValues, r, e); } return !s && a.register(r), () => { (s ? e && !a._state.action : e) ? a.unregister(r) : t(r, !1); }; }, [ r, a, s, o ]), t.useEffect(() => { a._setDisabledField({ disabled: i, name: r }); }, [ i, r, a ]), t.useMemo(() => ({ field: _, formState: l, fieldState: f }), [ _, l, f ]); } var ie = (e) => e.render(P(e)), F = (e, t, n, r, i) => t ? { ...n[e], types: { ...n[e] && n[e].types ? n[e].types : {}, [r]: i || !0 } } : {}, I = (e) => Array.isArray(e) ? e : [e], ae = () => { let e = []; return { get observers() { return e; }, next: (t) => { for (let n of e) n.next && n.next(t); }, subscribe: (t) => (e.push(t), { unsubscribe: () => { e = e.filter((e) => e !== t); } }), unsubscribe: () => { e = []; } }; }, oe = (e) => d(e) || !f(e); function L(e, t, n = /* @__PURE__ */ new WeakSet()) { if (oe(e) || oe(t)) return e === t; if (u(e) && u(t)) return e.getTime() === t.getTime(); let r = Object.keys(e), i = Object.keys(t); if (r.length !== i.length) return !1; if (n.has(e) || n.has(t)) return !0; n.add(e), n.add(t); for (let a of r) { let r = e[a]; if (!i.includes(a)) return !1; if (a !== "ref") { let e = t[a]; if (u(r) && u(e) || p(r) && p(e) || Array.isArray(r) && Array.isArray(e) ? !L(r, e, n) : r !== e) return !1; } } return !0; } var R = (e) => p(e) && !Object.keys(e).length, se = (e) => e.type === "file", z = (e) => typeof e == "function", ce = (e) => { if (!_) return !1; let t = e ? e.ownerDocument : 0; return e instanceof (t && t.defaultView ? t.defaultView.HTMLElement : HTMLElement); }, le = (e) => e.type === "select-multiple", B = (e) => e.type === "radio", ue = (e) => B(e) || l(e), de = (e) => ce(e) && e.isConnected; function fe(e, t) { let n = t.slice(0, -1).length, r = 0; for (; r < n;) e = b(e) ? r++ : e[t[r++]]; return e; } function V(e) { for (let t in e) if (e.hasOwnProperty(t) && !b(e[t])) return !1; return !0; } function H(e, t) { let n = Array.isArray(t) ? t : y(t) ? [t] : S(t), r = n.length === 1 ? e : fe(e, n), i = n.length - 1, a = n[i]; return r && delete r[a], i !== 0 && (p(r) && R(r) || Array.isArray(r) && V(r)) && H(e, n.slice(0, -1)), e; } var U = (e) => { for (let t in e) if (z(e[t])) return !0; return !1; }; function W(e, t = {}) { let n = Array.isArray(e); if (p(e) || n) for (let n in e) Array.isArray(e[n]) || p(e[n]) && !U(e[n]) ? (t[n] = Array.isArray(e[n]) ? [] : {}, W(e[n], t[n])) : d(e[n]) || (t[n] = !0); return t; } function G(e, t, n) { let r = Array.isArray(e); if (p(e) || r) for (let r in e) Array.isArray(e[r]) || p(e[r]) && !U(e[r]) ? b(t) || oe(n[r]) ? n[r] = Array.isArray(e[r]) ? W(e[r], []) : { ...W(e[r]) } : G(e[r], d(t) ? {} : t[r], n[r]) : n[r] = !L(e[r], t[r]); return n; } var K = (e, t) => G(e, t, W(t)), pe = { value: !1, isValid: !1 }, q = { value: !0, isValid: !0 }, me = (e) => { if (Array.isArray(e)) { if (e.length > 1) { let t = e.filter((e) => e && e.checked && !e.disabled).map((e) => e.value); return { value: t, isValid: !!t.length }; } return e[0].checked && !e[0].disabled ? e[0].attributes && !b(e[0].attributes.value) ? b(e[0].value) || e[0].value === "" ? q : { value: e[0].value, isValid: !0 } : q : pe; } return pe; }, he = (e, { valueAsNumber: t, valueAsDate: n, setValueAs: r }) => b(e) ? e : t ? e === "" ? NaN : e && +e : n && N(e) ? new Date(e) : r ? r(e) : e, ge = { isValid: !1, value: null }, J = (e) => Array.isArray(e) ? e.reduce((e, t) => t && t.checked && !t.disabled ? { isValid: !0, value: t.value } : e, ge) : ge; function _e(e) { let t = e.ref; return se(t) ? t.files : B(t) ? J(e.refs).value : le(t) ? [...t.selectedOptions].map(({ value: e }) => e) : l(t) ? me(e.refs).value : he(b(t.value) ? e.ref.value : t.value, e); } var ve = (e, t, n, r) => { let i = {}; for (let n of e) { let e = C(t, n); e && T(i, n, e._f); } return { criteriaMode: n, names: [...e], fields: i, shouldUseNativeValidation: r }; }, Y = (e) => e instanceof RegExp, X = (e) => b(e) ? e : Y(e) ? e.source : p(e) ? Y(e.value) ? e.value.source : e.value : e, ye = (e) => ({ isOnSubmit: !e || e === D.onSubmit, isOnBlur: e === D.onBlur, isOnChange: e === D.onChange, isOnAll: e === D.all, isOnTouch: e === D.onTouched }), be = "AsyncFunction", xe = (e) => !!e && !!e.validate && !!(z(e.validate) && e.validate.constructor.name === be || p(e.validate) && Object.values(e.validate).find((e) => e.constructor.name === be)), Se = (e) => e.mount && (e.required || e.min || e.max || e.maxLength || e.minLength || e.pattern || e.validate), Ce = (e, t, n) => !n && (t.watchAll || t.watch.has(e) || [...t.watch].some((t) => e.startsWith(t) && /^\.\w+/.test(e.slice(t.length)))), Z = (e, t, n, r) => { for (let i of n || Object.keys(e)) { let n = C(e, i); if (n) { let { _f: e, ...a } = n; if (e) { if (e.refs && e.refs[0] && t(e.refs[0], i) && !r || e.ref && t(e.ref, e.name) && !r) return !0; if (Z(a, t)) break; } else if (p(a) && Z(a, t)) break; } } }; function we(e, t, n) { let r = C(e, n); if (r || y(n)) return { error: r, name: n }; let i = n.split("."); for (; i.length;) { let r = i.join("."), a = C(t, r), o = C(e, r); if (a && !Array.isArray(a) && n !== r) return { name: n }; if (o && o.type) return { name: r, error: o }; if (o && o.root && o.root.type) return { name: `${r}.root`, error: o.root }; i.pop(); } return { name: n }; } var Te = (e, t, n, r) => { n(e); let { name: i, ...a } = e; return R(a) || Object.keys(a).length >= Object.keys(t).length || Object.keys(a).find((e) => t[e] === (!r || D.all)); }, Ee = (e, t, n) => !e || !t || e === t || I(e).some((e) => e && (n ? e === t : e.startsWith(t) || t.startsWith(e))), De = (e, t, n, r, i) => i.isOnAll ? !1 : !n && i.isOnTouch ? !(t || e) : (n ? r.isOnBlur : i.isOnBlur) ? !e : (n ? r.isOnChange : i.isOnChange) ? e : !0, Oe = (e, t) => !x(C(e, t)).length && H(e, t), ke = (e, t, n) => { let r = I(C(e, n)); return T(r, "root", t[n]), T(e, n, r), e; }, Ae = (e) => N(e); function je(e, t, n = "validate") { if (Ae(e) || Array.isArray(e) && e.every(Ae) || w(e) && !e) return { type: n, message: Ae(e) ? e : "", ref: t }; } var Q = (e) => p(e) && !Y(e) ? e : { value: e, message: "" }, Me = async (e, t, n, r, i, a) => { let { ref: o, refs: s, required: c, maxLength: u, minLength: f, min: ee, max: m, pattern: h, validate: g, name: _, valueAsNumber: v, mount: y } = e._f, x = C(n, _); if (!y || t.has(_)) return {}; let S = s ? s[0] : o, T = (e) => { i && S.reportValidity && (S.setCustomValidity(w(e) ? "" : e || ""), S.reportValidity()); }, E = {}, D = B(o), k = l(o), A = D || k, j = (v || se(o)) && b(o.value) && b(x) || ce(o) && o.value === "" || x === "" || Array.isArray(x) && !x.length, M = F.bind(null, _, r, E), te = (e, t, n, r = O.maxLength, i = O.minLength) => { let a = e ? t : n; E[_] = { type: e ? r : i, message: a, ref: o, ...M(e ? r : i, a) }; }; if (a ? !Array.isArray(x) || !x.length : c && (!A && (j || d(x)) || w(x) && !x || k && !me(s).isValid || D && !J(s).isValid)) { let { value: e, message: t } = Ae(c) ? { value: !!c, message: c } : Q(c); if (e && (E[_] = { type: O.required, message: t, ref: S, ...M(O.required, t) }, !r)) return T(t), E; } if (!j && (!d(ee) || !d(m))) { let e, t, n = Q(m), i = Q(ee); if (!d(x) && !isNaN(x)) { let r = o.valueAsNumber || x && +x; d(n.value) || (e = r > n.value), d(i.value) || (t = r < i.value); } else { let r = o.valueAsDate || new Date(x), a = (e) => /* @__PURE__ */ new Date((/* @__PURE__ */ new Date()).toDateString() + " " + e), s = o.type == "time", c = o.type == "week"; N(n.value) && x && (e = s ? a(x) > a(n.value) : c ? x > n.value : r > new Date(n.value)), N(i.value) && x && (t = s ? a(x) < a(i.value) : c ? x < i.value : r < new Date(i.value)); } if ((e || t) && (te(!!e, n.message, i.message, O.max, O.min), !r)) return T(E[_].message), E; } if ((u || f) && !j && (N(x) || a && Array.isArray(x))) { let e = Q(u), t = Q(f), n = !d(e.value) && x.length > +e.value, i = !d(t.value) && x.length < +t.value; if ((n || i) && (te(n, e.message, t.message), !r)) return T(E[_].message), E; } if (h && !j && N(x)) { let { value: e, message: t } = Q(h); if (Y(e) && !x.match(e) && (E[_] = { type: O.pattern, message: t, ref: o, ...M(O.pattern, t) }, !r)) return T(t), E; } if (g) { if (z(g)) { let e = je(await g(x, n), S); if (e && (E[_] = { ...e, ...M(O.validate, e.message) }, !r)) return T(e.message), E; } else if (p(g)) { let e = {}; for (let t in g) { if (!R(e) && !r) break; let i = je(await g[t](x, n), S, t); i && (e = { ...i, ...M(t, i.message) }, T(i.message), r && (E[_] = e)); } if (!R(e) && (E[_] = { ref: S, ...e }, !r)) return E; } } return T(!0), E; }, Ne = { mode: D.onSubmit, reValidateMode: D.onChange, shouldFocusError: !0 }; function Pe(e = {}) { let t = { ...Ne, ...e }, n = { submitCount: 0, isDirty: !1, isReady: !1, isLoading: z(t.defaultValues), isValidating: !1, isSubmitted: !1, isSubmitting: !1, isSubmitSuccessful: !1, isValid: !1, touchedFields: {}, dirtyFields: {}, validatingFields: {}, errors: t.errors || {}, disabled: t.disabled || !1 }, r = {}, i = (p(t.defaultValues) || p(t.values)) && v(t.defaultValues || t.values) || {}, a = t.shouldUnregister ? {} : v(i), o = { action: !1, mount: !1, watch: !1 }, s = { mount: /* @__PURE__ */ new Set(), disabled: /* @__PURE__ */ new Set(), unMount: /* @__PURE__ */ new Set(), array: /* @__PURE__ */ new Set(), watch: /* @__PURE__ */ new Set() }, c, f = 0, m = { isDirty: !1, dirtyFields: !1, validatingFields: !1, touchedFields: !1, isValidating: !1, isValid: !1, errors: !1 }, g = { ...m }, y = { array: ae(), state: ae() }, S = t.criteriaMode === D.all, O = (e) => (t) => { clearTimeout(f), f = setTimeout(e, t); }, k = async (e) => { if (!t.disabled && (m.isValid || g.isValid || e)) { let e = t.resolver ? R((await F()).errors) : await B(r, !0); e !== n.isValid && y.state.next({ isValid: e }); } }, A = (e, r) => { !t.disabled && (m.isValidating || m.validatingFields || g.isValidating || g.validatingFields) && ((e || Array.from(s.mount)).forEach((e) => { e && (r ? T(n.validatingFields, e, r) : H(n.validatingFields, e)); }), y.state.next({ validatingFields: n.validatingFields, isValidating: !R(n.validatingFields) })); }, j = (e, s = [], c, l, u = !0, d = !0) => { if (l && c && !t.disabled) { if (o.action = !0, d && Array.isArray(C(r, e))) { let t = c(C(r, e), l.argA, l.argB); u && T(r, e, t); } if (d && Array.isArray(C(n.errors, e))) { let t = c(C(n.errors, e), l.argA, l.argB); u && T(n.errors, e, t), Oe(n.errors, e); } if ((m.touchedFields || g.touchedFields) && d && Array.isArray(C(n.touchedFields, e))) { let t = c(C(n.touchedFields, e), l.argA, l.argB); u && T(n.touchedFields, e, t); } (m.dirtyFields || g.dirtyFields) && (n.dirtyFields = K(i, a)), y.state.next({ name: e, isDirty: V(e, s), dirtyFields: n.dirtyFields, errors: n.errors, isValid: n.isValid }); } else T(a, e, s); }, M = (e, t) => { T(n.errors, e, t), y.state.next({ errors: n.errors }); }, te = (e) => { n.errors = e, y.state.next({ errors: n.errors, isValid: !1 }); }, re = (e, t, n, s) => { let c = C(r, e); if (c) { let r = C(a, e, b(n) ? C(i, e) : n); b(r) || s && s.defaultChecked || t ? T(a, e, t ? r : _e(c._f)) : G(e, r), o.mount && k(); } }, P = (e, r, a, o, s) => { let c = !1, l = !1, u = { name: e }; if (!t.disabled) { if (!a || o) { (m.isDirty || g.isDirty) && (l = n.isDirty, n.isDirty = u.isDirty = V(), c = l !== u.isDirty); let t = L(C(i, e), r); l = !!C(n.dirtyFields, e), t ? H(n.dirtyFields, e) : T(n.dirtyFields, e, !0), u.dirtyFields = n.dirtyFields, c ||= (m.dirtyFields || g.dirtyFields) && l !== !t; } if (a) { let t = C(n.touchedFields, e); t || (T(n.touchedFields, e, a), u.touchedFields = n.touchedFields, c ||= (m.touchedFields || g.touchedFields) && t !== a); } c && s && y.state.next(u); } return c ? u : {}; }, ie = (e, r, i, a) => { let o = C(n.errors, e), s = (m.isValid || g.isValid) && w(r) && n.isValid !== r; if (t.delayError && i ? (c = O(() => M(e, i)), c(t.delayError)) : (clearTimeout(f), c = null, i ? T(n.errors, e, i) : H(n.errors, e)), (i ? !L(o, i) : o) || !R(a) || s) { let t = { ...a, ...s && w(r) ? { isValid: r } : {}, errors: n.errors, name: e }; n = { ...n, ...t }, y.state.next(t); } }, F = async (e) => { A(e, !0); let n = await t.resolver(a, t.context, ve(e || s.mount, r, t.criteriaMode, t.shouldUseNativeValidation)); return A(e), n; }, oe = async (e) => { let { errors: t } = await F(e); if (e) for (let r of e) { let e = C(t, r); e ? T(n.errors, r, e) : H(n.errors, r); } else n.errors = t; return t; }, B = async (e, r, i = { valid: !0 }) => { for (let o in e) { let c = e[o]; if (c) { let { _f: e, ...l } = c; if (e) { let l = s.array.has(e.name), u = c._f && xe(c._f); u && m.validatingFields && A([o], !0); let d = await Me(c, s.disabled, a, S, t.shouldUseNativeValidation && !r, l); if (u && m.validatingFields && A([o]), d[e.name] && (i.valid = !1, r)) break; !r && (C(d, e.name) ? l ? ke(n.errors, d, e.name) : T(n.errors, e.name, d[e.name]) : H(n.errors, e.name)); } !R(l) && await B(l, r, i); } } return i.valid; }, fe = () => { for (let e of s.unMount) { let t = C(r, e); t && (t._f.refs ? t._f.refs.every((e) => !de(e)) : !de(t._f.ref)) && Ie(e); } s.unMount = /* @__PURE__ */ new Set(); }, V = (e, n) => !t.disabled && (e && n && T(a, e, n), !L(Y(), i)), U = (e, t, n) => ne(e, s, { ...o.mount ? a : b(t) ? i : N(e) ? { [e]: t } : t }, n, t), W = (e) => x(C(o.mount ? a : i, e, t.shouldUnregister ? C(i, e, []) : [])), G = (e, t, n = {}) => { let i = C(r, e), o = t; if (i) { let n = i._f; n && (!n.disabled && T(a, e, he(t, n)), o = ce(n.ref) && d(t) ? "" : t, le(n.ref) ? [...n.ref.options].forEach((e) => e.selected = o.includes(e.value)) : n.refs ? l(n.ref) ? n.refs.forEach((e) => { (!e.defaultChecked || !e.disabled) && (Array.isArray(o) ? e.checked = !!o.find((t) => t === e.value) : e.checked = o === e.value || !!o); }) : n.refs.forEach((e) => e.checked = e.value === o) : se(n.ref) ? n.ref.value = "" : (n.ref.value = o, n.ref.type || y.state.next({ name: e, values: v(a) }))); } (n.shouldDirty || n.shouldTouch) && P(e, o, n.shouldTouch, n.shouldDirty, !0), n.shouldValidate && J(e); }, pe = (e, t, n) => { for (let i in t) { if (!t.hasOwnProperty(i)) return; let a = t[i], o = e + "." + i, c = C(r, o); (s.array.has(e) || p(a) || c && !c._f) && !u(a) ? pe(o, a, n) : G(o, a, n); } }, q = (e, t, c = {}) => { let l = C(r, e), u = s.array.has(e), f = v(t); T(a, e, f), u ? (y.array.next({ name: e, values: v(a) }), (m.isDirty || m.dirtyFields || g.isDirty || g.dirtyFields) && c.shouldDirty && y.state.next({ name: e, dirtyFields: K(i, a), isDirty: V(e, f) })) : l && !l._f && !d(f) ? pe(e, f, c) : G(e, f, c), Ce(e, s) && y.state.next({ ...n }), y.state.next({ name: o.mount ? e : void 0, values: v(a) }); }, me = async (e) => { o.mount = !0; let i = e.target, l = i.name, d = !0, f = C(r, l), p = (e) => { d = Number.isNaN(e) || u(e) && isNaN(e.getTime()) || L(e, C(a, l, e)); }, h = ye(t.mode), _ = ye(t.reValidateMode); if (f) { let o, u, b = i.type ? _e(f._f) : ee(e), x = e.type === E.BLUR || e.type === E.FOCUS_OUT, w = !Se(f._f) && !t.resolver && !C(n.errors, l) && !f._f.deps || De(x, C(n.touchedFields, l), n.isSubmitted, _, h), D = Ce(l, s, x); T(a, l, b), x ? (f._f.onBlur && f._f.onBlur(e), c && c(0)) : f._f.onChange && f._f.onChange(e); let O = P(l, b, x), j = !R(O) || D; if (!x && y.state.next({ name: l, type: e.type, values: v(a) }), w) return (m.isValid || g.isValid) && (t.mode === "onBlur" ? x && k() : x || k()), j && y.state.next({ name: l, ...D ? {} : O }); if (!x && D && y.state.next({ ...n }), t.resolver) { let { errors: e } = await F([l]); if (p(b), d) { let t = we(e, r, we(n.errors, r, l).name || l); o = t.error, l = t.name, u = R(e); } } else A([l], !0), o = (await Me(f, s.disabled, a, S, t.shouldUseNativeValidation))[l], A([l]), p(b), d && (o ? u = !1 : (m.isValid || g.isValid) && (u = await B(r, !0))); d && (f._f.deps && J(f._f.deps), ie(l, u, o, O)); } }, ge = (e, t) => { if (C(n.errors, t) && e.focus) return e.focus(), 1; }, J = async (e, i = {}) => { let a, o, c = I(e); if (t.resolver) { let t = await oe(b(e) ? e : c); a = R(t), o = e ? !c.some((e) => C(t, e)) : a; } else e ? (o = (await Promise.all(c.map(async (e) => { let t = C(r, e); return await B(t && t._f ? { [e]: t } : t); }))).every(Boolean), !(!o && !n.isValid) && k()) : o = a = await B(r); return y.state.next({ ...!N(e) || (m.isValid || g.isValid) && a !== n.isValid ? {} : { name: e }, ...t.resolver || !e ? { isValid: a } : {}, errors: n.errors }), i.shouldFocus && !o && Z(r, ge, e ? c : s.mount), o; }, Y = (e) => { let t = { ...o.mount ? a : i }; return b(e) ? t : N(e) ? C(t, e) : e.map((e) => C(t, e)); }, be = (e, t) => ({ invalid: !!C((t || n).errors, e), isDirty: !!C((t || n).dirtyFields, e), error: C((t || n).errors, e), isValidating: !!C(n.validatingFields, e), isTouched: !!C((t || n).touchedFields, e) }), Ae = (e) => { e && I(e).forEach((e) => H(n.errors, e)), y.state.next({ errors: e ? n.errors : {} }); }, je = (e, t, i) => { let a = (C(r, e, { _f: {} })._f || {}).ref, { ref: o, message: s, type: c, ...l } = C(n.errors, e) || {}; T(n.errors, e, { ...l, ...t, ref: a }), y.state.next({ name: e, errors: n.errors, isValid: !1 }), i && i.shouldFocus && a && a.focus && a.focus(); }, Q = (e, t) => z(e) ? y.state.subscribe({ next: (n) => e(U(void 0, t), n) }) : U(e, t, !0), Pe = (e) => y.state.subscribe({ next: (t) => { Ee(e.name, t.name, e.exact) && Te(t, e.formState || m, Ge, e.reRenderRoot) && e.callback({ values: { ...a }, ...n, ...t }); } }).unsubscribe, Fe = (e) => (o.mount = !0, g = { ...g, ...e.formState }, Pe({ ...e, formState: g })), Ie = (e, o = {}) => { for (let c of e ? I(e) : s.mount) s.mount.delete(c), s.array.delete(c), o.keepValue || (H(r, c), H(a, c)), !o.keepError && H(n.errors, c), !o.keepDirty && H(n.dirtyFields, c), !o.keepTouched && H(n.touchedFields, c), !o.keepIsValidating && H(n.validatingFields, c), !t.shouldUnregister && !o.keepDefaultValue && H(i, c); y.state.next({ values: v(a) }), y.state.next({ ...n, ...o.keepDirty ? { isDirty: V() } : {} }), !o.keepIsValid && k(); }, Le = ({ disabled: e, name: t }) => { (w(e) && o.mount || e || s.disabled.has(t)) && (e ? s.disabled.add(t) : s.disabled.delete(t)); }, $ = (e, n = {}) => { let a = C(r, e), c = w(n.disabled) || w(t.disabled); return T(r, e, { ...a || {}, _f: { ...a && a._f ? a._f : { ref: { name: e } }, name: e, mount: !0, ...n } }), s.mount.add(e), a ? Le({ disabled: w(n.disabled) ? n.disabled : t.disabled, name: e }) : re(e, !0, n.value), { ...c ? { disabled: n.disabled || t.disabled } : {}, ...t.progressive ? { required: !!n.required, min: X(n.min), max: X(n.max), minLength: X(n.minLength), maxLength: X(n.maxLength), pattern: X(n.pattern) } : {}, name: e, onChange: me, onBlur: me, ref: (c) => { if (c) { $(e, n), a = C(r, e); let t = b(c.value) && c.querySelectorAll && c.querySelectorAll("input,select,textarea")[0] || c, o = ue(t), s = a._f.refs || []; if (o ? s.find((e) => e === t) : t === a._f.ref) return; T(r, e, { _f: { ...a._f, ...o ? { refs: [ ...s.filter(de), t, ...Array.isArray(C(i, e)) ? [{}] : [] ], ref: { type: t.type, name: e } } : { ref: t } } }), re(e, !1, void 0, t); } else a = C(r, e, {}), a._f && (a._f.mount = !1), (t.shouldUnregister || n.shouldUnregister) && !(h(s.array, e) && o.action) && s.unMount.add(e); } }; }, Re = () => t.shouldFocusError && Z(r, ge, s.mount), ze = (e) => { w(e) && (y.state.next({ disabled: e }), Z(r, (t, n) => { let i = C(r, n); i && (t.disabled = i._f.disabled || e, Array.isArray(i._f.refs) && i._f.refs.forEach((t) => { t.disabled = i._f.disabled || e; })); }, 0, !1)); }, Be = (e, i) => async (o) => { let c; o && (o.preventDefault && o.preventDefault(), o.persist && o.persist()); let l = v(a); if (y.state.next({ isSubmitting: !0 }), t.resolver) { let { errors: e, values: t } = await F(); n.errors = e, l = v(t); } else await B(r); if (s.disabled.size) for (let e of s.disabled) H(l, e); if (H(n.errors, "root"), R(n.errors)) { y.state.next({ errors: {} }); try { await e(l, o); } catch (e) { c = e; } } else i && await i({ ...n.errors }, o), Re(), setTimeout(Re); if (y.state.next({ isSubmitted: !0, isSubmitting: !1, isSubmitSuccessful: R(n.errors) && !c, submitCount: n.submitCount + 1, errors: n.errors }), c) throw c; }, Ve = (e, t = {}) => { C(r, e) && (b(t.defaultValue) ? q(e, v(C(i, e))) : (q(e, t.defaultValue), T(i, e, v(t.defaultValue))), t.keepTouched || H(n.touchedFields, e), t.keepDirty || (H(n.dirtyFields, e), n.isDirty = t.defaultValue ? V(e, v(C(i, e))) : V()), t.keepError || (H(n.errors, e), m.isValid && k()), y.state.next({ ...n })); }, He = (e, c = {}) => { let l = e ? v(e) : i, u = v(l), d = R(e), f = d ? i : u; if (c.keepDefaultValues || (i = l), !c.keepValues) { if (c.keepDirtyValues) { let e = new Set([...s.mount, ...Object.keys(K(i, a))]); for (let t of Array.from(e)) C(n.dirtyFields, t) ? T(f, t, C(a, t)) : q(t, C(f, t)); } else { if (_ && b(e)) for (let e of s.mount) { let t = C(r, e); if (t && t._f) { let e = Array.isArray(t._f.refs) ? t._f.refs[0] : t._f.ref; if (ce(e)) { let t = e.closest("form"); if (t) { t.reset(); break; } } } } for (let e of s.mount) { let t = C(f, e, C(i, e)); b(t) || (T(f, e, t), q(e, C(f, e))); } } a = v(f), y.array.next({ values: { ...f } }), y.state.next({ values: { ...f } }); } s = { mount: c.keepDirtyValues ? s.mount : /* @__PURE__ */ new Set(), unMount: /* @__PURE__ */ new Set(), array: /* @__PURE__ */ new Set(), disabled: /* @__PURE__ */ new Set(), watch: /* @__PURE__ */ new Set(), watchAll: !1, focus: "" }, o.mount = !m.isValid || !!c.keepIsValid || !!c.keepDirtyValues, o.watch = !!t.shouldUnregister, y.state.next({ submitCount: c.keepSubmitCount ? n.submitCount : 0, isDirty: d ? !1 : c.keepDirty ? n.isDirty : !!(c.keepDefaultValues && !L(e, i)), isSubmitted: c.keepIsSubmitted ? n.isSubmitted : !1, dirtyFields: d ? {} : c.keepDirtyValues ? c.keepDefaultValues && a ? K(i, a) : n.dirtyFields : c.keepDefaultValues && e ? K(i, e) : c.keepDirty ? n.dirtyFields : {}, touchedFields: c.keepTouched ? n.touchedFields : {}, errors: c.keepErrors ? n.errors : {}, isSubmitSuccessful: c.keepIsSubmitSuccessful ? n.isSubmitSuccessful : !1, isSubmitting: !1 }); }, Ue = (e, t) => He(z(e) ? e(a) : e, t), We = (e, t = {}) => { let n = C(r, e), i = n && n._f; if (i) { let e = i.refs ? i.refs[0] : i.ref; e.focus && (e.focus(), t.shouldSelect && z(e.select) && e.select()); } }, Ge = (e) => { n = { ...n, ...e }; }, Ke = { control: { register: $, unregister: Ie, getFieldState: be, handleSubmit: Be, setError: je, _subscribe: Pe, _runSchema: F, _focusError: Re, _getWatch: U, _getDirty: V, _setValid: k, _setFieldArray: j, _setDisabledField: Le, _setErrors: te, _getFieldArray: W, _reset: He, _resetDefaultValues: () => z(t.defaultValues) && t.defaultValues().then((e) => { Ue(e, t.resetOptions), y.state.next({ isLoading: !1 }); }), _removeUnmounted: fe, _disableForm: ze, _subjects: y, _proxyFormState: m, get _fields() { return r; }, get _formValues() { return a; }, get _state() { return o; }, set _state(e) { o = e; }, get _defaultValues() { return i; }, get _names() { return s; }, set _names(e) { s = e; }, get _formState() { return n; }, get _options() { return t; }, set _options(e) { t = { ...t, ...e }; } }, subscribe: Fe, trigger: J, register: $, handleSubmit: Be, watch: Q, setValue: q, getValues: Y, reset: Ue, resetField: Ve, clearErrors: Ae, unregister: Ie, setError: je, setFocus: We, getFieldState: be }; return { ...Ke, formControl: Ke }; } function Fe(e = {}) { let n = t.useRef(void 0), r = t.useRef(void 0), [i, a] = t.useState({ isDirty: !1, isValidating: !1, isLoading: z(e.defaultValues), isSubmitted: !1, isSubmitting: !1, isSubmitSuccessful: !1, isValid: !1, submitCount: 0, dirtyFields: {}, touchedFields: {}, validatingFields: {}, errors: e.errors || {}, disabled: e.disabled || !1, isReady: !1, defaultValues: z(e.defaultValues) ? void 0 : e.defaultValues }); if (!n.current) if (e.formControl) n.current = { ...e.formControl, formState: i }, e.defaultValues && !z(e.defaultValues) && e.formControl.reset(e.defaultValues, e.resetOptions); else { let { formControl: t, ...r } = Pe(e); n.current = { ...r, formState: i }; } let o = n.current.control; return o._options = e, M(() => { let e = o._subscribe({ formState: o._proxyFormState, callback: () => a({ ...o._formState }), reRenderRoot: !0 }); return a((e) => ({ ...e, isReady: !0 })), o._formState.isReady = !0, e; }, [o]), t.useEffect(() => o._disableForm(e.disabled), [o, e.disabled]), t.useEffect(() => { e.mode && (o._options.mode = e.mode), e.reValidateMode && (o._options.reValidateMode = e.reValidateMode); }, [ o, e.mode, e.reValidateMode ]), t.useEffect(() => { e.errors && (o._setErrors(e.errors), o._focusError()); }, [o, e.errors]), t.useEffect(() => { e.shouldUnregister && o._subjects.state.next({ values: o._getWatch() }); }, [o, e.shouldUnregister]), t.useEffect(() => { if (o._proxyFormState.isDirty) { let e = o._getDirty(); e !== i.isDirty && o._subjects.state.next({ isDirty: e }); } }, [o, i.isDirty]), t.useEffect(() => { e.values && !L(e.values, r.current) ? (o._reset(e.values, o._options.resetOptions), r.current = e.values, a((e) => ({ ...e }))) : o._resetDefaultValues(); }, [o, e.values]), t.useEffect(() => { o._state.mount || (o._setValid(), o._state.mount = !0), o._state.watch && (o._state.watch = !1, o._subjects.state.next({ ...o._formState })), o._removeUnmounted(); }), n.current.formState = j(i, o), n.current; } //#endregion //#region packages/react/src/_context.tsx var Ie = r({}), Le = ({ config: e }) => { let [t, r] = s(e.start), [a, l] = s([]), { control: u, trigger: d, getValues: f, setValue: p, register: ee, unregister: m, reset: h, watch: g } = Fe({ resolver: async (n) => { let r = e.validations[t].schema; if (r && typeof r.validate == "function") return r.validate(n, { abortEarly: !1 }).then((e) => ({ values: e, errors: {} })).catch((e) => ({ values: {}, errors: (e.inner || []).reduce((e, t) => (e[t.path] = { type: "manual", message: t.message }, e), {}) })); if (r && typeof r.safeParse == "function") { let e = r.safeParse(n); if (e.success) return { values: e.data, errors: {} }; { let t = {}; return (e.error?.errors || []).forEach((e) => { e.path && e.path.length > 0 && (t[e.path.join(".")] = { type: "manual", message: e.message }); }), { values: {}, errors: t }; } } return { values: {}, errors: {} }; }, defaultValues: e.validations[t].defaultValues, mode: "onBlur" }), _ = o(() => { let n = e.validations[t].schema; if (n && typeof n.fields == "object") return Object.keys(n.fields ?? {}); if (n && typeof n._def == "object" && n._def.shape) { let e = n._def, t = typeof e.shape == "function" ? e.shape() : e.shape; return Object.keys(t ?? {}); } return []; }, [t, e.validations]), v = async () => { if (!await d(_)) return; let n = e.orchestration[t]?.next?.(f()); n && (l((e) => [...e, t]), r(n)); }, y = () => { let e = a[a.length - 1]; e && (m(_), r(e), l((e) => e.slice(0, -1))); }, b = async (t) => { t.preventDefault(), await d(_) && e.onSubmit?.(f()); }, x = e.views[t]?.component, S = e.views[t]?.wrapper, C = S ? typeof S == "function" ? S(x) : i(S) ? n(S, {}, x) : x : x; return /* @__PURE__ */ c(Ie.Provider, { value: { navigateToNextStep: v, navigateToPreviousStep: y, registerStepperFields: ee, getStepperFieldValues: f, setStepperFieldValues: p, stepperFieldResetter: h, canNavigateToNextStep: async () => d(_), control: u, watchStepperFieldValues: g }, children: /* @__PURE__ */ c("form", { onSubmit: b, children: C }) }); }, $ = () => a(Ie), Re = (e) => { let { control: t } = $(); return P({ control: t, ...e }); }; //#endregion export { ie as Controller, Le as SmartStepper, P as useController, $ as useSmartStepper, Re as useSmartStepperController };