@macrulez/vue-form-schema 0.1.7 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +461 -180
  3. package/dist/MaskEngine-BEXwX4BK.js +144 -0
  4. package/dist/MaskEngine-CPr-fSPy.cjs +1 -0
  5. package/dist/ValidationEngine-BC4U1ef1.js +135 -0
  6. package/dist/ValidationEngine-Diz-qTFs.cjs +1 -0
  7. package/dist/_plugin-vue_export-helper-BHFhmbuH.cjs +1 -0
  8. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +9 -0
  9. package/dist/core/ConditionEvaluator.d.ts.map +1 -1
  10. package/dist/core/MaskEngine.d.ts.map +1 -1
  11. package/dist/core/ValidationEngine.d.ts +13 -0
  12. package/dist/core/ValidationEngine.d.ts.map +1 -1
  13. package/dist/core/formRegistry.d.ts +33 -0
  14. package/dist/core/formRegistry.d.ts.map +1 -0
  15. package/dist/core/inferTypes.d.ts.map +1 -1
  16. package/dist/core/schemaUtils.d.ts +38 -0
  17. package/dist/core/schemaUtils.d.ts.map +1 -1
  18. package/dist/core/serverErrors.d.ts +69 -0
  19. package/dist/core/serverErrors.d.ts.map +1 -0
  20. package/dist/core/types.d.ts +22 -2
  21. package/dist/core/types.d.ts.map +1 -1
  22. package/dist/core/useForm.d.ts +4 -1
  23. package/dist/core/useForm.d.ts.map +1 -1
  24. package/dist/core/useMultiStepForm.d.ts.map +1 -1
  25. package/dist/devtools/index.d.ts +26 -0
  26. package/dist/devtools/index.d.ts.map +1 -0
  27. package/dist/devtools.cjs +1 -0
  28. package/dist/devtools.d.ts +6 -0
  29. package/dist/devtools.js +93 -0
  30. package/dist/formRegistry-Bv1eaWQ-.js +31 -0
  31. package/dist/formRegistry-DaDmXyYY.cjs +1 -0
  32. package/dist/index.cjs +1 -1
  33. package/dist/index.d.ts +5 -3
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +392 -359
  36. package/dist/openapi.cjs +1 -0
  37. package/dist/openapi.d.ts +202 -0
  38. package/dist/openapi.js +118 -0
  39. package/dist/parsers/json.d.ts.map +1 -1
  40. package/dist/parsers/openapi.d.ts +139 -0
  41. package/dist/parsers/openapi.d.ts.map +1 -0
  42. package/dist/parsers/valibot.d.ts +13 -4
  43. package/dist/parsers/valibot.d.ts.map +1 -1
  44. package/dist/parsers/yup.d.ts +10 -4
  45. package/dist/parsers/yup.d.ts.map +1 -1
  46. package/dist/parsers/zod.d.ts +18 -4
  47. package/dist/parsers/zod.d.ts.map +1 -1
  48. package/dist/schemaUtils-Cc7CwGXB.cjs +1 -0
  49. package/dist/schemaUtils-Cvlsk24U.js +337 -0
  50. package/dist/style.css +1 -0
  51. package/dist/ui/index.d.ts +1 -0
  52. package/dist/ui/index.d.ts.map +1 -1
  53. package/dist/ui/naive/index.d.ts +11 -0
  54. package/dist/ui/naive/index.d.ts.map +1 -0
  55. package/dist/ui/primevue/index.d.ts +11 -0
  56. package/dist/ui/primevue/index.d.ts.map +1 -0
  57. package/dist/ui/shadcn/index.d.ts +11 -0
  58. package/dist/ui/shadcn/index.d.ts.map +1 -0
  59. package/dist/ui/tailwind/index.d.ts +11 -0
  60. package/dist/ui/tailwind/index.d.ts.map +1 -0
  61. package/dist/ui-naive.cjs +1 -0
  62. package/dist/ui-naive.d.ts +411 -0
  63. package/dist/ui-naive.js +667 -0
  64. package/dist/ui-primevue.cjs +1 -0
  65. package/dist/ui-primevue.d.ts +411 -0
  66. package/dist/ui-primevue.js +651 -0
  67. package/dist/ui-shadcn.cjs +1 -0
  68. package/dist/ui-shadcn.d.ts +411 -0
  69. package/dist/ui-shadcn.js +650 -0
  70. package/dist/ui-tailwind.cjs +1 -0
  71. package/dist/ui-tailwind.d.ts +411 -0
  72. package/dist/ui-tailwind.js +669 -0
  73. package/dist/ui.cjs +1 -1
  74. package/dist/ui.d.ts +61 -10
  75. package/dist/ui.js +434 -299
  76. package/dist/valibot.cjs +1 -1
  77. package/dist/valibot.d.ts +35 -4
  78. package/dist/valibot.js +47 -20
  79. package/dist/yup.cjs +1 -1
  80. package/dist/yup.d.ts +33 -5
  81. package/dist/yup.js +16 -15
  82. package/dist/zod.cjs +1 -1
  83. package/dist/zod.d.ts +41 -5
  84. package/dist/zod.js +58 -28
  85. package/package.json +99 -25
  86. package/dist/MaskEngine-BqJQYybS.js +0 -233
  87. package/dist/MaskEngine-BwAs2Zb0.cjs +0 -1
  88. package/dist/__tests__/ConditionEvaluator.test.d.ts +0 -2
  89. package/dist/__tests__/ConditionEvaluator.test.d.ts.map +0 -1
  90. package/dist/__tests__/MaskEngine.test.d.ts +0 -2
  91. package/dist/__tests__/MaskEngine.test.d.ts.map +0 -1
  92. package/dist/__tests__/ValidationEngine.test.d.ts +0 -2
  93. package/dist/__tests__/ValidationEngine.test.d.ts.map +0 -1
  94. package/dist/__tests__/parsers.test.d.ts +0 -2
  95. package/dist/__tests__/parsers.test.d.ts.map +0 -1
  96. package/dist/__tests__/phase3.test.d.ts +0 -2
  97. package/dist/__tests__/phase3.test.d.ts.map +0 -1
  98. package/dist/__tests__/phase4.test.d.ts +0 -2
  99. package/dist/__tests__/phase4.test.d.ts.map +0 -1
  100. package/dist/__tests__/useFieldArray.test.d.ts +0 -2
  101. package/dist/__tests__/useFieldArray.test.d.ts.map +0 -1
  102. package/dist/__tests__/useForm.test.d.ts +0 -2
  103. package/dist/__tests__/useForm.test.d.ts.map +0 -1
  104. package/dist/__tests__/useMultiStepForm.test.d.ts +0 -2
  105. package/dist/__tests__/useMultiStepForm.test.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),x=require("./MaskEngine-CPr-fSPy.cjs"),F=require("./ValidationEngine-Diz-qTFs.cjs"),D={class:"mb-4"},T=["for"],R={key:0,class:"text-red-400 ml-0.5","aria-hidden":"true"},A=["id"],k=e.defineComponent({__name:"BaseField",props:{field:{},error:{},touched:{type:Boolean}},setup(t){const s=t,o=e.computed(()=>{var a;return!!(s.touched&&((a=s.error)!=null&&a.length))}),c=e.computed(()=>`${s.field.name}-error`),n=e.computed(()=>({"aria-required":s.field.required?"true":void 0,"aria-invalid":o.value?"true":"false","aria-describedby":o.value?c.value:void 0}));return(a,d)=>(e.openBlock(),e.createElementBlock("div",D,[t.field.label?(e.openBlock(),e.createElementBlock("label",{key:0,for:t.field.name,class:"block text-xs font-semibold uppercase tracking-wider text-gray-400 mb-1.5"},[e.createTextVNode(e.toDisplayString(t.field.label)+" ",1),t.field.required?(e.openBlock(),e.createElementBlock("span",R,"*")):e.createCommentVNode("",!0)],8,T)):e.createCommentVNode("",!0),e.renderSlot(a.$slots,"default",e.normalizeProps(e.guardReactiveProps(n.value))),o.value?(e.openBlock(),e.createElementBlock("ul",{key:1,id:c.value,class:"mt-1 space-y-0.5",role:"alert","aria-live":"polite"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.error,(i,m)=>(e.openBlock(),e.createElementBlock("li",{key:m,class:"text-red-400 text-xs"},e.toDisplayString(i),1))),128))],8,A)):e.createCommentVNode("",!0)]))}}),P=["id","type","name","value","placeholder","disabled","required"],B=e.defineComponent({__name:"TextField",props:{field:{},modelValue:{},error:{},touched:{type:Boolean}},emits:["update:modelValue","blur"],setup(t,{emit:s}){const o=t,c=s,n=e.ref(null);let a=null;const d=e.computed(()=>{var i;return!!(o.touched&&((i=o.error)!=null&&i.length))});return e.onMounted(()=>{n.value&&o.field.mask&&(a=x.bindMask(n.value,o.field.mask))}),e.onUnmounted(()=>a==null?void 0:a()),(i,m)=>(e.openBlock(),e.createBlock(k,{field:t.field,error:t.error,touched:t.touched},{default:e.withCtx(f=>[e.createElementVNode("input",e.mergeProps({id:t.field.name,ref_key:"inputRef",ref:n,type:t.field.type==="email"?"email":"text",name:t.field.name,value:t.modelValue??"",placeholder:t.field.placeholder,disabled:t.field.disabled===!0,required:t.field.required},f,{class:["w-full rounded-lg border bg-gray-900 px-3 py-2 text-sm text-gray-100 placeholder-gray-500 outline-none transition focus:ring-2 disabled:cursor-not-allowed disabled:opacity-50",d.value?"border-red-500 focus:ring-red-500":"border-gray-700 focus:ring-indigo-500 focus:border-indigo-500"],onInput:m[0]||(m[0]=g=>c("update:modelValue",g.target.value)),onBlur:m[1]||(m[1]=g=>c("blur"))}),null,16,P)]),_:1},8,["field","error","touched"]))}}),L=["id","name","value","placeholder","disabled","required"],V=e.defineComponent({__name:"NumberField",props:{field:{},modelValue:{},error:{},touched:{type:Boolean}},emits:["update:modelValue","blur"],setup(t,{emit:s}){const o=t,c=s,n=e.computed(()=>{var d;return!!(o.touched&&((d=o.error)!=null&&d.length))});function a(d){const i=d.target.value;c("update:modelValue",i===""?null:Number(i))}return(d,i)=>(e.openBlock(),e.createBlock(k,{field:t.field,error:t.error,touched:t.touched},{default:e.withCtx(m=>[e.createElementVNode("input",e.mergeProps({id:t.field.name,type:"number",name:t.field.name,value:t.modelValue??"",placeholder:t.field.placeholder,disabled:t.field.disabled===!0,required:t.field.required},m,{class:["w-full rounded-lg border bg-gray-900 px-3 py-2 text-sm text-gray-100 placeholder-gray-500 outline-none transition focus:ring-2 disabled:cursor-not-allowed disabled:opacity-50",n.value?"border-red-500 focus:ring-red-500":"border-gray-700 focus:ring-indigo-500 focus:border-indigo-500"],onInput:a,onBlur:i[0]||(i[0]=f=>c("blur"))}),null,16,L)]),_:1},8,["field","error","touched"]))}}),I=["id","name","value","placeholder","disabled","required"],$=e.defineComponent({__name:"TextareaField",props:{field:{},modelValue:{},error:{},touched:{type:Boolean}},emits:["update:modelValue","blur"],setup(t,{emit:s}){const o=t,c=s,n=e.computed(()=>{var a;return!!(o.touched&&((a=o.error)!=null&&a.length))});return(a,d)=>(e.openBlock(),e.createBlock(k,{field:t.field,error:t.error,touched:t.touched},{default:e.withCtx(i=>[e.createElementVNode("textarea",e.mergeProps({id:t.field.name,name:t.field.name,value:t.modelValue??"",placeholder:t.field.placeholder,disabled:t.field.disabled===!0,required:t.field.required},i,{class:["w-full resize-y rounded-lg border bg-gray-900 px-3 py-2 text-sm text-gray-100 placeholder-gray-500 outline-none transition focus:ring-2 disabled:cursor-not-allowed disabled:opacity-50",n.value?"border-red-500 focus:ring-red-500":"border-gray-700 focus:ring-indigo-500 focus:border-indigo-500"],style:{"min-height":"80px"},onInput:d[0]||(d[0]=m=>c("update:modelValue",m.target.value)),onBlur:d[1]||(d[1]=m=>c("blur"))}),null,16,I)]),_:1},8,["field","error","touched"]))}}),M={key:0,class:"py-2 text-sm text-gray-400"},z=["id","name","disabled","required"],U=["selected"],j=["value","selected"],E=e.defineComponent({__name:"SelectField",props:{field:{},modelValue:{},error:{},touched:{type:Boolean}},emits:["update:modelValue","blur"],setup(t,{emit:s}){const o=t,c=s,n=e.computed(()=>Array.isArray(o.field.options)?o.field.options:[]),a=e.computed(()=>{var i;return!!(o.touched&&((i=o.error)!=null&&i.length))});function d(i){const m=i.target,f=n.value.find(g=>String(g.value)===m.value);c("update:modelValue",(f==null?void 0:f.value)??m.value)}return(i,m)=>(e.openBlock(),e.createBlock(k,{field:t.field,error:t.error,touched:t.touched},{default:e.withCtx(f=>[t.field.optionsLoading?(e.openBlock(),e.createElementBlock("div",M,"Loading…")):(e.openBlock(),e.createElementBlock("select",e.mergeProps({key:1,id:t.field.name,name:t.field.name,disabled:t.field.disabled===!0||t.field.optionsLoading,required:t.field.required},f,{class:["w-full rounded-lg border bg-gray-900 px-3 py-2 text-sm text-gray-100 outline-none transition focus:ring-2 disabled:cursor-not-allowed disabled:opacity-50",a.value?"border-red-500 focus:ring-red-500":"border-gray-700 focus:ring-indigo-500 focus:border-indigo-500"],onChange:d,onBlur:m[0]||(m[0]=g=>c("blur"))}),[e.createElementVNode("option",{value:"",disabled:"",selected:t.modelValue===null||t.modelValue===void 0||t.modelValue==="",class:"bg-gray-800"},e.toDisplayString(t.field.placeholder??"Select an option"),9,U),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value,g=>(e.openBlock(),e.createElementBlock("option",{key:String(g.value),value:String(g.value),selected:t.modelValue===g.value,class:"bg-gray-800"},e.toDisplayString(g.label),9,j))),128))],16,z))]),_:1},8,["field","error","touched"]))}}),K={class:"flex cursor-pointer items-center gap-2.5"},O=["id","name","checked","disabled","required","aria-checked"],G={key:0,class:"text-sm text-gray-200"},C=e.defineComponent({__name:"CheckboxField",props:{field:{},modelValue:{type:[Boolean,null]},error:{},touched:{type:Boolean}},emits:["update:modelValue","blur"],setup(t,{emit:s}){const o=s;return(c,n)=>(e.openBlock(),e.createBlock(k,{field:{...t.field,label:void 0},error:t.error,touched:t.touched},{default:e.withCtx(a=>[e.createElementVNode("label",K,[e.createElementVNode("input",e.mergeProps({id:t.field.name,type:"checkbox",name:t.field.name,checked:!!t.modelValue,disabled:t.field.disabled===!0,required:t.field.required,"aria-checked":t.modelValue?"true":"false"},a,{class:"h-4 w-4 cursor-pointer rounded border-gray-600 bg-gray-900 text-indigo-500 accent-indigo-500 disabled:cursor-not-allowed disabled:opacity-50",onChange:n[0]||(n[0]=d=>o("update:modelValue",d.target.checked)),onBlur:n[1]||(n[1]=d=>o("blur"))}),null,16,O),t.field.label?(e.openBlock(),e.createElementBlock("span",G,e.toDisplayString(t.field.label),1)):e.createCommentVNode("",!0)])]),_:1},8,["field","error","touched"]))}}),H=["aria-required","aria-invalid","aria-describedby"],J={key:0,class:"block text-xs font-semibold uppercase tracking-wider text-gray-400 mb-2"},Q={key:0,class:"text-red-400 ml-0.5","aria-hidden":"true"},W={class:"space-y-2"},X=["name","value","checked","disabled","onChange"],Y={class:"text-sm text-gray-200"},Z=["id"],w=e.defineComponent({__name:"RadioField",props:{field:{},modelValue:{},error:{},touched:{type:Boolean}},emits:["update:modelValue","blur"],setup(t,{emit:s}){const o=t,c=s,n=e.computed(()=>{var i;return!!(o.touched&&((i=o.error)!=null&&i.length))}),a=e.computed(()=>`${o.field.name}-error`),d=e.computed(()=>Array.isArray(o.field.options)?o.field.options:[]);return(i,m)=>(e.openBlock(),e.createElementBlock("fieldset",{class:"mb-4","aria-required":t.field.required?"true":void 0,"aria-invalid":n.value?"true":"false","aria-describedby":n.value?a.value:void 0},[t.field.label?(e.openBlock(),e.createElementBlock("legend",J,[e.createTextVNode(e.toDisplayString(t.field.label)+" ",1),t.field.required?(e.openBlock(),e.createElementBlock("span",Q,"*")):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),e.createElementVNode("div",W,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,f=>(e.openBlock(),e.createElementBlock("label",{key:String(f.value),class:"flex cursor-pointer items-center gap-2.5"},[e.createElementVNode("input",{type:"radio",name:t.field.name,value:String(f.value),checked:t.modelValue===f.value,disabled:t.field.disabled===!0,class:"h-4 w-4 cursor-pointer border-gray-600 bg-gray-900 text-indigo-500 accent-indigo-500 disabled:cursor-not-allowed disabled:opacity-50",onChange:g=>c("update:modelValue",f.value),onBlur:m[0]||(m[0]=g=>c("blur"))},null,40,X),e.createElementVNode("span",Y,e.toDisplayString(f.label),1)]))),128))]),n.value?(e.openBlock(),e.createElementBlock("ul",{key:1,id:a.value,class:"mt-1 space-y-0.5",role:"alert","aria-live":"polite"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.error,(f,g)=>(e.openBlock(),e.createElementBlock("li",{key:g,class:"text-red-400 text-xs"},e.toDisplayString(f),1))),128))],8,Z)):e.createCommentVNode("",!0)],8,H))}}),_=["id","name","value","disabled","required"],N=e.defineComponent({__name:"DateField",props:{field:{},modelValue:{},error:{},touched:{type:Boolean}},emits:["update:modelValue","blur"],setup(t,{emit:s}){const o=t,c=s,n=e.computed(()=>{var a;return!!(o.touched&&((a=o.error)!=null&&a.length))});return(a,d)=>(e.openBlock(),e.createBlock(k,{field:t.field,error:t.error,touched:t.touched},{default:e.withCtx(i=>[e.createElementVNode("input",e.mergeProps({id:t.field.name,type:"date",name:t.field.name,value:t.modelValue??"",disabled:t.field.disabled===!0,required:t.field.required},i,{class:["w-full rounded-lg border bg-gray-900 px-3 py-2 text-sm text-gray-100 outline-none transition focus:ring-2 disabled:cursor-not-allowed disabled:opacity-50",n.value?"border-red-500 focus:ring-red-500":"border-gray-700 focus:ring-indigo-500 focus:border-indigo-500"],onInput:d[0]||(d[0]=m=>c("update:modelValue",m.target.value)),onBlur:d[1]||(d[1]=m=>c("blur"))}),null,16,_)]),_:1},8,["field","error","touched"]))}}),ee=["id","name","accept","multiple","disabled","required"],te={class:"pointer-events-none space-y-1"},oe={class:"text-sm text-gray-300"},re={key:0,class:"text-xs text-gray-500"},le={key:0,class:"mt-2 space-y-1"},ne={class:"truncate text-gray-200"},ae={class:"ml-2 shrink-0 text-xs text-gray-500"},de=["aria-label","onClick"],S=e.defineComponent({__name:"FileField",props:{field:{},modelValue:{},error:{},touched:{type:Boolean}},emits:["update:modelValue","blur"],setup(t,{emit:s}){const o=t,c=s,n=e.ref(!1),a=e.ref(null),d=e.computed(()=>o.modelValue?Array.isArray(o.modelValue)?o.modelValue:[o.modelValue]:[]),i=e.computed(()=>o.field.multiple??!1);function m(l){if(!l||l.length===0){c("update:modelValue",null);return}c("update:modelValue",i.value?Array.from(l):l[0])}function f(l){m(l.target.files),c("blur")}function g(l){var r;n.value=!1,l.preventDefault(),m(((r=l.dataTransfer)==null?void 0:r.files)??null),c("blur")}function h(l){const r=d.value.filter((b,y)=>y!==l);r.length===0?(c("update:modelValue",null),a.value&&(a.value.value="")):c("update:modelValue",i.value?r:r[0])}function v(l){return l<1024?`${l} B`:l<1024*1024?`${(l/1024).toFixed(1)} KB`:`${(l/(1024*1024)).toFixed(1)} MB`}return(l,r)=>(e.openBlock(),e.createBlock(k,{field:t.field,error:t.error,touched:t.touched},{default:e.withCtx(b=>{var y;return[e.createElementVNode("div",{class:e.normalizeClass(["relative rounded-lg border-2 border-dashed p-6 text-center transition",n.value?"border-indigo-500 bg-indigo-500/10":t.touched&&((y=t.error)!=null&&y.length)?"border-red-500 bg-red-500/5":"border-gray-700 bg-gray-900 hover:border-gray-500"]),onDragover:r[0]||(r[0]=e.withModifiers(u=>n.value=!0,["prevent"])),onDragleave:r[1]||(r[1]=u=>n.value=!1),onDrop:g},[e.createElementVNode("input",e.mergeProps({id:t.field.name,ref_key:"inputRef",ref:a,type:"file",name:t.field.name,accept:t.field.accept,multiple:i.value,disabled:t.field.disabled===!0,required:t.field.required},b,{class:"absolute inset-0 h-full w-full cursor-pointer opacity-0 disabled:cursor-not-allowed",onChange:f}),null,16,ee),e.createElementVNode("div",te,[r[2]||(r[2]=e.createElementVNode("div",{class:"text-2xl"},"📁",-1)),e.createElementVNode("p",oe,e.toDisplayString(n.value?"Drop files here":"Click to upload or drag & drop"),1),t.field.accept?(e.openBlock(),e.createElementBlock("p",re,e.toDisplayString(t.field.accept),1)):e.createCommentVNode("",!0)])],34),d.value.length?(e.openBlock(),e.createElementBlock("ul",le,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,(u,p)=>(e.openBlock(),e.createElementBlock("li",{key:`${u.name}-${p}`,class:"flex items-center justify-between rounded-lg border border-gray-700 bg-gray-900 px-3 py-2 text-sm"},[e.createElementVNode("span",ne,e.toDisplayString(u.name),1),e.createElementVNode("span",ae,e.toDisplayString(v(u.size)),1),e.createElementVNode("button",{type:"button","aria-label":`Remove ${u.name}`,class:"ml-2 shrink-0 text-gray-500 hover:text-red-400 transition",onClick:ye=>h(p)}," × ",8,de)]))),128))])):e.createCommentVNode("",!0)]}),_:1},8,["field","error","touched"]))}}),ie={class:"mb-4"},ue={key:0,class:"block text-xs font-semibold uppercase tracking-wider text-gray-400 mb-2"},ce={class:"flex-1 space-y-0"},se=["onClick"],q=e.defineComponent({__name:"ArrayField",props:{field:{},form:{},components:{}},setup(t){const s=t,o=x.useRegistry(),c={text:B,email:B,number:V,textarea:$,select:E,checkbox:C,radio:w,date:N};function n(l){var r;return l.component?l.component:((r=s.components)==null?void 0:r[l.type])??o[l.type]??c[l.type]??null}const{rows:a,append:d,remove:i}=x.useFieldArray(s.form,s.field.name);function m(l){return F.getByPath(s.form.values.value,l.name)}function f(l,r){s.form.setField(l.name,r)}function g(l){var b;const r=s.form;(b=r.touchField)==null||b.call(r,l.name)}function h(l){return s.form.errors.value[l.name]??[]}function v(l){return s.form.touched.value[l.name]??!1}return(l,r)=>(e.openBlock(),e.createElementBlock("div",ie,[t.field.label?(e.openBlock(),e.createElementBlock("div",ue,e.toDisplayString(t.field.label),1)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(a),b=>(e.openBlock(),e.createElementBlock("div",{key:b.key,class:"mb-2 flex items-start gap-2 rounded-lg border border-gray-700 bg-gray-900 p-3"},[e.createElementVNode("div",ce,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(b.fields,y=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:y.name},[n(y)?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(n(y)),{key:0,field:y,"model-value":m(y),error:h(y),touched:v(y),"onUpdate:modelValue":u=>f(y,u),onBlur:u=>g(y)},null,40,["field","model-value","error","touched","onUpdate:modelValue","onBlur"])):e.createCommentVNode("",!0)],64))),128))]),e.createElementVNode("button",{type:"button",class:"mt-7 shrink-0 rounded px-2 py-1 text-xs text-gray-500 hover:bg-red-500/10 hover:text-red-400 transition",onClick:y=>e.unref(i)(b.index)}," Remove ",8,se)]))),128)),e.createElementVNode("button",{type:"button",class:"mt-1 rounded-lg border border-dashed border-gray-600 px-4 py-2 text-sm text-gray-400 hover:border-indigo-500 hover:text-indigo-400 transition",onClick:r[0]||(r[0]=b=>e.unref(d)())}," + Add row ")]))}}),me={key:1,class:"mb-4 rounded-lg border border-gray-700 p-4"},fe={key:0,class:"px-1 text-xs font-semibold uppercase tracking-wider text-gray-400"},ge=["disabled"],be=e.defineComponent({__name:"TailwindFormRenderer",props:{form:{},components:{},submitLabel:{},fields:{}},emits:["submit"],setup(t,{emit:s}){const o=t,c=x.useRegistry(),n=s,a={text:B,email:B,number:V,textarea:$,select:E,checkbox:C,radio:w,date:N,file:S};function d(r){var b;return r.component?r.component:((b=o.components)==null?void 0:b[r.type])??c[r.type]??a[r.type]??null}function i(r){return F.getByPath(o.form.values.value,r.name)}function m(r,b){o.form.setField(r.name,b)}function f(r){var y;const b=o.form;(y=b.touchField)==null||y.call(b,r.name)}function g(r){return o.form.errors.value[r.name]??[]}function h(r){return o.form.touched.value[r.name]??!1}const v=e.computed(()=>(o.fields??o.form.fields.value).filter(r=>r.visible!==!1));async function l(r){r.preventDefault(),await o.form.submit(),n("submit")}return(r,b)=>{const y=e.resolveComponent("TailwindFormRenderer",!0);return e.openBlock(),e.createElementBlock("form",{novalidate:"",onSubmit:l},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(v.value,u=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:u.name},[r.$slots[`field-${u.name}`]?e.renderSlot(r.$slots,`field-${u.name}`,{key:0,field:u,value:i(u),error:g(u),touched:h(u),setValue:p=>m(u,p),touch:()=>f(u)}):u.type==="group"?(e.openBlock(),e.createElementBlock("fieldset",me,[u.label?(e.openBlock(),e.createElementBlock("legend",fe,e.toDisplayString(u.label),1)):e.createCommentVNode("",!0),u.fields?(e.openBlock(),e.createBlock(y,{key:1,form:t.form,fields:u.fields,components:t.components},null,8,["form","fields","components"])):e.createCommentVNode("",!0)])):u.type==="array"?(e.openBlock(),e.createBlock(q,{key:2,field:u,form:t.form,components:t.components},null,8,["field","form","components"])):d(u)?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(d(u)),{key:3,field:u,"model-value":i(u),error:g(u),touched:h(u),"onUpdate:modelValue":p=>m(u,p),onBlur:p=>f(u)},null,40,["field","model-value","error","touched","onUpdate:modelValue","onBlur"])):e.createCommentVNode("",!0)],64))),128)),e.renderSlot(r.$slots,"submit",{isSubmitting:t.form.isSubmitting.value,isValid:t.form.isValid.value},()=>[e.createElementVNode("button",{type:"submit",disabled:t.form.isSubmitting.value,class:"mt-2 rounded-lg bg-indigo-600 px-5 py-2 text-sm font-medium text-white transition hover:bg-indigo-500 disabled:cursor-not-allowed disabled:opacity-40"},e.toDisplayString(t.submitLabel??"Submit"),9,ge)])],32)}}});exports.TailwindFormRenderer=be;exports.TwArrayField=q;exports.TwCheckboxField=C;exports.TwDateField=N;exports.TwFileField=S;exports.TwNumberField=V;exports.TwRadioField=w;exports.TwSelectField=E;exports.TwTextField=B;exports.TwTextareaField=$;
