shadcn-vue/apps/www/src/public/r/styles/default/PinInputFormDemo.json
2024-11-23 00:49:59 +08:00

24 lines
2.6 KiB
JSON

{
"name": "PinInputFormDemo",
"type": "registry:example",
"dependencies": [
"vee-validate",
"@vee-validate/zod",
"zod"
],
"registryDependencies": [
"button",
"form",
"pin-input",
"toast"
],
"files": [
{
"path": "example/PinInputFormDemo.vue",
"content": "<script setup lang=\"ts\">\nimport { Button } from '@/registry/default/ui/button'\nimport {\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@/registry/default/ui/form'\nimport {\n PinInput,\n PinInputGroup,\n PinInputInput,\n} from '@/registry/default/ui/pin-input'\nimport { toast } from '@/registry/default/ui/toast'\nimport { toTypedSchema } from '@vee-validate/zod'\nimport { useForm } from 'vee-validate'\nimport { h } from 'vue'\nimport * as z from 'zod'\n\nconst formSchema = toTypedSchema(z.object({\n pin: z.array(z.coerce.string()).length(5, { message: 'Invalid input' }),\n}))\n\nconst { handleSubmit, setFieldValue } = useForm({\n validationSchema: formSchema,\n initialValues: {\n pin: ['1', '2', '3'],\n },\n})\n\nconst onSubmit = handleSubmit(({ pin }) => {\n toast({\n title: 'You submitted the following values:',\n description: h('pre', { class: 'mt-2 w-[340px] rounded-md bg-slate-950 p-4' }, h('code', { class: 'text-white' }, JSON.stringify(pin.join(''), null, 2))),\n })\n})\n\nconst handleComplete = (e: string[]) => console.log(e.join(''))\n</script>\n\n<template>\n <form class=\"w-2/3 space-y-6 mx-auto\" @submit=\"onSubmit\">\n <FormField v-slot=\"{ componentField, value }\" name=\"pin\">\n <FormItem>\n <FormLabel>OTP</FormLabel>\n <FormControl>\n <PinInput\n id=\"pin-input\"\n :model-value=\"value\"\n placeholder=\"○\"\n class=\"flex gap-2 items-center mt-1\"\n otp\n type=\"number\"\n :name=\"componentField.name\"\n @complete=\"handleComplete\"\n @update:model-value=\"(arrStr) => {\n setFieldValue('pin', arrStr.filter(Boolean))\n }\"\n >\n <PinInputGroup>\n <PinInputInput\n v-for=\"(id, index) in 5\"\n :key=\"id\"\n :index=\"index\"\n />\n </PinInputGroup>\n </PinInput>\n </FormControl>\n <FormDescription>\n Allows users to input a sequence of one-character alphanumeric inputs.\n </FormDescription>\n <FormMessage />\n </FormItem>\n </FormField>\n\n <Button>Submit</Button>\n </form>\n</template>\n",
"type": "registry:example",
"target": ""
}
]
}