pdyform 2.0.1 → 2.1.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 (209) hide show
  1. package/package.json +9 -3
  2. package/packages/core/dist/chunk-TP3IHKWV.js +69 -0
  3. package/packages/core/dist/{chunk-GQASS6PM.js → chunk-WEDHXOHH.js} +22 -0
  4. package/packages/core/dist/formState.cjs +187 -0
  5. package/packages/core/dist/formState.d.cts +17 -0
  6. package/packages/core/dist/formState.d.ts +17 -0
  7. package/packages/core/dist/formState.js +15 -0
  8. package/packages/core/dist/index.cjs +92 -2
  9. package/packages/core/dist/index.d.cts +2 -1
  10. package/packages/core/dist/index.d.ts +2 -1
  11. package/packages/core/dist/index.js +21 -3
  12. package/packages/core/dist/utils.cjs +27 -2
  13. package/packages/core/dist/utils.d.cts +4 -1
  14. package/packages/core/dist/utils.d.ts +4 -1
  15. package/packages/core/dist/utils.js +9 -3
  16. package/packages/react/dist/index.cjs +14 -43
  17. package/packages/react/dist/index.js +20 -43
  18. package/packages/vue/dist/index.d.ts +2 -36
  19. package/packages/vue/dist/index.js +1 -28
  20. package/packages/vue/dist/index.mjs +267 -6530
  21. package/eslint.config.mjs +0 -53
  22. package/example/README.md +0 -36
  23. package/example/react-demo/index.html +0 -12
  24. package/example/react-demo/node_modules/.bin/browserslist +0 -17
  25. package/example/react-demo/node_modules/.bin/tsc +0 -17
  26. package/example/react-demo/node_modules/.bin/tsserver +0 -17
  27. package/example/react-demo/node_modules/.bin/vite +0 -17
  28. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-checkbox.js +0 -300
  29. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-checkbox.js.map +0 -7
  30. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-label.js +0 -194
  31. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-label.js.map +0 -7
  32. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-radio-group.js +0 -530
  33. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-radio-group.js.map +0 -7
  34. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-select.js +0 -4808
  35. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-select.js.map +0 -7
  36. package/example/react-demo/node_modules/.vite/deps/_metadata.json +0 -115
  37. package/example/react-demo/node_modules/.vite/deps/chunk-3D5PZ6F6.js +0 -49
  38. package/example/react-demo/node_modules/.vite/deps/chunk-3D5PZ6F6.js.map +0 -7
  39. package/example/react-demo/node_modules/.vite/deps/chunk-5Q2RBQLA.js +0 -127
  40. package/example/react-demo/node_modules/.vite/deps/chunk-5Q2RBQLA.js.map +0 -7
  41. package/example/react-demo/node_modules/.vite/deps/chunk-G3PMV62Z.js +0 -36
  42. package/example/react-demo/node_modules/.vite/deps/chunk-G3PMV62Z.js.map +0 -7
  43. package/example/react-demo/node_modules/.vite/deps/chunk-GX7YZ5KV.js +0 -370
  44. package/example/react-demo/node_modules/.vite/deps/chunk-GX7YZ5KV.js.map +0 -7
  45. package/example/react-demo/node_modules/.vite/deps/chunk-PUFJGYAC.js +0 -928
  46. package/example/react-demo/node_modules/.vite/deps/chunk-PUFJGYAC.js.map +0 -7
  47. package/example/react-demo/node_modules/.vite/deps/chunk-SIU35MPB.js +0 -21
  48. package/example/react-demo/node_modules/.vite/deps/chunk-SIU35MPB.js.map +0 -7
  49. package/example/react-demo/node_modules/.vite/deps/chunk-TOMGVNQP.js +0 -1906
  50. package/example/react-demo/node_modules/.vite/deps/chunk-TOMGVNQP.js.map +0 -7
  51. package/example/react-demo/node_modules/.vite/deps/chunk-YYN6DZAU.js +0 -21628
  52. package/example/react-demo/node_modules/.vite/deps/chunk-YYN6DZAU.js.map +0 -7
  53. package/example/react-demo/node_modules/.vite/deps/chunk-ZE5VSJFE.js +0 -144
  54. package/example/react-demo/node_modules/.vite/deps/chunk-ZE5VSJFE.js.map +0 -7
  55. package/example/react-demo/node_modules/.vite/deps/class-variance-authority.js +0 -51
  56. package/example/react-demo/node_modules/.vite/deps/class-variance-authority.js.map +0 -7
  57. package/example/react-demo/node_modules/.vite/deps/clsx.js +0 -10
  58. package/example/react-demo/node_modules/.vite/deps/clsx.js.map +0 -7
  59. package/example/react-demo/node_modules/.vite/deps/lucide-react.js +0 -29725
  60. package/example/react-demo/node_modules/.vite/deps/lucide-react.js.map +0 -7
  61. package/example/react-demo/node_modules/.vite/deps/package.json +0 -3
  62. package/example/react-demo/node_modules/.vite/deps/react-dom.js +0 -7
  63. package/example/react-demo/node_modules/.vite/deps/react-dom.js.map +0 -7
  64. package/example/react-demo/node_modules/.vite/deps/react-dom_client.js +0 -39
  65. package/example/react-demo/node_modules/.vite/deps/react-dom_client.js.map +0 -7
  66. package/example/react-demo/node_modules/.vite/deps/react.js +0 -6
  67. package/example/react-demo/node_modules/.vite/deps/react.js.map +0 -7
  68. package/example/react-demo/node_modules/.vite/deps/react_jsx-dev-runtime.js +0 -913
  69. package/example/react-demo/node_modules/.vite/deps/react_jsx-dev-runtime.js.map +0 -7
  70. package/example/react-demo/node_modules/.vite/deps/react_jsx-runtime.js +0 -7
  71. package/example/react-demo/node_modules/.vite/deps/react_jsx-runtime.js.map +0 -7
  72. package/example/react-demo/node_modules/.vite/deps/tailwind-merge.js +0 -2534
  73. package/example/react-demo/node_modules/.vite/deps/tailwind-merge.js.map +0 -7
  74. package/example/react-demo/package.json +0 -23
  75. package/example/react-demo/postcss.config.mjs +0 -6
  76. package/example/react-demo/src/App.tsx +0 -64
  77. package/example/react-demo/src/main.tsx +0 -10
  78. package/example/react-demo/src/styles.css +0 -102
  79. package/example/react-demo/tailwind.config.mjs +0 -50
  80. package/example/react-demo/tsconfig.json +0 -16
  81. package/example/react-demo/vite.config.ts +0 -14
  82. package/example/shared/defaultSchema.ts +0 -68
  83. package/example/vue-demo/index.html +0 -12
  84. package/example/vue-demo/node_modules/.bin/tsc +0 -17
  85. package/example/vue-demo/node_modules/.bin/tsserver +0 -17
  86. package/example/vue-demo/node_modules/.bin/vite +0 -17
  87. package/example/vue-demo/node_modules/.vite/deps/_metadata.json +0 -46
  88. package/example/vue-demo/node_modules/.vite/deps/chunk-PZ5AY32C.js +0 -10
  89. package/example/vue-demo/node_modules/.vite/deps/chunk-PZ5AY32C.js.map +0 -7
  90. package/example/vue-demo/node_modules/.vite/deps/chunk-TCXBSQ4M.js +0 -12877
  91. package/example/vue-demo/node_modules/.vite/deps/chunk-TCXBSQ4M.js.map +0 -7
  92. package/example/vue-demo/node_modules/.vite/deps/clsx.js +0 -22
  93. package/example/vue-demo/node_modules/.vite/deps/clsx.js.map +0 -7
  94. package/example/vue-demo/node_modules/.vite/deps/lucide-vue-next.js +0 -29720
  95. package/example/vue-demo/node_modules/.vite/deps/lucide-vue-next.js.map +0 -7
  96. package/example/vue-demo/node_modules/.vite/deps/package.json +0 -3
  97. package/example/vue-demo/node_modules/.vite/deps/radix-vue.js +0 -24321
  98. package/example/vue-demo/node_modules/.vite/deps/radix-vue.js.map +0 -7
  99. package/example/vue-demo/node_modules/.vite/deps/tailwind-merge.js +0 -2534
  100. package/example/vue-demo/node_modules/.vite/deps/tailwind-merge.js.map +0 -7
  101. package/example/vue-demo/node_modules/.vite/deps/vue.js +0 -348
  102. package/example/vue-demo/node_modules/.vite/deps/vue.js.map +0 -7
  103. package/example/vue-demo/package.json +0 -20
  104. package/example/vue-demo/postcss.config.mjs +0 -6
  105. package/example/vue-demo/src/App.vue +0 -61
  106. package/example/vue-demo/src/env.d.ts +0 -1
  107. package/example/vue-demo/src/main.ts +0 -5
  108. package/example/vue-demo/src/style.css +0 -102
  109. package/example/vue-demo/tailwind.config.mjs +0 -50
  110. package/example/vue-demo/tsconfig.json +0 -15
  111. package/example/vue-demo/vite.config.ts +0 -14
  112. package/packages/core/dist/parser.cjs +0 -1
  113. package/packages/core/dist/parser.d.cts +0 -2
  114. package/packages/core/dist/parser.d.ts +0 -2
  115. package/packages/core/dist/parser.js +0 -0
  116. package/packages/core/node_modules/.bin/api-extractor +0 -17
  117. package/packages/core/node_modules/.bin/esbuild +0 -14
  118. package/packages/core/node_modules/.bin/jiti +0 -17
  119. package/packages/core/node_modules/.bin/tsc +0 -17
  120. package/packages/core/node_modules/.bin/tsserver +0 -17
  121. package/packages/core/node_modules/.bin/tsup +0 -17
  122. package/packages/core/node_modules/.bin/tsup-node +0 -17
  123. package/packages/core/node_modules/.bin/vitest +0 -17
  124. package/packages/core/node_modules/.vite/vitest/results.json +0 -1
  125. package/packages/core/package.json +0 -37
  126. package/packages/core/src/index.ts +0 -2
  127. package/packages/core/src/parser.ts +0 -0
  128. package/packages/core/src/types.ts +0 -42
  129. package/packages/core/src/utils.ts +0 -80
  130. package/packages/core/test/utils.test.ts +0 -99
  131. package/packages/core/tsconfig.json +0 -15
  132. package/packages/core/tsup.config.ts +0 -9
  133. package/packages/react/node_modules/.bin/api-extractor +0 -17
  134. package/packages/react/node_modules/.bin/browserslist +0 -17
  135. package/packages/react/node_modules/.bin/esbuild +0 -14
  136. package/packages/react/node_modules/.bin/jiti +0 -17
  137. package/packages/react/node_modules/.bin/tsc +0 -17
  138. package/packages/react/node_modules/.bin/tsserver +0 -17
  139. package/packages/react/node_modules/.bin/tsup +0 -17
  140. package/packages/react/node_modules/.bin/tsup-node +0 -17
  141. package/packages/react/node_modules/.bin/vite +0 -17
  142. package/packages/react/node_modules/.bin/vitest +0 -17
  143. package/packages/react/node_modules/.vite/vitest/results.json +0 -1
  144. package/packages/react/package.json +0 -57
  145. package/packages/react/postcss.config.mjs +0 -6
  146. package/packages/react/src/DynamicForm.tsx +0 -93
  147. package/packages/react/src/FormFieldRenderer.tsx +0 -50
  148. package/packages/react/src/components/Checkbox.tsx +0 -28
  149. package/packages/react/src/components/CheckboxRenderer.tsx +0 -37
  150. package/packages/react/src/components/Input.tsx +0 -24
  151. package/packages/react/src/components/InputRenderer.tsx +0 -29
  152. package/packages/react/src/components/Label.tsx +0 -24
  153. package/packages/react/src/components/RadioGroup.tsx +0 -42
  154. package/packages/react/src/components/RadioRenderer.tsx +0 -29
  155. package/packages/react/src/components/Select.tsx +0 -93
  156. package/packages/react/src/components/SelectRenderer.tsx +0 -27
  157. package/packages/react/src/components/Textarea.tsx +0 -23
  158. package/packages/react/src/components/TextareaRenderer.tsx +0 -17
  159. package/packages/react/src/components/index.ts +0 -55
  160. package/packages/react/src/components/types.ts +0 -17
  161. package/packages/react/src/index.tsx +0 -3
  162. package/packages/react/src/utils.ts +0 -7
  163. package/packages/react/tailwind.config.mjs +0 -10
  164. package/packages/react/test/DynamicForm.test.tsx +0 -25
  165. package/packages/react/test/FormFieldRenderer.test.tsx +0 -127
  166. package/packages/react/tsconfig.json +0 -15
  167. package/packages/react/vitest.config.ts +0 -16
  168. package/packages/vue/node_modules/.bin/rollup +0 -17
  169. package/packages/vue/node_modules/.bin/tsc +0 -17
  170. package/packages/vue/node_modules/.bin/tsserver +0 -17
  171. package/packages/vue/node_modules/.bin/vite +0 -17
  172. package/packages/vue/node_modules/.bin/vitest +0 -17
  173. package/packages/vue/node_modules/.bin/vue-tsc +0 -17
  174. package/packages/vue/node_modules/.vite/vitest/results.json +0 -1
  175. package/packages/vue/node_modules/.vue-global-types/vue_3.5_0_0_0.d.ts +0 -118
  176. package/packages/vue/node_modules/.vue-global-types/vue_3.5_false.d.ts +0 -128
  177. package/packages/vue/package.json +0 -53
  178. package/packages/vue/postcss.config.mjs +0 -6
  179. package/packages/vue/src/DynamicForm.vue +0 -81
  180. package/packages/vue/src/FormFieldRenderer.vue +0 -70
  181. package/packages/vue/src/components/Checkbox.vue +0 -28
  182. package/packages/vue/src/components/CheckboxRenderer.vue +0 -35
  183. package/packages/vue/src/components/Input.vue +0 -21
  184. package/packages/vue/src/components/InputRenderer.vue +0 -28
  185. package/packages/vue/src/components/Label.vue +0 -21
  186. package/packages/vue/src/components/RadioGroup.vue +0 -30
  187. package/packages/vue/src/components/RadioGroupItem.vue +0 -26
  188. package/packages/vue/src/components/RadioRenderer.vue +0 -24
  189. package/packages/vue/src/components/Select.vue +0 -40
  190. package/packages/vue/src/components/SelectContent.vue +0 -38
  191. package/packages/vue/src/components/SelectItem.vue +0 -43
  192. package/packages/vue/src/components/SelectRenderer.vue +0 -30
  193. package/packages/vue/src/components/SelectTrigger.vue +0 -27
  194. package/packages/vue/src/components/Textarea.vue +0 -19
  195. package/packages/vue/src/components/TextareaRenderer.vue +0 -18
  196. package/packages/vue/src/components/index.ts +0 -24
  197. package/packages/vue/src/env.d.ts +0 -7
  198. package/packages/vue/src/fieldComponentMap.ts +0 -34
  199. package/packages/vue/src/index.ts +0 -4
  200. package/packages/vue/src/utils.ts +0 -6
  201. package/packages/vue/tailwind.config.mjs +0 -10
  202. package/packages/vue/test/DynamicForm.test.ts +0 -19
  203. package/packages/vue/test/FormFieldRenderer.test.ts +0 -133
  204. package/packages/vue/tsconfig.json +0 -16
  205. package/packages/vue/vite.config.ts +0 -29
  206. package/packages/vue/vitest.config.ts +0 -16
  207. package/pnpm-workspace.yaml +0 -4
  208. package/tsconfig.json +0 -21
  209. package/turbo.json +0 -25
