@effect-app/vue-components 3.0.1 → 3.0.2

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 (34) hide show
  1. package/dist/vue-components.es10.js +26 -22
  2. package/dist/vue-components.es11.js +2 -2
  3. package/dist/vue-components.es12.js +1 -1
  4. package/dist/vue-components.es16.js +11 -4
  5. package/dist/vue-components.es17.js +4 -10
  6. package/dist/vue-components.es18.js +10 -55
  7. package/dist/vue-components.es19.js +50 -63
  8. package/dist/vue-components.es20.js +68 -6
  9. package/dist/vue-components.es21.js +5 -5
  10. package/dist/vue-components.es22.js +6 -3
  11. package/dist/vue-components.es23.js +3 -3
  12. package/dist/vue-components.es24.js +3 -2
  13. package/dist/vue-components.es25.js +1 -1
  14. package/dist/vue-components.es26.js +1 -1
  15. package/dist/vue-components.es27.js +1 -1
  16. package/dist/vue-components.es28.js +2 -17
  17. package/dist/vue-components.es29.js +16 -10
  18. package/dist/vue-components.es30.js +41 -191
  19. package/dist/vue-components.es32.js +2 -42
  20. package/dist/vue-components.es33.js +111 -2
  21. package/dist/vue-components.es35.js +7 -111
  22. package/dist/vue-components.es36.js +34 -0
  23. package/dist/vue-components.es38.js +187 -27
  24. package/dist/vue-components.es40.js +1 -1
  25. package/dist/vue-components.es5.js +1 -1
  26. package/dist/vue-components.es6.js +31 -37
  27. package/dist/vue-components.es7.js +1 -1
  28. package/package.json +1 -1
  29. package/src/components/OmegaForm/OmegaInput.vue +0 -13
  30. package/src/components/OmegaForm/OmegaInternalInput.vue +1 -0
  31. package/src/components/OmegaForm/useOmegaForm.ts +12 -2
  32. package/src/components/OmegaForm/useRegisterField.ts +3 -1
  33. package/dist/vue-components.es37.js +0 -9
  34. /package/dist/{vue-components.es34.js → vue-components.es31.js} +0 -0
