@macrulez/vue-form-schema 0.1.7 → 0.1.9

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 (46) hide show
  1. package/LICENSE +21 -0
  2. package/dist/MaskEngine-DAKSNIHQ.cjs +1 -0
  3. package/dist/MaskEngine-mLoXKd4d.js +251 -0
  4. package/dist/core/ValidationEngine.d.ts +6 -0
  5. package/dist/core/ValidationEngine.d.ts.map +1 -1
  6. package/dist/core/types.d.ts +10 -2
  7. package/dist/core/types.d.ts.map +1 -1
  8. package/dist/core/useForm.d.ts.map +1 -1
  9. package/dist/index.cjs +1 -1
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +159 -151
  13. package/dist/ui/index.d.ts +1 -0
  14. package/dist/ui/index.d.ts.map +1 -1
  15. package/dist/ui/tailwind/index.d.ts +11 -0
  16. package/dist/ui/tailwind/index.d.ts.map +1 -0
  17. package/dist/ui-tailwind.cjs +1 -0
  18. package/dist/ui-tailwind.d.ts +397 -0
  19. package/dist/ui-tailwind.js +650 -0
  20. package/dist/ui.cjs +1 -1
  21. package/dist/ui.d.ts +47 -10
  22. package/dist/ui.js +436 -300
  23. package/dist/valibot.d.ts +10 -2
  24. package/dist/yup.d.ts +10 -2
  25. package/dist/zod.d.ts +10 -2
  26. package/package.json +38 -24
  27. package/dist/MaskEngine-BqJQYybS.js +0 -233
  28. package/dist/MaskEngine-BwAs2Zb0.cjs +0 -1
  29. package/dist/__tests__/ConditionEvaluator.test.d.ts +0 -2
  30. package/dist/__tests__/ConditionEvaluator.test.d.ts.map +0 -1
  31. package/dist/__tests__/MaskEngine.test.d.ts +0 -2
  32. package/dist/__tests__/MaskEngine.test.d.ts.map +0 -1
  33. package/dist/__tests__/ValidationEngine.test.d.ts +0 -2
  34. package/dist/__tests__/ValidationEngine.test.d.ts.map +0 -1
  35. package/dist/__tests__/parsers.test.d.ts +0 -2
  36. package/dist/__tests__/parsers.test.d.ts.map +0 -1
  37. package/dist/__tests__/phase3.test.d.ts +0 -2
  38. package/dist/__tests__/phase3.test.d.ts.map +0 -1
  39. package/dist/__tests__/phase4.test.d.ts +0 -2
  40. package/dist/__tests__/phase4.test.d.ts.map +0 -1
  41. package/dist/__tests__/useFieldArray.test.d.ts +0 -2
  42. package/dist/__tests__/useFieldArray.test.d.ts.map +0 -1
  43. package/dist/__tests__/useForm.test.d.ts +0 -2
  44. package/dist/__tests__/useForm.test.d.ts.map +0 -1
  45. package/dist/__tests__/useMultiStepForm.test.d.ts +0 -2
  46. package/dist/__tests__/useMultiStepForm.test.d.ts.map +0 -1
