\n\nI believe this is an issue with Nuxt UI and not FormKit because it used to work fine on the previous version.\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell-script\nindex.vue:17 [Vue warn]: Unhandled error during execution of mounted hook \n at \u003CDialogTrigger key=0 as-child=\"\" class=\"\" > \n at \u003CDialogRoot modal=true open=true onAfter:leave=fn ... > \n at \u003CUModal close= {onClick: ƒ} title=\"This modal was opened programmatically 0 times\" open=true ... > \n at \u003CModalExample key= Symbol(useOverlay) ref_for=true count=0 ... > \n at \u003CUOverlayProvider > \n at \u003CTooltipProvider > \n at \u003CConfigProvider use-id=fn\u003Cuse-id> dir=undefined locale=undefined > \n at \u003CApp > \n at \u003CApp key=4 > \n at \u003CNuxtRoot>\nwarn$1 @ runtime-core.esm-bundler.js?v=fb91d406:50\nlogError @ runtime-core.esm-bundler.js?v=fb91d406:261\nhandleError @ runtime-core.esm-bundler.js?v=fb91d406:253\ncallWithErrorHandling @ runtime-core.esm-bundler.js?v=fb91d406:199\ncallWithAsyncErrorHandling @ runtime-core.esm-bundler.js?v=fb91d406:204\nhook.__weh.hook.__weh @ runtime-core.esm-bundler.js?v=fb91d406:2842\nflushPostFlushCbs @ runtime-core.esm-bundler.js?v=fb91d406:382\nflushJobs @ runtime-core.esm-bundler.js?v=fb91d406:424\nPromise.then\nqueueFlush @ runtime-core.esm-bundler.js?v=fb91d406:319\nqueueJob @ runtime-core.esm-bundler.js?v=fb91d406:314\neffect2.scheduler @ runtime-core.esm-bundler.js?v=fb91d406:5499\ntrigger @ reactivity.esm-bundler.js?v=fb91d406:235\nendBatch @ reactivity.esm-bundler.js?v=fb91d406:293\ntrigger @ reactivity.esm-bundler.js?v=fb91d406:693\nset @ reactivity.esm-bundler.js?v=fb91d406:974\nopen @ useOverlay.js?v=fb91d406:29\nopen @ useOverlay.js?v=fb91d406:18\nopen @ index.vue:17\n(anonymous) @ Button.vue:80\nonClickWrapper @ Button.vue:80\nonClickWrapper @ LinkBase.vue:30\ncallWithErrorHandling @ runtime-core.esm-bundler.js?v=fb91d406:197\ncallWithAsyncErrorHandling @ runtime-core.esm-bundler.js?v=fb91d406:204\ninvoker @ runtime-dom.esm-bundler.js?v=fb91d406:720\nuseForwardExpose.js?v=fb91d406:8 Uncaught (in promise) TypeError: Cannot read properties of null (reading 'nodeName')\n at ComputedRefImpl.fn (useForwardExpose.js?v=fb91d406:8:64)\n at refreshComputed (reactivity.esm-bundler.js?v=fb91d406:361:29)\n at get value (reactivity.esm-bundler.js?v=fb91d406:1567:5)\n at DialogTrigger.js?v=fb91d406:19:57\n at runtime-core.esm-bundler.js?v=fb91d406:2862:40\n at callWithErrorHandling (runtime-core.esm-bundler.js?v=fb91d406:197:19)\n at callWithAsyncErrorHandling (runtime-core.esm-bundler.js?v=fb91d406:204:17)\n at hook.__weh.hook.__weh (runtime-core.esm-bundler.js?v=fb91d406:2842:19)\n at flushPostFlushCbs (runtime-core.esm-bundler.js?v=fb91d406:382:28)\n at flushJobs (runtime-core.esm-bundler.js?v=fb91d406:424:5)\n```",[3181,3182,3185],{"name":3165,"color":3166},{"name":3183,"color":3184},"v3","49DCB8",{"name":3186,"color":3187},"triage","ffffff",4309,"ui","closed","UModal does not work with FormKit","2025-06-07T23:36:34Z","https://github.com/nuxt/ui/issues/4309",0.6635077,{"description":3196,"labels":3197,"number":3200,"owner":3152,"repository":3189,"state":3190,"title":3201,"updated_at":3202,"url":3203,"score":3204},"### Environment\n\n- Operating System: `Windows_NT`\n- Node Version: `v22.18.0`\n- Nuxt Version: `4.1.1`\n- CLI Version: `3.28.0`\n- Nitro Version: `2.12.4`\n- Package Manager: `npm@11.5.2`\n- Builder: `-`\n- User Config: `runtimeConfig`, `modules`, `devtools`, `supabase`, `css`, `routeRules`, `compatibilityDate`\n- Runtime Modules: `@nuxt/ui-pro@3.3.3`, `@vueuse/nuxt@13.9.0`, `@nuxtjs/supabase@1.6.2`, `nuxt-charts@0.2.3`\n- Build Modules: `-`\n\n\n### Is this bug related to Nuxt or Vue?\n\nNuxt\n\n### Package\n\nv3.x\n\n### Version\n\nv3.3.3\n\n### Reproduction\n\nhttps://codesandbox.io/p/devbox/zen-euclid-cf554n\n\n### Description\n\nThe problem occurs because the UFileUpload component likely contains a button element that doesn't have an explicit type attribute, causing it to default to type=\"submit\", which triggers form submission.\n\n### Additional context\n\n```\n\u003Ccomponent\n :is=\"variant === 'button' ? 'button' : 'div'\"\n ref=\"dropzoneRef\"\n :type=\"variant === 'button' ? 'button' : undefined\" // 👈 add this maybe?\n :role=\"variant === 'button' ? undefined : 'button'\"\n :data-dragging=\"isDragging\"\n :class=\"ui.base({ class: props.ui?.base })\"\n :tabindex=\"interactive && !disabled ? 0 : -1\"\n @click=\"interactive && !disabled && open()\" \n @keydown.prevent\n @keyup.enter.space=\"interactive && !disabled && open()\"\n>\n```\n\n### Logs\n\n```shell-script\n\n```",[3198,3199],{"name":3165,"color":3166},{"name":3183,"color":3184},4935,"UFileUpload with variant button inside form will cause UForm submit","2025-09-09T14:55:29Z","https://github.com/nuxt/ui/issues/4935",0.67272395,{"description":3206,"labels":3207,"number":3214,"owner":3152,"repository":3189,"state":3190,"title":3215,"updated_at":3216,"url":3217,"score":3218},"### Environment\n\n------------------------------\n- Operating System: Darwin\n- Node Version: v23.9.0\n- Nuxt Version: 3.15.4\n- CLI Version: 3.22.3\n- Nitro Version: -\n- Package Manager: pnpm@10.5.2\n- Builder: -\n- User Config: compatibilityDate, devtools, modules, css, ui, runtimeConfig\n- Runtime Modules: @nuxt/ui-pro@3.0.0-beta.2, @pinia/nuxt@0.10.1\n- Build Modules: -\n------------------------------\n\n👉 Report an issue: https://github.com/nuxt/nuxt/issues/new?template=bug-report.yml\n👉 Suggest an improvement: https://github.com/nuxt/nuxt/discussions/new\n👉 Read d\n\n### Is this bug related to Nuxt or Vue?\n\nNuxt\n\n### Version\n\n3.0.0-beta.2\n\n### Reproduction\n\nhttps://codesandbox.io/p/devbox/relaxed-scooby-nv4zrp?file=%2Fapp%2Fpages%2Findex.vue%3A7%2C51\n\n### Description\n\nI was importing type `FormSubmitEvent` from Nuxt UI but when I shifted to nuxt ui pro and replaced the import. But it broke, because nuxt ui pro doesn't export this type\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell-script\n\n```",[3208,3209,3210,3213],{"name":3165,"color":3166},{"name":3183,"color":3184},{"name":3211,"color":3212},"nuxt/ui-pro","00dc82",{"name":3186,"color":3187},3465,"type `FormSubmitEvent` not working in nuxt ui pro version 3","2025-05-10T17:33:04Z","https://github.com/nuxt/ui/issues/3465",0.6798853,{"description":3220,"labels":3221,"number":3229,"owner":3152,"repository":3189,"state":3190,"title":3230,"updated_at":3231,"url":3232,"score":3233},"### Environment\n\n```\n------------------------------\n- Operating System: Darwin - macOS 15.6.1 (24G90)\n- Node Version: v22.14.0\n- Nuxt Version: 4.0.3\n- CLI Version: 3.28.0\n- Nitro Version: 2.12.4\n- Package Manager: npm@10.9.2\n- Builder: -\n- User Config: compatibilityDate, devtools, modules\n- Runtime Modules: @nuxt/ui@3.3.2\n- Build Modules: -\n------------------------------\n```\n\n### Is this bug related to Nuxt or Vue?\n\nNuxt\n\n### Package\n\nv4.0.0-alpha.x\n\n### Version\n\n4.0.0-alpha.0\n\n### Reproduction\n\n1. `npm create nuxt@latest repro`, opting to also install Nuxt UI\n2. `cd repro`\n3. Edit `app.vue` as shown below \n4. `npm run dev`\n5. Visit http://localhost:3000\n\n### Description\n\nWhen server-side rendering even the most basic Nuxt UI Form component with one input, there's a hydration mismatch:\n\n`app.vue`\n```vue\n\u003Ctemplate>\n \u003Cu-app>\n \u003Cu-form :state=\"state\">\n \u003Cu-form-field label=\"Serial Number\" name=\"serialnumber\">\n \u003Cu-input v-model=\"state.serialnumber\" />\n \u003C/u-form-field>\n \u003C/u-form>\n \u003C/u-app>\n\u003C/template>\n\n\u003Cscript setup>\nconst state = reactive({\n serialnumber: ''\n})\n\u003C/script>\n```\n\nChrome devtools console:\n```\n[Vue warn]: Hydration children mismatch on \u003Cform id=\"v-0\">…\u003C/form>\u003C!--[-->\u003Cdiv class=\"text-sm\">…\u003C/div>\u003C!--]-->\u003Ctextarea name style=\"display: none;\">\u003C/textarea>\u003C/form> \nServer rendered element contains more child nodes than client vdom. \n at \u003CUForm state= {serialnumber: ''}serialnumber: \"\"[[Prototype]]: Object > \n at \u003CApp key=4 > \n at \u003CNuxtRoot>\n```\n\nThis occurs on Nuxt UI 3.3.2 as well as 4.0.0-alpha.0. It persists even when my form is more complex and has a Valibot schema.\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell-script\n\n```",[3222,3223,3226,3227],{"name":3165,"color":3166},{"name":3224,"color":3225},"needs reproduction","CB47CF",{"name":3186,"color":3187},{"name":3228,"color":3184},"v4",4846,"Form: Hydration mismatch","2025-09-03T19:01:35Z","https://github.com/nuxt/ui/issues/4846",0.6804516,{"description":3235,"labels":3236,"number":3240,"owner":3152,"repository":3189,"state":3190,"title":3241,"updated_at":3242,"url":3243,"score":3244},"### For what version of Nuxt UI are you asking this question?\n\nv2.x\n\n### Description\n\nI have a form like the following example:\n```vue\n\u003Ctemplate>\n \u003Cdiv>\n \u003Ch1>Training Form\u003C/h1>\n \u003C/div>\n \u003CUForm :state=\"state\" :schema=\"schema\" @submit=\"handleSubmit\">\n \u003CUFormGroup label=\"Name\" name=\"name\">\n \u003CUInput v-model=\"state.name\" />\n \u003C/UFormGroup>\n \u003CUFormGroup label=\"Training Week\" name=\"trainingWeek\">\n \u003Cdiv v-for=\"(day, index) in state.trainingWeek\" :key=\"index\">\n \u003CUFormGroup label=\"Day\" name=\"trainingWeek[' + index + '].day\">\n \u003CUInput v-model=\"day.day\" />\n \u003C/UFormGroup>\n \u003CUFormGroup label=\"Exercises\" name=\"trainingWeek[' + index + '].exercises\">\n \u003Cdiv v-for=\"(exercise, exerciseIndex) in day.exercises\" :key=\"exerciseIndex\">\n \u003CUInput v-model=\"exercise.exerciseName\" />\n \u003C/div>\n \u003C/UFormGroup>\n \u003Cdiv class=\"mt-4 flex justify-end\">\n \u003CUButton @click=\"addExercise(index)\">Add Exercise\u003C/UButton>\n \u003C/div>\n \u003C/div>\n \u003C/UFormGroup>\n \u003Cdiv class=\"mt-4 flex justify-end\">\n \u003CUButton @click=\"addDay\">Add Day\u003C/UButton>\n \u003CUButton type=\"submit\">Submit\u003C/UButton>\n \u003C/div>\n \u003C/UForm>\n\u003C/template>\n\n\u003Cscript setup lang=\"ts\">\nimport { z } from \"zod\";\nimport type { FormSubmitEvent } from \"#ui/types\";\nconst state = reactive({\n name: \"\",\n trainingWeek: [\n {\n day: \"\",\n exercises: [\n {\n exerciseName: \"\",\n },\n ],\n },\n ],\n});\n\nconst schema = z.object({\n name: z.string().min(1, \"Required field\"),\n trainingWeek: z.array(\n z.object({\n day: z.string().min(1, \"Required field\"),\n exercises: z.array(\n z.object({\n exerciseName: z.string().min(1, \"Required field\"),\n }),\n ),\n }),\n ),\n});\n\ntype Schema = z.infer\u003Ctypeof schema>;\n\nconst handleSubmit = (event: FormSubmitEvent\u003CSchema>) => {\n console.log(JSON.stringify(event.data, null, 2));\n};\n\nconst addExercise = (index: number) => {\n state.trainingWeek[index].exercises.push({ exerciseName: \"\" });\n};\n\nconst addDay = () => {\n state.trainingWeek.push({ day: \"\", exercises: [{ exerciseName: \"\" }] });\n};\n\u003C/script>\n\n```\n\nI render the form based on state and dynamically add fields.\n\nThe form automatically sets up errors for name ( or any first level fields ) but doesn't set up errors for nested ones like day or exerciseName in the above example\n\nWhat's the proper way to create dynamic forms and avail error setting ? \n\nI'm able to get the following:\n```json\nprofile.vue:68 ZodError: [\n {\n \"code\": \"too_small\",\n \"minimum\": 1,\n \"type\": \"string\",\n \"inclusive\": true,\n \"exact\": false,\n \"message\": \"Required field\",\n \"path\": [\n \"trainingWeek\",\n 0,\n \"day\"\n ]\n },\n {\n \"code\": \"too_small\",\n \"minimum\": 1,\n \"type\": \"string\",\n \"inclusive\": true,\n \"exact\": false,\n \"message\": \"Required field\",\n \"path\": [\n \"trainingWeek\",\n 0,\n \"exercises\",\n 0,\n \"exerciseName\"\n ]\n }\n]\n```\noutput by parsing schema \n```js\nwatchEffect(() => {\n try {\n schema.parse(state);\n } catch (error) {\n console.error(error);\n }\n});\n```\n\n",[3237],{"name":3238,"color":3239},"question","d876e3",2674,"How to ensure UForm and UFormGroup auto assigns errors for nested dynamic form.","2024-11-18T16:59:59Z","https://github.com/nuxt/ui/issues/2674",0.6811453,{"description":3246,"labels":3247,"number":3251,"owner":3152,"repository":3189,"state":3190,"title":3252,"updated_at":3253,"url":3254,"score":3255},"### Environment\n\nOperating System: mac os\nNode Version: v22.14.0\nLaravel Version: 12.12.0\nNitro Version: -\nPackage Manager: bun 1.2.11\nBuilder: -\nUser Config: -\nRuntime Modules: -\nBuild Modules: -\n\n### Is this bug related to Nuxt or Vue?\n\nVue\n\n### Version\n\nv3.1.1\n\n### Reproduction\n\nN/A\n\n### Description\n\nI'm using the example from the documentation for implementing a login and the button behaves like a link. I've already tried as=\"button\" and it doesn't work.\n\n```\n\u003Cscript setup lang=\"ts\">\nimport * as z from 'zod'\nimport type { FormSubmitEvent } from '@nuxt/ui'\n\nconst schema = z.object({\n email: z.string().email('Invalid email'),\n password: z.string().min(8, 'Must be at least 8 characters')\n})\n\ntype Schema = z.output\u003Ctypeof schema>\n\nconst state = reactive\u003CPartial\u003CSchema>>({\n email: undefined,\n password: undefined\n})\n\nconst toast = useToast()\nasync function onSubmit(event: FormSubmitEvent\u003CSchema>) {\n toast.add({ title: 'Success', description: 'The form has been submitted.', color: 'success' })\n console.log(event.data)\n}\n\u003C/script>\n\u003Ctemplate>\n \u003CUForm :schema=\"schema\" :state=\"state\" class=\"space-y-4\" @submit=\"onSubmit\">\n \u003CUFormField label=\"Email\" name=\"email\">\n \u003CUInput v-model=\"state.email\" />\n \u003C/UFormField>\n \u003CUFormField label=\"Password\" name=\"password\">\n \u003CUInput v-model=\"state.password\" type=\"password\" />\n \u003C/UFormField>\n \u003CUButton type=\"submit\">\n Submit\n \u003C/UButton>\n \u003C/UForm>\n\u003C/template>\n```\n\n### Additional context\n\n\n\n### Logs\n\n```shell-script\n\n```",[3248,3249,3250],{"name":3165,"color":3166},{"name":3183,"color":3184},{"name":3186,"color":3187},4095,"UButton works as a link in Inertia","2025-05-07T08:12:17Z","https://github.com/nuxt/ui/issues/4095",0.69214803,{"description":3257,"labels":3258,"number":3261,"owner":3152,"repository":3189,"state":3190,"title":3262,"updated_at":3263,"url":3264,"score":3265},"### Description\n\nIs it possible to use a UForm within a UModal, but have the submit button in the modal's footer? I tried to wrap the whole modal with no success:\n\n```vue\n\u003Ctemplate>\n \u003CUForm :schema=\"userCreateSchema\" :state @submit=\"onSubmit\">\n \u003CUModal title=\"Create user\">\n \u003Ctemplate #body>\n \u003CUFormField label=\"First name\" name=\"givenName\" required>\n \u003CUInput v-model=\"state.givenName\" />\n \u003C/UFormField>\n\n \u003CUFormField label=\"Last name\" name=\"familyName\" required>\n \u003CUInput v-model=\"state.familyName\" />\n \u003C/UFormField>\n \u003C/template>\n\n \u003Ctemplate #footer>\n \u003CUButton label=\"Save\" type=\"submit\" />\n \u003C/template>\n \u003C/UModal>\n \u003C/UForm>\n\u003C/template>\n```",[3259,3260],{"name":3238,"color":3239},{"name":3183,"color":3184},4401,"How to use a UForm within a UModal with footer?","2025-08-21T09:37:27Z","https://github.com/nuxt/ui/issues/4401",0.6959348,{"description":3267,"labels":3268,"number":3276,"owner":3152,"repository":3189,"state":3190,"title":3277,"updated_at":3278,"url":3279,"score":3280},"### Environment\n\nnot needed\n\n### Is this bug related to Nuxt or Vue?\n\nNuxt\n\n### Version\n\nv3.1.0\n\n### Reproduction\n\nnot needed\n\n### Description\n\nThere is no error state on the input field like color \"error\" when u wrap URadioGroup in UFormField\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell-script\n\n```",[3269,3270,3271,3272,3273],{"name":3165,"color":3166},{"name":3224,"color":3225},{"name":3183,"color":3184},{"name":3186,"color":3187},{"name":3274,"color":3275},"closed-by-bot","ededed",4025,"RedioGroup in Form","2025-05-07T02:09:29Z","https://github.com/nuxt/ui/issues/4025",0.6971411,["Reactive",3282],{},["Set"],["ShallowReactive",3285],{"$fTRc1wZytZ_XrK4EfJfei_Sz-An4H4Yy6syhVxH_PVJc":-1,"$fVwlcUIaAe71r-bdbLbdESCk_R5yRbI50Dkb2V9SG_Uc":-1},"/nuxt/ui/3913"]