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
JavaScript
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 };