{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "signup", "title": "Sign Up Form", "description": "A dark-themed sign up form with name, email, and password fields, Google OAuth button, and loading state.", "dependencies": [], "registryDependencies": [], "files": [ { "path": "registry/default/signup/signup.tsx", "content": "\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { useState } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nexport interface SignupFormProps {\r\n onSubmit?: (values: { name: string; email: string; password: string }) => void;\r\n onGoogleSignIn?: () => void;\r\n onSignIn?: () => void;\r\n className?: string;\r\n}\r\n\r\nexport function SignupForm({\r\n onSubmit,\r\n onGoogleSignIn,\r\n onSignIn,\r\n className,\r\n}: SignupFormProps) {\r\n const [name, setName] = useState(\"\");\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [agreed, setAgreed] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const strength = (() => {\r\n if (password.length === 0) return 0;\r\n let score = 0;\r\n if (password.length >= 8) score++;\r\n if (/[A-Z]/.test(password)) score++;\r\n if (/[0-9]/.test(password)) score++;\r\n if (/[^A-Za-z0-9]/.test(password)) score++;\r\n return score;\r\n })();\r\n\r\n const strengthLabel = [\"\", \"Weak\", \"Fair\", \"Good\", \"Strong\"][strength];\r\n const strengthColor = [\"\", \"bg-red-500\", \"bg-yellow-500\", \"bg-blue-500\", \"bg-green-500\"][strength];\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!agreed) return;\r\n setLoading(true);\r\n await onSubmit?.({ name, email, password });\r\n setLoading(false);\r\n };\r\n\r\n return (\r\n
Start building something great today
\r\n\r\n Already have an account?{\" \"}\r\n \r\n
\r\n