asterui 0.12.71 → 0.12.72

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.
@@ -1,9 +1,9 @@
1
- import { jsx as t, jsxs as E } from "react/jsx-runtime";
1
+ import { jsx as t, jsxs as L } from "react/jsx-runtime";
2
2
  import { createContext as Fe, useId as ae, useEffect as ie, useRef as O, isValidElement as U, cloneElement as Ne, useContext as ke } from "react";
3
3
  import { useWatch as ce, useForm as de, useFieldArray as Ve, Controller as we } from "react-hook-form";
4
4
  import { useWatch as et } from "react-hook-form";
5
5
  import { useConfig as Ce } from "../providers/ConfigProvider.js";
6
- const Le = "input", Ee = "input-xs", Ae = "input-sm", Se = "input-md", je = "input-lg", ze = "input-xl", Me = "floating-label", Pe = "loading", Re = "loading-spinner", Te = "loading-xs", We = "tooltip", Be = "tooltip-top", le = "validator-hint", G = Fe(void 0), Y = {
6
+ const Ae = "input", Le = "input-xs", Se = "input-sm", Ee = "input-md", je = "input-lg", ze = "input-xl", Me = "floating-label", Pe = "loading", Re = "loading-spinner", Te = "loading-xs", We = "tooltip", _e = "tooltip-top", le = "validator-hint", G = Fe(void 0), Y = {
7
7
  email: {
8
8
  value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
9
9
  message: "Please enter a valid email address"
@@ -23,106 +23,108 @@ function Q() {
23
23
  throw new Error("Form compound components must be used within Form");
24
24
  return i;
25
25
  }
26
- function Ie({
26
+ function Be({
27
27
  form: i,
28
28
  onFinish: a,
29
29
  onFinishFailed: s,
30
30
  initialValues: n,
31
31
  layout: m = "vertical",
32
- labelWidth: p = 60,
32
+ labelWidth: g = 60,
33
33
  size: w,
34
- disabled: y = !1,
34
+ disabled: b = !1,
35
35
  children: d,
36
36
  className: l = "",
37
37
  noValidate: $ = !0,
38
- ...b
38
+ ...F
39
39
  }) {
40
- const { componentSize: F } = Ce(), f = w ?? F ?? "md", z = de({
40
+ const { componentSize: N } = Ce(), f = w ?? N ?? "md", z = de({
41
41
  defaultValues: n
42
- }), N = i || z, I = async (C) => {
43
- if (C.preventDefault(), await N.trigger())
44
- a && a(N.getValues());
42
+ }), v = i || z, I = async (C) => {
43
+ if (C.preventDefault(), v.__submitAttempted = !0, await v.trigger())
44
+ a && a(v.getValues());
45
45
  else if (s) {
46
- const u = N.formState.errors, k = [], M = (P, D = "") => {
46
+ const u = v.formState.errors, k = [], M = (P, D = "") => {
47
47
  for (const R in P) {
48
48
  const T = D ? `${D}.${R}` : R, V = P[R];
49
49
  V?.message ? k.push({ name: T, errors: [V.message] }) : typeof V == "object" && V !== null && M(V, T);
50
50
  }
51
51
  };
52
- M(u), s({ values: N.getValues(), errorFields: k });
52
+ M(u), s({ values: v.getValues(), errorFields: k });
53
53
  }
54
- }, S = (C) => {
55
- C.preventDefault(), N.reset(n);
54
+ }, E = (C) => {
55
+ C.preventDefault(), v.reset(n), v.__submitAttempted = !1;
56
56
  };
57
- return /* @__PURE__ */ t(G.Provider, { value: { form: N, layout: m, labelWidth: p, size: f, disabled: y }, children: /* @__PURE__ */ t("form", { onSubmit: I, onReset: S, className: l, noValidate: $, ...b, children: d }) });
57
+ return /* @__PURE__ */ t(G.Provider, { value: { form: v, layout: m, labelWidth: g, size: f, disabled: b }, children: /* @__PURE__ */ t("form", { onSubmit: I, onReset: E, className: l, noValidate: $, ...F, children: d }) });
58
58
  }
59
- function De({
59
+ function Ie({
60
60
  name: i,
61
61
  label: a,
62
62
  floatingLabel: s,
63
63
  help: n,
64
64
  required: m = !1,
65
- rules: p,
65
+ rules: g,
66
66
  valuePropName: w = "value",
67
- inline: y = !1,
67
+ inline: b = !1,
68
68
  className: d = "",
69
69
  children: l,
70
70
  tooltip: $,
71
- extra: b,
72
- hasFeedback: F = !1,
71
+ extra: F,
72
+ hasFeedback: N = !1,
73
73
  dependencies: f,
74
74
  validateTrigger: z = "onChange",
75
- initialValue: N,
75
+ initialValue: v,
76
76
  hidden: I = !1,
77
- addonBefore: S,
77
+ addonBefore: E,
78
78
  addonAfter: C,
79
- "data-testid": h
79
+ "data-testid": p
80
80
  }) {
81
81
  const { form: u, size: k, listName: M, layout: P, labelWidth: D, disabled: R } = Q(), T = ae(), V = ae();
82
82
  if (!i)
83
- return /* @__PURE__ */ t("div", { className: `${y ? "w-auto" : "w-full"} ${d}`, style: I ? { display: "none" } : void 0, children: l });
84
- let g;
85
- Array.isArray(i) ? g = (M ? [M, ...i] : i).join(".") : g = i, ie(() => {
86
- N !== void 0 && u.getValues(g) === void 0 && u.setValue(g, N);
83
+ return /* @__PURE__ */ t("div", { className: `${b ? "w-auto" : "w-full"} ${d}`, style: I ? { display: "none" } : void 0, children: l });
84
+ let h;
85
+ Array.isArray(i) ? h = (M ? [M, ...i] : i).join(".") : h = i, ie(() => {
86
+ v !== void 0 && u.getValues(h) === void 0 && u.setValue(h, v);
87
87
  }, []);
88
- const X = ce({
88
+ const H = ce({
89
89
  control: u.control,
90
90
  name: f,
91
91
  disabled: !f || f.length === 0
92
- }), H = O(u);
93
- H.current = u;
92
+ }), J = O(u);
93
+ J.current = u;
94
94
  const Z = O(void 0);
95
95
  ie(() => {
96
96
  if (!f || f.length === 0) return;
97
97
  if (Z.current === void 0) {
98
- Z.current = JSON.stringify(X);
98
+ Z.current = JSON.stringify(H);
99
99
  return;
100
100
  }
101
- const e = JSON.stringify(X);
101
+ const e = JSON.stringify(H);
102
102
  if (Z.current !== e) {
103
103
  Z.current = e;
104
- const r = H.current.formState.touchedFields;
105
- g.split(".").reduce((v, K) => v?.[K], r) && H.current.trigger(g);
104
+ const r = J.current.formState.touchedFields;
105
+ h.split(".").reduce((x, K) => x?.[K], r) && J.current.trigger(h);
106
106
  }
107
- }, [X, f, g]);
107
+ }, [H, f, h]);
108
108
  const W = ((e) => {
109
109
  const r = e.split(".");
110
110
  let o = u.formState.errors;
111
- for (const v of r) {
111
+ for (const x of r) {
112
112
  if (!o) break;
113
- o = o[v];
113
+ o = o[x];
114
114
  }
115
115
  return o;
116
- })(g), A = W?.message, me = p ? Array.isArray(p) ? p : [p] : [], J = O(u);
117
- J.current = u;
116
+ })(h), S = W?.message, me = g ? Array.isArray(g) ? g : [g] : [], _ = O(u);
117
+ _.current = u;
118
118
  const fe = {
119
- getFieldValue: (e) => J.current.getValues(e),
120
- getFieldsValue: () => J.current.getValues()
121
- }, he = me.map(
119
+ getFieldValue: (e) => _.current.getValues(e),
120
+ getFieldsValue: () => _.current.getValues(),
121
+ isSubmitted: () => _.current.formState.isSubmitted,
122
+ isSubmitAttempted: () => !!_.current.__submitAttempted
123
+ }, pe = me.map(
122
124
  (e) => typeof e == "function" ? e(fe) : e
123
- ), j = {}, q = [], _ = [];
125
+ ), j = {}, q = [], X = [];
124
126
  m && (j.required = "This field is required");
125
- for (const e of he) {
127
+ for (const e of pe) {
126
128
  if (e.required && (j.required = typeof e.required == "string" ? e.required : e.message || "This field is required"), e.type && Y[e.type] && q.push({
127
129
  pattern: Y[e.type].value,
128
130
  message: e.message || Y[e.type].message
@@ -138,136 +140,136 @@ function De({
138
140
  const r = e.pattern instanceof RegExp ? e.pattern : e.pattern.value, o = e.pattern instanceof RegExp ? e.message || "Invalid format" : e.pattern.message;
139
141
  q.push({ pattern: r, message: o });
140
142
  }
141
- if (e.validate && _.push(e.validate), e.validator) {
143
+ if (e.validate && X.push(e.validate), e.validator) {
142
144
  const r = e.validator;
143
- _.push(async (o) => {
145
+ X.push(async (o) => {
144
146
  try {
145
147
  return await r(e, o), !0;
146
- } catch (v) {
147
- return v instanceof Error ? v.message : String(v);
148
+ } catch (x) {
149
+ return x instanceof Error ? x.message : String(x);
148
150
  }
149
151
  });
150
152
  }
151
153
  }
152
- (q.length > 0 || _.length > 0) && (j.validate = async (e) => {
154
+ (q.length > 0 || X.length > 0) && (j.validate = async (e) => {
153
155
  for (const { pattern: r, message: o } of q)
154
156
  if (e && !r.test(e))
155
157
  return o;
156
- for (const r of _) {
158
+ for (const r of X) {
157
159
  const o = await r(e);
158
160
  if (o !== !0)
159
161
  return o;
160
162
  }
161
163
  return !0;
162
164
  });
163
- const ee = Array.isArray(z) ? z : [z], te = ee.includes("onChange"), ge = ee.includes("onBlur"), pe = ({ hasError: e, isValidating: r }) => r ? /* @__PURE__ */ t("span", { className: `${Pe} ${Re} ${Te} text-base-content/50` }) : e ? /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-error", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) : /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-success", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }), ve = () => /* @__PURE__ */ t("div", { className: `${We} ${Be} ml-1`, "data-tip": $, children: /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-base-content/50 cursor-help", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }) });
165
+ const ee = Array.isArray(z) ? z : [z], te = ee.includes("onChange"), he = ee.includes("onBlur"), ge = ({ hasError: e, isValidating: r }) => r ? /* @__PURE__ */ t("span", { className: `${Pe} ${Re} ${Te} text-base-content/50` }) : e ? /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-error", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) : /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-success", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }), ve = () => /* @__PURE__ */ t("div", { className: `${We} ${_e} ml-1`, "data-tip": $, children: /* @__PURE__ */ t("svg", { className: "w-4 h-4 text-base-content/50 cursor-help", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }) });
164
166
  return /* @__PURE__ */ t(
165
167
  we,
166
168
  {
167
- name: g,
169
+ name: h,
168
170
  control: u.control,
169
171
  rules: j,
170
172
  render: ({ field: e, fieldState: r }) => {
171
- const { value: o, onChange: v, onBlur: K, ref: xe } = e, ye = r.isTouched && u.formState.isValidating, x = {
173
+ const { value: o, onChange: x, onBlur: K, ref: xe } = e, ye = r.isTouched && u.formState.isValidating, y = {
172
174
  id: T,
173
175
  ref: xe,
174
176
  "aria-invalid": W ? !0 : void 0,
175
177
  "aria-describedby": W ? V : void 0,
176
- "data-testid": h ? `${h}-input` : void 0
178
+ "data-testid": p ? `${p}-input` : void 0
177
179
  };
178
- x.onBlur = () => {
179
- K(), ge && u.trigger(g);
180
+ y.onBlur = () => {
181
+ K(), he && u.trigger(h);
180
182
  };
181
183
  const se = U(l) ? l.props.onChange : void 0;
182
- w === "checked" ? (x.checked = o, x.onChange = (c) => {
183
- v(c.target.checked), te && u.trigger(g), se?.(c);
184
- }) : (x.value = o ?? "", x.onChange = (c) => {
184
+ w === "checked" ? (y.checked = o, y.onChange = (c) => {
185
+ x(c.target.checked), te && u.trigger(h), se?.(c);
186
+ }) : (y.value = o ?? "", y.onChange = (c) => {
185
187
  if (c && c.target !== void 0) {
186
188
  const B = c.target.value ?? c.currentTarget?.value;
187
- v(B ?? c);
189
+ x(B ?? c);
188
190
  } else
189
- v(c);
190
- te && u.trigger(g), se?.(c);
191
- }), k && U(l) && (l.props.size || (x.size = k)), W && (x.color = "error", x["aria-invalid"] = !0), R && (x.disabled = !0), (S || C) && (x.unstyled = !0);
192
- const re = U(l) ? Ne(l, x) : l, L = P === "horizontal", ne = P === "inline", oe = {
193
- xs: Ee,
194
- sm: Ae,
195
- md: Se,
191
+ x(c);
192
+ te && u.trigger(h), se?.(c);
193
+ }), k && U(l) && (l.props.size || (y.size = k)), W && (y.color = "error", y["aria-invalid"] = !0), R && (y.disabled = !0), (E || C) && (y.unstyled = !0);
194
+ const re = U(l) ? Ne(l, y) : l, A = P === "horizontal", ne = P === "inline", oe = {
195
+ xs: Le,
196
+ sm: Se,
197
+ md: Ee,
196
198
  lg: je,
197
199
  xl: ze
198
- }, $e = () => {
199
- const c = /* @__PURE__ */ E("div", { className: `${L ? "flex-1" : ""} ${F ? "relative" : ""}`, children: [
200
+ }, be = () => {
201
+ const c = /* @__PURE__ */ L("div", { className: `${A ? "flex-1" : ""} ${N ? "relative" : ""}`, children: [
200
202
  re,
201
- F && r.isTouched && /* @__PURE__ */ t("span", { className: "absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none", children: /* @__PURE__ */ t(pe, { hasError: !!W, isValidating: ye }) })
203
+ N && r.isTouched && /* @__PURE__ */ t("span", { className: "absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none", children: /* @__PURE__ */ t(ge, { hasError: !!W, isValidating: ye }) })
202
204
  ] });
203
205
  if (s) {
204
206
  const B = [
205
207
  Me,
206
208
  k && oe[k]
207
209
  ].filter(Boolean).join(" ");
208
- return /* @__PURE__ */ E("label", { className: B, children: [
210
+ return /* @__PURE__ */ L("label", { className: B, children: [
209
211
  re,
210
- /* @__PURE__ */ E("span", { children: [
212
+ /* @__PURE__ */ L("span", { children: [
211
213
  s,
212
214
  m && /* @__PURE__ */ t("span", { className: "text-error ml-1", children: "*" })
213
215
  ] })
214
216
  ] });
215
217
  }
216
218
  return c;
217
- }, be = (c) => {
218
- if (!S && !C) return c;
219
+ }, $e = (c) => {
220
+ if (!E && !C) return c;
219
221
  const B = [
220
- Le,
222
+ Ae,
221
223
  "flex",
222
224
  "items-center",
223
225
  "gap-2",
224
226
  k && oe[k]
225
227
  ].filter(Boolean).join(" ");
226
- return /* @__PURE__ */ E("label", { className: B, children: [
227
- S && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: S }),
228
+ return /* @__PURE__ */ L("label", { className: B, children: [
229
+ E && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: E }),
228
230
  c,
229
231
  C && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: C })
230
232
  ] });
231
233
  };
232
- return /* @__PURE__ */ E("div", { className: `${y ? "w-auto" : "w-full"} ${L ? "mb-4" : ""} ${ne ? "inline-flex mr-4" : ""} ${d}`, style: I ? { display: "none" } : void 0, "data-testid": h, children: [
233
- /* @__PURE__ */ E("div", { className: L ? "flex items-center gap-4" : "", children: [
234
+ return /* @__PURE__ */ L("div", { className: `${b ? "w-auto" : "w-full"} ${A ? "mb-4" : ""} ${ne ? "inline-flex mr-4" : ""} ${d}`, style: I ? { display: "none" } : void 0, "data-testid": p, children: [
235
+ /* @__PURE__ */ L("div", { className: A ? "flex items-center gap-4" : "", children: [
234
236
  a && !s && /* @__PURE__ */ t(
235
237
  "label",
236
238
  {
237
239
  htmlFor: T,
238
- className: `block text-sm font-medium ${L ? "flex-shrink-0 text-right" : ""} ${!L && !ne ? "mb-1" : ""}`,
239
- style: L ? { width: D } : void 0,
240
- "data-testid": h ? `${h}-label` : void 0,
241
- children: /* @__PURE__ */ E("span", { className: "flex items-center", children: [
240
+ className: `block text-sm font-medium ${A ? "flex-shrink-0 text-right" : ""} ${!A && !ne ? "mb-1" : ""}`,
241
+ style: A ? { width: D } : void 0,
242
+ "data-testid": p ? `${p}-label` : void 0,
243
+ children: /* @__PURE__ */ L("span", { className: "flex items-center", children: [
242
244
  a,
243
245
  m && /* @__PURE__ */ t("span", { className: "text-error ml-1", children: "*" }),
244
246
  $ && /* @__PURE__ */ t(ve, {})
245
247
  ] })
246
248
  }
247
249
  ),
248
- be($e())
250
+ $e(be())
249
251
  ] }),
250
- !L && !y && /* @__PURE__ */ t("p", { id: V, className: `${le} ${A ? "!visible text-error" : ""} min-h-[1.25rem]`, role: A ? "alert" : void 0, "data-testid": h ? `${h}-error` : void 0, children: A || n && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: n }) || " " }),
251
- L && (A || n) && /* @__PURE__ */ t("p", { id: V, className: `${le} ${A ? "!visible text-error" : ""} min-h-[1.25rem]`, role: A ? "alert" : void 0, "data-testid": h ? `${h}-error` : void 0, children: A || n && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: n }) }),
252
- b && /* @__PURE__ */ t("div", { className: "text-sm text-base-content/60 mt-1", "data-testid": h ? `${h}-extra` : void 0, children: b })
252
+ !A && !b && /* @__PURE__ */ t("p", { id: V, className: `${le} ${S ? "!visible text-error" : ""} min-h-[1.25rem]`, role: S ? "alert" : void 0, "data-testid": p ? `${p}-error` : void 0, children: S || n && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: n }) || " " }),
253
+ A && (S || n) && /* @__PURE__ */ t("p", { id: V, className: `${le} ${S ? "!visible text-error" : ""} min-h-[1.25rem]`, role: S ? "alert" : void 0, "data-testid": p ? `${p}-error` : void 0, children: S || n && /* @__PURE__ */ t("span", { className: "text-base-content/70", children: n }) }),
254
+ F && /* @__PURE__ */ t("div", { className: "text-sm text-base-content/60 mt-1", "data-testid": p ? `${p}-extra` : void 0, children: F })
253
255
  ] });
254
256
  }
255
257
  }
256
258
  );
257
259
  }
258
- function Ze({
260
+ function De({
259
261
  name: i,
260
262
  children: a
261
263
  }) {
262
- const { form: s, layout: n, size: m, disabled: p } = Q(), { fields: w, append: y, remove: d, move: l } = Ve({
264
+ const { form: s, layout: n, size: m, disabled: g } = Q(), { fields: w, append: b, remove: d, move: l } = Ve({
263
265
  control: s.control,
264
266
  name: i
265
- }), $ = w.map((b, F) => ({
266
- ...b,
267
- name: F
267
+ }), $ = w.map((F, N) => ({
268
+ ...F,
269
+ name: N
268
270
  }));
269
- return /* @__PURE__ */ t(G.Provider, { value: { form: s, layout: n, size: m, listName: i, disabled: p }, children: a($, {
270
- add: y,
271
+ return /* @__PURE__ */ t(G.Provider, { value: { form: s, layout: n, size: m, listName: i, disabled: g }, children: a($, {
272
+ add: b,
271
273
  remove: d,
272
274
  move: l
273
275
  }) });
@@ -280,24 +282,24 @@ function ue(i) {
280
282
  });
281
283
  }, s.validateFields = a.trigger, s.resetFields = a.reset, s.isFieldTouched = (n) => !!a.formState.touchedFields[n], s.getFieldError = (n) => a.formState.errors[n]?.message, s;
282
284
  }
283
- function qe({ fields: i, className: a = "", "data-testid": s }) {
284
- const { form: n } = Q(), { errors: m } = n.formState, p = (d, l = "") => {
285
+ function Ze({ fields: i, className: a = "", "data-testid": s }) {
286
+ const { form: n } = Q(), { errors: m } = n.formState, g = (d, l = "") => {
285
287
  const $ = [];
286
- for (const b in d) {
287
- const F = l ? `${l}.${b}` : b, f = d[b];
288
- f?.message ? $.push({ field: F, message: f.message }) : typeof f == "object" && f !== null && $.push(...p(f, F));
288
+ for (const F in d) {
289
+ const N = l ? `${l}.${F}` : F, f = d[F];
290
+ f?.message ? $.push({ field: N, message: f.message }) : typeof f == "object" && f !== null && $.push(...g(f, N));
289
291
  }
290
292
  return $;
291
- }, w = p(m), y = i ? w.filter((d) => i.includes(d.field)) : w;
292
- return y.length === 0 ? null : /* @__PURE__ */ t("ul", { className: `text-error text-sm space-y-1 ${a}`, role: "alert", "data-testid": s, children: y.map((d, l) => /* @__PURE__ */ E("li", { className: "flex items-start gap-2", "data-testid": s ? `${s}-${d.field}` : void 0, children: [
293
+ }, w = g(m), b = i ? w.filter((d) => i.includes(d.field)) : w;
294
+ return b.length === 0 ? null : /* @__PURE__ */ t("ul", { className: `text-error text-sm space-y-1 ${a}`, role: "alert", "data-testid": s, children: b.map((d, l) => /* @__PURE__ */ L("li", { className: "flex items-start gap-2", "data-testid": s ? `${s}-${d.field}` : void 0, children: [
293
295
  /* @__PURE__ */ t("svg", { className: "w-4 h-4 mt-0.5 flex-shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }),
294
296
  /* @__PURE__ */ t("span", { children: d.message })
295
297
  ] }, `${d.field}-${l}`)) });
296
298
  }
297
- const Ue = Object.assign(Ie, {
298
- Item: De,
299
- List: Ze,
300
- ErrorList: qe,
299
+ const Ue = Object.assign(Be, {
300
+ Item: Ie,
301
+ List: De,
302
+ ErrorList: Ze,
301
303
  useForm: ue,
302
304
  useWatch: ce
303
305
  }), Ye = ue;
@@ -1 +1 @@
1
- {"version":3,"file":"Form.js","sources":["../../src/components/Form.tsx"],"sourcesContent":["import React, { createContext, useContext, cloneElement, isValidElement, useId, useEffect, useRef } from 'react'\nimport { useForm as rhfUseForm, UseFormReturn, FieldValues, SubmitHandler, UseFormProps, Controller, useFieldArray, FieldArrayPath, FieldArray, useWatch } from 'react-hook-form'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputMd = 'input-md'\nconst dInputLg = 'input-lg'\nconst dInputXl = 'input-xl'\nconst dFloatingLabel = 'floating-label'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingXs = 'loading-xs'\nconst dTooltip = 'tooltip'\nconst dTooltipTop = 'tooltip-top'\nconst dValidatorHint = 'validator-hint'\n\ninterface FormContextValue {\n form: UseFormReturn<any>\n layout?: 'vertical' | 'horizontal' | 'inline'\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n labelWidth?: number\n listName?: string\n disabled?: boolean\n}\n\nconst FormContext = createContext<FormContextValue | undefined>(undefined)\n\n// Built-in type validators\nconst TYPE_VALIDATORS = {\n email: {\n value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i,\n message: 'Please enter a valid email address',\n },\n url: {\n value: /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/,\n message: 'Please enter a valid URL',\n },\n number: {\n value: /^-?\\d+(\\.\\d+)?$/,\n message: 'Please enter a valid number',\n },\n}\n\nexport interface FormProps<TFieldValues extends FieldValues = FieldValues>\n extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onSubmit'> {\n form?: UseFormReturn<TFieldValues>\n onFinish?: SubmitHandler<TFieldValues>\n /** Called when form validation fails */\n onFinishFailed?: (errorInfo: { values: TFieldValues; errorFields: Array<{ name: string; errors: string[] }> }) => void\n initialValues?: UseFormProps<TFieldValues>['defaultValues']\n layout?: 'vertical' | 'horizontal' | 'inline'\n /** Label width in pixels for horizontal layout (default: 80) */\n labelWidth?: number\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Disable all form fields */\n disabled?: boolean\n children: React.ReactNode\n /** Test ID for the form element */\n 'data-testid'?: string\n}\n\nexport interface FormRule {\n required?: boolean | string\n type?: 'email' | 'url' | 'number'\n min?: number | { value: number; message: string }\n max?: number | { value: number; message: string }\n pattern?: RegExp | { value: RegExp; message: string }\n message?: string\n validate?: (value: any) => boolean | string | Promise<boolean | string>\n /** Ant Design style validator (for compatibility) */\n validator?: (rule: any, value: any) => Promise<void>\n}\n\n/** Form methods passed to rule functions (Ant Design style) */\nexport interface FormRuleMethods {\n getFieldValue: (name: string) => any\n getFieldsValue: () => any\n}\n\n/** A rule can be an object or a function that returns a rule object */\nexport type FormRuleInput = FormRule | ((methods: FormRuleMethods) => FormRule)\n\nexport type ValidateTrigger = 'onChange' | 'onBlur' | 'onSubmit' | ('onChange' | 'onBlur' | 'onSubmit')[]\n\nexport interface FormItemProps {\n name?: string | string[]\n label?: string\n /** Floating label text (alternative to label, uses DaisyUI floating-label) */\n floatingLabel?: string\n help?: string\n required?: boolean\n rules?: FormRuleInput | FormRuleInput[]\n valuePropName?: string\n inline?: boolean\n className?: string\n children: React.ReactElement\n /** Tooltip text to show next to label */\n tooltip?: string\n /** Additional content below the form control */\n extra?: React.ReactNode\n /** Show validation feedback icon */\n hasFeedback?: boolean\n /** Field names that this field depends on for validation */\n dependencies?: string[]\n /** When to trigger validation */\n validateTrigger?: ValidateTrigger\n /** Initial value for this field (overrides Form's initialValues) */\n initialValue?: any\n /** Hide this field (still validates and submits) */\n hidden?: boolean\n /** Text/element before input (outside, using DaisyUI label) */\n addonBefore?: React.ReactNode\n /** Text/element after input (outside, using DaisyUI label) */\n addonAfter?: React.ReactNode\n /** Test ID for the form item (used as prefix for child elements) */\n 'data-testid'?: string\n}\n\nexport interface FormListProps<TFieldValues extends FieldValues = FieldValues> {\n name: FieldArrayPath<TFieldValues>\n children: (\n fields: FieldArray<TFieldValues>[],\n operations: {\n add: (value?: any) => void\n remove: (index: number) => void\n move: (from: number, to: number) => void\n }\n ) => React.ReactNode\n}\n\nfunction useFormContext() {\n const context = useContext(FormContext)\n if (!context) {\n throw new Error('Form compound components must be used within Form')\n }\n return context\n}\n\nfunction FormRoot<TFieldValues extends FieldValues = FieldValues>({\n form: externalForm,\n onFinish,\n onFinishFailed,\n initialValues,\n layout = 'vertical',\n labelWidth = 60,\n size,\n disabled = false,\n children,\n className = '',\n noValidate = true,\n ...props\n}: FormProps<TFieldValues>) {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const internalForm = rhfUseForm<TFieldValues>({\n defaultValues: initialValues,\n })\n\n const form = externalForm || internalForm\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n\n // Trigger validation\n const isValid = await form.trigger()\n\n if (isValid) {\n if (onFinish) {\n onFinish(form.getValues())\n }\n } else {\n if (onFinishFailed) {\n const errors = form.formState.errors\n const errorFields: Array<{ name: string; errors: string[] }> = []\n\n // Flatten errors into errorFields array\n const flattenErrors = (obj: any, prefix = '') => {\n for (const key in obj) {\n const fullKey = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n if (value?.message) {\n errorFields.push({ name: fullKey, errors: [value.message as string] })\n } else if (typeof value === 'object' && value !== null) {\n flattenErrors(value, fullKey)\n }\n }\n }\n flattenErrors(errors)\n\n onFinishFailed({ values: form.getValues(), errorFields })\n }\n }\n }\n\n const handleReset = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n form.reset(initialValues as any)\n }\n\n return (\n <FormContext.Provider value={{ form, layout, labelWidth, size: effectiveSize, disabled }}>\n <form onSubmit={handleSubmit} onReset={handleReset} className={className} noValidate={noValidate} {...props}>\n {children}\n </form>\n </FormContext.Provider>\n )\n}\n\nfunction FormItem({\n name,\n label,\n floatingLabel,\n help,\n required = false,\n rules,\n valuePropName = 'value',\n inline = false,\n className = '',\n children,\n tooltip,\n extra,\n hasFeedback = false,\n dependencies,\n validateTrigger = 'onChange',\n initialValue,\n hidden = false,\n addonBefore,\n addonAfter,\n 'data-testid': testId,\n}: FormItemProps) {\n const { form, size, listName, layout, labelWidth, disabled: formDisabled } = useFormContext()\n const inputId = useId()\n const errorId = useId()\n\n if (!name) {\n // Render without form control if no name provided\n return <div className={`${inline ? 'w-auto' : 'w-full'} ${className}`} style={hidden ? { display: 'none' } : undefined}>{children}</div>\n }\n\n // Handle nested field names (for Form.List)\n let fieldName: string\n if (Array.isArray(name)) {\n // If we're inside a Form.List, prepend the list name\n const fullPath = listName ? [listName, ...name] : name\n fieldName = fullPath.join('.')\n } else {\n fieldName = name\n }\n\n // Set initial value if provided\n useEffect(() => {\n if (initialValue !== undefined) {\n const currentValue = form.getValues(fieldName as any)\n if (currentValue === undefined) {\n form.setValue(fieldName as any, initialValue)\n }\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Watch dependencies and re-validate when they change\n const watchedDeps = useWatch({\n control: form.control,\n name: dependencies as any,\n disabled: !dependencies || dependencies.length === 0,\n })\n\n // Use refs to avoid infinite loops\n const formRef = useRef(form)\n formRef.current = form\n const prevDepsRef = useRef<string | undefined>(undefined)\n\n useEffect(() => {\n // Skip if no dependencies\n if (!dependencies || dependencies.length === 0) return\n\n // Skip initial render\n if (prevDepsRef.current === undefined) {\n prevDepsRef.current = JSON.stringify(watchedDeps)\n return\n }\n\n // Only trigger if dependency values actually changed\n const currentDeps = JSON.stringify(watchedDeps)\n if (prevDepsRef.current !== currentDeps) {\n prevDepsRef.current = currentDeps\n // Only re-validate if this field has been touched\n const touchedFields = formRef.current.formState.touchedFields as any\n const isTouched = fieldName.split('.').reduce((obj, key) => obj?.[key], touchedFields)\n if (isTouched) {\n formRef.current.trigger(fieldName as any)\n }\n }\n }, [watchedDeps, dependencies, fieldName])\n\n // Get error by traversing the error object path\n const getErrorByPath = (path: string) => {\n const keys = path.split('.')\n let error: any = form.formState.errors\n for (const key of keys) {\n if (!error) break\n error = error[key]\n }\n return error\n }\n\n const error = getErrorByPath(fieldName)\n const errorMessage = error?.message as string | undefined\n\n // Normalize rules to array\n const rulesInputArray: FormRuleInput[] = rules\n ? Array.isArray(rules) ? rules : [rules]\n : []\n\n // Store form ref for use in validators (to get fresh values at validation time)\n const validatorFormRef = useRef(form)\n validatorFormRef.current = form\n\n // Create form methods for rule functions (Ant Design style)\n // These methods always access current form values via ref\n const formMethods: FormRuleMethods = {\n getFieldValue: (name: string) => validatorFormRef.current.getValues(name as any),\n getFieldsValue: () => validatorFormRef.current.getValues(),\n }\n\n // Resolve function rules to rule objects\n const rulesArray: FormRule[] = rulesInputArray.map(rule =>\n typeof rule === 'function' ? rule(formMethods) : rule\n )\n\n // Build validation rules\n const validationRules: any = {}\n const patternValidators: Array<{ pattern: RegExp; message: string }> = []\n const customValidators: Array<(value: any) => boolean | string | Promise<boolean | string>> = []\n\n // Handle top-level required prop\n if (required) {\n validationRules.required = 'This field is required'\n }\n\n // Process each rule\n for (const rule of rulesArray) {\n // Required\n if (rule.required) {\n validationRules.required = typeof rule.required === 'string'\n ? rule.required\n : rule.message || 'This field is required'\n }\n\n // Type validator\n if (rule.type && TYPE_VALIDATORS[rule.type]) {\n patternValidators.push({\n pattern: TYPE_VALIDATORS[rule.type].value,\n message: rule.message || TYPE_VALIDATORS[rule.type].message,\n })\n }\n\n // Min length\n if (rule.min !== undefined) {\n const minValue = typeof rule.min === 'object' ? rule.min.value : rule.min\n const minMessage = typeof rule.min === 'object'\n ? rule.min.message\n : rule.message || `Minimum length is ${minValue} characters`\n validationRules.minLength = { value: minValue, message: minMessage }\n }\n\n // Max length\n if (rule.max !== undefined) {\n const maxValue = typeof rule.max === 'object' ? rule.max.value : rule.max\n const maxMessage = typeof rule.max === 'object'\n ? rule.max.message\n : rule.message || `Maximum length is ${maxValue} characters`\n validationRules.maxLength = { value: maxValue, message: maxMessage }\n }\n\n // Pattern - collect all patterns\n if (rule.pattern) {\n const patternValue = rule.pattern instanceof RegExp ? rule.pattern : rule.pattern.value\n const patternMessage = rule.pattern instanceof RegExp\n ? rule.message || 'Invalid format'\n : rule.pattern.message\n patternValidators.push({ pattern: patternValue, message: patternMessage })\n }\n\n // Custom validator (our style)\n if (rule.validate) {\n customValidators.push(rule.validate)\n }\n\n // Ant Design style validator\n if (rule.validator) {\n const antValidator = rule.validator\n customValidators.push(async (value: any) => {\n try {\n await antValidator(rule, value)\n return true\n } catch (err) {\n return err instanceof Error ? err.message : String(err)\n }\n })\n }\n }\n\n // Combine all pattern and custom validators into a single validate function\n if (patternValidators.length > 0 || customValidators.length > 0) {\n validationRules.validate = async (value: any) => {\n // Check all patterns (skip if empty - required rule handles that)\n for (const { pattern, message } of patternValidators) {\n if (value && !pattern.test(value)) {\n return message\n }\n }\n\n // Run all custom validators (always run - they may validate empty/false values)\n for (const validator of customValidators) {\n const result = await validator(value)\n if (result !== true) {\n return result\n }\n }\n\n return true\n }\n }\n\n // Normalize validateTrigger to array\n const triggers = Array.isArray(validateTrigger) ? validateTrigger : [validateTrigger]\n const shouldValidateOnChange = triggers.includes('onChange')\n const shouldValidateOnBlur = triggers.includes('onBlur')\n\n // Feedback icons\n const FeedbackIcon = ({ hasError, isValidating }: { hasError: boolean; isValidating: boolean }) => {\n if (isValidating) {\n return (\n <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingXs} text-base-content/50`} />\n )\n }\n if (hasError) {\n return (\n <svg className=\"w-4 h-4 text-error\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n }\n return (\n <svg className=\"w-4 h-4 text-success\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n }\n\n // Tooltip icon\n const TooltipIcon = () => (\n <div className={`${dTooltip} ${dTooltipTop} ml-1`} data-tip={tooltip}>\n <svg className=\"w-4 h-4 text-base-content/50 cursor-help\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </div>\n )\n\n return (\n <Controller\n name={fieldName}\n control={form.control}\n rules={validationRules}\n render={({ field, fieldState }) => {\n const { value, onChange, onBlur, ref } = field\n const isValidating = fieldState.isTouched && form.formState.isValidating\n\n // Clone the child element and inject form control props\n const childProps: any = {\n id: inputId,\n ref,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': error ? errorId : undefined,\n 'data-testid': testId ? `${testId}-input` : undefined,\n }\n\n // Handle onBlur based on validateTrigger\n childProps.onBlur = () => {\n onBlur()\n if (shouldValidateOnBlur) {\n form.trigger(fieldName as any)\n }\n }\n\n // Get the original onChange from the child element (if any)\n const originalOnChange = isValidElement(children) ? (children.props as any).onChange : undefined\n\n // Handle different value prop names (e.g., 'checked' for checkboxes)\n if (valuePropName === 'checked') {\n childProps.checked = value\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.checked)\n if (shouldValidateOnChange) {\n form.trigger(fieldName as any)\n }\n // Call original onChange if provided\n originalOnChange?.(e)\n }\n } else {\n childProps.value = value ?? ''\n childProps.onChange = (eventOrValue: any) => {\n // Handle components that pass value directly (e.g., Range, Rating)\n // vs components that pass event object (e.g., Input, Select)\n if (eventOrValue && eventOrValue.target !== undefined) {\n const nextValue = eventOrValue.target.value ?? eventOrValue.currentTarget?.value\n onChange(nextValue ?? eventOrValue)\n } else {\n onChange(eventOrValue)\n }\n if (shouldValidateOnChange) {\n form.trigger(fieldName as any)\n }\n // Call original onChange if provided\n originalOnChange?.(eventOrValue)\n }\n }\n\n // Apply size if specified at form level\n if (size && isValidElement(children)) {\n const existingProps = children.props as any\n if (!existingProps.size) {\n childProps.size = size\n }\n }\n\n // Apply error styling and accessibility\n if (error) {\n childProps.color = 'error'\n childProps['aria-invalid'] = true\n }\n\n // Apply form-level disabled state\n if (formDisabled) {\n childProps.disabled = true\n }\n\n // When wrapped with addons, the child input should be unstyled (the wrapper has the styling)\n const hasAddons = addonBefore || addonAfter\n if (hasAddons) {\n childProps.unstyled = true\n }\n\n const enhancedChild = isValidElement(children)\n ? cloneElement(children as React.ReactElement<any>, childProps)\n : children\n\n const isHorizontal = layout === 'horizontal'\n const isInline = layout === 'inline'\n\n // Size class for floating label\n const floatingSizeClasses: Record<string, string> = {\n xs: dInputXs,\n sm: dInputSm,\n md: dInputMd,\n lg: dInputLg,\n xl: dInputXl,\n }\n\n // Build the input element with optional floating label wrapper\n const renderInputElement = () => {\n const inputWithFeedback = (\n <div className={`${isHorizontal ? 'flex-1' : ''} ${hasFeedback ? 'relative' : ''}`}>\n {enhancedChild}\n {hasFeedback && fieldState.isTouched && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none\">\n <FeedbackIcon hasError={!!error} isValidating={isValidating} />\n </span>\n )}\n </div>\n )\n\n // Floating label variant\n if (floatingLabel) {\n const floatingClasses = [\n dFloatingLabel,\n size && floatingSizeClasses[size],\n ].filter(Boolean).join(' ')\n\n return (\n <label className={floatingClasses}>\n {enhancedChild}\n <span>{floatingLabel}{required && <span className=\"text-error ml-1\">*</span>}</span>\n </label>\n )\n }\n\n return inputWithFeedback\n }\n\n // Wrap with external addons if specified using DaisyUI input wrapper pattern\n const renderWithAddons = (input: React.ReactNode) => {\n if (!addonBefore && !addonAfter) return input\n\n const addonClasses = [\n dInput,\n 'flex',\n 'items-center',\n 'gap-2',\n size && floatingSizeClasses[size],\n ].filter(Boolean).join(' ')\n\n return (\n <label className={addonClasses}>\n {addonBefore && <span className=\"text-base-content/70\">{addonBefore}</span>}\n {input}\n {addonAfter && <span className=\"text-base-content/70\">{addonAfter}</span>}\n </label>\n )\n }\n\n return (\n <div className={`${inline ? 'w-auto' : 'w-full'} ${isHorizontal ? 'mb-4' : ''} ${isInline ? 'inline-flex mr-4' : ''} ${className}`} style={hidden ? { display: 'none' } : undefined} data-testid={testId}>\n <div className={isHorizontal ? 'flex items-center gap-4' : ''}>\n {label && !floatingLabel && (\n <label\n htmlFor={inputId}\n className={`block text-sm font-medium ${isHorizontal ? 'flex-shrink-0 text-right' : ''} ${!isHorizontal && !isInline ? 'mb-1' : ''}`}\n style={isHorizontal ? { width: labelWidth } : undefined}\n data-testid={testId ? `${testId}-label` : undefined}\n >\n <span className=\"flex items-center\">\n {label}\n {required && <span className=\"text-error ml-1\">*</span>}\n {tooltip && <TooltipIcon />}\n </span>\n </label>\n )}\n {renderWithAddons(renderInputElement())}\n </div>\n {!isHorizontal && !inline && (\n <p id={errorId} className={`${dValidatorHint} ${errorMessage ? '!visible text-error' : ''} min-h-[1.25rem]`} role={errorMessage ? 'alert' : undefined} data-testid={testId ? `${testId}-error` : undefined}>\n {errorMessage || (help && <span className=\"text-base-content/70\">{help}</span>) || '\\u00A0'}\n </p>\n )}\n {isHorizontal && (errorMessage || help) && (\n <p id={errorId} className={`${dValidatorHint} ${errorMessage ? '!visible text-error' : ''} min-h-[1.25rem]`} role={errorMessage ? 'alert' : undefined} data-testid={testId ? `${testId}-error` : undefined}>\n {errorMessage || (help && <span className=\"text-base-content/70\">{help}</span>)}\n </p>\n )}\n {extra && (\n <div className=\"text-sm text-base-content/60 mt-1\" data-testid={testId ? `${testId}-extra` : undefined}>{extra}</div>\n )}\n </div>\n )\n }}\n />\n )\n}\n\nfunction FormList<TFieldValues extends FieldValues = FieldValues>({\n name,\n children,\n}: FormListProps<TFieldValues>) {\n const { form, layout, size, disabled } = useFormContext()\n\n const { fields, append, remove, move } = useFieldArray({\n control: form.control,\n name,\n })\n\n // Add name (index) to each field for proper path construction\n const fieldsWithName = fields.map((field, index) => ({\n ...field,\n name: index,\n }))\n\n return (\n <FormContext.Provider value={{ form, layout, size, listName: name as string, disabled }}>\n {children(fieldsWithName as any, {\n add: append,\n remove,\n move,\n })}\n </FormContext.Provider>\n )\n}\n\n// Enhanced hook to expose full form API\nexport function useFormInstance<TFieldValues extends FieldValues = FieldValues>(\n options?: UseFormProps<TFieldValues>\n) {\n const formInstance = rhfUseForm<TFieldValues>(options)\n\n // Add convenience methods to the instance\n const enhancedInstance = formInstance as typeof formInstance & {\n setFieldValue: typeof formInstance.setValue\n getFieldValue: (name: any) => any\n getFieldsValue: typeof formInstance.getValues\n setFieldsValue: (values: any) => void\n validateFields: typeof formInstance.trigger\n resetFields: typeof formInstance.reset\n isFieldTouched: (name: string) => boolean\n getFieldError: (name: string) => string | undefined\n }\n\n // Add the alias methods\n enhancedInstance.setFieldValue = formInstance.setValue\n enhancedInstance.getFieldValue = (name: any) => formInstance.getValues(name)\n enhancedInstance.getFieldsValue = formInstance.getValues\n enhancedInstance.setFieldsValue = (values: any) => {\n Object.keys(values).forEach((key) => {\n formInstance.setValue(key as any, values[key])\n })\n }\n enhancedInstance.validateFields = formInstance.trigger\n enhancedInstance.resetFields = formInstance.reset\n enhancedInstance.isFieldTouched = (name: string) => {\n const touched = formInstance.formState.touchedFields as any\n return !!touched[name]\n }\n enhancedInstance.getFieldError = (name: string) => {\n const errors = formInstance.formState.errors as any\n return errors[name]?.message as string | undefined\n }\n\n return enhancedInstance\n}\n\nexport interface FormErrorListProps {\n /** Specific field names to show errors for (shows all errors if not specified) */\n fields?: string[]\n /** Custom className */\n className?: string\n /** Test ID for the error list */\n 'data-testid'?: string\n}\n\nfunction FormErrorList({ fields, className = '', 'data-testid': testId }: FormErrorListProps) {\n const { form } = useFormContext()\n const { errors } = form.formState\n\n // Flatten nested errors into a list\n const flattenErrors = (obj: any, prefix = ''): Array<{ field: string; message: string }> => {\n const result: Array<{ field: string; message: string }> = []\n\n for (const key in obj) {\n const fullKey = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n\n if (value?.message) {\n result.push({ field: fullKey, message: value.message as string })\n } else if (typeof value === 'object' && value !== null) {\n result.push(...flattenErrors(value, fullKey))\n }\n }\n\n return result\n }\n\n const allErrors = flattenErrors(errors)\n const filteredErrors = fields\n ? allErrors.filter(e => fields.includes(e.field))\n : allErrors\n\n if (filteredErrors.length === 0) {\n return null\n }\n\n return (\n <ul className={`text-error text-sm space-y-1 ${className}`} role=\"alert\" data-testid={testId}>\n {filteredErrors.map((error, index) => (\n <li key={`${error.field}-${index}`} className=\"flex items-start gap-2\" data-testid={testId ? `${testId}-${error.field}` : undefined}>\n <svg className=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>{error.message}</span>\n </li>\n ))}\n </ul>\n )\n}\n\nexport const Form = Object.assign(FormRoot, {\n Item: FormItem,\n List: FormList,\n ErrorList: FormErrorList,\n useForm: useFormInstance,\n useWatch,\n})\n\nexport const useForm = useFormInstance\nexport { useWatch }\n\nexport type { UseFormReturn as FormInstance }\n"],"names":["dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dFloatingLabel","dLoading","dLoadingSpinner","dLoadingXs","dTooltip","dTooltipTop","dValidatorHint","FormContext","createContext","TYPE_VALIDATORS","useFormContext","context","useContext","FormRoot","externalForm","onFinish","onFinishFailed","initialValues","layout","labelWidth","size","disabled","children","className","noValidate","props","componentSize","useConfig","effectiveSize","internalForm","rhfUseForm","form","handleSubmit","e","errors","errorFields","flattenErrors","obj","prefix","key","fullKey","value","handleReset","jsx","FormItem","name","label","floatingLabel","help","required","rules","valuePropName","inline","tooltip","extra","hasFeedback","dependencies","validateTrigger","initialValue","hidden","addonBefore","addonAfter","testId","listName","formDisabled","inputId","useId","errorId","fieldName","useEffect","watchedDeps","useWatch","formRef","useRef","prevDepsRef","currentDeps","touchedFields","error","path","keys","errorMessage","rulesInputArray","validatorFormRef","formMethods","rulesArray","rule","validationRules","patternValidators","customValidators","minValue","minMessage","maxValue","maxMessage","patternValue","patternMessage","antValidator","err","pattern","message","validator","result","triggers","shouldValidateOnChange","shouldValidateOnBlur","FeedbackIcon","hasError","isValidating","TooltipIcon","Controller","field","fieldState","onChange","onBlur","ref","childProps","originalOnChange","isValidElement","eventOrValue","nextValue","enhancedChild","cloneElement","isHorizontal","isInline","floatingSizeClasses","renderInputElement","inputWithFeedback","jsxs","floatingClasses","renderWithAddons","input","addonClasses","FormList","fields","append","remove","move","useFieldArray","fieldsWithName","index","useFormInstance","options","formInstance","enhancedInstance","values","FormErrorList","allErrors","filteredErrors","Form","useForm"],"mappings":"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"}
1
+ {"version":3,"file":"Form.js","sources":["../../src/components/Form.tsx"],"sourcesContent":["import React, { createContext, useContext, cloneElement, isValidElement, useId, useEffect, useRef } from 'react'\nimport { useForm as rhfUseForm, UseFormReturn, FieldValues, SubmitHandler, UseFormProps, Controller, useFieldArray, FieldArrayPath, FieldArray, useWatch } from 'react-hook-form'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputMd = 'input-md'\nconst dInputLg = 'input-lg'\nconst dInputXl = 'input-xl'\nconst dFloatingLabel = 'floating-label'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingXs = 'loading-xs'\nconst dTooltip = 'tooltip'\nconst dTooltipTop = 'tooltip-top'\nconst dValidatorHint = 'validator-hint'\n\ninterface FormContextValue {\n form: UseFormReturn<any>\n layout?: 'vertical' | 'horizontal' | 'inline'\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n labelWidth?: number\n listName?: string\n disabled?: boolean\n}\n\nconst FormContext = createContext<FormContextValue | undefined>(undefined)\n\n// Built-in type validators\nconst TYPE_VALIDATORS = {\n email: {\n value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i,\n message: 'Please enter a valid email address',\n },\n url: {\n value: /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/,\n message: 'Please enter a valid URL',\n },\n number: {\n value: /^-?\\d+(\\.\\d+)?$/,\n message: 'Please enter a valid number',\n },\n}\n\nexport interface FormProps<TFieldValues extends FieldValues = FieldValues>\n extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onSubmit'> {\n form?: UseFormReturn<TFieldValues>\n onFinish?: SubmitHandler<TFieldValues>\n /** Called when form validation fails */\n onFinishFailed?: (errorInfo: { values: TFieldValues; errorFields: Array<{ name: string; errors: string[] }> }) => void\n initialValues?: UseFormProps<TFieldValues>['defaultValues']\n layout?: 'vertical' | 'horizontal' | 'inline'\n /** Label width in pixels for horizontal layout (default: 80) */\n labelWidth?: number\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Disable all form fields */\n disabled?: boolean\n children: React.ReactNode\n /** Test ID for the form element */\n 'data-testid'?: string\n}\n\nexport interface FormRule {\n required?: boolean | string\n type?: 'email' | 'url' | 'number'\n min?: number | { value: number; message: string }\n max?: number | { value: number; message: string }\n pattern?: RegExp | { value: RegExp; message: string }\n message?: string\n validate?: (value: any) => boolean | string | Promise<boolean | string>\n /** Ant Design style validator (for compatibility) */\n validator?: (rule: any, value: any) => Promise<void>\n}\n\n/** Form methods passed to rule functions (Ant Design style) */\nexport interface FormRuleMethods {\n getFieldValue: (name: string) => any\n getFieldsValue: () => any\n isSubmitted: () => boolean\n isSubmitAttempted: () => boolean\n}\n\n/** A rule can be an object or a function that returns a rule object */\nexport type FormRuleInput = FormRule | ((methods: FormRuleMethods) => FormRule)\n\nexport type ValidateTrigger = 'onChange' | 'onBlur' | 'onSubmit' | ('onChange' | 'onBlur' | 'onSubmit')[]\n\nexport interface FormItemProps {\n name?: string | string[]\n label?: string\n /** Floating label text (alternative to label, uses DaisyUI floating-label) */\n floatingLabel?: string\n help?: string\n required?: boolean\n rules?: FormRuleInput | FormRuleInput[]\n valuePropName?: string\n inline?: boolean\n className?: string\n children: React.ReactElement\n /** Tooltip text to show next to label */\n tooltip?: string\n /** Additional content below the form control */\n extra?: React.ReactNode\n /** Show validation feedback icon */\n hasFeedback?: boolean\n /** Field names that this field depends on for validation */\n dependencies?: string[]\n /** When to trigger validation */\n validateTrigger?: ValidateTrigger\n /** Initial value for this field (overrides Form's initialValues) */\n initialValue?: any\n /** Hide this field (still validates and submits) */\n hidden?: boolean\n /** Text/element before input (outside, using DaisyUI label) */\n addonBefore?: React.ReactNode\n /** Text/element after input (outside, using DaisyUI label) */\n addonAfter?: React.ReactNode\n /** Test ID for the form item (used as prefix for child elements) */\n 'data-testid'?: string\n}\n\nexport interface FormListProps<TFieldValues extends FieldValues = FieldValues> {\n name: FieldArrayPath<TFieldValues>\n children: (\n fields: FieldArray<TFieldValues>[],\n operations: {\n add: (value?: any) => void\n remove: (index: number) => void\n move: (from: number, to: number) => void\n }\n ) => React.ReactNode\n}\n\nfunction useFormContext() {\n const context = useContext(FormContext)\n if (!context) {\n throw new Error('Form compound components must be used within Form')\n }\n return context\n}\n\nfunction FormRoot<TFieldValues extends FieldValues = FieldValues>({\n form: externalForm,\n onFinish,\n onFinishFailed,\n initialValues,\n layout = 'vertical',\n labelWidth = 60,\n size,\n disabled = false,\n children,\n className = '',\n noValidate = true,\n ...props\n}: FormProps<TFieldValues>) {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const internalForm = rhfUseForm<TFieldValues>({\n defaultValues: initialValues,\n })\n\n const form = externalForm || internalForm\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n\n ;(form as any).__submitAttempted = true\n // Trigger validation\n const isValid = await form.trigger()\n\n if (isValid) {\n if (onFinish) {\n onFinish(form.getValues())\n }\n } else {\n if (onFinishFailed) {\n const errors = form.formState.errors\n const errorFields: Array<{ name: string; errors: string[] }> = []\n\n // Flatten errors into errorFields array\n const flattenErrors = (obj: any, prefix = '') => {\n for (const key in obj) {\n const fullKey = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n if (value?.message) {\n errorFields.push({ name: fullKey, errors: [value.message as string] })\n } else if (typeof value === 'object' && value !== null) {\n flattenErrors(value, fullKey)\n }\n }\n }\n flattenErrors(errors)\n\n onFinishFailed({ values: form.getValues(), errorFields })\n }\n }\n }\n\n const handleReset = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n form.reset(initialValues as any)\n ;(form as any).__submitAttempted = false\n }\n\n return (\n <FormContext.Provider value={{ form, layout, labelWidth, size: effectiveSize, disabled }}>\n <form onSubmit={handleSubmit} onReset={handleReset} className={className} noValidate={noValidate} {...props}>\n {children}\n </form>\n </FormContext.Provider>\n )\n}\n\nfunction FormItem({\n name,\n label,\n floatingLabel,\n help,\n required = false,\n rules,\n valuePropName = 'value',\n inline = false,\n className = '',\n children,\n tooltip,\n extra,\n hasFeedback = false,\n dependencies,\n validateTrigger = 'onChange',\n initialValue,\n hidden = false,\n addonBefore,\n addonAfter,\n 'data-testid': testId,\n}: FormItemProps) {\n const { form, size, listName, layout, labelWidth, disabled: formDisabled } = useFormContext()\n const inputId = useId()\n const errorId = useId()\n\n if (!name) {\n // Render without form control if no name provided\n return <div className={`${inline ? 'w-auto' : 'w-full'} ${className}`} style={hidden ? { display: 'none' } : undefined}>{children}</div>\n }\n\n // Handle nested field names (for Form.List)\n let fieldName: string\n if (Array.isArray(name)) {\n // If we're inside a Form.List, prepend the list name\n const fullPath = listName ? [listName, ...name] : name\n fieldName = fullPath.join('.')\n } else {\n fieldName = name\n }\n\n // Set initial value if provided\n useEffect(() => {\n if (initialValue !== undefined) {\n const currentValue = form.getValues(fieldName as any)\n if (currentValue === undefined) {\n form.setValue(fieldName as any, initialValue)\n }\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Watch dependencies and re-validate when they change\n const watchedDeps = useWatch({\n control: form.control,\n name: dependencies as any,\n disabled: !dependencies || dependencies.length === 0,\n })\n\n // Use refs to avoid infinite loops\n const formRef = useRef(form)\n formRef.current = form\n const prevDepsRef = useRef<string | undefined>(undefined)\n\n useEffect(() => {\n // Skip if no dependencies\n if (!dependencies || dependencies.length === 0) return\n\n // Skip initial render\n if (prevDepsRef.current === undefined) {\n prevDepsRef.current = JSON.stringify(watchedDeps)\n return\n }\n\n // Only trigger if dependency values actually changed\n const currentDeps = JSON.stringify(watchedDeps)\n if (prevDepsRef.current !== currentDeps) {\n prevDepsRef.current = currentDeps\n // Only re-validate if this field has been touched\n const touchedFields = formRef.current.formState.touchedFields as any\n const isTouched = fieldName.split('.').reduce((obj, key) => obj?.[key], touchedFields)\n if (isTouched) {\n formRef.current.trigger(fieldName as any)\n }\n }\n }, [watchedDeps, dependencies, fieldName])\n\n // Get error by traversing the error object path\n const getErrorByPath = (path: string) => {\n const keys = path.split('.')\n let error: any = form.formState.errors\n for (const key of keys) {\n if (!error) break\n error = error[key]\n }\n return error\n }\n\n const error = getErrorByPath(fieldName)\n const errorMessage = error?.message as string | undefined\n\n // Normalize rules to array\n const rulesInputArray: FormRuleInput[] = rules\n ? Array.isArray(rules) ? rules : [rules]\n : []\n\n // Store form ref for use in validators (to get fresh values at validation time)\n const validatorFormRef = useRef(form)\n validatorFormRef.current = form\n\n // Create form methods for rule functions (Ant Design style)\n // These methods always access current form values via ref\n const formMethods: FormRuleMethods = {\n getFieldValue: (name: string) => validatorFormRef.current.getValues(name as any),\n getFieldsValue: () => validatorFormRef.current.getValues(),\n isSubmitted: () => validatorFormRef.current.formState.isSubmitted,\n isSubmitAttempted: () => !!(validatorFormRef.current as any).__submitAttempted,\n }\n\n // Resolve function rules to rule objects\n const rulesArray: FormRule[] = rulesInputArray.map(rule =>\n typeof rule === 'function' ? rule(formMethods) : rule\n )\n\n // Build validation rules\n const validationRules: any = {}\n const patternValidators: Array<{ pattern: RegExp; message: string }> = []\n const customValidators: Array<(value: any) => boolean | string | Promise<boolean | string>> = []\n\n // Handle top-level required prop\n if (required) {\n validationRules.required = 'This field is required'\n }\n\n // Process each rule\n for (const rule of rulesArray) {\n // Required\n if (rule.required) {\n validationRules.required = typeof rule.required === 'string'\n ? rule.required\n : rule.message || 'This field is required'\n }\n\n // Type validator\n if (rule.type && TYPE_VALIDATORS[rule.type]) {\n patternValidators.push({\n pattern: TYPE_VALIDATORS[rule.type].value,\n message: rule.message || TYPE_VALIDATORS[rule.type].message,\n })\n }\n\n // Min length\n if (rule.min !== undefined) {\n const minValue = typeof rule.min === 'object' ? rule.min.value : rule.min\n const minMessage = typeof rule.min === 'object'\n ? rule.min.message\n : rule.message || `Minimum length is ${minValue} characters`\n validationRules.minLength = { value: minValue, message: minMessage }\n }\n\n // Max length\n if (rule.max !== undefined) {\n const maxValue = typeof rule.max === 'object' ? rule.max.value : rule.max\n const maxMessage = typeof rule.max === 'object'\n ? rule.max.message\n : rule.message || `Maximum length is ${maxValue} characters`\n validationRules.maxLength = { value: maxValue, message: maxMessage }\n }\n\n // Pattern - collect all patterns\n if (rule.pattern) {\n const patternValue = rule.pattern instanceof RegExp ? rule.pattern : rule.pattern.value\n const patternMessage = rule.pattern instanceof RegExp\n ? rule.message || 'Invalid format'\n : rule.pattern.message\n patternValidators.push({ pattern: patternValue, message: patternMessage })\n }\n\n // Custom validator (our style)\n if (rule.validate) {\n customValidators.push(rule.validate)\n }\n\n // Ant Design style validator\n if (rule.validator) {\n const antValidator = rule.validator\n customValidators.push(async (value: any) => {\n try {\n await antValidator(rule, value)\n return true\n } catch (err) {\n return err instanceof Error ? err.message : String(err)\n }\n })\n }\n }\n\n // Combine all pattern and custom validators into a single validate function\n if (patternValidators.length > 0 || customValidators.length > 0) {\n validationRules.validate = async (value: any) => {\n // Check all patterns (skip if empty - required rule handles that)\n for (const { pattern, message } of patternValidators) {\n if (value && !pattern.test(value)) {\n return message\n }\n }\n\n // Run all custom validators (always run - they may validate empty/false values)\n for (const validator of customValidators) {\n const result = await validator(value)\n if (result !== true) {\n return result\n }\n }\n\n return true\n }\n }\n\n // Normalize validateTrigger to array\n const triggers = Array.isArray(validateTrigger) ? validateTrigger : [validateTrigger]\n const shouldValidateOnChange = triggers.includes('onChange')\n const shouldValidateOnBlur = triggers.includes('onBlur')\n\n // Feedback icons\n const FeedbackIcon = ({ hasError, isValidating }: { hasError: boolean; isValidating: boolean }) => {\n if (isValidating) {\n return (\n <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingXs} text-base-content/50`} />\n )\n }\n if (hasError) {\n return (\n <svg className=\"w-4 h-4 text-error\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n }\n return (\n <svg className=\"w-4 h-4 text-success\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n }\n\n // Tooltip icon\n const TooltipIcon = () => (\n <div className={`${dTooltip} ${dTooltipTop} ml-1`} data-tip={tooltip}>\n <svg className=\"w-4 h-4 text-base-content/50 cursor-help\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </div>\n )\n\n return (\n <Controller\n name={fieldName}\n control={form.control}\n rules={validationRules}\n render={({ field, fieldState }) => {\n const { value, onChange, onBlur, ref } = field\n const isValidating = fieldState.isTouched && form.formState.isValidating\n\n // Clone the child element and inject form control props\n const childProps: any = {\n id: inputId,\n ref,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': error ? errorId : undefined,\n 'data-testid': testId ? `${testId}-input` : undefined,\n }\n\n // Handle onBlur based on validateTrigger\n childProps.onBlur = () => {\n onBlur()\n if (shouldValidateOnBlur) {\n form.trigger(fieldName as any)\n }\n }\n\n // Get the original onChange from the child element (if any)\n const originalOnChange = isValidElement(children) ? (children.props as any).onChange : undefined\n\n // Handle different value prop names (e.g., 'checked' for checkboxes)\n if (valuePropName === 'checked') {\n childProps.checked = value\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.checked)\n if (shouldValidateOnChange) {\n form.trigger(fieldName as any)\n }\n // Call original onChange if provided\n originalOnChange?.(e)\n }\n } else {\n childProps.value = value ?? ''\n childProps.onChange = (eventOrValue: any) => {\n // Handle components that pass value directly (e.g., Range, Rating)\n // vs components that pass event object (e.g., Input, Select)\n if (eventOrValue && eventOrValue.target !== undefined) {\n const nextValue = eventOrValue.target.value ?? eventOrValue.currentTarget?.value\n onChange(nextValue ?? eventOrValue)\n } else {\n onChange(eventOrValue)\n }\n if (shouldValidateOnChange) {\n form.trigger(fieldName as any)\n }\n // Call original onChange if provided\n originalOnChange?.(eventOrValue)\n }\n }\n\n // Apply size if specified at form level\n if (size && isValidElement(children)) {\n const existingProps = children.props as any\n if (!existingProps.size) {\n childProps.size = size\n }\n }\n\n // Apply error styling and accessibility\n if (error) {\n childProps.color = 'error'\n childProps['aria-invalid'] = true\n }\n\n // Apply form-level disabled state\n if (formDisabled) {\n childProps.disabled = true\n }\n\n // When wrapped with addons, the child input should be unstyled (the wrapper has the styling)\n const hasAddons = addonBefore || addonAfter\n if (hasAddons) {\n childProps.unstyled = true\n }\n\n const enhancedChild = isValidElement(children)\n ? cloneElement(children as React.ReactElement<any>, childProps)\n : children\n\n const isHorizontal = layout === 'horizontal'\n const isInline = layout === 'inline'\n\n // Size class for floating label\n const floatingSizeClasses: Record<string, string> = {\n xs: dInputXs,\n sm: dInputSm,\n md: dInputMd,\n lg: dInputLg,\n xl: dInputXl,\n }\n\n // Build the input element with optional floating label wrapper\n const renderInputElement = () => {\n const inputWithFeedback = (\n <div className={`${isHorizontal ? 'flex-1' : ''} ${hasFeedback ? 'relative' : ''}`}>\n {enhancedChild}\n {hasFeedback && fieldState.isTouched && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none\">\n <FeedbackIcon hasError={!!error} isValidating={isValidating} />\n </span>\n )}\n </div>\n )\n\n // Floating label variant\n if (floatingLabel) {\n const floatingClasses = [\n dFloatingLabel,\n size && floatingSizeClasses[size],\n ].filter(Boolean).join(' ')\n\n return (\n <label className={floatingClasses}>\n {enhancedChild}\n <span>{floatingLabel}{required && <span className=\"text-error ml-1\">*</span>}</span>\n </label>\n )\n }\n\n return inputWithFeedback\n }\n\n // Wrap with external addons if specified using DaisyUI input wrapper pattern\n const renderWithAddons = (input: React.ReactNode) => {\n if (!addonBefore && !addonAfter) return input\n\n const addonClasses = [\n dInput,\n 'flex',\n 'items-center',\n 'gap-2',\n size && floatingSizeClasses[size],\n ].filter(Boolean).join(' ')\n\n return (\n <label className={addonClasses}>\n {addonBefore && <span className=\"text-base-content/70\">{addonBefore}</span>}\n {input}\n {addonAfter && <span className=\"text-base-content/70\">{addonAfter}</span>}\n </label>\n )\n }\n\n return (\n <div className={`${inline ? 'w-auto' : 'w-full'} ${isHorizontal ? 'mb-4' : ''} ${isInline ? 'inline-flex mr-4' : ''} ${className}`} style={hidden ? { display: 'none' } : undefined} data-testid={testId}>\n <div className={isHorizontal ? 'flex items-center gap-4' : ''}>\n {label && !floatingLabel && (\n <label\n htmlFor={inputId}\n className={`block text-sm font-medium ${isHorizontal ? 'flex-shrink-0 text-right' : ''} ${!isHorizontal && !isInline ? 'mb-1' : ''}`}\n style={isHorizontal ? { width: labelWidth } : undefined}\n data-testid={testId ? `${testId}-label` : undefined}\n >\n <span className=\"flex items-center\">\n {label}\n {required && <span className=\"text-error ml-1\">*</span>}\n {tooltip && <TooltipIcon />}\n </span>\n </label>\n )}\n {renderWithAddons(renderInputElement())}\n </div>\n {!isHorizontal && !inline && (\n <p id={errorId} className={`${dValidatorHint} ${errorMessage ? '!visible text-error' : ''} min-h-[1.25rem]`} role={errorMessage ? 'alert' : undefined} data-testid={testId ? `${testId}-error` : undefined}>\n {errorMessage || (help && <span className=\"text-base-content/70\">{help}</span>) || '\\u00A0'}\n </p>\n )}\n {isHorizontal && (errorMessage || help) && (\n <p id={errorId} className={`${dValidatorHint} ${errorMessage ? '!visible text-error' : ''} min-h-[1.25rem]`} role={errorMessage ? 'alert' : undefined} data-testid={testId ? `${testId}-error` : undefined}>\n {errorMessage || (help && <span className=\"text-base-content/70\">{help}</span>)}\n </p>\n )}\n {extra && (\n <div className=\"text-sm text-base-content/60 mt-1\" data-testid={testId ? `${testId}-extra` : undefined}>{extra}</div>\n )}\n </div>\n )\n }}\n />\n )\n}\n\nfunction FormList<TFieldValues extends FieldValues = FieldValues>({\n name,\n children,\n}: FormListProps<TFieldValues>) {\n const { form, layout, size, disabled } = useFormContext()\n\n const { fields, append, remove, move } = useFieldArray({\n control: form.control,\n name,\n })\n\n // Add name (index) to each field for proper path construction\n const fieldsWithName = fields.map((field, index) => ({\n ...field,\n name: index,\n }))\n\n return (\n <FormContext.Provider value={{ form, layout, size, listName: name as string, disabled }}>\n {children(fieldsWithName as any, {\n add: append,\n remove,\n move,\n })}\n </FormContext.Provider>\n )\n}\n\n// Enhanced hook to expose full form API\nexport function useFormInstance<TFieldValues extends FieldValues = FieldValues>(\n options?: UseFormProps<TFieldValues>\n) {\n const formInstance = rhfUseForm<TFieldValues>(options)\n\n // Add convenience methods to the instance\n const enhancedInstance = formInstance as typeof formInstance & {\n setFieldValue: typeof formInstance.setValue\n getFieldValue: (name: any) => any\n getFieldsValue: typeof formInstance.getValues\n setFieldsValue: (values: any) => void\n validateFields: typeof formInstance.trigger\n resetFields: typeof formInstance.reset\n isFieldTouched: (name: string) => boolean\n getFieldError: (name: string) => string | undefined\n }\n\n // Add the alias methods\n enhancedInstance.setFieldValue = formInstance.setValue\n enhancedInstance.getFieldValue = (name: any) => formInstance.getValues(name)\n enhancedInstance.getFieldsValue = formInstance.getValues\n enhancedInstance.setFieldsValue = (values: any) => {\n Object.keys(values).forEach((key) => {\n formInstance.setValue(key as any, values[key])\n })\n }\n enhancedInstance.validateFields = formInstance.trigger\n enhancedInstance.resetFields = formInstance.reset\n enhancedInstance.isFieldTouched = (name: string) => {\n const touched = formInstance.formState.touchedFields as any\n return !!touched[name]\n }\n enhancedInstance.getFieldError = (name: string) => {\n const errors = formInstance.formState.errors as any\n return errors[name]?.message as string | undefined\n }\n\n return enhancedInstance\n}\n\nexport interface FormErrorListProps {\n /** Specific field names to show errors for (shows all errors if not specified) */\n fields?: string[]\n /** Custom className */\n className?: string\n /** Test ID for the error list */\n 'data-testid'?: string\n}\n\nfunction FormErrorList({ fields, className = '', 'data-testid': testId }: FormErrorListProps) {\n const { form } = useFormContext()\n const { errors } = form.formState\n\n // Flatten nested errors into a list\n const flattenErrors = (obj: any, prefix = ''): Array<{ field: string; message: string }> => {\n const result: Array<{ field: string; message: string }> = []\n\n for (const key in obj) {\n const fullKey = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n\n if (value?.message) {\n result.push({ field: fullKey, message: value.message as string })\n } else if (typeof value === 'object' && value !== null) {\n result.push(...flattenErrors(value, fullKey))\n }\n }\n\n return result\n }\n\n const allErrors = flattenErrors(errors)\n const filteredErrors = fields\n ? allErrors.filter(e => fields.includes(e.field))\n : allErrors\n\n if (filteredErrors.length === 0) {\n return null\n }\n\n return (\n <ul className={`text-error text-sm space-y-1 ${className}`} role=\"alert\" data-testid={testId}>\n {filteredErrors.map((error, index) => (\n <li key={`${error.field}-${index}`} className=\"flex items-start gap-2\" data-testid={testId ? `${testId}-${error.field}` : undefined}>\n <svg className=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>{error.message}</span>\n </li>\n ))}\n </ul>\n )\n}\n\nexport const Form = Object.assign(FormRoot, {\n Item: FormItem,\n List: FormList,\n ErrorList: FormErrorList,\n useForm: useFormInstance,\n useWatch,\n})\n\nexport const useForm = useFormInstance\nexport { useWatch }\n\nexport type { UseFormReturn as FormInstance }\n"],"names":["dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dFloatingLabel","dLoading","dLoadingSpinner","dLoadingXs","dTooltip","dTooltipTop","dValidatorHint","FormContext","createContext","TYPE_VALIDATORS","useFormContext","context","useContext","FormRoot","externalForm","onFinish","onFinishFailed","initialValues","layout","labelWidth","size","disabled","children","className","noValidate","props","componentSize","useConfig","effectiveSize","internalForm","rhfUseForm","form","handleSubmit","e","errors","errorFields","flattenErrors","obj","prefix","key","fullKey","value","handleReset","jsx","FormItem","name","label","floatingLabel","help","required","rules","valuePropName","inline","tooltip","extra","hasFeedback","dependencies","validateTrigger","initialValue","hidden","addonBefore","addonAfter","testId","listName","formDisabled","inputId","useId","errorId","fieldName","useEffect","watchedDeps","useWatch","formRef","useRef","prevDepsRef","currentDeps","touchedFields","error","path","keys","errorMessage","rulesInputArray","validatorFormRef","formMethods","rulesArray","rule","validationRules","patternValidators","customValidators","minValue","minMessage","maxValue","maxMessage","patternValue","patternMessage","antValidator","err","pattern","message","validator","result","triggers","shouldValidateOnChange","shouldValidateOnBlur","FeedbackIcon","hasError","isValidating","TooltipIcon","Controller","field","fieldState","onChange","onBlur","ref","childProps","originalOnChange","isValidElement","eventOrValue","nextValue","enhancedChild","cloneElement","isHorizontal","isInline","floatingSizeClasses","renderInputElement","inputWithFeedback","jsxs","floatingClasses","renderWithAddons","input","addonClasses","FormList","fields","append","remove","move","useFieldArray","fieldsWithName","index","useFormInstance","options","formInstance","enhancedInstance","values","FormErrorList","allErrors","filteredErrors","Form","useForm"],"mappings":"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"}