@vanstack/solid-ark 0.0.22 → 0.0.24

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.
package/README.md CHANGED
@@ -54,6 +54,10 @@ function Demo() {
54
54
 
55
55
  组件样式基于 Tailwind 语义 token,覆盖 `:root` CSS 变量即可自定义(各子入口文档中有对应的 token 示例)。
56
56
 
57
+ ## 演示
58
+
59
+ 组件演示见 monorepo 的 [apps/solid-demo](https://gitee.com/janzho/vanstack/tree/master/apps/solid-demo):`pnpm dev` 后打开 Form / Modal / DataTable / Badge 等页面。
60
+
57
61
  ## License
58
62
 
59
63
  MIT
@@ -1,7 +1,7 @@
1
1
  import "../solid-ark.css";
2
2
  import { t as e } from "../button-Br_upy12.js";
3
3
  import { t } from "../badge-Dt0uZnmA.js";
4
- import { t as n } from "../form-IwL17HZI.js";
4
+ import { t as n } from "../form-B1_Ea0zH.js";
5
5
  import { t as r } from "../table-Dl0ngdNr.js";
6
6
  import { className as i, createComponent as a, effect as o, insert as s, memo as c, setAttribute as l, setStyleProperty as u, template as d, use as f } from "solid-js/web";
7
7
  import { For as p, Show as m, createEffect as ee, createMemo as h, createSignal as g, mergeProps as _, on as te, onCleanup as v, onMount as y } from "solid-js";
@@ -1,2 +1,2 @@
1
1
  export { Form } from './Form';
2
- export type { DatePickerStoredValue, FieldConfig, FieldControlProps, FieldRule, FieldRuleContext, FormInvalidSubmitProps, FormProps, FormSize, FormSubmitProps, } from './type';
2
+ export type { DatePickerStoredValue, FieldConfig, FieldControlProps, FieldRule, FieldRuleContext, FormExposed, FormInvalidSubmitProps, FormProps, FormSize, FormSubmitProps, } from './type';
@@ -1,3 +1,3 @@
1
1
  import "../solid-ark.css";
2
- import { t as e } from "../form-IwL17HZI.js";
2
+ import { t as e } from "../form-B1_Ea0zH.js";
3
3
  export { e as Form };
@@ -25,6 +25,10 @@ interface BaseFieldConfig {
25
25
  renderLabel?: (label: string) => JSX.Element;
26
26
  /** 自定义 error */
27
27
  renderError?: (errors: string[]) => JSX.Element;
28
+ /** 是否隐藏渲染:true 时不渲染但值仍提交,默认 false */
29
+ hidden?: boolean;
30
+ /** 是否渲染并提交:false 或函数返回 false 时不渲染且值不提交;函数接收当前表单值(响应式联动显隐) */
31
+ show?: ((values: Record<string, unknown>) => boolean) | boolean;
28
32
  /** 提交/比较前转换为数字(select/radio 值是字符串、目标字段是数字时使用) */
29
33
  valueType?: "number";
30
34
  }
@@ -123,6 +127,21 @@ export interface FormSubmitProps<TData extends Record<string, unknown>> {
123
127
  /** patch=true 时提供:patch 是否非空 */
124
128
  changed?: boolean;
125
129
  }
130
+ /** 暴露给外部的表单实例(Form ref) */
131
+ export interface FormExposed<TData extends Record<string, unknown>> {
132
+ /** 校验全部字段(等待异步规则);返回是否全部通过,不触发提交 */
133
+ validate: () => Promise<boolean>;
134
+ /** 重置表单 */
135
+ reset: () => void;
136
+ /** 读取全部字段值(快照副本,非响应式引用) */
137
+ getFieldValues: () => TData;
138
+ /** 批量写入字段值(逐字段触发校验与 onValuesChange) */
139
+ setFieldValues: (values: Partial<TData>) => void;
140
+ /** 读取字段值 */
141
+ getFieldValue: (name: string) => unknown;
142
+ /** 写入字段值 */
143
+ setFieldValue: (name: string, value: unknown) => void;
144
+ }
126
145
  export interface FormProps<TData extends Record<string, unknown>> {
127
146
  /** 字段配置 */
128
147
  fields: FieldConfig[];
@@ -132,10 +151,13 @@ export interface FormProps<TData extends Record<string, unknown>> {
132
151
  onValuesChange?: (values: TData) => void;
133
152
  /** 是否计算变更集:默认 false;开启后 onSubmit 额外收到 { patch, changed }(与初始值比较,提交时计算) */
134
153
  patch?: boolean;
154
+ /** 暴露表单实例(Solid ref 语义,挂载时回调一次),用于外部主动校验/提交 */
155
+ ref?: (api: FormExposed<TData>) => void;
135
156
  /** 控件尺寸:small | default(默认)| large,控制 input/textarea/select/datePicker 等输入类控件 */
136
157
  size?: FormSize;
137
158
  /** 提交回调(仅在校验通过时触发) */
138
- onSubmit: (props: FormSubmitProps<TData>) => Promise<void> | void;
159
+ /** 提交回调(仅在校验通过时触发);只做展示/受控绑定时可不传 */
160
+ onSubmit?: (props: FormSubmitProps<TData>) => Promise<void> | void;
139
161
  /** 提交被校验拦截时的回调 */
140
162
  onSubmitInvalid?: (props: FormInvalidSubmitProps<TData>) => void;
141
163
  /** 表单布局 class */
@@ -2,21 +2,21 @@ import "./solid-ark.css";
2
2
  import { Index as e, className as t, createComponent as n, delegateEvents as r, effect as i, insert as a, memo as o, setAttribute as s, style as c, template as l } from "solid-js/web";
3
3
  import { For as u, Show as d, Suspense as f, createEffect as p, createMemo as m, createSignal as h, createUniqueId as g, lazy as _, mergeProps as v, on as y, onCleanup as b } from "solid-js";
4
4
  import { Field as x } from "@ark-ui/solid/field";
5
- import { createForm as S } from "@tanstack/solid-form";
6
- import { Checkbox as C } from "@ark-ui/solid/checkbox";
7
- import { RadioGroup as w } from "@ark-ui/solid/radio-group";
8
- import { Switch as T } from "@ark-ui/solid/switch";
9
- import { deepEqual as E } from "fast-equals";
5
+ import { createForm as ee } from "@tanstack/solid-form";
6
+ import { Checkbox as S } from "@ark-ui/solid/checkbox";
7
+ import { RadioGroup as C } from "@ark-ui/solid/radio-group";
8
+ import { Switch as w } from "@ark-ui/solid/switch";
9
+ import { deepEqual as T } from "fast-equals";
10
10
  //#region src/form/components/FieldSkeleton.tsx
11
- var D = /*#__PURE__*/ l("<div aria-hidden=true class=van-form-field-skeleton>");
12
- function O() {
13
- return D();
11
+ var E = /*#__PURE__*/ l("<div aria-hidden=true class=van-form-field-skeleton>");
12
+ function D() {
13
+ return E();
14
14
  }
15
15
  //#endregion
16
16
  //#region src/form/components/FormCheckbox.tsx
17
- var ee = /*#__PURE__*/ l("<svg class=van-form-check-icon fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=3 viewBox=\"0 0 24 24\"><path d=\"M5 12l5 5l10 -10\">");
18
- function k(e) {
19
- return n(C.Root, {
17
+ var te = /*#__PURE__*/ l("<svg class=van-form-check-icon fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=3 viewBox=\"0 0 24 24\"><path d=\"M5 12l5 5l10 -10\">");
18
+ function O(e) {
19
+ return n(S.Root, {
20
20
  get checked() {
21
21
  return e.value ?? !1;
22
22
  },
@@ -27,33 +27,33 @@ function k(e) {
27
27
  onCheckedChange: (t) => e.onChange(t.checked === !0),
28
28
  get children() {
29
29
  return [
30
- n(C.Control, {
30
+ n(S.Control, {
31
31
  class: "van-form-checkbox-control",
32
32
  get children() {
33
- return n(C.Indicator, {
33
+ return n(S.Indicator, {
34
34
  class: "van-form-checkbox-indicator",
35
35
  get children() {
36
- return ee();
36
+ return te();
37
37
  }
38
38
  });
39
39
  }
40
40
  }),
41
- o(() => o(() => !!e.label)() && n(C.Label, {
41
+ o(() => o(() => !!e.label)() && n(S.Label, {
42
42
  class: "van-form-checkbox-label",
43
43
  get children() {
44
44
  return e.label;
45
45
  }
46
46
  })),
47
- n(C.HiddenInput, {})
47
+ n(S.HiddenInput, {})
48
48
  ];
49
49
  }
50
50
  });
51
51
  }
52
52
  //#endregion
53
53
  //#region src/form/components/FormCheckboxGroup.tsx
54
- var A = /*#__PURE__*/ l("<svg class=van-form-check-icon fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=3 viewBox=\"0 0 24 24\"><path d=\"M5 12l5 5l10 -10\">");
55
- function j(t) {
56
- return n(C.Group, {
54
+ var k = /*#__PURE__*/ l("<svg class=van-form-check-icon fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=3 viewBox=\"0 0 24 24\"><path d=\"M5 12l5 5l10 -10\">");
55
+ function A(t) {
56
+ return n(S.Group, {
57
57
  class: "van-form-checkbox-group",
58
58
  get id() {
59
59
  return t.controlId;
@@ -65,7 +65,7 @@ function j(t) {
65
65
  get each() {
66
66
  return t.field.options;
67
67
  },
68
- children: (e) => n(C.Root, {
68
+ children: (e) => n(S.Root, {
69
69
  class: "van-form-checkbox-root",
70
70
  get id() {
71
71
  return `${t.controlId}-item-${e().value}`;
@@ -81,24 +81,24 @@ function j(t) {
81
81
  },
82
82
  get children() {
83
83
  return [
84
- n(C.Control, {
84
+ n(S.Control, {
85
85
  class: "van-form-checkbox-control",
86
86
  get children() {
87
- return n(C.Indicator, {
87
+ return n(S.Indicator, {
88
88
  class: "van-form-checkbox-indicator",
89
89
  get children() {
90
- return A();
90
+ return k();
91
91
  }
92
92
  });
93
93
  }
94
94
  }),
95
- n(C.Label, {
95
+ n(S.Label, {
96
96
  class: "van-form-checkbox-label",
97
97
  get children() {
98
98
  return e().label;
99
99
  }
100
100
  }),
101
- n(C.HiddenInput, {})
101
+ n(S.HiddenInput, {})
102
102
  ];
103
103
  }
104
104
  })
@@ -108,7 +108,7 @@ function j(t) {
108
108
  }
109
109
  //#endregion
110
110
  //#region src/form/components/useDebouncedValue.ts
111
- function M(e) {
111
+ function j(e) {
112
112
  let [t, n] = h(e.value() ?? ""), r, i = (t) => {
113
113
  if (n(t), (e.debounce ?? 0) > 0) {
114
114
  clearTimeout(r), r = setTimeout(() => {
@@ -133,12 +133,12 @@ function M(e) {
133
133
  }
134
134
  //#endregion
135
135
  //#region src/form/components/FormInput.tsx
136
- var te = /*#__PURE__*/ l("<svg fill=none height=14 stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=2 viewBox=\"0 0 24 24\"width=14 xmlns=http://www.w3.org/2000/svg><path d=\"M18 6 6 18\"></path><path d=\"m6 6 12 12\">"), N = /*#__PURE__*/ l("<button aria-label=清空 type=button>"), P = /*#__PURE__*/ l("<div class=van-form-input-group>"), F = /*#__PURE__*/ l("<span class=\"van-form-input-addon van-form-input-addon-prefix\">"), I = /*#__PURE__*/ l("<span class=\"van-form-input-addon van-form-input-addon-suffix\">");
137
- function L() {
138
- return te();
136
+ var ne = /*#__PURE__*/ l("<svg fill=none height=14 stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=2 viewBox=\"0 0 24 24\"width=14 xmlns=http://www.w3.org/2000/svg><path d=\"M18 6 6 18\"></path><path d=\"m6 6 12 12\">"), M = /*#__PURE__*/ l("<button aria-label=清空 type=button>"), N = /*#__PURE__*/ l("<div class=van-form-input-group>"), P = /*#__PURE__*/ l("<span class=\"van-form-input-addon van-form-input-addon-prefix\">"), F = /*#__PURE__*/ l("<span class=\"van-form-input-addon van-form-input-addon-suffix\">");
137
+ function I() {
138
+ return ne();
139
139
  }
140
- function R(e) {
141
- let { local: r, handleInput: s, handleBlur: c, handleClear: l } = M({
140
+ function L(e) {
141
+ let { local: r, handleInput: s, handleBlur: c, handleClear: l } = j({
142
142
  value: () => e.value,
143
143
  debounce: e.field.debounce,
144
144
  onChange: e.onChange,
@@ -164,11 +164,11 @@ function R(e) {
164
164
  }
165
165
  }), p = e.field.prefix !== void 0 || e.field.suffix !== void 0, m = e.field.clearable === !0;
166
166
  return !p && !m ? f : (() => {
167
- var s = P();
167
+ var s = N();
168
168
  return a(s, (() => {
169
169
  var t = o(() => e.field.prefix !== void 0);
170
170
  return () => t() && (() => {
171
- var t = F();
171
+ var t = P();
172
172
  return a(t, () => e.field.prefix), t;
173
173
  })();
174
174
  })(), null), a(s, f, null), a(s, n(d, {
@@ -176,15 +176,15 @@ function R(e) {
176
176
  return m && r() !== "";
177
177
  },
178
178
  get children() {
179
- var r = N();
179
+ var r = M();
180
180
  return r.$$click = () => {
181
181
  l(), u?.focus();
182
- }, a(r, n(L, {})), i(() => t(r, `van-form-input-clear${e.field.suffix === void 0 ? "" : " van-form-input-clear-before-suffix"}`)), r;
182
+ }, a(r, n(I, {})), i(() => t(r, `van-form-input-clear${e.field.suffix === void 0 ? "" : " van-form-input-clear-before-suffix"}`)), r;
183
183
  }
184
184
  }), null), a(s, (() => {
185
185
  var t = o(() => e.field.suffix !== void 0);
186
186
  return () => t() && (() => {
187
- var t = I();
187
+ var t = F();
188
188
  return a(t, () => e.field.suffix), t;
189
189
  })();
190
190
  })(), null), s;
@@ -193,9 +193,9 @@ function R(e) {
193
193
  r(["click"]);
194
194
  //#endregion
195
195
  //#region src/form/components/FormRadio.tsx
196
- function z(t) {
196
+ function R(t) {
197
197
  let r = m(() => t.field.options.map((e) => e.value));
198
- return n(w.Root, {
198
+ return n(C.Root, {
199
199
  class: "van-form-radio-group",
200
200
  get id() {
201
201
  return t.controlId;
@@ -212,21 +212,21 @@ function z(t) {
212
212
  },
213
213
  children: (e) => {
214
214
  let r = t.field.options.find((t) => t.value === e());
215
- return n(w.Item, {
215
+ return n(C.Item, {
216
216
  class: "van-form-radio-item",
217
217
  get value() {
218
218
  return e();
219
219
  },
220
220
  get children() {
221
221
  return [
222
- n(w.ItemControl, { class: "van-form-radio-control" }),
223
- n(w.ItemText, {
222
+ n(C.ItemControl, { class: "van-form-radio-control" }),
223
+ n(C.ItemText, {
224
224
  class: "van-form-radio-text",
225
225
  get children() {
226
226
  return r?.label ?? e();
227
227
  }
228
228
  }),
229
- n(w.ItemHiddenInput, {})
229
+ n(C.ItemHiddenInput, {})
230
230
  ];
231
231
  }
232
232
  });
@@ -237,8 +237,8 @@ function z(t) {
237
237
  }
238
238
  //#endregion
239
239
  //#region src/form/components/FormSwitch.tsx
240
- function B(e) {
241
- return n(T.Root, {
240
+ function z(e) {
241
+ return n(w.Root, {
242
242
  get checked() {
243
243
  return e.value ?? !1;
244
244
  },
@@ -249,27 +249,27 @@ function B(e) {
249
249
  onCheckedChange: (t) => e.onChange(t.checked),
250
250
  get children() {
251
251
  return [
252
- n(T.Control, {
252
+ n(w.Control, {
253
253
  class: "van-form-switch-control",
254
254
  get children() {
255
- return n(T.Thumb, { class: "van-form-switch-thumb" });
255
+ return n(w.Thumb, { class: "van-form-switch-thumb" });
256
256
  }
257
257
  }),
258
- o(() => o(() => !!e.label)() && n(T.Label, {
258
+ o(() => o(() => !!e.label)() && n(w.Label, {
259
259
  class: "van-form-switch-label",
260
260
  get children() {
261
261
  return e.label;
262
262
  }
263
263
  })),
264
- n(T.HiddenInput, {})
264
+ n(w.HiddenInput, {})
265
265
  ];
266
266
  }
267
267
  });
268
268
  }
269
269
  //#endregion
270
270
  //#region src/form/components/FormTextarea.tsx
271
- function V(e) {
272
- let { local: t, handleInput: r, handleBlur: i } = M({
271
+ function B(e) {
272
+ let { local: t, handleInput: r, handleBlur: i } = j({
273
273
  value: () => e.value,
274
274
  debounce: e.field.debounce,
275
275
  onChange: e.onChange,
@@ -292,17 +292,17 @@ function V(e) {
292
292
  }
293
293
  //#endregion
294
294
  //#region src/form/components/utils.ts
295
- function H(e, t) {
295
+ function V(e, t) {
296
296
  return e.fieldType === t;
297
297
  }
298
- function U(e) {
298
+ function H(e) {
299
299
  if (e != null) return typeof e == "number" ? `${e}px` : e;
300
300
  }
301
301
  //#endregion
302
302
  //#region src/form/components/FieldRenderer.tsx
303
- var W = _(() => import("./FormDatePicker-Cazd9kkD.js").then((e) => ({ default: e.FormDatePicker }))), G = _(() => import("./FormSelect-BDZATc3u.js").then((e) => ({ default: e.FormSelect })));
304
- function K(e) {
305
- return H(e.field, "input") ? n(R, {
303
+ var U = _(() => import("./FormDatePicker-Cazd9kkD.js").then((e) => ({ default: e.FormDatePicker }))), W = _(() => import("./FormSelect-BDZATc3u.js").then((e) => ({ default: e.FormSelect })));
304
+ function G(e) {
305
+ return V(e.field, "input") ? n(L, {
306
306
  get field() {
307
307
  return e.field;
308
308
  },
@@ -313,7 +313,7 @@ function K(e) {
313
313
  get value() {
314
314
  return e.value;
315
315
  }
316
- }) : H(e.field, "textarea") ? n(V, {
316
+ }) : V(e.field, "textarea") ? n(B, {
317
317
  get field() {
318
318
  return e.field;
319
319
  },
@@ -324,12 +324,12 @@ function K(e) {
324
324
  get value() {
325
325
  return e.value;
326
326
  }
327
- }) : H(e.field, "select") ? n(f, {
327
+ }) : V(e.field, "select") ? n(f, {
328
328
  get fallback() {
329
- return n(O, {});
329
+ return n(D, {});
330
330
  },
331
331
  get children() {
332
- return n(G, {
332
+ return n(W, {
333
333
  get controlId() {
334
334
  return e.controlId;
335
335
  },
@@ -345,12 +345,12 @@ function K(e) {
345
345
  }
346
346
  });
347
347
  }
348
- }) : H(e.field, "datePicker") ? n(f, {
348
+ }) : V(e.field, "datePicker") ? n(f, {
349
349
  get fallback() {
350
- return n(O, {});
350
+ return n(D, {});
351
351
  },
352
352
  get children() {
353
- return n(W, {
353
+ return n(U, {
354
354
  get controlId() {
355
355
  return e.controlId;
356
356
  },
@@ -366,7 +366,7 @@ function K(e) {
366
366
  }
367
367
  });
368
368
  }
369
- }) : H(e.field, "checkbox") ? n(k, {
369
+ }) : V(e.field, "checkbox") ? n(O, {
370
370
  get controlId() {
371
371
  return e.controlId;
372
372
  },
@@ -377,7 +377,7 @@ function K(e) {
377
377
  get value() {
378
378
  return e.value;
379
379
  }
380
- }) : H(e.field, "switch") ? n(B, {
380
+ }) : V(e.field, "switch") ? n(z, {
381
381
  get controlId() {
382
382
  return e.controlId;
383
383
  },
@@ -388,7 +388,7 @@ function K(e) {
388
388
  get value() {
389
389
  return e.value;
390
390
  }
391
- }) : H(e.field, "radio") ? n(z, {
391
+ }) : V(e.field, "radio") ? n(R, {
392
392
  get controlId() {
393
393
  return e.controlId;
394
394
  },
@@ -399,7 +399,7 @@ function K(e) {
399
399
  get value() {
400
400
  return e.value;
401
401
  }
402
- }) : H(e.field, "checkbox-group") ? n(j, {
402
+ }) : V(e.field, "checkbox-group") ? n(A, {
403
403
  get controlId() {
404
404
  return e.controlId;
405
405
  },
@@ -414,29 +414,29 @@ function K(e) {
414
414
  }
415
415
  //#endregion
416
416
  //#region src/form/patch.ts
417
+ function K(e) {
418
+ return J(e) || e === "" ? void 0 : Number(e);
419
+ }
417
420
  function q(e) {
418
- return Y(e) || e === "" ? void 0 : Number(e);
421
+ return J(e) || e === "" ? 0 : Number(e);
419
422
  }
420
423
  function J(e) {
421
- return Y(e) || e === "" ? 0 : Number(e);
422
- }
423
- function Y(e) {
424
424
  return e == null;
425
425
  }
426
- function X(e) {
426
+ function Y(e) {
427
427
  return Array.isArray(e) ? [...e].sort() : [];
428
428
  }
429
- function Z(e) {
429
+ function X(e) {
430
430
  return e && typeof e == "object" && !Array.isArray(e) ? e : {};
431
431
  }
432
- function Q(e) {
432
+ function Z(e) {
433
433
  return typeof e == "object" && !!e && !Array.isArray(e);
434
434
  }
435
- function ne(e, t, n) {
435
+ function re(e, t, n) {
436
436
  let r = {};
437
437
  for (let i of n) {
438
438
  let { name: n, valueType: a } = i, o = e[n], s = t[n], c;
439
- c = a === "number" ? E(q(o), q(s)) : Array.isArray(o) || Array.isArray(s) ? E(X(o), X(s)) : Q(o) || Q(s) ? E(Z(o), Z(s)) : E(Y(o) ? "" : o, Y(s) ? "" : s), c || (r[n] = a === "number" ? J(s) : s);
439
+ c = a === "number" ? T(K(o), K(s)) : Array.isArray(o) || Array.isArray(s) ? T(Y(o), Y(s)) : Z(o) || Z(s) ? T(X(o), X(s)) : T(J(o) ? "" : o, J(s) ? "" : s), c || (r[n] = a === "number" ? q(s) : s);
440
440
  }
441
441
  return {
442
442
  patch: r,
@@ -445,11 +445,11 @@ function ne(e, t, n) {
445
445
  }
446
446
  //#endregion
447
447
  //#region src/form/Form.tsx
448
- var re = /*#__PURE__*/ l("<form>"), ie = /*#__PURE__*/ l("<div class=van-form-field>");
449
- function $(e) {
448
+ var ie = /*#__PURE__*/ l("<form>"), ae = /*#__PURE__*/ l("<div class=van-form-field>");
449
+ function Q(e) {
450
450
  return typeof e == "string" ? e : e && typeof e == "object" && "message" in e ? String(e.message) : String(e);
451
451
  }
452
- function ae(e) {
452
+ function oe(e) {
453
453
  let t = e.rule;
454
454
  if (t) return {
455
455
  onChange: typeof t == "function" ? (e) => t({
@@ -459,27 +459,34 @@ function ae(e) {
459
459
  ...e.validateListenTo?.length ? { onChangeListenTo: e.validateListenTo } : {}
460
460
  };
461
461
  }
462
- function oe(e) {
463
- let r = v({ values: {} }, e), l = r.values, f = g(), h = (e) => `${f}-${e}`, _ = S(() => ({
462
+ function $(e, t) {
463
+ return typeof e.show == "function" ? e.show(t) : e.show !== !1;
464
+ }
465
+ function se(e, t) {
466
+ let n = new Set(t.filter((t) => !$(t, e)).map((e) => e.name));
467
+ return Object.fromEntries(Object.entries(e).filter(([e]) => !n.has(e)));
468
+ }
469
+ function ce(e) {
470
+ let r = v({ values: {} }, e), l = r.values, f = g(), h = (e) => `${f}-${e}`, _ = ee(() => ({
464
471
  defaultValues: l,
465
472
  onSubmit: async ({ value: e }) => {
466
- let t = e;
473
+ let t = e, n = se(t, r.fields);
467
474
  if (r.patch) {
468
- let { patch: e, changed: n } = ne(l, t, r.fields);
469
- await r.onSubmit({
470
- value: t,
475
+ let { patch: e, changed: i } = re(l, n, r.fields.filter((e) => $(e, t)));
476
+ await r.onSubmit?.({
477
+ value: n,
471
478
  patch: e,
472
- changed: n
479
+ changed: i
473
480
  });
474
481
  return;
475
482
  }
476
- await r.onSubmit({ value: t });
483
+ await r.onSubmit?.({ value: n });
477
484
  },
478
485
  onSubmitInvalid: ({ value: e, formApi: t }) => {
479
486
  if (!r.onSubmitInvalid) return;
480
487
  let n = {}, i = t.state.fieldMeta;
481
488
  for (let [e, t] of Object.entries(i)) {
482
- let r = (t?.errors ?? []).map($).filter(Boolean);
489
+ let r = (t?.errors ?? []).map(Q).filter(Boolean);
483
490
  r.length > 0 && (n[e] = r);
484
491
  }
485
492
  r.onSubmitInvalid({
@@ -487,28 +494,39 @@ function oe(e) {
487
494
  errors: n
488
495
  });
489
496
  }
490
- })), b = _.useStore((e) => e.isSubmitting), C = _.useStore((e) => e.values), w = _.setFieldValue;
497
+ }));
498
+ r.ref?.({
499
+ validate: async () => (await _.validateAllFields("change"), _.state.canSubmit),
500
+ reset: () => _.reset(),
501
+ getFieldValues: () => ({ ..._.state.values }),
502
+ setFieldValues: (e) => {
503
+ for (let [t, n] of Object.entries(e)) _.setFieldValue(t, n);
504
+ },
505
+ getFieldValue: (e) => _.getFieldValue(e),
506
+ setFieldValue: (e, t) => _.setFieldValue(e, t)
507
+ });
508
+ let b = _.useStore((e) => e.values), S = m(() => r.fields.filter((e) => !e.hidden && $(e, b()))), C = _.useStore((e) => e.isSubmitting), w = _.useStore((e) => e.values), T = _.setFieldValue;
491
509
  return p(y(() => r.values, (e) => {
492
- for (let [t, n] of Object.entries(e ?? {})) _.state.values[t] !== n && w(t, n);
493
- }, { defer: !0 })), p(y(C, (e) => r.onValuesChange?.(e), { defer: !0 })), (() => {
494
- var e = re();
510
+ for (let [t, n] of Object.entries(e ?? {})) _.state.values[t] !== n && T(t, n);
511
+ }, { defer: !0 })), p(y(w, (e) => r.onValuesChange?.(e), { defer: !0 })), (() => {
512
+ var e = ie();
495
513
  return e.addEventListener("submit", (e) => {
496
514
  e.preventDefault(), e.stopPropagation(), _.handleSubmit();
497
515
  }), a(e, n(u, {
498
516
  get each() {
499
- return r.fields;
517
+ return S();
500
518
  },
501
519
  children: (e) => n(_.Field, {
502
520
  get name() {
503
521
  return e.name;
504
522
  },
505
523
  get validators() {
506
- return ae(e);
524
+ return oe(e);
507
525
  },
508
526
  children: (t) => {
509
- let r = t(), s = m(() => (t().state.meta.errors ?? []).map($).filter(Boolean)), l = m(() => t().state.value), f = U(e.fieldWidth), p = f ? { width: f } : void 0;
527
+ let r = t(), s = m(() => (t().state.meta.errors ?? []).map(Q).filter(Boolean)), l = m(() => t().state.value), f = H(e.fieldWidth), p = f ? { width: f } : void 0;
510
528
  return e.control ? (() => {
511
- var t = ie();
529
+ var t = ae();
512
530
  return a(t, () => e.control({
513
531
  value: l,
514
532
  onChange: (e) => r.handleChange(e),
@@ -545,7 +563,7 @@ function oe(e) {
545
563
  });
546
564
  }
547
565
  }),
548
- n(K, {
566
+ n(G, {
549
567
  get controlId() {
550
568
  return h(e.name);
551
569
  },
@@ -595,7 +613,7 @@ function oe(e) {
595
613
  });
596
614
  }
597
615
  })
598
- }), null), a(e, () => r.children?.({ isSubmitting: b() }), null), i((n) => {
616
+ }), null), a(e, () => r.children?.({ isSubmitting: C() }), null), i((n) => {
599
617
  var i = `van-form-form ${r.className ?? ""}`, a = r.size ?? "default";
600
618
  return i !== n.e && t(e, n.e = i), a !== n.t && s(e, "data-size", n.t = a), n;
601
619
  }, {
@@ -605,4 +623,4 @@ function oe(e) {
605
623
  })();
606
624
  }
607
625
  //#endregion
608
- export { oe as t };
626
+ export { ce as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vanstack/solid-ark",
3
- "version": "0.0.22",
3
+ "version": "0.0.24",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -71,10 +71,10 @@
71
71
  "vite-plugin-solid": "^2.11.0",
72
72
  "vitest": "^4.1.10",
73
73
  "zod": "^4.4.0",
74
- "@vanstack/eslint-config": "0.0.1",
75
- "@vanstack/prettier-config": "0.0.1",
74
+ "@vanstack/vite-config": "0.0.2",
76
75
  "@vanstack/tsconfig": "0.0.1",
77
- "@vanstack/vite-config": "0.0.2"
76
+ "@vanstack/prettier-config": "0.0.1",
77
+ "@vanstack/eslint-config": "0.0.1"
78
78
  },
79
79
  "scripts": {
80
80
  "build": "tsc --noEmit && vite build",