Files
zeekay 16c4453cc1 feat: sync with upstream shadcn/ui (through [email protected])
Squash merge of shadcn-ui/ui main branch into hanzo/ui, bringing in:
- [email protected] through [email protected] releases
- New apps/v4 directory structure
- Registry system improvements and MCP server
- Framework support (Vue, Svelte, React Native)
- New templates (vite-app, monorepo-next, laravel)
- Zod 4 compatibility (scoped override for zod@>4)
- Test fixture corrections for alias resolution

All 867 merge conflicts resolved preserving Hanzo customizations.
1020/1020 shadcn tests pass.
2026-02-09 10:44:26 -08:00

30 lines
4.2 KiB
JSON

{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "otp-05",
"title": "OTP 05",
"description": "A simple OTP form with social providers.",
"registryDependencies": [
"button",
"input-otp",
"label",
"field"
],
"files": [
{
"path": "registry/base-maia/blocks/otp-05/page.tsx",
"content": "import { OTPForm } from \"@/registry/base-maia/blocks/otp-05/components/otp-form\"\n\nexport default function OTPPage() {\n return (\n <div className=\"bg-background flex min-h-svh flex-col items-center justify-center gap-6 p-6 md:p-10\">\n <div className=\"w-full max-w-sm\">\n <OTPForm />\n </div>\n </div>\n )\n}\n",
"type": "registry:page",
"target": "app/otp/page.tsx"
},
{
"path": "registry/base-maia/blocks/otp-05/components/otp-form.tsx",
"content": "\"use client\"\n\nimport { cn } from \"@/registry/base-maia/lib/utils\"\nimport { Button } from \"@/registry/base-maia/ui/button\"\nimport {\n Field,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n} from \"@/registry/base-maia/ui/field\"\nimport {\n InputOTP,\n InputOTPGroup,\n InputOTPSeparator,\n InputOTPSlot,\n} from \"@/registry/base-maia/ui/input-otp\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport function OTPForm({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div className={cn(\"flex flex-col gap-6\", className)} {...props}>\n <form>\n <FieldGroup>\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <a\n href=\"#\"\n className=\"flex flex-col items-center gap-2 font-medium\"\n >\n <div className=\"flex size-8 items-center justify-center rounded-md\">\n <IconPlaceholder\n lucide=\"GalleryVerticalEndIcon\"\n tabler=\"IconLayoutRows\"\n hugeicons=\"LayoutBottomIcon\"\n phosphor=\"RowsIcon\"\n remixicon=\"RiGalleryLine\"\n className=\"size-6\"\n />\n </div>\n <span className=\"sr-only\">Acme Inc.</span>\n </a>\n <h1 className=\"text-xl font-bold\">Enter verification code</h1>\n <FieldDescription>\n We sent a 6-digit code to your email address\n </FieldDescription>\n </div>\n <Field>\n <FieldLabel htmlFor=\"otp\" className=\"sr-only\">\n Verification code\n </FieldLabel>\n <InputOTP\n maxLength={6}\n id=\"otp\"\n required\n containerClassName=\"gap-4\"\n >\n <InputOTPGroup className=\"gap-2.5 *:data-[slot=input-otp-slot]:h-16 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl\">\n <InputOTPSlot index={0} />\n <InputOTPSlot index={1} />\n <InputOTPSlot index={2} />\n </InputOTPGroup>\n <InputOTPSeparator />\n <InputOTPGroup className=\"gap-2.5 *:data-[slot=input-otp-slot]:h-16 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl\">\n <InputOTPSlot index={3} />\n <InputOTPSlot index={4} />\n <InputOTPSlot index={5} />\n </InputOTPGroup>\n </InputOTP>\n <FieldDescription className=\"text-center\">\n Didn&apos;t receive the code? <a href=\"#\">Resend</a>\n </FieldDescription>\n </Field>\n <Field>\n <Button type=\"submit\">Verify</Button>\n </Field>\n </FieldGroup>\n </form>\n <FieldDescription className=\"px-6 text-center\">\n By clicking continue, you agree to our <a href=\"#\">Terms of Service</a>{\" \"}\n and <a href=\"#\">Privacy Policy</a>.\n </FieldDescription>\n </div>\n )\n}\n",
"type": "registry:component"
}
],
"categories": [
"authentication",
"otp"
],
"type": "registry:block"
}