@@ -0,0 +1,411 @@
1
+ import { Component } from 'vue';
2
+ import { ComponentOptionsMixin } from 'vue';
3
+ import { ComponentProvideOptions } from 'vue';
4
+ import { ComputedRef } from 'vue';
5
+ import { DefineComponent } from 'vue';
6
+ import { ExtractPropTypes } from 'vue';
7
+ import { PropType } from 'vue';
8
+ import { PublicProps } from 'vue';
9
+ import { Ref } from 'vue';
10
+
11
+ declare const __VLS_component: DefineComponent<ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
12
+ form: UseFormReturn;
13
+ components?: Partial<Record<FieldDefinition["type"], Component | string>>;
14
+ submitLabel?: string;
15
+ /**
16
+ * Internal: the field list to render. Used by the `group` case to recurse
17
+ * into `field.fields` instead of re-rendering the whole top-level schema
18
+ * (which would recurse into the same group forever). Defaults to the
19
+ * form's top-level fields — not meant to be passed by consumers.
20
+ */
21
+ fields?: FieldDefinition[];
22
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
23
+ submit: () => void;
24
+ }, string, PublicProps, Readonly<ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
25
+ form: UseFormReturn;
26
+ components?: Partial<Record<FieldDefinition["type"], Component | string>>;
27
+ submitLabel?: string;
28
+ /**
29
+ * Internal: the field list to render. Used by the `group` case to recurse
30
+ * into `field.fields` instead of re-rendering the whole top-level schema
31
+ * (which would recurse into the same group forever). Defaults to the
32
+ * form's top-level fields — not meant to be passed by consumers.
33
+ */
34
+ fields?: FieldDefinition[];
35
+ }>>> & Readonly<{
36
+ onSubmit?: (() => any) | undefined;
37
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
38
+
39
+ declare type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
40
+
41
+ declare type __VLS_NonUndefinedable_10<T> = T extends undefined ? never : T;
42
+
43
+ declare type __VLS_NonUndefinedable_2<T> = T extends undefined ? never : T;
44
+
45
+ declare type __VLS_NonUndefinedable_3<T> = T extends undefined ? never : T;
46
+
47
+ declare type __VLS_NonUndefinedable_4<T> = T extends undefined ? never : T;
48
+
49
+ declare type __VLS_NonUndefinedable_5<T> = T extends undefined ? never : T;
50
+
51
+ declare type __VLS_NonUndefinedable_6<T> = T extends undefined ? never : T;
52
+
53
+ declare type __VLS_NonUndefinedable_7<T> = T extends undefined ? never : T;
54
+
55
+ declare type __VLS_NonUndefinedable_8<T> = T extends undefined ? never : T;
56
+
57
+ declare type __VLS_NonUndefinedable_9<T> = T extends undefined ? never : T;
58
+
59
+ declare function __VLS_template(): Partial<Record<`field-${string}`, (_: {
60
+ field: FieldDefinition;
61
+ value: unknown;
62
+ error: string[];
63
+ touched: boolean;
64
+ setValue: (v: unknown) => void;
65
+ touch: () => void;
66
+ }) => any>> & {
67
+ submit?(_: {
68
+ isSubmitting: boolean;
69
+ isValid: boolean;
70
+ }): any;
71
+ };
72
+
73
+ declare type __VLS_TypePropsToRuntimeProps<T> = {
74
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
75
+ type: PropType<__VLS_NonUndefinedable<T[K]>>;
76
+ } : {
77
+ type: PropType<T[K]>;
78
+ required: true;
79
+ };
80
+ };
81
+
82
+ declare type __VLS_TypePropsToRuntimeProps_10<T> = {
83
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
84
+ type: PropType<__VLS_NonUndefinedable_10<T[K]>>;
85
+ } : {
86
+ type: PropType<T[K]>;
87
+ required: true;
88
+ };
89
+ };
90
+
91
+ declare type __VLS_TypePropsToRuntimeProps_2<T> = {
92
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
93
+ type: PropType<__VLS_NonUndefinedable_2<T[K]>>;
94
+ } : {
95
+ type: PropType<T[K]>;
96
+ required: true;
97
+ };
98
+ };
99
+
100
+ declare type __VLS_TypePropsToRuntimeProps_3<T> = {
101
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
102
+ type: PropType<__VLS_NonUndefinedable_3<T[K]>>;
103
+ } : {
104
+ type: PropType<T[K]>;
105
+ required: true;
106
+ };
107
+ };
108
+
109
+ declare type __VLS_TypePropsToRuntimeProps_4<T> = {
110
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
111
+ type: PropType<__VLS_NonUndefinedable_4<T[K]>>;
112
+ } : {
113
+ type: PropType<T[K]>;
114
+ required: true;
115
+ };
116
+ };
117
+
118
+ declare type __VLS_TypePropsToRuntimeProps_5<T> = {
119
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
120
+ type: PropType<__VLS_NonUndefinedable_5<T[K]>>;
121
+ } : {
122
+ type: PropType<T[K]>;
123
+ required: true;
124
+ };
125
+ };
126
+
127
+ declare type __VLS_TypePropsToRuntimeProps_6<T> = {
128
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
129
+ type: PropType<__VLS_NonUndefinedable_6<T[K]>>;
130
+ } : {
131
+ type: PropType<T[K]>;
132
+ required: true;
133
+ };
134
+ };
135
+
136
+ declare type __VLS_TypePropsToRuntimeProps_7<T> = {
137
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
138
+ type: PropType<__VLS_NonUndefinedable_7<T[K]>>;
139
+ } : {
140
+ type: PropType<T[K]>;
141
+ required: true;
142
+ };
143
+ };
144
+
145
+ declare type __VLS_TypePropsToRuntimeProps_8<T> = {
146
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
147
+ type: PropType<__VLS_NonUndefinedable_8<T[K]>>;
148
+ } : {
149
+ type: PropType<T[K]>;
150
+ required: true;
151
+ };
152
+ };
153
+
154
+ declare type __VLS_TypePropsToRuntimeProps_9<T> = {
155
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
156
+ type: PropType<__VLS_NonUndefinedable_9<T[K]>>;
157
+ } : {
158
+ type: PropType<T[K]>;
159
+ required: true;
160
+ };
161
+ };
162
+
163
+ declare type __VLS_WithTemplateSlots<T, S> = T & {
164
+ new (): {
165
+ $slots: S;
166
+ };
167
+ };
168
+
169
+ declare type AsyncValidatorFn = (value: unknown, values: Record<string, unknown>) => Promise<string | null>;
170
+
171
+ declare interface FieldDefinition {
172
+ type: FieldType;
173
+ /** Dot-path for nested fields, e.g. "address.city" */
174
+ name: string;
175
+ label?: string;
176
+ placeholder?: string;
177
+ defaultValue?: unknown | ((values: Record<string, unknown>) => unknown);
178
+ required?: boolean;
179
+ /** Static or dynamic disabled state */
180
+ disabled?: boolean | ((values: Record<string, unknown>) => boolean);
181
+ /** Static or dynamic visibility; string is evaluated as expression */
182
+ visible?: boolean | string | ((values: Record<string, unknown>) => boolean);
183
+ validators?: ValidatorFn[];
184
+ asyncValidators?: AsyncValidatorFn[];
185
+ mask?: string | MaskConfig;
186
+ /** For select / radio — static list, sync function, or async function */
187
+ options?: FieldOption[] | ((values: Record<string, unknown>) => FieldOption[] | Promise<FieldOption[]>);
188
+ /**
189
+ * Field names whose values trigger re-fetching of async options.
190
+ * Only relevant when `options` is an async function.
191
+ */
192
+ optionsDeps?: string[];
193
+ /** Internal: set by useForm when async options are loading. Read-only for consumers. */
194
+ optionsLoading?: boolean;
195
+ /** For group and array */
196
+ fields?: FieldDefinition[];
197
+ /**
198
+ * Applied on every setField call before the value is stored.
199
+ * Use for trimming, type coercion, formatting, etc.
200
+ */
201
+ transform?: (value: unknown, values: Record<string, unknown>) => unknown;
202
+ /**
203
+ * Applied at submit time to produce the final payload value.
204
+ * Runs after all validation passes.
205
+ */
206
+ parse?: (raw: unknown) => unknown;
207
+ /**
208
+ * Custom Vue component to render this field.
209
+ * Receives FormFieldProps and must emit 'update:modelValue' and 'blur'.
210
+ */
211
+ component?: Component | string;
212
+ /** Accepted file types, e.g. "image/*,.pdf" — passed to <input accept> */
213
+ accept?: string;
214
+ /** Allow selecting multiple files */
215
+ multiple?: boolean;
216
+ /** Maximum file size in bytes */
217
+ maxSize?: number;
218
+ /** Maximum number of files (only relevant when multiple=true) */
219
+ maxFiles?: number;
220
+ }
221
+
222
+ declare interface FieldOption {
223
+ label: string;
224
+ value: unknown;
225
+ }
226
+
227
+ declare type FieldType = 'text' | 'number' | 'email' | 'select' | 'checkbox' | 'radio' | 'textarea' | 'date' | 'array' | 'group' | 'file';
228
+
229
+ declare interface MaskConfig {
230
+ preset?: MaskPreset;
231
+ /** Custom mask pattern: '#' = digit, 'A' = letter, other chars are literals */
232
+ pattern?: string;
233
+ }
234
+
235
+ declare type MaskPreset = 'phone-ru' | 'phone-eu' | 'date' | 'inn' | 'iban';
236
+
237
+ export declare const TailwindFormRenderer: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
238
+
239
+ export declare const TwArrayField: DefineComponent<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_10<{
240
+ field: FieldDefinition;
241
+ form: UseFormReturn;
242
+ components?: Partial<Record<FieldDefinition["type"], Component | string>>;
243
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_10<{
244
+ field: FieldDefinition;
245
+ form: UseFormReturn;
246
+ components?: Partial<Record<FieldDefinition["type"], Component | string>>;
247
+ }>>> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
248
+
249
+ export declare const TwCheckboxField: DefineComponent<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_6<{
250
+ field: FieldDefinition;
251
+ modelValue: boolean | null;
252
+ error?: string[];
253
+ touched?: boolean;
254
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
255
+ blur: () => void;
256
+ "update:modelValue": (value: boolean) => void;
257
+ }, string, PublicProps, Readonly<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_6<{
258
+ field: FieldDefinition;
259
+ modelValue: boolean | null;
260
+ error?: string[];
261
+ touched?: boolean;
262
+ }>>> & Readonly<{
263
+ onBlur?: (() => any) | undefined;
264
+ "onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
265
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
266
+
267
+ export declare const TwDateField: DefineComponent<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_8<{
268
+ field: FieldDefinition;
269
+ modelValue: string | null;
270
+ error?: string[];
271
+ touched?: boolean;
272
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
273
+ blur: () => void;
274
+ "update:modelValue": (value: string) => void;
275
+ }, string, PublicProps, Readonly<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_8<{
276
+ field: FieldDefinition;
277
+ modelValue: string | null;
278
+ error?: string[];
279
+ touched?: boolean;
280
+ }>>> & Readonly<{
281
+ onBlur?: (() => any) | undefined;
282
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
283
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
284
+
285
+ export declare const TwFileField: DefineComponent<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_9<{
286
+ field: FieldDefinition;
287
+ modelValue: File | File[] | null;
288
+ error?: string[];
289
+ touched?: boolean;
290
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
291
+ blur: () => void;
292
+ "update:modelValue": (value: File | File[] | null) => void;
293
+ }, string, PublicProps, Readonly<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_9<{
294
+ field: FieldDefinition;
295
+ modelValue: File | File[] | null;
296
+ error?: string[];
297
+ touched?: boolean;
298
+ }>>> & Readonly<{
299
+ onBlur?: (() => any) | undefined;
300
+ "onUpdate:modelValue"?: ((value: File | File[] | null) => any) | undefined;
301
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
302
+
303
+ export declare const TwNumberField: DefineComponent<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_3<{
304
+ field: FieldDefinition;
305
+ modelValue: number | null;
306
+ error?: string[];
307
+ touched?: boolean;
308
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
309
+ blur: () => void;
310
+ "update:modelValue": (value: number | null) => void;
311
+ }, string, PublicProps, Readonly<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_3<{
312
+ field: FieldDefinition;
313
+ modelValue: number | null;
314
+ error?: string[];
315
+ touched?: boolean;
316
+ }>>> & Readonly<{
317
+ onBlur?: (() => any) | undefined;
318
+ "onUpdate:modelValue"?: ((value: number | null) => any) | undefined;
319
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
320
+
321
+ export declare const TwRadioField: DefineComponent<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_7<{
322
+ field: FieldDefinition;
323
+ modelValue: unknown;
324
+ error?: string[];
325
+ touched?: boolean;
326
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
327
+ blur: () => void;
328
+ "update:modelValue": (value: unknown) => void;
329
+ }, string, PublicProps, Readonly<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_7<{
330
+ field: FieldDefinition;
331
+ modelValue: unknown;
332
+ error?: string[];
333
+ touched?: boolean;
334
+ }>>> & Readonly<{
335
+ onBlur?: (() => any) | undefined;
336
+ "onUpdate:modelValue"?: ((value: unknown) => any) | undefined;
337
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
338
+
339
+ export declare const TwSelectField: DefineComponent<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_5<{
340
+ field: FieldDefinition;
341
+ modelValue: unknown;
342
+ error?: string[];
343
+ touched?: boolean;
344
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
345
+ blur: () => void;
346
+ "update:modelValue": (value: unknown) => void;
347
+ }, string, PublicProps, Readonly<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_5<{
348
+ field: FieldDefinition;
349
+ modelValue: unknown;
350
+ error?: string[];
351
+ touched?: boolean;
352
+ }>>> & Readonly<{
353
+ onBlur?: (() => any) | undefined;
354
+ "onUpdate:modelValue"?: ((value: unknown) => any) | undefined;
355
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
356
+
357
+ export declare const TwTextareaField: DefineComponent<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_4<{
358
+ field: FieldDefinition;
359
+ modelValue: string | null;
360
+ error?: string[];
361
+ touched?: boolean;
362
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
363
+ blur: () => void;
364
+ "update:modelValue": (value: string) => void;
365
+ }, string, PublicProps, Readonly<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_4<{
366
+ field: FieldDefinition;
367
+ modelValue: string | null;
368
+ error?: string[];
369
+ touched?: boolean;
370
+ }>>> & Readonly<{
371
+ onBlur?: (() => any) | undefined;
372
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
373
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
374
+
375
+ export declare const TwTextField: DefineComponent<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_2<{
376
+ field: FieldDefinition;
377
+ modelValue: string | null;
378
+ error?: string[];
379
+ touched?: boolean;
380
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
381
+ blur: () => void;
382
+ "update:modelValue": (value: string) => void;
383
+ }, string, PublicProps, Readonly<ExtractPropTypes<__VLS_TypePropsToRuntimeProps_2<{
384
+ field: FieldDefinition;
385
+ modelValue: string | null;
386
+ error?: string[];
387
+ touched?: boolean;
388
+ }>>> & Readonly<{
389
+ onBlur?: (() => any) | undefined;
390
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
391
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
392
+
393
+ declare interface UseFormReturn<T extends Record<string, unknown> = Record<string, unknown>> {
394
+ fields: ComputedRef<FieldDefinition[]>;
395
+ values: Ref<T>;
396
+ errors: Ref<Record<string, string[]>>;
397
+ touched: Ref<Record<string, boolean>>;
398
+ /** Per-field async options loading state */
399
+ optionsLoading: Ref<Record<string, boolean>>;
400
+ isDirty: ComputedRef<boolean>;
401
+ isValid: ComputedRef<boolean>;
402
+ isSubmitting: Ref<boolean>;
403
+ submit(): Promise<void>;
404
+ reset(values?: Partial<T>): void;
405
+ setField(path: string, value: unknown): void;
406
+ getField(path: string): unknown;
407
+ }
408
+
409
+ declare type ValidatorFn = (value: unknown, values: Record<string, unknown>) => string | null;
410
+
411
+ export { }