package/dist/ui.js CHANGED
@@ -1,10 +1,10 @@
1
- import { defineComponent as x, openBlock as t, createElementBlock as d, normalizeClass as A, createTextVNode as D, toDisplayString as v, createCommentVNode as k, renderSlot as q, Fragment as S, renderList as C, ref as K, onMounted as O, onUnmounted as Q, createBlock as V, withCtx as g, createElementVNode as b, computed as U, createVNode as p, unref as w, resolveDynamicComponent as E, resolveComponent as W, createSlots as X } from "vue";
2
- import { b as Y, n as I, l as Z, g as M } from "./MaskEngine-BqJQYybS.js";
3
- const _ = ["for"], ee = {
1
+ import { defineComponent as V, computed as B, openBlock as t, createElementBlock as r, normalizeClass as T, createTextVNode as I, toDisplayString as y, createCommentVNode as k, renderSlot as A, normalizeProps as W, guardReactiveProps as X, Fragment as x, renderList as S, ref as w, onMounted as Y, onUnmounted as Z, createBlock as F, withCtx as q, createElementVNode as b, mergeProps as R, createVNode as M, unref as z, resolveDynamicComponent as U, resolveComponent as _, createSlots as ee } from "vue";
2
+ import { b as te, t as P, q as le, h as K } from "./MaskEngine-mLoXKd4d.js";
3
+ const ae = ["for"], ne = {
4
4
  key: 0,
5
5
  class: "vfs-field__required",
6
6
  "aria-hidden": "true"
7
- }, te = ["id"], F = /* @__PURE__ */ x({
7
+ }, re = ["id"], C = /* @__PURE__ */ V({
8
8
  __name: "BaseField",
9
9
  props: {
10
10
  field: {},
@@ -12,37 +12,41 @@ const _ = ["for"], ee = {
12
12
  touched: { type: Boolean }
13
13
  },
14
14
  setup(e) {
15
- const r = e;
16
- return (a, s) => {
17
- var n, o;
18
- return t(), d("div", {
19
- class: A(["vfs-field", [`vfs-field--${r.field.type}`, { "vfs-field--error": e.touched && ((n = e.error) == null ? void 0 : n.length) }]])
15
+ const o = e, l = B(() => {
16
+ var u;
17
+ return !!(o.touched && ((u = o.error) != null && u.length));
18
+ }), s = B(() => `${o.field.name}-error`), a = B(() => ({
19
+ "aria-required": o.field.required ? "true" : void 0,
20
+ "aria-invalid": l.value ? "true" : "false",
21
+ "aria-describedby": l.value ? s.value : void 0
22
+ }));
23
+ return (u, m) => (t(), r("div", {
24
+ class: T(["vfs-field", [`vfs-field--${o.field.type}`, { "vfs-field--error": l.value }]])
25
+ }, [
26
+ o.field.label ? (t(), r("label", {
27
+ key: 0,
28
+ for: o.field.name,
29
+ class: "vfs-field__label"
20
30
  }, [
21
- r.field.label ? (t(), d("label", {
22
- key: 0,
23
- for: r.field.name,
24
- class: "vfs-field__label"
25
- }, [
26
- D(v(r.field.label) + " ", 1),
27
- r.field.required ? (t(), d("span", ee, "*")) : k("", !0)
28
- ], 8, _)) : k("", !0),
29
- q(a.$slots, "default"),
30
- e.touched && ((o = e.error) != null && o.length) ? (t(), d("ul", {
31
- key: 1,
32
- id: `${r.field.name}-error`,
33
- class: "vfs-field__errors",
34
- role: "alert",
35
- "aria-live": "polite"
36
- }, [
37
- (t(!0), d(S, null, C(e.error, (h, m) => (t(), d("li", {
38
- key: m,
39
- class: "vfs-field__error"
40
- }, v(h), 1))), 128))
41
- ], 8, te)) : k("", !0)
42
- ], 2);
43
- };
31
+ I(y(o.field.label) + " ", 1),
32
+ o.field.required ? (t(), r("span", ne, "*")) : k("", !0)
33
+ ], 8, ae)) : k("", !0),
34
+ A(u.$slots, "default", W(X(a.value))),
35
+ l.value ? (t(), r("ul", {
36
+ key: 1,
37
+ id: s.value,
38
+ class: "vfs-field__errors",
39
+ role: "alert",
40
+ "aria-live": "polite"
41
+ }, [
42
+ (t(!0), r(x, null, S(e.error, (f, h) => (t(), r("li", {
43
+ key: h,
44
+ class: "vfs-field__error"
45
+ }, y(f), 1))), 128))
46
+ ], 8, re)) : k("", !0)
47
+ ], 2));
44
48
  }
45
- }), le = ["id", "type", "name", "value", "placeholder", "disabled", "required"], N = /* @__PURE__ */ x({
49
+ }), oe = ["id", "type", "name", "value", "placeholder", "disabled", "required"], N = /* @__PURE__ */ V({
46
50
  __name: "TextField",
47
51
  props: {
48
52
  field: {},
@@ -51,40 +55,41 @@ const _ = ["for"], ee = {
51
55
  touched: { type: Boolean }
52
56
  },
53
57
  emits: ["update:modelValue", "blur"],
54
- setup(e, { emit: r }) {
55
- const a = e, s = r, n = K(null);
56
- let o = null;
57
- O(() => {
58
- n.value && a.field.mask && (o = Y(n.value, a.field.mask));
59
- }), Q(() => o == null ? void 0 : o());
60
- function h(m) {
61
- s("update:modelValue", m.target.value);
58
+ setup(e, { emit: o }) {
59
+ const l = e, s = o, a = w(null);
60
+ let u = null;
61
+ Y(() => {
62
+ a.value && l.field.mask && (u = te(a.value, l.field.mask));
63
+ }), Z(() => u == null ? void 0 : u());
64
+ function m(f) {
65
+ s("update:modelValue", f.target.value);
62
66
  }
63
- return (m, i) => (t(), V(F, {
67
+ return (f, h) => (t(), F(C, {
64
68
  field: e.field,
65
69
  error: e.error,
66
70
  touched: e.touched
67
71
  }, {
68
- default: g(() => [
69
- b("input", {
72
+ default: q((c) => [
73
+ b("input", R({
70
74
  id: e.field.name,
71
75
  ref_key: "inputRef",
72
- ref: n,
76
+ ref: a,
73
77
  type: e.field.type === "email" ? "email" : "text",
74
78
  name: e.field.name,
75
- value: e.modelValue,
79
+ value: e.modelValue ?? "",
76
80
  placeholder: e.field.placeholder,
77
81
  disabled: e.field.disabled === !0,
78
- required: e.field.required,
82
+ required: e.field.required
83
+ }, c, {
79
84
  class: "vfs-input",
80
- onInput: h,
81
- onBlur: i[0] || (i[0] = ($) => s("blur"))
82
- }, null, 40, le)
85
+ onInput: m,
86
+ onBlur: h[0] || (h[0] = (g) => s("blur"))
87
+ }), null, 16, oe)
83
88
  ]),
84
89
  _: 1
85
90
  }, 8, ["field", "error", "touched"]));
86
91
  }
87
- }), ne = ["id", "name", "value", "placeholder", "disabled", "required"], z = /* @__PURE__ */ x({
92
+ }), ie = ["id", "name", "value", "placeholder", "disabled", "required"], O = /* @__PURE__ */ V({
88
93
  __name: "NumberField",
89
94
  props: {
90
95
  field: {},
@@ -93,35 +98,36 @@ const _ = ["for"], ee = {
93
98
  touched: { type: Boolean }
94
99
  },
95
100
  emits: ["update:modelValue", "blur"],
96
- setup(e, { emit: r }) {
97
- const a = r;
98
- function s(n) {
99
- const o = n.target.value;
100
- a("update:modelValue", o === "" ? null : Number(o));
101
+ setup(e, { emit: o }) {
102
+ const l = o;
103
+ function s(a) {
104
+ const u = a.target.value;
105
+ l("update:modelValue", u === "" ? null : Number(u));
101
106
  }
102
- return (n, o) => (t(), V(F, {
107
+ return (a, u) => (t(), F(C, {
103
108
  field: e.field,
104
109
  error: e.error,
105
110
  touched: e.touched
106
111
  }, {
107
- default: g(() => [
108
- b("input", {
112
+ default: q((m) => [
113
+ b("input", R({
109
114
  id: e.field.name,
110
115
  type: "number",
111
116
  name: e.field.name,
112
117
  value: e.modelValue ?? "",
113
118
  placeholder: e.field.placeholder,
114
119
  disabled: e.field.disabled === !0,
115
- required: e.field.required,
120
+ required: e.field.required
121
+ }, m, {
116
122
  class: "vfs-input",
117
123
  onInput: s,
118
- onBlur: o[0] || (o[0] = (h) => a("blur"))
119
- }, null, 40, ne)
124
+ onBlur: u[0] || (u[0] = (f) => l("blur"))
125
+ }), null, 16, ie)
120
126
  ]),
121
127
  _: 1
122
128
  }, 8, ["field", "error", "touched"]));
123
129
  }
124
- }), ae = ["id", "name", "value", "placeholder", "disabled", "required"], P = /* @__PURE__ */ x({
130
+ }), ue = ["id", "name", "value", "placeholder", "disabled", "required"], j = /* @__PURE__ */ V({
125
131
  __name: "TextareaField",
126
132
  props: {
127
133
  field: {},
@@ -130,33 +136,34 @@ const _ = ["for"], ee = {
130
136
  touched: { type: Boolean }
131
137
  },
132
138
  emits: ["update:modelValue", "blur"],
133
- setup(e, { emit: r }) {
134
- const a = r;
135
- return (s, n) => (t(), V(F, {
139
+ setup(e, { emit: o }) {
140
+ const l = o;
141
+ return (s, a) => (t(), F(C, {
136
142
  field: e.field,
137
143
  error: e.error,
138
144
  touched: e.touched
139
145
  }, {
140
- default: g(() => [
141
- b("textarea", {
146
+ default: q((u) => [
147
+ b("textarea", R({
142
148
  id: e.field.name,
143
149
  name: e.field.name,
144
- value: e.modelValue,
150
+ value: e.modelValue ?? "",
145
151
  placeholder: e.field.placeholder,
146
152
  disabled: e.field.disabled === !0,
147
- required: e.field.required,
153
+ required: e.field.required
154
+ }, u, {
148
155
  class: "vfs-textarea",
149
- onInput: n[0] || (n[0] = (o) => a("update:modelValue", o.target.value)),
150
- onBlur: n[1] || (n[1] = (o) => a("blur"))
151
- }, null, 40, ae)
156
+ onInput: a[0] || (a[0] = (m) => l("update:modelValue", m.target.value)),
157
+ onBlur: a[1] || (a[1] = (m) => l("blur"))
158
+ }), null, 16, ue)
152
159
  ]),
153
160
  _: 1
154
161
  }, 8, ["field", "error", "touched"]));
155
162
  }
156
- }), oe = {
163
+ }), de = {
157
164
  key: 0,
158
165
  class: "vfs-select-loading"
159
- }, re = ["id", "name", "disabled", "required"], ue = ["selected"], de = ["value", "selected"], j = /* @__PURE__ */ x({
166
+ }, se = ["id", "name", "disabled", "required"], ce = ["selected"], me = ["value", "selected"], G = /* @__PURE__ */ V({
160
167
  __name: "SelectField",
161
168
  props: {
162
169
  field: {},
@@ -165,84 +172,94 @@ const _ = ["for"], ee = {
165
172
  touched: { type: Boolean }
166
173
  },
167
174
  emits: ["update:modelValue", "blur"],
168
- setup(e, { emit: r }) {
169
- const a = e, s = r, n = U(
170
- () => Array.isArray(a.field.options) ? a.field.options : []
175
+ setup(e, { emit: o }) {
176
+ const l = e, s = o, a = B(
177
+ () => Array.isArray(l.field.options) ? l.field.options : []
171
178
  );
172
- function o(h) {
173
- const m = h.target, i = n.value.find(($) => String($.value) === m.value);
174
- s("update:modelValue", (i == null ? void 0 : i.value) ?? m.value);
179
+ function u(m) {
180
+ const f = m.target, h = a.value.find((c) => String(c.value) === f.value);
181
+ s("update:modelValue", (h == null ? void 0 : h.value) ?? f.value);
175
182
  }
176
- return (h, m) => (t(), V(F, {
183
+ return (m, f) => (t(), F(C, {
177
184
  field: e.field,
178
185
  error: e.error,
179
186
  touched: e.touched
180
187
  }, {
181
- default: g(() => [
182
- e.field.optionsLoading ? (t(), d("div", oe, "Loading…")) : (t(), d("select", {
188
+ default: q((h) => [
189
+ e.field.optionsLoading ? (t(), r("div", de, "Loading…")) : (t(), r("select", R({
183
190
  key: 1,
184
191
  id: e.field.name,
185
192
  name: e.field.name,
186
193
  disabled: e.field.disabled === !0 || e.field.optionsLoading,
187
- required: e.field.required,
194
+ required: e.field.required
195
+ }, h, {
188
196
  class: "vfs-select",
189
- onChange: o,
190
- onBlur: m[0] || (m[0] = (i) => s("blur"))
191
- }, [
197
+ onChange: u,
198
+ onBlur: f[0] || (f[0] = (c) => s("blur"))
199
+ }), [
192
200
  b("option", {
193
201
  value: "",
194
202
  disabled: "",
195
203
  selected: e.modelValue === null || e.modelValue === void 0 || e.modelValue === ""
196
- }, v(e.field.placeholder ?? "Select an option"), 9, ue),
197
- (t(!0), d(S, null, C(n.value, (i) => (t(), d("option", {
198
- key: String(i.value),
199
- value: String(i.value),
200
- selected: e.modelValue === i.value
201
- }, v(i.label), 9, de))), 128))
202
- ], 40, re))
204
+ }, y(e.field.placeholder ?? "Select an option"), 9, ce),
205
+ (t(!0), r(x, null, S(a.value, (c) => (t(), r("option", {
206
+ key: String(c.value),
207
+ value: String(c.value),
208
+ selected: e.modelValue === c.value
209
+ }, y(c.label), 9, me))), 128))
210
+ ], 16, se))
203
211
  ]),
204
212
  _: 1
205
213
  }, 8, ["field", "error", "touched"]));
206
214
  }
207
- }), ie = { class: "vfs-checkbox-label" }, se = ["id", "name", "checked", "disabled", "required"], me = {
215
+ }), fe = { class: "vfs-checkbox-label" }, ve = ["id", "name", "checked", "disabled", "required", "aria-checked"], be = {
208
216
  key: 0,
209
217
  class: "vfs-checkbox-text"
210
- }, G = /* @__PURE__ */ x({
218
+ }, H = /* @__PURE__ */ V({
211
219
  __name: "CheckboxField",
212
220
  props: {
213
221
  field: {},
214
- modelValue: { type: Boolean },
222
+ modelValue: { type: [Boolean, null] },
215
223
  error: {},
216
224
  touched: { type: Boolean }
217
225
  },
218
226
  emits: ["update:modelValue", "blur"],
219
- setup(e, { emit: r }) {
220
- const a = r;
221
- return (s, n) => (t(), V(F, {
227
+ setup(e, { emit: o }) {
228
+ const l = o;
229
+ return (s, a) => (t(), F(C, {
222
230
  field: { ...e.field, label: void 0 },
223
231
  error: e.error,
224
232
  touched: e.touched
225
233
  }, {
226
- default: g(() => [
227
- b("label", ie, [
228
- b("input", {
234
+ default: q((u) => [
235
+ b("label", fe, [
236
+ b("input", R({
229
237
  id: e.field.name,
230
238
  type: "checkbox",
231
239
  name: e.field.name,
232
- checked: e.modelValue,
240
+ checked: !!e.modelValue,
233
241
  disabled: e.field.disabled === !0,
234
242
  required: e.field.required,
243
+ "aria-checked": e.modelValue ? "true" : "false"
244
+ }, u, {
235
245
  class: "vfs-checkbox",
236
- onChange: n[0] || (n[0] = (o) => a("update:modelValue", o.target.checked)),
237
- onBlur: n[1] || (n[1] = (o) => a("blur"))
238
- }, null, 40, se),
239
- e.field.label ? (t(), d("span", me, v(e.field.label), 1)) : k("", !0)
246
+ onChange: a[0] || (a[0] = (m) => l("update:modelValue", m.target.checked)),
247
+ onBlur: a[1] || (a[1] = (m) => l("blur"))
248
+ }), null, 16, ve),
249
+ e.field.label ? (t(), r("span", be, y(e.field.label), 1)) : k("", !0)
240
250
  ])
241
251
  ]),
242
252
  _: 1
243
253
  }, 8, ["field", "error", "touched"]));
244
254
  }
245
- }), ce = ["aria-labelledby"], fe = ["name", "value", "checked", "disabled", "onChange"], H = /* @__PURE__ */ x({
255
+ }), he = ["aria-required", "aria-invalid", "aria-describedby"], ye = {
256
+ key: 0,
257
+ class: "vfs-field__label"
258
+ }, $e = {
259
+ key: 0,
260
+ class: "vfs-field__required",
261
+ "aria-hidden": "true"
262
+ }, ke = { class: "vfs-radio-group" }, ge = ["name", "value", "checked", "disabled", "onChange"], Ve = ["id"], J = /* @__PURE__ */ V({
246
263
  __name: "RadioField",
247
264
  props: {
248
265
  field: {},
@@ -251,41 +268,56 @@ const _ = ["for"], ee = {
251
268
  touched: { type: Boolean }
252
269
  },
253
270
  emits: ["update:modelValue", "blur"],
254
- setup(e, { emit: r }) {
255
- const a = r;
256
- return (s, n) => (t(), V(F, {
257
- field: e.field,
258
- error: e.error,
259
- touched: e.touched
260
- }, {
261
- default: g(() => [
262
- b("div", {
263
- class: "vfs-radio-group",
264
- role: "radiogroup",
265
- "aria-labelledby": e.field.name + "-label"
271
+ setup(e, { emit: o }) {
272
+ const l = e, s = o, a = B(() => {
273
+ var f;
274
+ return !!(l.touched && ((f = l.error) != null && f.length));
275
+ }), u = B(() => `${l.field.name}-error`), m = B(
276
+ () => Array.isArray(l.field.options) ? l.field.options : []
277
+ );
278
+ return (f, h) => (t(), r("fieldset", {
279
+ class: T(["vfs-field vfs-field--radio", { "vfs-field--error": a.value }]),
280
+ "aria-required": e.field.required ? "true" : void 0,
281
+ "aria-invalid": a.value ? "true" : "false",
282
+ "aria-describedby": a.value ? u.value : void 0
283
+ }, [
284
+ e.field.label ? (t(), r("legend", ye, [
285
+ I(y(e.field.label) + " ", 1),
286
+ e.field.required ? (t(), r("span", $e, "*")) : k("", !0)
287
+ ])) : k("", !0),
288
+ b("div", ke, [
289
+ (t(!0), r(x, null, S(m.value, (c) => (t(), r("label", {
290
+ key: String(c.value),
291
+ class: "vfs-radio-label"
266
292
  }, [
267
- (t(!0), d(S, null, C(e.field.options, (o) => (t(), d("label", {
268
- key: String(o.value),
269
- class: "vfs-radio-label"
270
- }, [
271
- b("input", {
272
- type: "radio",
273
- name: e.field.name,
274
- value: String(o.value),
275
- checked: e.modelValue === o.value,
276
- disabled: e.field.disabled === !0,
277
- class: "vfs-radio",
278
- onChange: (h) => a("update:modelValue", o.value),
279
- onBlur: n[0] || (n[0] = (h) => a("blur"))
280
- }, null, 40, fe),
281
- D(" " + v(o.label), 1)
282
- ]))), 128))
283
- ], 8, ce)
293
+ b("input", {
294
+ type: "radio",
295
+ name: e.field.name,
296
+ value: String(c.value),
297
+ checked: e.modelValue === c.value,
298
+ disabled: e.field.disabled === !0,
299
+ class: "vfs-radio",
300
+ onChange: (g) => s("update:modelValue", c.value),
301
+ onBlur: h[0] || (h[0] = (g) => s("blur"))
302
+ }, null, 40, ge),
303
+ I(" " + y(c.label), 1)
304
+ ]))), 128))
284
305
  ]),
285
- _: 1
286
- }, 8, ["field", "error", "touched"]));
306
+ a.value ? (t(), r("ul", {
307
+ key: 1,
308
+ id: u.value,
309
+ class: "vfs-field__errors",
310
+ role: "alert",
311
+ "aria-live": "polite"
312
+ }, [
313
+ (t(!0), r(x, null, S(e.error, (c, g) => (t(), r("li", {
314
+ key: g,
315
+ class: "vfs-field__error"
316
+ }, y(c), 1))), 128))
317
+ ], 8, Ve)) : k("", !0)
318
+ ], 10, he));
287
319
  }
288
- }), ve = ["id", "name", "value", "disabled", "required"], J = /* @__PURE__ */ x({
320
+ }), pe = ["id", "name", "value", "disabled", "required"], Q = /* @__PURE__ */ V({
289
321
  __name: "DateField",
290
322
  props: {
291
323
  field: {},
@@ -294,33 +326,34 @@ const _ = ["for"], ee = {
294
326
  touched: { type: Boolean }
295
327
  },
296
328
  emits: ["update:modelValue", "blur"],
297
- setup(e, { emit: r }) {
298
- const a = r;
299
- return (s, n) => (t(), V(F, {
329
+ setup(e, { emit: o }) {
330
+ const l = o;
331
+ return (s, a) => (t(), F(C, {
300
332
  field: e.field,
301
333
  error: e.error,
302
334
  touched: e.touched
303
335
  }, {
304
- default: g(() => [
305
- b("input", {
336
+ default: q((u) => [
337
+ b("input", R({
306
338
  id: e.field.name,
307
339
  type: "date",
308
340
  name: e.field.name,
309
- value: e.modelValue,
341
+ value: e.modelValue ?? "",
310
342
  disabled: e.field.disabled === !0,
311
- required: e.field.required,
343
+ required: e.field.required
344
+ }, u, {
312
345
  class: "vfs-input",
313
- onInput: n[0] || (n[0] = (o) => a("update:modelValue", o.target.value)),
314
- onBlur: n[1] || (n[1] = (o) => a("blur"))
315
- }, null, 40, ve)
346
+ onInput: a[0] || (a[0] = (m) => l("update:modelValue", m.target.value)),
347
+ onBlur: a[1] || (a[1] = (m) => l("blur"))
348
+ }), null, 16, pe)
316
349
  ]),
317
350
  _: 1
318
351
  }, 8, ["field", "error", "touched"]));
319
352
  }
320
- }), be = { class: "vfs-array" }, he = {
353
+ }), xe = { class: "vfs-array" }, Fe = {
321
354
  key: 0,
322
355
  class: "vfs-field__label"
323
- }, ye = ["onClick"], $e = /* @__PURE__ */ x({
356
+ }, qe = ["onClick"], Be = /* @__PURE__ */ V({
324
357
  __name: "ArrayField",
325
358
  props: {
326
359
  field: {},
@@ -328,83 +361,184 @@ const _ = ["for"], ee = {
328
361
  components: {}
329
362
  },
330
363
  setup(e) {
331
- const r = e, a = I(), s = {
364
+ const o = e, l = P(), s = {
332
365
  text: N,
333
366
  email: N,
334
- number: z,
335
- textarea: P,
336
- select: j,
337
- checkbox: G,
338
- radio: H,
339
- date: J
367
+ number: O,
368
+ textarea: j,
369
+ select: G,
370
+ checkbox: H,
371
+ radio: J,
372
+ date: Q
340
373
  };
341
- function n(c) {
342
- var l;
343
- return c.component ? c.component : ((l = r.components) == null ? void 0 : l[c.type]) ?? a[c.type] ?? s[c.type] ?? null;
374
+ function a($) {
375
+ var n;
376
+ return $.component ? $.component : ((n = o.components) == null ? void 0 : n[$.type]) ?? l[$.type] ?? s[$.type] ?? null;
344
377
  }
345
- const { rows: o, append: h, remove: m } = Z(r.form, r.field.name);
346
- function i(c) {
347
- return M(r.form.values.value, c.name);
378
+ const { rows: u, append: m, remove: f } = le(o.form, o.field.name);
379
+ function h($) {
380
+ return K(o.form.values.value, $.name);
348
381
  }
349
- function $(c, l) {
350
- r.form.setField(c.name, l);
382
+ function c($, n) {
383
+ o.form.setField($.name, n);
351
384
  }
352
- function B(c) {
353
- var f;
354
- const l = r.form;
355
- (f = l.touchField) == null || f.call(l, c.name);
385
+ function g($) {
386
+ var i;
387
+ const n = o.form;
388
+ (i = n.touchField) == null || i.call(n, $.name);
356
389
  }
357
- function L(c) {
358
- return r.form.errors.value[c.name] ?? [];
390
+ function D($) {
391
+ return o.form.errors.value[$.name] ?? [];
359
392
  }
360
- function T(c) {
361
- return r.form.touched.value[c.name] ?? !1;
393
+ function L($) {
394
+ return o.form.touched.value[$.name] ?? !1;
362
395
  }
363
- return (c, l) => (t(), d("div", be, [
364
- p(F, {
396
+ return ($, n) => (t(), r("div", xe, [
397
+ M(C, {
365
398
  field: { ...e.field, label: void 0 },
366
399
  error: [],
367
400
  touched: !1
368
401
  }, {
369
- default: g(() => [
370
- e.field.label ? (t(), d("div", he, v(e.field.label), 1)) : k("", !0),
371
- (t(!0), d(S, null, C(w(o), (f) => (t(), d("div", {
372
- key: f.key,
402
+ default: q(() => [
403
+ e.field.label ? (t(), r("div", Fe, y(e.field.label), 1)) : k("", !0),
404
+ (t(!0), r(x, null, S(z(u), (i) => (t(), r("div", {
405
+ key: i.key,
373
406
  class: "vfs-array__row"
374
407
  }, [
375
- (t(!0), d(S, null, C(f.fields, (y) => (t(), d(S, {
376
- key: y.name
408
+ (t(!0), r(x, null, S(i.fields, (v) => (t(), r(x, {
409
+ key: v.name
377
410
  }, [
378
- n(y) ? (t(), V(E(n(y)), {
411
+ a(v) ? (t(), F(U(a(v)), {
379
412
  key: 0,
380
- field: y,
381
- "model-value": i(y),
382
- error: L(y),
383
- touched: T(y),
384
- "onUpdate:modelValue": (u) => $(y, u),
385
- onBlur: (u) => B(y)
413
+ field: v,
414
+ "model-value": h(v),
415
+ error: D(v),
416
+ touched: L(v),
417
+ "onUpdate:modelValue": (d) => c(v, d),
418
+ onBlur: (d) => g(v)
386
419
  }, null, 40, ["field", "model-value", "error", "touched", "onUpdate:modelValue", "onBlur"])) : k("", !0)
387
420
  ], 64))), 128)),
388
421
  b("button", {
389
422
  type: "button",
390
423
  class: "vfs-array__remove",
391
- onClick: (y) => w(m)(f.index)
392
- }, " Remove ", 8, ye)
424
+ onClick: (v) => z(f)(i.index)
425
+ }, " Remove ", 8, qe)
393
426
  ]))), 128)),
394
427
  b("button", {
395
428
  type: "button",
396
429
  class: "vfs-array__add",
397
- onClick: l[0] || (l[0] = (f) => w(h)())
430
+ onClick: n[0] || (n[0] = (i) => z(m)())
398
431
  }, " + Add row ")
399
432
  ]),
400
433
  _: 1
401
434
  }, 8, ["field"])
402
435
  ]));
403
436
  }
404
- }), ke = {
437
+ }), Se = ["id", "name", "accept", "multiple", "disabled", "required"], Ce = ["for"], Re = {
438
+ key: 0,
439
+ class: "vfs-file-hint"
440
+ }, De = {
441
+ key: 0,
442
+ class: "vfs-file-list"
443
+ }, Le = { class: "vfs-file-name" }, Ae = { class: "vfs-file-size" }, Ne = ["aria-label", "onClick"], Te = /* @__PURE__ */ V({
444
+ __name: "FileField",
445
+ props: {
446
+ field: {},
447
+ modelValue: {},
448
+ error: {},
449
+ touched: { type: Boolean }
450
+ },
451
+ emits: ["update:modelValue", "blur"],
452
+ setup(e, { emit: o }) {
453
+ const l = e, s = o, a = w(!1), u = w(null), m = B(() => l.modelValue ? Array.isArray(l.modelValue) ? l.modelValue : [l.modelValue] : []), f = B(() => l.field.multiple ?? !1);
454
+ function h(i) {
455
+ if (!i || i.length === 0) {
456
+ s("update:modelValue", null);
457
+ return;
458
+ }
459
+ f.value ? s("update:modelValue", Array.from(i)) : s("update:modelValue", i[0]);
460
+ }
461
+ function c(i) {
462
+ h(i.target.files), s("blur");
463
+ }
464
+ function g(i) {
465
+ var v;
466
+ a.value = !1, i.preventDefault(), h(((v = i.dataTransfer) == null ? void 0 : v.files) ?? null), s("blur");
467
+ }
468
+ function D(i) {
469
+ i.preventDefault(), a.value = !0;
470
+ }
471
+ function L() {
472
+ a.value = !1;
473
+ }
474
+ function $(i) {
475
+ const v = m.value.filter((d, p) => p !== i);
476
+ v.length === 0 ? (s("update:modelValue", null), u.value && (u.value.value = "")) : f.value ? s("update:modelValue", v) : s("update:modelValue", v[0]);
477
+ }
478
+ function n(i) {
479
+ return i < 1024 ? `${i} B` : i < 1024 * 1024 ? `${(i / 1024).toFixed(1)} KB` : `${(i / (1024 * 1024)).toFixed(1)} MB`;
480
+ }
481
+ return (i, v) => (t(), F(C, {
482
+ field: e.field,
483
+ error: e.error,
484
+ touched: e.touched
485
+ }, {
486
+ default: q((d) => [
487
+ b("div", {
488
+ class: T(["vfs-file-zone", { "vfs-file-zone--dragging": a.value }]),
489
+ onDragover: D,
490
+ onDragleave: L,
491
+ onDrop: g
492
+ }, [
493
+ b("input", R({
494
+ id: e.field.name,
495
+ ref_key: "inputRef",
496
+ ref: u,
497
+ type: "file",
498
+ name: e.field.name,
499
+ accept: e.field.accept,
500
+ multiple: f.value,
501
+ disabled: e.field.disabled === !0,
502
+ required: e.field.required
503
+ }, d, {
504
+ class: "vfs-file-input",
505
+ onChange: c
506
+ }), null, 16, Se),
507
+ b("label", {
508
+ for: e.field.name,
509
+ class: "vfs-file-label"
510
+ }, [
511
+ v[0] || (v[0] = b("span", {
512
+ class: "vfs-file-icon",
513
+ "aria-hidden": "true"
514
+ }, "📁", -1)),
515
+ b("span", null, y(a.value ? "Drop files here" : "Click to upload or drag & drop"), 1),
516
+ e.field.accept ? (t(), r("span", Re, y(e.field.accept), 1)) : k("", !0)
517
+ ], 8, Ce)
518
+ ], 34),
519
+ m.value.length ? (t(), r("ul", De, [
520
+ (t(!0), r(x, null, S(m.value, (p, E) => (t(), r("li", {
521
+ key: `${p.name}-${E}`,
522
+ class: "vfs-file-item"
523
+ }, [
524
+ b("span", Le, y(p.name), 1),
525
+ b("span", Ae, y(n(p.size)), 1),
526
+ b("button", {
527
+ type: "button",
528
+ class: "vfs-file-remove",
529
+ "aria-label": `Remove ${p.name}`,
530
+ onClick: (He) => $(E)
531
+ }, " × ", 8, Ne)
532
+ ]))), 128))
533
+ ])) : k("", !0)
534
+ ]),
535
+ _: 1
536
+ }, 8, ["field", "error", "touched"]));
537
+ }
538
+ }), ze = {
405
539
  key: 1,
406
540
  class: "vfs-group"
407
- }, Ve = { key: 0 }, ge = ["disabled"], xe = /* @__PURE__ */ x({
541
+ }, Ie = { key: 0 }, we = ["disabled"], Ee = /* @__PURE__ */ V({
408
542
  __name: "FormRenderer",
409
543
  props: {
410
544
  form: {},
@@ -412,103 +546,104 @@ const _ = ["for"], ee = {
412
546
  submitLabel: {}
413
547
  },
414
548
  emits: ["submit"],
415
- setup(e, { emit: r }) {
416
- const a = e, s = I(), n = r, o = {
549
+ setup(e, { emit: o }) {
550
+ const l = e, s = P(), a = o, u = {
417
551
  text: N,
418
552
  email: N,
419
- number: z,
420
- textarea: P,
421
- select: j,
422
- checkbox: G,
423
- radio: H,
424
- date: J
553
+ number: O,
554
+ textarea: j,
555
+ select: G,
556
+ checkbox: H,
557
+ radio: J,
558
+ date: Q,
559
+ file: Te
425
560
  };
426
- function h(l) {
427
- var f;
428
- return l.component ? l.component : ((f = a.components) == null ? void 0 : f[l.type]) ?? s[l.type] ?? o[l.type] ?? null;
561
+ function m(n) {
562
+ var i;
563
+ return n.component ? n.component : ((i = l.components) == null ? void 0 : i[n.type]) ?? s[n.type] ?? u[n.type] ?? null;
429
564
  }
430
- function m(l) {
431
- return M(a.form.values.value, l.name);
565
+ function f(n) {
566
+ return K(l.form.values.value, n.name);
432
567
  }
433
- function i(l, f) {
434
- a.form.setField(l.name, f);
568
+ function h(n, i) {
569
+ l.form.setField(n.name, i);
435
570
  }
436
- function $(l) {
437
- var y;
438
- const f = a.form;
439
- (y = f.touchField) == null || y.call(f, l.name);
571
+ function c(n) {
572
+ var v;
573
+ const i = l.form;
574
+ (v = i.touchField) == null || v.call(i, n.name);
440
575
  }
441
- function B(l) {
442
- return a.form.errors.value[l.name] ?? [];
576
+ function g(n) {
577
+ return l.form.errors.value[n.name] ?? [];
443
578
  }
444
- function L(l) {
445
- return a.form.touched.value[l.name] ?? !1;
579
+ function D(n) {
580
+ return l.form.touched.value[n.name] ?? !1;
446
581
  }
447
- const T = U(
448
- () => a.form.fields.value.filter((l) => l.visible !== !1)
582
+ const L = B(
583
+ () => l.form.fields.value.filter((n) => n.visible !== !1)
449
584
  );
450
- async function c(l) {
451
- l.preventDefault(), await a.form.submit(), n("submit");
585
+ async function $(n) {
586
+ n.preventDefault(), await l.form.submit(), a("submit");
452
587
  }
453
- return (l, f) => {
454
- const y = W("FormRenderer", !0);
455
- return t(), d("form", {
588
+ return (n, i) => {
589
+ const v = _("FormRenderer", !0);
590
+ return t(), r("form", {
456
591
  class: "vfs-form",
457
592
  novalidate: "",
458
- onSubmit: c
593
+ onSubmit: $
459
594
  }, [
460
- (t(!0), d(S, null, C(T.value, (u) => (t(), d(S, {
461
- key: u.name
595
+ (t(!0), r(x, null, S(L.value, (d) => (t(), r(x, {
596
+ key: d.name
462
597
  }, [
463
- l.$slots[`field-${u.name}`] ? q(l.$slots, `field-${u.name}`, {
598
+ n.$slots[`field-${d.name}`] ? A(n.$slots, `field-${d.name}`, {
464
599
  key: 0,
465
- field: u,
466
- value: m(u),
467
- error: B(u),
468
- touched: L(u),
469
- setValue: (R) => i(u, R),
470
- touch: () => $(u)
471
- }) : u.type === "group" ? (t(), d("fieldset", ke, [
472
- u.label ? (t(), d("legend", Ve, v(u.label), 1)) : k("", !0),
473
- u.fields ? (t(), V(y, {
600
+ field: d,
601
+ value: f(d),
602
+ error: g(d),
603
+ touched: D(d),
604
+ setValue: (p) => h(d, p),
605
+ touch: () => c(d)
606
+ }) : d.type === "group" ? (t(), r("fieldset", ze, [
607
+ d.label ? (t(), r("legend", Ie, y(d.label), 1)) : k("", !0),
608
+ d.fields ? (t(), F(v, {
474
609
  key: 1,
475
610
  form: e.form,
476
611
  components: e.components
477
612
  }, null, 8, ["form", "components"])) : k("", !0)
478
- ])) : u.type === "array" ? (t(), V($e, {
613
+ ])) : d.type === "array" ? (t(), F(Be, {
479
614
  key: 2,
480
- field: u,
615
+ field: d,
481
616
  form: e.form,
482
617
  components: e.components
483
- }, null, 8, ["field", "form", "components"])) : h(u) ? (t(), V(E(h(u)), {
618
+ }, null, 8, ["field", "form", "components"])) : m(d) ? (t(), F(U(m(d)), {
484
619
  key: 3,
485
- field: u,
486
- "model-value": m(u),
487
- error: B(u),
488
- touched: L(u),
489
- "onUpdate:modelValue": (R) => i(u, R),
490
- onBlur: (R) => $(u)
491
- }, X({ _: 2 }, [
492
- l.$slots[`label-${u.name}`] ? {
620
+ field: d,
621
+ "model-value": f(d),
622
+ error: g(d),
623
+ touched: D(d),
624
+ "onUpdate:modelValue": (p) => h(d, p),
625
+ onBlur: (p) => c(d)
626
+ }, ee({ _: 2 }, [
627
+ n.$slots[`label-${d.name}`] ? {
493
628
  name: "label",
494
- fn: g(() => [
495
- q(l.$slots, `label-${u.name}`, { field: u })
629
+ fn: q(() => [
630
+ A(n.$slots, `label-${d.name}`, { field: d })
496
631
  ]),
497
632
  key: "0"
498
633
  } : void 0,
499
- l.$slots[`error-${u.name}`] ? {
634
+ n.$slots[`error-${d.name}`] ? {
500
635
  name: "error",
501
- fn: g(() => [
502
- q(l.$slots, `error-${u.name}`, {
503
- field: u,
504
- error: B(u)
636
+ fn: q(() => [
637
+ A(n.$slots, `error-${d.name}`, {
638
+ field: d,
639
+ error: g(d)
505
640
  })
506
641
  ]),
507
642
  key: "1"
508
643
  } : void 0
509
644
  ]), 1064, ["field", "model-value", "error", "touched", "onUpdate:modelValue", "onBlur"])) : k("", !0)
510
645
  ], 64))), 128)),
511
- q(l.$slots, "submit", {
646
+ A(n.$slots, "submit", {
512
647
  isSubmitting: e.form.isSubmitting.value,
513
648
  isValid: e.form.isValid.value
514
649
  }, () => [
@@ -516,15 +651,15 @@ const _ = ["for"], ee = {
516
651
  type: "submit",
517
652
  disabled: e.form.isSubmitting.value,
518
653
  class: "vfs-submit"
519
- }, v(e.submitLabel ?? "Submit"), 9, ge)
654
+ }, y(e.submitLabel ?? "Submit"), 9, we)
520
655
  ])
521
656
  ], 32);
522
657
  };
523
658
  }
524
- }), Se = { class: "vfs-multistep" }, Be = { class: "vfs-multistep__steps" }, Fe = { class: "vfs-multistep__step-number" }, Ce = {
659
+ }), Me = { class: "vfs-multistep" }, Ue = { class: "vfs-multistep__steps" }, Pe = { class: "vfs-multistep__step-number" }, Ke = {
525
660
  key: 0,
526
661
  class: "vfs-multistep__step-label"
527
- }, qe = { class: "vfs-multistep__progress" }, Le = { class: "vfs-multistep__nav" }, Re = ["disabled"], we = /* @__PURE__ */ x({
662
+ }, Oe = { class: "vfs-multistep__progress" }, je = { class: "vfs-multistep__nav" }, Ge = ["disabled"], We = /* @__PURE__ */ V({
528
663
  __name: "MultiStepFormRenderer",
529
664
  props: {
530
665
  form: {},
@@ -535,55 +670,55 @@ const _ = ["for"], ee = {
535
670
  stepLabels: {}
536
671
  },
537
672
  emits: ["submit"],
538
- setup(e, { emit: r }) {
539
- const a = e, s = r;
540
- async function n() {
541
- await a.form.next();
673
+ setup(e, { emit: o }) {
674
+ const l = e, s = o;
675
+ async function a() {
676
+ await l.form.next();
542
677
  }
543
- async function o() {
544
- await a.form.submit(), s("submit");
678
+ async function u() {
679
+ await l.form.submit(), s("submit");
545
680
  }
546
- return (h, m) => (t(), d("div", Se, [
547
- b("div", Be, [
548
- (t(!0), d(S, null, C(e.form.steps, (i, $) => {
549
- var B;
550
- return t(), d("div", {
551
- key: $,
552
- class: A(["vfs-multistep__step", {
553
- "vfs-multistep__step--active": $ === e.form.currentStep.value,
554
- "vfs-multistep__step--done": $ < e.form.currentStep.value
681
+ return (m, f) => (t(), r("div", Me, [
682
+ b("div", Ue, [
683
+ (t(!0), r(x, null, S(e.form.steps, (h, c) => {
684
+ var g;
685
+ return t(), r("div", {
686
+ key: c,
687
+ class: T(["vfs-multistep__step", {
688
+ "vfs-multistep__step--active": c === e.form.currentStep.value,
689
+ "vfs-multistep__step--done": c < e.form.currentStep.value
555
690
  }])
556
691
  }, [
557
- b("span", Fe, v($ + 1), 1),
558
- (B = e.stepLabels) != null && B[$] ? (t(), d("span", Ce, v(e.stepLabels[$]), 1)) : k("", !0)
692
+ b("span", Pe, y(c + 1), 1),
693
+ (g = e.stepLabels) != null && g[c] ? (t(), r("span", Ke, y(e.stepLabels[c]), 1)) : k("", !0)
559
694
  ], 2);
560
695
  }), 128))
561
696
  ]),
562
- b("div", qe, " Step " + v(e.form.currentStep.value + 1) + " of " + v(e.form.totalSteps), 1),
563
- p(xe, {
697
+ b("div", Oe, " Step " + y(e.form.currentStep.value + 1) + " of " + y(e.form.totalSteps), 1),
698
+ M(Ee, {
564
699
  form: e.form.form.value,
565
700
  components: e.components
566
701
  }, {
567
- submit: g(() => [
568
- b("div", Le, [
569
- e.form.isFirstStep.value ? k("", !0) : (t(), d("button", {
702
+ submit: q(() => [
703
+ b("div", je, [
704
+ e.form.isFirstStep.value ? k("", !0) : (t(), r("button", {
570
705
  key: 0,
571
706
  type: "button",
572
707
  class: "vfs-multistep__back",
573
- onClick: m[0] || (m[0] = (i) => e.form.back())
574
- }, v(e.backLabel ?? "← Back"), 1)),
575
- e.form.isLastStep.value ? (t(), d("button", {
708
+ onClick: f[0] || (f[0] = (h) => e.form.back())
709
+ }, y(e.backLabel ?? "← Back"), 1)),
710
+ e.form.isLastStep.value ? (t(), r("button", {
576
711
  key: 2,
577
712
  type: "button",
578
713
  class: "vfs-submit",
579
714
  disabled: e.form.isSubmitting.value,
580
- onClick: o
581
- }, v(e.submitLabel ?? "Submit"), 9, Re)) : (t(), d("button", {
715
+ onClick: u
716
+ }, y(e.submitLabel ?? "Submit"), 9, Ge)) : (t(), r("button", {
582
717
  key: 1,
583
718
  type: "button",
584
719
  class: "vfs-multistep__next",
585
- onClick: n
586
- }, v(e.nextLabel ?? "Next →"), 1))
720
+ onClick: a
721
+ }, y(e.nextLabel ?? "Next →"), 1))
587
722
  ])
588
723
  ]),
589
724
  _: 1
@@ -592,14 +727,15 @@ const _ = ["for"], ee = {
592
727
  }
593
728
  });
594
729
  export {
595
- $e as ArrayField,
596
- G as CheckboxField,
597
- J as DateField,
598
- xe as FormRenderer,
599
- we as MultiStepFormRenderer,
600
- z as NumberField,
601
- H as RadioField,
602
- j as SelectField,
730
+ Be as ArrayField,
731
+ H as CheckboxField,
732
+ Q as DateField,
733
+ Te as FileField,
734
+ Ee as FormRenderer,
735
+ We as MultiStepFormRenderer,
736
+ O as NumberField,
737
+ J as RadioField,
738
+ G as SelectField,
603
739
  N as TextField,
604
- P as TextareaField
740
+ j as TextareaField
605
741
  };