@macrulez/vue-form-schema 0.1.7 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +461 -180
  3. package/dist/MaskEngine-BEXwX4BK.js +144 -0
  4. package/dist/MaskEngine-CPr-fSPy.cjs +1 -0
  5. package/dist/ValidationEngine-BC4U1ef1.js +135 -0
  6. package/dist/ValidationEngine-Diz-qTFs.cjs +1 -0
  7. package/dist/_plugin-vue_export-helper-BHFhmbuH.cjs +1 -0
  8. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +9 -0
  9. package/dist/core/ConditionEvaluator.d.ts.map +1 -1
  10. package/dist/core/MaskEngine.d.ts.map +1 -1
  11. package/dist/core/ValidationEngine.d.ts +13 -0
  12. package/dist/core/ValidationEngine.d.ts.map +1 -1
  13. package/dist/core/formRegistry.d.ts +33 -0
  14. package/dist/core/formRegistry.d.ts.map +1 -0
  15. package/dist/core/inferTypes.d.ts.map +1 -1
  16. package/dist/core/schemaUtils.d.ts +38 -0
  17. package/dist/core/schemaUtils.d.ts.map +1 -1
  18. package/dist/core/serverErrors.d.ts +69 -0
  19. package/dist/core/serverErrors.d.ts.map +1 -0
  20. package/dist/core/types.d.ts +22 -2
  21. package/dist/core/types.d.ts.map +1 -1
  22. package/dist/core/useForm.d.ts +4 -1
  23. package/dist/core/useForm.d.ts.map +1 -1
  24. package/dist/core/useMultiStepForm.d.ts.map +1 -1
  25. package/dist/devtools/index.d.ts +26 -0
  26. package/dist/devtools/index.d.ts.map +1 -0
  27. package/dist/devtools.cjs +1 -0
  28. package/dist/devtools.d.ts +6 -0
  29. package/dist/devtools.js +93 -0
  30. package/dist/formRegistry-Bv1eaWQ-.js +31 -0
  31. package/dist/formRegistry-DaDmXyYY.cjs +1 -0
  32. package/dist/index.cjs +1 -1
  33. package/dist/index.d.ts +5 -3
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +392 -359
  36. package/dist/openapi.cjs +1 -0
  37. package/dist/openapi.d.ts +202 -0
  38. package/dist/openapi.js +118 -0
  39. package/dist/parsers/json.d.ts.map +1 -1
  40. package/dist/parsers/openapi.d.ts +139 -0
  41. package/dist/parsers/openapi.d.ts.map +1 -0
  42. package/dist/parsers/valibot.d.ts +13 -4
  43. package/dist/parsers/valibot.d.ts.map +1 -1
  44. package/dist/parsers/yup.d.ts +10 -4
  45. package/dist/parsers/yup.d.ts.map +1 -1
  46. package/dist/parsers/zod.d.ts +18 -4
  47. package/dist/parsers/zod.d.ts.map +1 -1
  48. package/dist/schemaUtils-Cc7CwGXB.cjs +1 -0
  49. package/dist/schemaUtils-Cvlsk24U.js +337 -0
  50. package/dist/style.css +1 -0
  51. package/dist/ui/index.d.ts +1 -0
  52. package/dist/ui/index.d.ts.map +1 -1
  53. package/dist/ui/naive/index.d.ts +11 -0
  54. package/dist/ui/naive/index.d.ts.map +1 -0
  55. package/dist/ui/primevue/index.d.ts +11 -0
  56. package/dist/ui/primevue/index.d.ts.map +1 -0
  57. package/dist/ui/shadcn/index.d.ts +11 -0
  58. package/dist/ui/shadcn/index.d.ts.map +1 -0
  59. package/dist/ui/tailwind/index.d.ts +11 -0
  60. package/dist/ui/tailwind/index.d.ts.map +1 -0
  61. package/dist/ui-naive.cjs +1 -0
  62. package/dist/ui-naive.d.ts +411 -0
  63. package/dist/ui-naive.js +667 -0
  64. package/dist/ui-primevue.cjs +1 -0
  65. package/dist/ui-primevue.d.ts +411 -0
  66. package/dist/ui-primevue.js +651 -0
  67. package/dist/ui-shadcn.cjs +1 -0
  68. package/dist/ui-shadcn.d.ts +411 -0
  69. package/dist/ui-shadcn.js +650 -0
  70. package/dist/ui-tailwind.cjs +1 -0
  71. package/dist/ui-tailwind.d.ts +411 -0
  72. package/dist/ui-tailwind.js +669 -0
  73. package/dist/ui.cjs +1 -1
  74. package/dist/ui.d.ts +61 -10
  75. package/dist/ui.js +434 -299
  76. package/dist/valibot.cjs +1 -1
  77. package/dist/valibot.d.ts +35 -4
  78. package/dist/valibot.js +47 -20
  79. package/dist/yup.cjs +1 -1
  80. package/dist/yup.d.ts +33 -5
  81. package/dist/yup.js +16 -15
  82. package/dist/zod.cjs +1 -1
  83. package/dist/zod.d.ts +41 -5
  84. package/dist/zod.js +58 -28
  85. package/package.json +99 -25
  86. package/dist/MaskEngine-BqJQYybS.js +0 -233
  87. package/dist/MaskEngine-BwAs2Zb0.cjs +0 -1
  88. package/dist/__tests__/ConditionEvaluator.test.d.ts +0 -2
  89. package/dist/__tests__/ConditionEvaluator.test.d.ts.map +0 -1
  90. package/dist/__tests__/MaskEngine.test.d.ts +0 -2
  91. package/dist/__tests__/MaskEngine.test.d.ts.map +0 -1
  92. package/dist/__tests__/ValidationEngine.test.d.ts +0 -2
  93. package/dist/__tests__/ValidationEngine.test.d.ts.map +0 -1
  94. package/dist/__tests__/parsers.test.d.ts +0 -2
  95. package/dist/__tests__/parsers.test.d.ts.map +0 -1
  96. package/dist/__tests__/phase3.test.d.ts +0 -2
  97. package/dist/__tests__/phase3.test.d.ts.map +0 -1
  98. package/dist/__tests__/phase4.test.d.ts +0 -2
  99. package/dist/__tests__/phase4.test.d.ts.map +0 -1
  100. package/dist/__tests__/useFieldArray.test.d.ts +0 -2
  101. package/dist/__tests__/useFieldArray.test.d.ts.map +0 -1
  102. package/dist/__tests__/useForm.test.d.ts +0 -2
  103. package/dist/__tests__/useForm.test.d.ts.map +0 -1
  104. package/dist/__tests__/useMultiStepForm.test.d.ts +0 -2
  105. package/dist/__tests__/useMultiStepForm.test.d.ts.map +0 -1