@@ -55,7 +55,7 @@ module.exports = __toCommonJS(index_exports);
55
55
 
56
56
  // src/DynamicForm.tsx
57
57
  var import_react = require("react");
58
- var import_core = require("pdyform/core");
58
+ var import_core2 = require("pdyform/core");
59
59
 
60
60
  // src/components/Input.tsx
61
61
  var React = __toESM(require("react"), 1);
@@ -248,14 +248,11 @@ var Label = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
248
248
  Label.displayName = LabelPrimitive.Root.displayName;
249
249
 
250
250
  // src/components/InputRenderer.tsx
251
+ var import_core = require("pdyform/core");
251
252
  var import_jsx_runtime7 = require("react/jsx-runtime");
252
253
  var InputRenderer = ({ field, value, onChange, onBlur, fieldId }) => {
253
254
  const handleChange = (nextValue) => {
254
- if (field.type !== "number") {
255
- onChange(nextValue);
256
- return;
257
- }
258
- onChange(nextValue === "" ? "" : Number(nextValue));
255
+ onChange((0, import_core.normalizeFieldValue)(field, nextValue));
259
256
  };
260
257
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
261
258
  Input,
@@ -398,47 +395,21 @@ var FormFieldRenderer = ({
398
395
  // src/DynamicForm.tsx
399
396
  var import_jsx_runtime13 = require("react/jsx-runtime");
400
397
  var DynamicForm = ({ schema, onSubmit, className }) => {
401
- const [values, setValues] = (0, import_react.useState)((0, import_core.getDefaultValues)(schema.fields));
402
- const [errors, setErrors] = (0, import_react.useState)({});
403
- const [isSubmitting, setIsSubmitting] = (0, import_react.useState)(false);
398
+ const [formState, setFormState] = (0, import_react.useState)(() => (0, import_core2.createFormRuntimeState)(schema.fields));
404
399
  const handleFieldChange = (name, value) => {
405
- setValues((prev) => ({ ...prev, [name]: value }));
406
- const field = schema.fields.find((f) => f.name === name);
407
- if (field) {
408
- const error = (0, import_core.validateField)(value, field);
409
- setErrors((prev) => ({
410
- ...prev,
411
- [name]: error || ""
412
- }));
413
- }
400
+ setFormState((prev) => (0, import_core2.applyFieldChange)(schema.fields, prev, name, value));
414
401
  };
415
402
  const handleFieldBlur = (name) => {
416
- const field = schema.fields.find((f) => f.name === name);
417
- if (field) {
418
- const error = (0, import_core.validateField)(values[name], field);
419
- setErrors((prev) => ({
420
- ...prev,
421
- [name]: error || ""
422
- }));
423
- }
403
+ setFormState((prev) => (0, import_core2.applyFieldBlur)(schema.fields, prev, name));
424
404
  };
425
405
  const handleSubmit = (e) => {
426
406
  e.preventDefault();
427
- setIsSubmitting(true);
428
- const newErrors = {};
429
- let hasError = false;
430
- schema.fields.forEach((field) => {
431
- const error = (0, import_core.validateField)(values[field.name], field);
432
- if (error) {
433
- newErrors[field.name] = error;
434
- hasError = true;
435
- }
436
- });
437
- setErrors(newErrors);
407
+ const submittingState = (0, import_core2.setSubmitting)(formState, true);
408
+ const { state: validatedState, hasError } = (0, import_core2.runSubmitValidation)(schema.fields, submittingState);
409
+ setFormState(validatedState);
438
410
  if (!hasError) {
439
- onSubmit(values);
411
+ onSubmit(validatedState.values);
440
412
  }
441
- setIsSubmitting(false);
442
413
  };
443
414
  return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("form", { onSubmit: handleSubmit, className: `space-y-6 ${className || ""}`, children: [
444
415
  schema.title && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("h2", { className: "text-2xl font-bold tracking-tight", children: schema.title }),
@@ -447,10 +418,10 @@ var DynamicForm = ({ schema, onSubmit, className }) => {
447
418
  FormFieldRenderer,
448
419
  {
449
420
  field,
450
- value: values[field.name],
421
+ value: formState.values[field.name],
451
422
  onChange: (val) => handleFieldChange(field.name, val),
452
423
  onBlur: () => handleFieldBlur(field.name),
453
- error: errors[field.name]
424
+ error: formState.errors[field.name]
454
425
  },
455
426
  field.name
456
427
  )) }),
@@ -458,9 +429,9 @@ var DynamicForm = ({ schema, onSubmit, className }) => {
458
429
  "button",
459
430
  {
460
431
  type: "submit",
461
- disabled: isSubmitting,
432
+ disabled: formState.isSubmitting,
462
433
  className: "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2 w-full",
463
- children: isSubmitting ? "Submitting..." : schema.submitButtonText || "Submit"
434
+ children: formState.isSubmitting ? "Submitting..." : schema.submitButtonText || "Submit"
464
435
  }
465
436
  )
466
437
  ] });
@@ -1,6 +1,12 @@
1
1
  // src/DynamicForm.tsx
2
2
  import { useState } from "react";
3
- import { validateField, getDefaultValues } from "pdyform/core";
3
+ import {
4
+ createFormRuntimeState,
5
+ applyFieldChange,
6
+ applyFieldBlur,
7
+ runSubmitValidation,
8
+ setSubmitting
9
+ } from "pdyform/core";
4
10
 
5
11
  // src/components/Input.tsx
6
12
  import * as React from "react";
@@ -193,14 +199,11 @@ var Label = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
193
199
  Label.displayName = LabelPrimitive.Root.displayName;
194
200
 
195
201
  // src/components/InputRenderer.tsx
202
+ import { normalizeFieldValue } from "pdyform/core";
196
203
  import { jsx as jsx7 } from "react/jsx-runtime";
197
204
  var InputRenderer = ({ field, value, onChange, onBlur, fieldId }) => {
198
205
  const handleChange = (nextValue) => {
199
- if (field.type !== "number") {
200
- onChange(nextValue);
201
- return;
202
- }
203
- onChange(nextValue === "" ? "" : Number(nextValue));
206
+ onChange(normalizeFieldValue(field, nextValue));
204
207
  };
205
208
  return /* @__PURE__ */ jsx7(
206
209
  Input,
@@ -343,47 +346,21 @@ var FormFieldRenderer = ({
343
346
  // src/DynamicForm.tsx
344
347
  import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
345
348
  var DynamicForm = ({ schema, onSubmit, className }) => {
346
- const [values, setValues] = useState(getDefaultValues(schema.fields));
347
- const [errors, setErrors] = useState({});
348
- const [isSubmitting, setIsSubmitting] = useState(false);
349
+ const [formState, setFormState] = useState(() => createFormRuntimeState(schema.fields));
349
350
  const handleFieldChange = (name, value) => {
350
- setValues((prev) => ({ ...prev, [name]: value }));
351
- const field = schema.fields.find((f) => f.name === name);
352
- if (field) {
353
- const error = validateField(value, field);
354
- setErrors((prev) => ({
355
- ...prev,
356
- [name]: error || ""
357
- }));
358
- }
351
+ setFormState((prev) => applyFieldChange(schema.fields, prev, name, value));
359
352
  };
360
353
  const handleFieldBlur = (name) => {
361
- const field = schema.fields.find((f) => f.name === name);
362
- if (field) {
363
- const error = validateField(values[name], field);
364
- setErrors((prev) => ({
365
- ...prev,
366
- [name]: error || ""
367
- }));
368
- }
354
+ setFormState((prev) => applyFieldBlur(schema.fields, prev, name));
369
355
  };
370
356
  const handleSubmit = (e) => {
371
357
  e.preventDefault();
372
- setIsSubmitting(true);
373
- const newErrors = {};
374
- let hasError = false;
375
- schema.fields.forEach((field) => {
376
- const error = validateField(values[field.name], field);
377
- if (error) {
378
- newErrors[field.name] = error;
379
- hasError = true;
380
- }
381
- });
382
- setErrors(newErrors);
358
+ const submittingState = setSubmitting(formState, true);
359
+ const { state: validatedState, hasError } = runSubmitValidation(schema.fields, submittingState);
360
+ setFormState(validatedState);
383
361
  if (!hasError) {
384
- onSubmit(values);
362
+ onSubmit(validatedState.values);
385
363
  }
386
- setIsSubmitting(false);
387
364
  };
388
365
  return /* @__PURE__ */ jsxs6("form", { onSubmit: handleSubmit, className: `space-y-6 ${className || ""}`, children: [
389
366
  schema.title && /* @__PURE__ */ jsx13("h2", { className: "text-2xl font-bold tracking-tight", children: schema.title }),
@@ -392,10 +369,10 @@ var DynamicForm = ({ schema, onSubmit, className }) => {
392
369
  FormFieldRenderer,
393
370
  {
394
371
  field,
395
- value: values[field.name],
372
+ value: formState.values[field.name],
396
373
  onChange: (val) => handleFieldChange(field.name, val),
397
374
  onBlur: () => handleFieldBlur(field.name),
398
- error: errors[field.name]
375
+ error: formState.errors[field.name]
399
376
  },
400
377
  field.name
401
378
  )) }),
@@ -403,9 +380,9 @@ var DynamicForm = ({ schema, onSubmit, className }) => {
403
380
  "button",
404
381
  {
405
382
  type: "submit",
406
- disabled: isSubmitting,
383
+ disabled: formState.isSubmitting,
407
384
  className: "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2 w-full",
408
- children: isSubmitting ? "Submitting..." : schema.submitButtonText || "Submit"
385
+ children: formState.isSubmitting ? "Submitting..." : schema.submitButtonText || "Submit"
409
386
  }
410
387
  )
411
388
  ] });
@@ -2,6 +2,8 @@ import { Component } from 'vue';
2
2
  import { ComponentOptionsMixin } from 'vue';
3
3
  import { ComponentProvideOptions } from 'vue';
4
4
  import { DefineComponent } from 'vue';
5
+ import { FormField } from 'pdyform/core';
6
+ import { FormSchema } from 'pdyform/core';
5
7
  import { PublicProps } from 'vue';
6
8
 
7
9
  declare type __VLS_Props = {
@@ -53,46 +55,10 @@ export declare interface FieldRendererProps {
53
55
  fieldId: string;
54
56
  }
55
57
 
56
- declare type FieldType = 'text' | 'number' | 'email' | 'password' | 'select' | 'checkbox' | 'radio' | 'textarea' | 'date';
57
-
58
- declare interface FormField {
59
- id: string;
60
- name: string;
61
- label: string;
62
- type: FieldType;
63
- placeholder?: string;
64
- description?: string;
65
- defaultValue?: any;
66
- options?: Option_2[]; // For select, radio, checkbox
67
- validations?: ValidationRule[];
68
- hidden?: boolean;
69
- disabled?: boolean;
70
- className?: string; // CSS class for custom styling
71
- }
72
-
73
58
  export declare const FormFieldRenderer: DefineComponent<__VLS_Props_2, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
74
59
  "update:modelValue": (...args: any[]) => void;
75
60
  }, string, PublicProps, Readonly<__VLS_Props_2> & Readonly<{
76
61
  "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
77
62
  }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
78
63
 
79
- declare interface FormSchema {
80
- title?: string;
81
- description?: string;
82
- fields: FormField[];
83
- submitButtonText?: string;
84
- }
85
-
86
- declare interface Option_2 {
87
- label: string;
88
- value: string | number;
89
- }
90
-
91
- declare interface ValidationRule {
92
- type: 'required' | 'min' | 'max' | 'pattern' | 'email' | 'custom';
93
- value?: any;
94
- message?: string;
95
- validator?: (value: any) => boolean | string;
96
- }
97
-
98
64
  export { }