@@ -1,34 +1,194 @@
1
- import { defineComponent as m, createElementBlock as d, openBlock as u, withModifiers as f, createElementVNode as l, unref as s, renderSlot as a } from "vue";
2
- import { useStore as b } from "@tanstack/vue-form";
3
- import { usePreventClose as p } from "./vue-components.es11.js";
4
- import { getOmegaStore as c } from "./vue-components.es53.js";
5
- const S = ["disabled"], V = /* @__PURE__ */ m({
6
- __name: "OmegaWrapper",
1
+ import { defineComponent as k, resolveComponent as b, createElementBlock as v, openBlock as a, createBlock as n, createCommentVNode as u, resolveDynamicComponent as g, mergeProps as o, createSlots as d, withCtx as r, renderSlot as m, normalizeProps as s, guardReactiveProps as P, unref as C, Fragment as V, renderList as U } from "vue";
2
+ import { getInputType as c } from "./vue-components.es12.js";
3
+ const w = /* @__PURE__ */ k({
4
+ inheritAttrs: !1,
5
+ __name: "OmegaInputVuetify",
7
6
  props: {
8
- form: {},
9
- disabled: { type: Boolean },
10
- subscribe: {}
7
+ inputProps: {},
8
+ field: {},
9
+ state: {}
11
10
  },
12
- setup(o) {
13
- const e = o, i = b(
14
- e.form.store,
15
- (t) => t.isSubmitting
16
- ), n = c(
17
- e.form,
18
- e.subscribe
19
- );
20
- return e.form.ignorePreventCloseEvents || p(() => e.form.useStore((t) => t.isDirty)), (t, r) => (u(), d("form", {
21
- novalidate: "",
22
- onSubmit: r[0] || (r[0] = f((v) => o.form.handleSubmit(), ["prevent", "stop"]))
23
- }, [
24
- l("fieldset", {
25
- disabled: s(i) || o.disabled
11
+ emits: ["focus", "blur"],
12
+ setup(e) {
13
+ return (l, i) => {
14
+ const y = b("v-text-field"), p = b("v-textarea"), f = b("v-radio"), h = b("v-radio-group"), q = b("v-select"), $ = b("v-autocomplete");
15
+ return a(), v("div", {
16
+ class: "omega-input",
17
+ onFocusout: i[4] || (i[4] = (t) => l.$emit("blur", t)),
18
+ onFocusin: i[5] || (i[5] = (t) => l.$emit("focus", t))
26
19
  }, [
27
- a(t.$slots, "default", { subscribedValues: s(n) }, void 0, !0)
28
- ], 8, S)
29
- ], 32));
20
+ e.inputProps.type === "boolean" || e.inputProps.type === "switch" ? (a(), n(g(e.inputProps.type === "boolean" ? "v-checkbox" : "v-switch"), o({
21
+ key: 0,
22
+ id: e.inputProps.id,
23
+ name: e.field.name,
24
+ label: e.inputProps.label,
25
+ "error-messages": e.inputProps.errorMessages,
26
+ error: e.inputProps.error,
27
+ ripple: ""
28
+ }, l.$attrs, {
29
+ "model-value": e.state.value,
30
+ onChange: i[0] || (i[0] = (t) => e.field.handleChange(t.target.checked))
31
+ }), d({ _: 2 }, [
32
+ l.$slots.label ? {
33
+ name: "label",
34
+ fn: r(() => [
35
+ m(l.$slots, "label", s(P({ required: e.inputProps.required, id: e.inputProps.id, label: e.inputProps.label })))
36
+ ]),
37
+ key: "0"
38
+ } : void 0
39
+ ]), 1040, ["id", "name", "label", "error-messages", "error", "model-value"])) : u("", !0),
40
+ e.inputProps.type === "email" || e.inputProps.type === "string" || e.inputProps.type === "password" || e.inputProps.type === "date" ? (a(), n(y, o({
41
+ key: 1,
42
+ id: e.inputProps.id,
43
+ required: e.inputProps.required,
44
+ "min-length": e.inputProps.minLength,
45
+ "max-length": e.inputProps.maxLength,
46
+ type: C(c)(e.inputProps.type),
47
+ name: e.field.name,
48
+ label: e.inputProps.label,
49
+ "error-messages": e.inputProps.errorMessages,
50
+ error: e.inputProps.error
51
+ }, l.$attrs, {
52
+ "model-value": e.state.value,
53
+ "onUpdate:modelValue": e.field.handleChange
54
+ }), d({ _: 2 }, [
55
+ l.$slots.label ? {
56
+ name: "label",
57
+ fn: r(() => [
58
+ m(l.$slots, "label", s(P({ required: e.inputProps.required, id: e.inputProps.id, label: e.inputProps.label })))
59
+ ]),
60
+ key: "0"
61
+ } : void 0
62
+ ]), 1040, ["id", "required", "min-length", "max-length", "type", "name", "label", "error-messages", "error", "model-value", "onUpdate:modelValue"])) : u("", !0),
63
+ e.inputProps.type === "text" ? (a(), n(p, o({
64
+ key: 2,
65
+ id: e.inputProps.id,
66
+ required: e.inputProps.required,
67
+ "min-length": e.inputProps.minLength,
68
+ "max-length": e.inputProps.maxLength,
69
+ name: e.field.name,
70
+ label: e.inputProps.label,
71
+ "error-messages": e.inputProps.errorMessages,
72
+ error: e.inputProps.error
73
+ }, l.$attrs, {
74
+ "model-value": e.state.value,
75
+ "onUpdate:modelValue": e.field.handleChange
76
+ }), d({ _: 2 }, [
77
+ l.$slots.label ? {
78
+ name: "label",
79
+ fn: r(() => [
80
+ m(l.$slots, "label", s(P({ required: e.inputProps.required, id: e.inputProps.id, label: e.inputProps.label })))
81
+ ]),
82
+ key: "0"
83
+ } : void 0
84
+ ]), 1040, ["id", "required", "min-length", "max-length", "name", "label", "error-messages", "error", "model-value", "onUpdate:modelValue"])) : u("", !0),
85
+ e.inputProps.type === "number" || e.inputProps.type === "range" ? (a(), n(g(e.inputProps.type === "range" ? "v-slider" : "v-text-field"), o({
86
+ key: 3,
87
+ id: e.inputProps.id,
88
+ required: e.inputProps.required,
89
+ min: e.inputProps.min,
90
+ max: e.inputProps.max,
91
+ type: e.inputProps.type,
92
+ name: e.field.name,
93
+ label: e.inputProps.label,
94
+ "error-messages": e.inputProps.errorMessages,
95
+ error: e.inputProps.error
96
+ }, l.$attrs, {
97
+ "model-value": e.state.value,
98
+ "onUpdate:modelValue": i[1] || (i[1] = (t) => {
99
+ t || t === 0 ? e.field.handleChange(Number(t)) : e.field.handleChange(void 0);
100
+ })
101
+ }), d({ _: 2 }, [
102
+ l.$slots.label ? {
103
+ name: "label",
104
+ fn: r(() => [
105
+ m(l.$slots, "label", s(P({ required: e.inputProps.required, id: e.inputProps.id, label: e.inputProps.label })))
106
+ ]),
107
+ key: "0"
108
+ } : void 0
109
+ ]), 1040, ["id", "required", "min", "max", "type", "name", "label", "error-messages", "error", "model-value"])) : u("", !0),
110
+ e.inputProps.type === "radio" ? (a(), n(h, o({
111
+ key: 4,
112
+ id: e.inputProps.id,
113
+ name: e.field.name,
114
+ label: e.inputProps.label,
115
+ "error-messages": e.inputProps.errorMessages,
116
+ error: e.inputProps.error
117
+ }, l.$attrs, {
118
+ "model-value": e.state.value,
119
+ "onUpdate:modelValue": e.field.handleChange
120
+ }), d({
121
+ default: r(() => [
122
+ (a(!0), v(V, null, U(e.inputProps.options, (t) => (a(), n(f, {
123
+ key: t.value,
124
+ label: t.title,
125
+ value: t.value
126
+ }, null, 8, ["label", "value"]))), 128))
127
+ ]),
128
+ _: 2
129
+ }, [
130
+ l.$slots.label ? {
131
+ name: "label",
132
+ fn: r(() => [
133
+ m(l.$slots, "label", s(P({ required: e.inputProps.required, id: e.inputProps.id, label: e.inputProps.label })))
134
+ ]),
135
+ key: "0"
136
+ } : void 0
137
+ ]), 1040, ["id", "name", "label", "error-messages", "error", "model-value", "onUpdate:modelValue"])) : u("", !0),
138
+ e.inputProps.type === "select" || e.inputProps.type === "multiple" ? (a(), n(q, o({
139
+ key: 5,
140
+ id: e.inputProps.id,
141
+ clearable: e.inputProps.type === "select",
142
+ required: e.inputProps.required,
143
+ multiple: e.inputProps.type === "multiple",
144
+ chips: e.inputProps.type === "multiple",
145
+ name: e.field.name,
146
+ label: e.inputProps.label,
147
+ items: e.inputProps.options,
148
+ "error-messages": e.inputProps.errorMessages,
149
+ error: e.inputProps.error
150
+ }, l.$attrs, {
151
+ "model-value": e.state.value,
152
+ onClear: i[2] || (i[2] = (t) => e.field.handleChange(void 0)),
153
+ "onUpdate:modelValue": e.field.handleChange
154
+ }), d({ _: 2 }, [
155
+ l.$slots.label ? {
156
+ name: "label",
157
+ fn: r(() => [
158
+ m(l.$slots, "label", s(P({ required: e.inputProps.required, id: e.inputProps.id, label: e.inputProps.label })))
159
+ ]),
160
+ key: "0"
161
+ } : void 0
162
+ ]), 1040, ["id", "clearable", "required", "multiple", "chips", "name", "label", "items", "error-messages", "error", "model-value", "onUpdate:modelValue"])) : u("", !0),
163
+ e.inputProps.type === "autocomplete" || e.inputProps.type === "autocompletemultiple" ? (a(), n($, o({
164
+ key: 6,
165
+ id: e.inputProps.id,
166
+ clearable: e.inputProps.type === "autocomplete",
167
+ multiple: e.inputProps.type === "autocompletemultiple",
168
+ required: e.inputProps.required,
169
+ name: e.field.name,
170
+ label: e.inputProps.label,
171
+ items: e.inputProps.options,
172
+ "error-messages": e.inputProps.errorMessages,
173
+ error: e.inputProps.error,
174
+ chips: e.inputProps.type === "autocompletemultiple"
175
+ }, l.$attrs, {
176
+ "model-value": e.state.value,
177
+ onClear: i[3] || (i[3] = (t) => e.field.handleChange(void 0)),
178
+ "onUpdate:modelValue": e.field.handleChange
179
+ }), d({ _: 2 }, [
180
+ l.$slots.label ? {
181
+ name: "label",
182
+ fn: r(() => [
183
+ m(l.$slots, "label", s(P({ required: e.inputProps.required, id: e.inputProps.id, label: e.inputProps.label })))
184
+ ]),
185
+ key: "0"
186
+ } : void 0
187
+ ]), 1040, ["id", "clearable", "multiple", "required", "name", "label", "items", "error-messages", "error", "chips", "model-value", "onUpdate:modelValue"])) : u("", !0)
188
+ ], 32);
189
+ };
30
190
  }
31
191
  });
32
192
  export {
33
- V as default
193
+ w as default
34
194
  };
@@ -1,5 +1,5 @@
1
1
  (function(){"use strict";try{if(typeof document<"u"){var i=document.createElement("style");if(i.appendChild(document.createTextNode(".omega-input .v-input__details:has(.v-messages:empty){grid-template-rows:0fr;transition:all .2s}.omega-input .v-messages:empty{min-height:0}.omega-input .v-input__details:has(.v-messages){transition:all .2s;overflow:hidden;min-height:0;display:grid;grid-template-rows:1fr}.omega-input .v-messages{transition:all .2s}.omega-input .v-messages>*{transition-duration:0s!important}.omega-input [role=alert]:has(.v-messages:empty){padding:0}.omega-input .v-btn{cursor:pointer;width:auto;appearance:none;box-shadow:none;display:block;min-width:auto;height:auto;padding:.5em .5em .5em 1em}")),document.head.appendChild(i),window.customElements){const e=window.customElements.define;window.customElements.define=function(s,t){const n=t.prototype.connectedCallback;return t.prototype.connectedCallback=function(){if(n&&n.call(this),this.shadowRoot){const a=document.createElement("style");a.appendChild(document.createTextNode(".omega-input .v-input__details:has(.v-messages:empty){grid-template-rows:0fr;transition:all .2s}.omega-input .v-messages:empty{min-height:0}.omega-input .v-input__details:has(.v-messages){transition:all .2s;overflow:hidden;min-height:0;display:grid;grid-template-rows:1fr}.omega-input .v-messages{transition:all .2s}.omega-input .v-messages>*{transition-duration:0s!important}.omega-input [role=alert]:has(.v-messages:empty){padding:0}.omega-input .v-btn{cursor:pointer;width:auto;appearance:none;box-shadow:none;display:block;min-width:auto;height:auto;padding:.5em .5em .5em 1em}")),this.shadowRoot.appendChild(a)}},e.call(window.customElements,s,t)}}}}catch(e){console.error("vite-plugin-css-injected-by-js",e)}})();
2
- import o from "./vue-components.es30.js";
2
+ import o from "./vue-components.es38.js";
3
3
 
4
4
  export {
5
5
  o as default
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as v, mergeModels as C, useModel as k, useSlots as V, computed as _, resolveComponent as g, createBlock as y, openBlock as B, unref as a, createSlots as E, withCtx as u, renderSlot as d, renderList as M, normalizeProps as S, guardReactiveProps as w } from "vue";
2
2
  import { useOnClose as L } from "./vue-components.es11.js";
3
- import { onMountedWithCleanup as h } from "./vue-components.es29.js";
3
+ import { onMountedWithCleanup as h } from "./vue-components.es16.js";
4
4
  const z = /* @__PURE__ */ v({
5
5
  __name: "Dialog",
6
6
  props: /* @__PURE__ */ C({
@@ -1,8 +1,8 @@
1
- import { defineComponent as F, computed as l, useAttrs as A, inject as M, createBlock as i, openBlock as f, resolveDynamicComponent as S, withCtx as u, createCommentVNode as w, mergeProps as I, unref as L, createSlots as P, renderSlot as c, normalizeProps as d, guardReactiveProps as v } from "vue";
2
- import { useIntl as j } from "./vue-components.es3.js";
3
- import { generateInputStandardSchemaFromFieldMeta as B } from "./vue-components.es12.js";
4
- import E from "./vue-components.es7.js";
5
- import { useErrorLabel as N } from "./vue-components.es10.js";
1
+ import { defineComponent as F, computed as o, useAttrs as $, inject as k, createBlock as u, openBlock as i, resolveDynamicComponent as A, withCtx as m, createCommentVNode as M, mergeProps as S, unref as w, createSlots as I, renderSlot as f, normalizeProps as c, guardReactiveProps as d } from "vue";
2
+ import { useIntl as P } from "./vue-components.es3.js";
3
+ import { generateInputStandardSchemaFromFieldMeta as j } from "./vue-components.es12.js";
4
+ import B from "./vue-components.es7.js";
5
+ import { useErrorLabel as E } from "./vue-components.es10.js";
6
6
  const V = /* @__PURE__ */ F({
7
7
  inheritAttrs: !1,
8
8
  __name: "OmegaInput",
@@ -13,52 +13,46 @@ const V = /* @__PURE__ */ F({
13
13
  name: {},
14
14
  inputClass: {}
15
15
  },
16
- setup(a) {
17
- const e = a, n = l(() => e.name), p = A(), g = l(() => {
16
+ setup(t) {
17
+ const e = t, l = o(() => e.name), v = $(), p = o(() => {
18
18
  if (e.inputClass !== null)
19
- return e.inputClass !== void 0 ? e.inputClass : p.class;
20
- }), s = M(
19
+ return e.inputClass !== void 0 ? e.inputClass : v.class;
20
+ }), n = k(
21
21
  "getMetaFromArray",
22
22
  null
23
- ), o = l(() => s?.value && s.value(e.name) ? s.value(n.value) : e.form.meta[n.value]), $ = l(() => {
24
- const t = o.value;
25
- if (!t) return n.value;
26
- const r = t;
27
- return `${n.value}-${r.type}-${r.minLength ?? ""}-${r.maxLength ?? ""}-${r.minimum ?? ""}-${r.maximum ?? ""}`;
28
- }), { trans: C } = j(), b = l(() => {
29
- if (!o.value)
23
+ ), r = o(() => n?.value && n.value(e.name) ? n.value(l.value) : e.form.meta[l.value]), { trans: g } = P(), C = o(() => {
24
+ if (!r.value)
30
25
  throw console.log(e.name, Object.keys(e.form.meta), e.form.meta), new Error("Meta is undefined");
31
- return B(o.value, C);
32
- }), h = N(e.form);
33
- return (t, r) => (f(), i(S(a.form.Field), {
34
- key: $.value,
35
- name: a.name,
26
+ return j(r.value, g);
27
+ }), b = E(e.form);
28
+ return (a, N) => (i(), u(A(t.form.Field), {
29
+ name: t.name,
36
30
  validators: {
37
- onChange: b.value,
38
- ...a.validators
31
+ onChange: C.value,
32
+ ...t.validators
39
33
  }
40
34
  }, {
41
- default: u(({ field: y, state: k }) => [
42
- o.value ? (f(), i(E, I({ key: 0 }, { ...t.$attrs, ...t.$props, inputClass: g.value }, {
43
- field: y,
44
- state: k,
45
- register: a.form.registerField,
46
- label: a.label ?? L(h)(n.value),
47
- meta: o.value
48
- }), P({
49
- default: u((m) => [
50
- c(t.$slots, "default", d(v(m)))
35
+ default: m(({ field: h, state: y }) => [
36
+ r.value ? (i(), u(B, S({ key: 0 }, { ...a.$attrs, ...a.$props, inputClass: p.value }, {
37
+ field: h,
38
+ state: y,
39
+ register: t.form.registerField,
40
+ label: t.label ?? w(b)(l.value),
41
+ meta: r.value
42
+ }), I({
43
+ default: m((s) => [
44
+ f(a.$slots, "default", c(d(s)))
51
45
  ]),
52
46
  _: 2
53
47
  }, [
54
- t.$slots.label ? {
48
+ a.$slots.label ? {
55
49
  name: "label",
56
- fn: u((m) => [
57
- c(t.$slots, "label", d(v(m)))
50
+ fn: m((s) => [
51
+ f(a.$slots, "label", c(d(s)))
58
52
  ]),
59
53
  key: "0"
60
54
  } : void 0
61
- ]), 1040, ["field", "state", "register", "label", "meta"])) : w("", !0)
55
+ ]), 1040, ["field", "state", "register", "label", "meta"])) : M("", !0)
62
56
  ]),
63
57
  _: 3
64
58
  }, 8, ["name", "validators"]));
@@ -1,7 +1,7 @@
1
1
  (function(){"use strict";try{if(typeof document<"u"){var i=document.createElement("style");if(i.appendChild(document.createTextNode(".omega-input .v-input__details:has(.v-messages:empty){grid-template-rows:0fr;transition:all .2s}.omega-input .v-messages:empty{min-height:0}.omega-input .v-input__details:has(.v-messages){transition:all .2s;overflow:hidden;min-height:0;display:grid;grid-template-rows:1fr}.omega-input .v-messages{transition:all .2s}.omega-input .v-messages>*{transition-duration:0s!important}.omega-input [role=alert]:has(.v-messages:empty){padding:0}.omega-input .v-btn{cursor:pointer;width:auto;appearance:none;box-shadow:none;display:block;min-width:auto;height:auto;padding:.5em .5em .5em 1em}")),document.head.appendChild(i),window.customElements){const e=window.customElements.define;window.customElements.define=function(s,t){const n=t.prototype.connectedCallback;return t.prototype.connectedCallback=function(){if(n&&n.call(this),this.shadowRoot){const a=document.createElement("style");a.appendChild(document.createTextNode(".omega-input .v-input__details:has(.v-messages:empty){grid-template-rows:0fr;transition:all .2s}.omega-input .v-messages:empty{min-height:0}.omega-input .v-input__details:has(.v-messages){transition:all .2s;overflow:hidden;min-height:0;display:grid;grid-template-rows:1fr}.omega-input .v-messages{transition:all .2s}.omega-input .v-messages>*{transition-duration:0s!important}.omega-input [role=alert]:has(.v-messages:empty){padding:0}.omega-input .v-btn{cursor:pointer;width:auto;appearance:none;box-shadow:none;display:block;min-width:auto;height:auto;padding:.5em .5em .5em 1em}")),this.shadowRoot.appendChild(a)}},e.call(window.customElements,s,t)}}}}catch(e){console.error("vite-plugin-css-injected-by-js",e)}})();
2
2
  import { defineComponent as N, computed as n, getCurrentInstance as k, useAttrs as q, useSlots as B, useId as S, renderSlot as d, normalizeProps as s, guardReactiveProps as p, createElementVNode as w, normalizeClass as F, createBlock as I, createCommentVNode as L, unref as A, openBlock as O, mergeProps as R, createSlots as V, withCtx as z } from "vue";
3
3
  import { useStore as f } from "@tanstack/vue-form";
4
- import T from "./vue-components.es30.js";
4
+ import T from "./vue-components.es38.js";
5
5
 
6
6
  const H = /* @__PURE__ */ N({
7
7
  inheritAttrs: !1,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/vue-components",
3
- "version": "3.0.1",
3
+ "version": "3.0.2",
4
4
  "peerDependencies": {
5
5
  "@mdi/js": "^7.4.47",
6
6
  "effect": "^3.19.3",
@@ -1,7 +1,6 @@
1
1
  <template>
2
2
  <component
3
3
  :is="form.Field"
4
- :key="fieldKey"
5
4
  :name="name"
6
5
  :validators="{
7
6
  onChange: schema,
@@ -82,18 +81,6 @@ const meta = computed(() => {
82
81
  return props.form.meta[propsName.value]
83
82
  })
84
83
 
85
- // Key to force Field re-mount when meta type changes (for TaggedUnion support)
86
- const fieldKey = computed(() => {
87
- const m = meta.value
88
- if (!m) return propsName.value
89
- // Include type and key constraints in the key so Field re-mounts when validation rules change
90
- // Cast to any since not all FieldMeta variants have these properties
91
- const fm = m as any
92
- return `${propsName.value}-${fm.type}-${fm.minLength ?? ""}-${fm.maxLength ?? ""}-${fm.minimum ?? ""}-${
93
- fm.maximum ?? ""
94
- }`
95
- })
96
-
97
84
  // Call useIntl during setup to avoid issues when computed re-evaluates
98
85
  const { trans } = useIntl()
99
86
 
@@ -102,6 +102,7 @@ props.register(computed(() => ({ name: props.field.name, label: props.label, id
102
102
  // This ensures errors persist when Field components re-mount due to :key changes
103
103
  const _errors = computed(() => {
104
104
  const fieldMeta = formFieldMeta.value[props.field.name] as any
105
+ // Treat errors as an array (like useOmegaForm does)
105
106
  return fieldMeta?.errors ?? []
106
107
  })
107
108
  const errors = computed(() =>
@@ -962,8 +962,18 @@ export const useOmegaForm = <
962
962
  // /** @experimental */
963
963
  handleSubmitEffect,
964
964
  registerField: (field: ComputedRef<{ name: string; label: string; id: string }>) => {
965
- watch(field, (f) => fieldMap.value.set(f.name, { label: f.label, id: f.id }), { immediate: true })
966
- onUnmounted(() => fieldMap.value.delete(field.value.name)) // todo; perhap only when owned (id match)
965
+ watch(field, (f) => {
966
+ fieldMap.value.set(f.name, { label: f.label, id: f.id })
967
+ }, { immediate: true })
968
+ onUnmounted(() => {
969
+ // Only delete if we still own this entry (id matches)
970
+ // This prevents old components from deleting entries registered by new components
971
+ // during re-mount transitions (e.g., when :key changes)
972
+ const currentEntry = fieldMap.value.get(field.value.name)
973
+ if (currentEntry?.id === field.value.id) {
974
+ fieldMap.value.delete(field.value.name)
975
+ }
976
+ })
967
977
  }
968
978
  })
969
979
 
@@ -5,7 +5,9 @@ const Key = Symbol("injected") as InjectionKey<Map<string, { label: string; id:
5
5
 
6
6
  export const useRegisterField = (field: ComputedRef<{ name: string; label: string; id: string }>) => {
7
7
  const map = injectCertain(Key)
8
- watch(field, (f) => map.set(f.name, { label: f.label, id: f.id }), { immediate: true })
8
+ watch(field, (f) => {
9
+ map.set(f.name, { label: f.label, id: f.id })
10
+ }, { immediate: true })
9
11
  onUnmounted(() => map.delete(field.value.name)) // todo; perhap only when owned
10
12
  }
11
13
 
@@ -1,9 +0,0 @@
1
- const s = (t, e) => {
2
- const o = t.__vccOpts || t;
3
- for (const [r, c] of e)
4
- o[r] = c;
5
- return o;
6
- };
7
- export {
8
- s as default
9
- };