@@ -0,0 +1,650 @@
1
+ import { defineComponent as V, computed as p, openBlock as l, createElementBlock as s, createTextVNode as N, toDisplayString as x, createCommentVNode as $, renderSlot as T, normalizeProps as J, guardReactiveProps as O, Fragment as F, renderList as w, ref as I, onMounted as Q, onUnmounted as W, createBlock as k, withCtx as S, createElementVNode as h, mergeProps as q, withModifiers as X, normalizeClass as Y, unref as E, resolveDynamicComponent as z, resolveComponent as Z } from "vue";
2
+ import { b as _, d as U, u as ee } from "./MaskEngine-BEXwX4BK.js";
3
+ import { g as M } from "./ValidationEngine-BC4U1ef1.js";
4
+ const te = { class: "mb-4 space-y-1.5" }, re = ["for"], le = {
5
+ key: 0,
6
+ class: "text-destructive ml-0.5",
7
+ "aria-hidden": "true"
8
+ }, oe = ["id"], C = /* @__PURE__ */ V({
9
+ __name: "BaseField",
10
+ props: {
11
+ field: {},
12
+ error: {},
13
+ touched: { type: Boolean }
14
+ },
15
+ setup(e) {
16
+ const m = e, t = p(() => {
17
+ var d;
18
+ return !!(m.touched && ((d = m.error) != null && d.length));
19
+ }), c = p(() => `${m.field.name}-error`), n = p(() => ({
20
+ "aria-required": m.field.required ? "true" : void 0,
21
+ "aria-invalid": t.value ? "true" : "false",
22
+ "aria-describedby": t.value ? c.value : void 0
23
+ }));
24
+ return (d, i) => (l(), s("div", te, [
25
+ e.field.label ? (l(), s("label", {
26
+ key: 0,
27
+ for: e.field.name,
28
+ class: "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
29
+ }, [
30
+ N(x(e.field.label) + " ", 1),
31
+ e.field.required ? (l(), s("span", le, "*")) : $("", !0)
32
+ ], 8, re)) : $("", !0),
33
+ T(d.$slots, "default", J(O(n.value))),
34
+ t.value ? (l(), s("ul", {
35
+ key: 1,
36
+ id: c.value,
37
+ class: "space-y-0.5",
38
+ role: "alert",
39
+ "aria-live": "polite"
40
+ }, [
41
+ (l(!0), s(F, null, w(e.error, (a, f) => (l(), s("li", {
42
+ key: f,
43
+ class: "text-destructive text-sm font-medium"
44
+ }, x(a), 1))), 128))
45
+ ], 8, oe)) : $("", !0)
46
+ ]));
47
+ }
48
+ }), ne = ["id", "type", "name", "value", "placeholder", "disabled", "required"], D = /* @__PURE__ */ V({
49
+ __name: "TextField",
50
+ props: {
51
+ field: {},
52
+ modelValue: {},
53
+ error: {},
54
+ touched: { type: Boolean }
55
+ },
56
+ emits: ["update:modelValue", "blur"],
57
+ setup(e, { emit: m }) {
58
+ const t = e, c = m, n = I(null);
59
+ let d = null;
60
+ const i = p(() => {
61
+ var a;
62
+ return !!(t.touched && ((a = t.error) != null && a.length));
63
+ });
64
+ return Q(() => {
65
+ n.value && t.field.mask && (d = _(n.value, t.field.mask));
66
+ }), W(() => d == null ? void 0 : d()), (a, f) => (l(), k(C, {
67
+ field: e.field,
68
+ error: e.error,
69
+ touched: e.touched
70
+ }, {
71
+ default: S((b) => [
72
+ h("input", q({
73
+ id: e.field.name,
74
+ ref_key: "inputRef",
75
+ ref: n,
76
+ type: e.field.type === "email" ? "email" : "text",
77
+ name: e.field.name,
78
+ value: e.modelValue ?? "",
79
+ placeholder: e.field.placeholder,
80
+ disabled: e.field.disabled === !0,
81
+ required: e.field.required
82
+ }, b, {
83
+ class: ["border-input placeholder:text-muted-foreground focus-visible:ring-ring flex h-9 w-full rounded-md border bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50", i.value ? "border-destructive focus-visible:ring-destructive" : ""],
84
+ onInput: f[0] || (f[0] = (v) => c("update:modelValue", v.target.value)),
85
+ onBlur: f[1] || (f[1] = (v) => c("blur"))
86
+ }), null, 16, ne)
87
+ ]),
88
+ _: 1
89
+ }, 8, ["field", "error", "touched"]));
90
+ }
91
+ }), de = ["id", "name", "value", "placeholder", "disabled", "required"], P = /* @__PURE__ */ V({
92
+ __name: "NumberField",
93
+ props: {
94
+ field: {},
95
+ modelValue: {},
96
+ error: {},
97
+ touched: { type: Boolean }
98
+ },
99
+ emits: ["update:modelValue", "blur"],
100
+ setup(e, { emit: m }) {
101
+ const t = e, c = m, n = p(() => {
102
+ var i;
103
+ return !!(t.touched && ((i = t.error) != null && i.length));
104
+ });
105
+ function d(i) {
106
+ const a = i.target.value;
107
+ c("update:modelValue", a === "" ? null : Number(a));
108
+ }
109
+ return (i, a) => (l(), k(C, {
110
+ field: e.field,
111
+ error: e.error,
112
+ touched: e.touched
113
+ }, {
114
+ default: S((f) => [
115
+ h("input", q({
116
+ id: e.field.name,
117
+ type: "number",
118
+ name: e.field.name,
119
+ value: e.modelValue ?? "",
120
+ placeholder: e.field.placeholder,
121
+ disabled: e.field.disabled === !0,
122
+ required: e.field.required
123
+ }, f, {
124
+ class: ["border-input placeholder:text-muted-foreground focus-visible:ring-ring flex h-9 w-full rounded-md border bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50", n.value ? "border-destructive focus-visible:ring-destructive" : ""],
125
+ onInput: d,
126
+ onBlur: a[0] || (a[0] = (b) => c("blur"))
127
+ }), null, 16, de)
128
+ ]),
129
+ _: 1
130
+ }, 8, ["field", "error", "touched"]));
131
+ }
132
+ }), ie = ["id", "name", "value", "placeholder", "disabled", "required"], L = /* @__PURE__ */ V({
133
+ __name: "TextareaField",
134
+ props: {
135
+ field: {},
136
+ modelValue: {},
137
+ error: {},
138
+ touched: { type: Boolean }
139
+ },
140
+ emits: ["update:modelValue", "blur"],
141
+ setup(e, { emit: m }) {
142
+ const t = e, c = m, n = p(() => {
143
+ var d;
144
+ return !!(t.touched && ((d = t.error) != null && d.length));
145
+ });
146
+ return (d, i) => (l(), k(C, {
147
+ field: e.field,
148
+ error: e.error,
149
+ touched: e.touched
150
+ }, {
151
+ default: S((a) => [
152
+ h("textarea", q({
153
+ id: e.field.name,
154
+ name: e.field.name,
155
+ value: e.modelValue ?? "",
156
+ placeholder: e.field.placeholder,
157
+ disabled: e.field.disabled === !0,
158
+ required: e.field.required
159
+ }, a, {
160
+ class: ["border-input placeholder:text-muted-foreground focus-visible:ring-ring flex min-h-[70px] w-full resize-y rounded-md border bg-transparent px-3 py-2 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50", n.value ? "border-destructive focus-visible:ring-destructive" : ""],
161
+ onInput: i[0] || (i[0] = (f) => c("update:modelValue", f.target.value)),
162
+ onBlur: i[1] || (i[1] = (f) => c("blur"))
163
+ }), null, 16, ie)
164
+ ]),
165
+ _: 1
166
+ }, 8, ["field", "error", "touched"]));
167
+ }
168
+ }), ae = {
169
+ key: 0,
170
+ class: "text-muted-foreground py-2 text-sm"
171
+ }, ue = ["id", "name", "disabled", "required"], se = ["selected"], ce = ["value", "selected"], j = /* @__PURE__ */ V({
172
+ __name: "SelectField",
173
+ props: {
174
+ field: {},
175
+ modelValue: {},
176
+ error: {},
177
+ touched: { type: Boolean }
178
+ },
179
+ emits: ["update:modelValue", "blur"],
180
+ setup(e, { emit: m }) {
181
+ const t = e, c = m, n = p(() => Array.isArray(t.field.options) ? t.field.options : []), d = p(() => {
182
+ var a;
183
+ return !!(t.touched && ((a = t.error) != null && a.length));
184
+ });
185
+ function i(a) {
186
+ const f = a.target, b = n.value.find((v) => String(v.value) === f.value);
187
+ c("update:modelValue", (b == null ? void 0 : b.value) ?? f.value);
188
+ }
189
+ return (a, f) => (l(), k(C, {
190
+ field: e.field,
191
+ error: e.error,
192
+ touched: e.touched
193
+ }, {
194
+ default: S((b) => [
195
+ e.field.optionsLoading ? (l(), s("div", ae, "Loading…")) : (l(), s("select", q({
196
+ key: 1,
197
+ id: e.field.name,
198
+ name: e.field.name,
199
+ disabled: e.field.disabled === !0 || e.field.optionsLoading,
200
+ required: e.field.required
201
+ }, b, {
202
+ class: ["border-input focus-visible:ring-ring flex h-9 w-full rounded-md border bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50", d.value ? "border-destructive focus-visible:ring-destructive" : ""],
203
+ onChange: i,
204
+ onBlur: f[0] || (f[0] = (v) => c("blur"))
205
+ }), [
206
+ h("option", {
207
+ value: "",
208
+ disabled: "",
209
+ selected: e.modelValue === null || e.modelValue === void 0 || e.modelValue === ""
210
+ }, x(e.field.placeholder ?? "Select an option"), 9, se),
211
+ (l(!0), s(F, null, w(n.value, (v) => (l(), s("option", {
212
+ key: String(v.value),
213
+ value: String(v.value),
214
+ selected: e.modelValue === v.value
215
+ }, x(v.label), 9, ce))), 128))
216
+ ], 16, ue))
217
+ ]),
218
+ _: 1
219
+ }, 8, ["field", "error", "touched"]));
220
+ }
221
+ }), me = { class: "flex cursor-pointer items-center gap-2.5" }, fe = ["id", "name", "checked", "disabled", "required", "aria-checked"], be = {
222
+ key: 0,
223
+ class: "text-sm leading-none"
224
+ }, K = /* @__PURE__ */ V({
225
+ __name: "CheckboxField",
226
+ props: {
227
+ field: {},
228
+ modelValue: { type: [Boolean, null] },
229
+ error: {},
230
+ touched: { type: Boolean }
231
+ },
232
+ emits: ["update:modelValue", "blur"],
233
+ setup(e, { emit: m }) {
234
+ const t = m;
235
+ return (c, n) => (l(), k(C, {
236
+ field: { ...e.field, label: void 0 },
237
+ error: e.error,
238
+ touched: e.touched
239
+ }, {
240
+ default: S((d) => [
241
+ h("label", me, [
242
+ h("input", q({
243
+ id: e.field.name,
244
+ type: "checkbox",
245
+ name: e.field.name,
246
+ checked: !!e.modelValue,
247
+ disabled: e.field.disabled === !0,
248
+ required: e.field.required,
249
+ "aria-checked": e.modelValue ? "true" : "false"
250
+ }, d, {
251
+ class: "border-primary text-primary focus-visible:ring-ring peer h-4 w-4 shrink-0 cursor-pointer rounded-sm border shadow focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50",
252
+ onChange: n[0] || (n[0] = (i) => t("update:modelValue", i.target.checked)),
253
+ onBlur: n[1] || (n[1] = (i) => t("blur"))
254
+ }), null, 16, fe),
255
+ e.field.label ? (l(), s("span", be, x(e.field.label), 1)) : $("", !0)
256
+ ])
257
+ ]),
258
+ _: 1
259
+ }, 8, ["field", "error", "touched"]));
260
+ }
261
+ }), ve = ["aria-required", "aria-invalid", "aria-describedby"], he = {
262
+ key: 0,
263
+ class: "text-sm font-medium leading-none"
264
+ }, ge = {
265
+ key: 0,
266
+ class: "text-destructive ml-0.5",
267
+ "aria-hidden": "true"
268
+ }, ye = { class: "space-y-2" }, xe = ["name", "value", "checked", "disabled", "onChange"], pe = { class: "text-sm leading-none" }, $e = ["id"], G = /* @__PURE__ */ V({
269
+ __name: "RadioField",
270
+ props: {
271
+ field: {},
272
+ modelValue: {},
273
+ error: {},
274
+ touched: { type: Boolean }
275
+ },
276
+ emits: ["update:modelValue", "blur"],
277
+ setup(e, { emit: m }) {
278
+ const t = e, c = m, n = p(() => {
279
+ var a;
280
+ return !!(t.touched && ((a = t.error) != null && a.length));
281
+ }), d = p(() => `${t.field.name}-error`), i = p(() => Array.isArray(t.field.options) ? t.field.options : []);
282
+ return (a, f) => (l(), s("fieldset", {
283
+ class: "mb-4 space-y-2",
284
+ "aria-required": e.field.required ? "true" : void 0,
285
+ "aria-invalid": n.value ? "true" : "false",
286
+ "aria-describedby": n.value ? d.value : void 0
287
+ }, [
288
+ e.field.label ? (l(), s("legend", he, [
289
+ N(x(e.field.label) + " ", 1),
290
+ e.field.required ? (l(), s("span", ge, "*")) : $("", !0)
291
+ ])) : $("", !0),
292
+ h("div", ye, [
293
+ (l(!0), s(F, null, w(i.value, (b) => (l(), s("label", {
294
+ key: String(b.value),
295
+ class: "flex cursor-pointer items-center gap-2.5"
296
+ }, [
297
+ h("input", {
298
+ type: "radio",
299
+ name: e.field.name,
300
+ value: String(b.value),
301
+ checked: e.modelValue === b.value,
302
+ disabled: e.field.disabled === !0,
303
+ class: "border-primary text-primary focus-visible:ring-ring h-4 w-4 cursor-pointer focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50",
304
+ onChange: (v) => c("update:modelValue", b.value),
305
+ onBlur: f[0] || (f[0] = (v) => c("blur"))
306
+ }, null, 40, xe),
307
+ h("span", pe, x(b.label), 1)
308
+ ]))), 128))
309
+ ]),
310
+ n.value ? (l(), s("ul", {
311
+ key: 1,
312
+ id: d.value,
313
+ class: "space-y-0.5",
314
+ role: "alert",
315
+ "aria-live": "polite"
316
+ }, [
317
+ (l(!0), s(F, null, w(e.error, (b, v) => (l(), s("li", {
318
+ key: v,
319
+ class: "text-destructive text-sm font-medium"
320
+ }, x(b), 1))), 128))
321
+ ], 8, $e)) : $("", !0)
322
+ ], 8, ve));
323
+ }
324
+ }), ke = ["id", "name", "value", "disabled", "required"], H = /* @__PURE__ */ V({
325
+ __name: "DateField",
326
+ props: {
327
+ field: {},
328
+ modelValue: {},
329
+ error: {},
330
+ touched: { type: Boolean }
331
+ },
332
+ emits: ["update:modelValue", "blur"],
333
+ setup(e, { emit: m }) {
334
+ const t = e, c = m, n = p(() => {
335
+ var d;
336
+ return !!(t.touched && ((d = t.error) != null && d.length));
337
+ });
338
+ return (d, i) => (l(), k(C, {
339
+ field: e.field,
340
+ error: e.error,
341
+ touched: e.touched
342
+ }, {
343
+ default: S((a) => [
344
+ h("input", q({
345
+ id: e.field.name,
346
+ type: "date",
347
+ name: e.field.name,
348
+ value: e.modelValue ?? "",
349
+ disabled: e.field.disabled === !0,
350
+ required: e.field.required
351
+ }, a, {
352
+ class: ["border-input focus-visible:ring-ring flex h-9 w-full rounded-md border bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50", n.value ? "border-destructive focus-visible:ring-destructive" : ""],
353
+ onInput: i[0] || (i[0] = (f) => c("update:modelValue", f.target.value)),
354
+ onBlur: i[1] || (i[1] = (f) => c("blur"))
355
+ }), null, 16, ke)
356
+ ]),
357
+ _: 1
358
+ }, 8, ["field", "error", "touched"]));
359
+ }
360
+ }), Ve = ["id", "name", "accept", "multiple", "disabled", "required"], Fe = { class: "text-muted-foreground pointer-events-none space-y-1 text-sm" }, we = {
361
+ key: 0,
362
+ class: "text-xs"
363
+ }, Be = {
364
+ key: 0,
365
+ class: "mt-2 space-y-1"
366
+ }, Se = { class: "truncate" }, qe = { class: "text-muted-foreground ml-2 shrink-0 text-xs" }, Ce = ["aria-label", "onClick"], Re = /* @__PURE__ */ V({
367
+ __name: "FileField",
368
+ props: {
369
+ field: {},
370
+ modelValue: {},
371
+ error: {},
372
+ touched: { type: Boolean }
373
+ },
374
+ emits: ["update:modelValue", "blur"],
375
+ setup(e, { emit: m }) {
376
+ const t = e, c = m, n = I(!1), d = I(null), i = p(() => t.modelValue ? Array.isArray(t.modelValue) ? t.modelValue : [t.modelValue] : []), a = p(() => t.field.multiple ?? !1);
377
+ function f(o) {
378
+ if (!o || o.length === 0) {
379
+ c("update:modelValue", null);
380
+ return;
381
+ }
382
+ c("update:modelValue", a.value ? Array.from(o) : o[0]);
383
+ }
384
+ function b(o) {
385
+ f(o.target.files), c("blur");
386
+ }
387
+ function v(o) {
388
+ var r;
389
+ n.value = !1, o.preventDefault(), f(((r = o.dataTransfer) == null ? void 0 : r.files) ?? null), c("blur");
390
+ }
391
+ function R(o) {
392
+ const r = i.value.filter((g, y) => y !== o);
393
+ r.length === 0 ? (c("update:modelValue", null), d.value && (d.value.value = "")) : c("update:modelValue", a.value ? r : r[0]);
394
+ }
395
+ function A(o) {
396
+ return o < 1024 ? `${o} B` : o < 1024 * 1024 ? `${(o / 1024).toFixed(1)} KB` : `${(o / (1024 * 1024)).toFixed(1)} MB`;
397
+ }
398
+ return (o, r) => (l(), k(C, {
399
+ field: e.field,
400
+ error: e.error,
401
+ touched: e.touched
402
+ }, {
403
+ default: S((g) => {
404
+ var y;
405
+ return [
406
+ h("div", {
407
+ class: Y([
408
+ "border-input relative rounded-md border border-dashed p-6 text-center transition-colors",
409
+ n.value ? "border-ring bg-accent" : e.touched && ((y = e.error) != null && y.length) ? "border-destructive" : "hover:border-ring/60"
410
+ ]),
411
+ onDragover: r[0] || (r[0] = X((u) => n.value = !0, ["prevent"])),
412
+ onDragleave: r[1] || (r[1] = (u) => n.value = !1),
413
+ onDrop: v
414
+ }, [
415
+ h("input", q({
416
+ id: e.field.name,
417
+ ref_key: "inputRef",
418
+ ref: d,
419
+ type: "file",
420
+ name: e.field.name,
421
+ accept: e.field.accept,
422
+ multiple: a.value,
423
+ disabled: e.field.disabled === !0,
424
+ required: e.field.required
425
+ }, g, {
426
+ class: "absolute inset-0 h-full w-full cursor-pointer opacity-0 disabled:cursor-not-allowed",
427
+ onChange: b
428
+ }), null, 16, Ve),
429
+ h("div", Fe, [
430
+ h("p", null, x(n.value ? "Drop files here" : "Click to upload or drag & drop"), 1),
431
+ e.field.accept ? (l(), s("p", we, x(e.field.accept), 1)) : $("", !0)
432
+ ])
433
+ ], 34),
434
+ i.value.length ? (l(), s("ul", Be, [
435
+ (l(!0), s(F, null, w(i.value, (u, B) => (l(), s("li", {
436
+ key: `${u.name}-${B}`,
437
+ class: "border-input flex items-center justify-between rounded-md border px-3 py-2 text-sm"
438
+ }, [
439
+ h("span", Se, x(u.name), 1),
440
+ h("span", qe, x(A(u.size)), 1),
441
+ h("button", {
442
+ type: "button",
443
+ "aria-label": `Remove ${u.name}`,
444
+ class: "text-muted-foreground hover:text-destructive ml-2 shrink-0 transition-colors",
445
+ onClick: (Me) => R(B)
446
+ }, " × ", 8, Ce)
447
+ ]))), 128))
448
+ ])) : $("", !0)
449
+ ];
450
+ }),
451
+ _: 1
452
+ }, 8, ["field", "error", "touched"]));
453
+ }
454
+ }), Ae = { class: "mb-4" }, De = {
455
+ key: 0,
456
+ class: "mb-2 text-sm font-medium leading-none"
457
+ }, Ee = { class: "flex-1 space-y-0" }, Te = ["onClick"], Ie = /* @__PURE__ */ V({
458
+ __name: "ArrayField",
459
+ props: {
460
+ field: {},
461
+ form: {},
462
+ components: {}
463
+ },
464
+ setup(e) {
465
+ const m = e, t = U(), c = {
466
+ text: D,
467
+ email: D,
468
+ number: P,
469
+ textarea: L,
470
+ select: j,
471
+ checkbox: K,
472
+ radio: G,
473
+ date: H
474
+ };
475
+ function n(o) {
476
+ var r;
477
+ return o.component ? o.component : ((r = m.components) == null ? void 0 : r[o.type]) ?? t[o.type] ?? c[o.type] ?? null;
478
+ }
479
+ const { rows: d, append: i, remove: a } = ee(m.form, m.field.name);
480
+ function f(o) {
481
+ return M(m.form.values.value, o.name);
482
+ }
483
+ function b(o, r) {
484
+ m.form.setField(o.name, r);
485
+ }
486
+ function v(o) {
487
+ var g;
488
+ const r = m.form;
489
+ (g = r.touchField) == null || g.call(r, o.name);
490
+ }
491
+ function R(o) {
492
+ return m.form.errors.value[o.name] ?? [];
493
+ }
494
+ function A(o) {
495
+ return m.form.touched.value[o.name] ?? !1;
496
+ }
497
+ return (o, r) => (l(), s("div", Ae, [
498
+ e.field.label ? (l(), s("div", De, x(e.field.label), 1)) : $("", !0),
499
+ (l(!0), s(F, null, w(E(d), (g) => (l(), s("div", {
500
+ key: g.key,
501
+ class: "border-input bg-card mb-2 flex items-start gap-2 rounded-md border p-3"
502
+ }, [
503
+ h("div", Ee, [
504
+ (l(!0), s(F, null, w(g.fields, (y) => (l(), s(F, {
505
+ key: y.name
506
+ }, [
507
+ n(y) ? (l(), k(z(n(y)), {
508
+ key: 0,
509
+ field: y,
510
+ "model-value": f(y),
511
+ error: R(y),
512
+ touched: A(y),
513
+ "onUpdate:modelValue": (u) => b(y, u),
514
+ onBlur: (u) => v(y)
515
+ }, null, 40, ["field", "model-value", "error", "touched", "onUpdate:modelValue", "onBlur"])) : $("", !0)
516
+ ], 64))), 128))
517
+ ]),
518
+ h("button", {
519
+ type: "button",
520
+ class: "text-muted-foreground hover:text-destructive mt-7 shrink-0 rounded px-2 py-1 text-xs transition-colors",
521
+ onClick: (y) => E(a)(g.index)
522
+ }, " Remove ", 8, Te)
523
+ ]))), 128)),
524
+ h("button", {
525
+ type: "button",
526
+ class: "border-input hover:border-ring hover:text-foreground text-muted-foreground mt-1 rounded-md border border-dashed px-4 py-2 text-sm transition-colors",
527
+ onClick: r[0] || (r[0] = (g) => E(i)())
528
+ }, " + Add row ")
529
+ ]));
530
+ }
531
+ }), Ne = {
532
+ key: 1,
533
+ class: "border-input mb-4 rounded-md border p-4"
534
+ }, ze = {
535
+ key: 0,
536
+ class: "px-1 text-sm font-medium leading-none"
537
+ }, Ue = ["disabled"], Ke = /* @__PURE__ */ V({
538
+ __name: "ShadcnFormRenderer",
539
+ props: {
540
+ form: {},
541
+ components: {},
542
+ submitLabel: {},
543
+ fields: {}
544
+ },
545
+ emits: ["submit"],
546
+ setup(e, { emit: m }) {
547
+ const t = e, c = U(), n = m, d = {
548
+ text: D,
549
+ email: D,
550
+ number: P,
551
+ textarea: L,
552
+ select: j,
553
+ checkbox: K,
554
+ radio: G,
555
+ date: H,
556
+ file: Re
557
+ };
558
+ function i(r) {
559
+ var g;
560
+ return r.component ? r.component : ((g = t.components) == null ? void 0 : g[r.type]) ?? c[r.type] ?? d[r.type] ?? null;
561
+ }
562
+ function a(r) {
563
+ return M(t.form.values.value, r.name);
564
+ }
565
+ function f(r, g) {
566
+ t.form.setField(r.name, g);
567
+ }
568
+ function b(r) {
569
+ var y;
570
+ const g = t.form;
571
+ (y = g.touchField) == null || y.call(g, r.name);
572
+ }
573
+ function v(r) {
574
+ return t.form.errors.value[r.name] ?? [];
575
+ }
576
+ function R(r) {
577
+ return t.form.touched.value[r.name] ?? !1;
578
+ }
579
+ const A = p(
580
+ () => (t.fields ?? t.form.fields.value).filter((r) => r.visible !== !1)
581
+ );
582
+ async function o(r) {
583
+ r.preventDefault(), await t.form.submit(), n("submit");
584
+ }
585
+ return (r, g) => {
586
+ const y = Z("ShadcnFormRenderer", !0);
587
+ return l(), s("form", {
588
+ novalidate: "",
589
+ onSubmit: o
590
+ }, [
591
+ (l(!0), s(F, null, w(A.value, (u) => (l(), s(F, {
592
+ key: u.name
593
+ }, [
594
+ r.$slots[`field-${u.name}`] ? T(r.$slots, `field-${u.name}`, {
595
+ key: 0,
596
+ field: u,
597
+ value: a(u),
598
+ error: v(u),
599
+ touched: R(u),
600
+ setValue: (B) => f(u, B),
601
+ touch: () => b(u)
602
+ }) : u.type === "group" ? (l(), s("fieldset", Ne, [
603
+ u.label ? (l(), s("legend", ze, x(u.label), 1)) : $("", !0),
604
+ u.fields ? (l(), k(y, {
605
+ key: 1,
606
+ form: e.form,
607
+ fields: u.fields,
608
+ components: e.components
609
+ }, null, 8, ["form", "fields", "components"])) : $("", !0)
610
+ ])) : u.type === "array" ? (l(), k(Ie, {
611
+ key: 2,
612
+ field: u,
613
+ form: e.form,
614
+ components: e.components
615
+ }, null, 8, ["field", "form", "components"])) : i(u) ? (l(), k(z(i(u)), {
616
+ key: 3,
617
+ field: u,
618
+ "model-value": a(u),
619
+ error: v(u),
620
+ touched: R(u),
621
+ "onUpdate:modelValue": (B) => f(u, B),
622
+ onBlur: (B) => b(u)
623
+ }, null, 40, ["field", "model-value", "error", "touched", "onUpdate:modelValue", "onBlur"])) : $("", !0)
624
+ ], 64))), 128)),
625
+ T(r.$slots, "submit", {
626
+ isSubmitting: e.form.isSubmitting.value,
627
+ isValid: e.form.isValid.value
628
+ }, () => [
629
+ h("button", {
630
+ type: "submit",
631
+ disabled: e.form.isSubmitting.value,
632
+ class: "bg-primary text-primary-foreground hover:bg-primary/90 mt-2 inline-flex h-9 items-center justify-center rounded-md px-4 py-2 text-sm font-medium shadow transition-colors disabled:pointer-events-none disabled:opacity-50"
633
+ }, x(e.submitLabel ?? "Submit"), 9, Ue)
634
+ ])
635
+ ], 32);
636
+ };
637
+ }
638
+ });
639
+ export {
640
+ Ie as ShArrayField,
641
+ K as ShCheckboxField,
642
+ H as ShDateField,
643
+ Re as ShFileField,
644
+ P as ShNumberField,
645
+ G as ShRadioField,
646
+ j as ShSelectField,
647
+ D as ShTextField,
648
+ L as ShTextareaField,
649
+ Ke as ShadcnFormRenderer
650
+ };