{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "example-form", "title": "Example Form", "description": "A contact form with Zod validation.", "dependencies": [ "zod" ], "registryDependencies": [ "button", "input", "label", "textarea", "card" ], "files": [ { "path": "registry/new-york/blocks/example-form/example-form.tsx", "content": "\"use client\";\n\nimport * as React from \"react\";\nimport { z } from \"zod\";\nimport { Button } from \"@/registry/new-york/ui/button\";\nimport {\n\tCard,\n\tCardContent,\n\tCardDescription,\n\tCardFooter,\n\tCardHeader,\n\tCardTitle,\n} from \"@/registry/new-york/ui/card\";\nimport { Input } from \"@/registry/new-york/ui/input\";\nimport { Label } from \"@/registry/new-york/ui/label\";\nimport { Textarea } from \"@/registry/new-york/ui/textarea\";\n\nconst exampleFormSchema = z.object({\n\tname: z.string().min(1),\n\temail: z.string().email(),\n\tmessage: z.string().min(1),\n});\n\nexport function ExampleForm() {\n\tconst [pending, setPending] = React.useState(false);\n\tconst [state, setState] = React.useState({\n\t\tdefaultValues: {\n\t\t\tname: \"\",\n\t\t\temail: \"\",\n\t\t\tmessage: \"\",\n\t\t},\n\t\tsuccess: false,\n\t\terrors: {\n\t\t\tname: \"\",\n\t\t\temail: \"\",\n\t\t\tmessage: \"\",\n\t\t},\n\t});\n\n\tconst handleSubmit = React.useCallback(\n\t\t(e: React.FormEvent) => {\n\t\t\te.preventDefault();\n\t\t\tsetPending(true);\n\n\t\t\tconst formData = new FormData(e.target as HTMLFormElement);\n\t\t\tconst data = Object.fromEntries(formData.entries());\n\t\t\tconst result = exampleFormSchema.safeParse(data);\n\n\t\t\tif (!result.success) {\n\t\t\t\tsetState({\n\t\t\t\t\t...state,\n\t\t\t\t\terrors: Object.fromEntries(\n\t\t\t\t\t\tObject.entries(result.error.flatten().fieldErrors).map(\n\t\t\t\t\t\t\t([key, value]) => [key, value?.[0] ?? \"\"],\n\t\t\t\t\t\t),\n\t\t\t\t\t) as Record,\n\t\t\t\t});\n\t\t\t\tsetPending(false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetPending(false);\n\t\t},\n\t\t[state],\n\t);\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\tHow can we help?\n\t\t\t\t\t\n\t\t\t\t\t\tNeed help with your project? We're here to assist you.\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tName *\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{state.errors?.name && (\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t{state.errors.name}\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tEmail *\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{state.errors?.email && (\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t{state.errors.email}\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tMessage *\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{state.errors?.message && (\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t{state.errors.message}\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t);\n}\n", "type": "registry:component" } ], "type": "registry:block" }