{ "name": "auth-modal", "type": "registry:ui", "dependencies": [ "framer-motion", "lucide-react" ], "registryDependencies": [], "description": "A premium, animated authentication modal with social login options.", "files": [ { "path": "components/ui/auth-modal.tsx", "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { motion, AnimatePresence, type Variants } from \"framer-motion\"\nimport { X, Mail, ArrowRight } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\n// Dummy icons for Google and Microsoft as Lucide doesn't have them\nconst GoogleIcon = ({ className }: { className?: string }) => (\n \n \n \n \n \n \n)\n\nconst MicrosoftIcon = ({ className }: { className?: string }) => (\n \n \n \n \n \n \n)\n\nconst AppleIcon = ({ className }: { className?: string }) => (\n \n \n \n)\n\nconst TwitterIcon = ({ className }: { className?: string }) => (\n \n \n \n)\n\nconst GitHubIcon = ({ className }: { className?: string }) => (\n \n \n \n)\n\ninterface AuthModalProps {\n /**\n * The text to display on the trigger button\n */\n triggerText?: string\n /**\n * Callback when login is attempted\n */\n onLogin?: (provider: string) => void\n /**\n * Optional className for the trigger button\n */\n className?: string\n}\n\nfunction AuthModal({\n triggerText = \"Sign up / Sign in\",\n onLogin,\n className\n}: AuthModalProps) {\n const [isOpen, setIsOpen] = React.useState(false)\n const [email, setEmail] = React.useState(\"\")\n\n const container: Variants = {\n hidden: { opacity: 0, scale: 0.95 },\n show: {\n opacity: 1,\n scale: 1,\n transition: {\n duration: 0.3,\n ease: \"easeInOut\",\n staggerChildren: 0.05\n }\n },\n exit: {\n opacity: 0,\n scale: 0.95,\n transition: {\n duration: 0.2,\n ease: \"easeInOut\"\n }\n }\n }\n\n const item = {\n hidden: { opacity: 0, y: 20 },\n show: { opacity: 1, y: 0 }\n }\n\n const socialButtons = [\n { icon: GoogleIcon, label: \"Google\", color: \"hover:bg-zinc-100 dark:hover:bg-zinc-800\" },\n { icon: AppleIcon, label: \"Apple\", color: \"hover:bg-zinc-100 dark:hover:bg-zinc-800\" },\n { icon: MicrosoftIcon, label: \"Microsoft\", color: \"hover:bg-zinc-100 dark:hover:bg-zinc-800\" },\n { icon: GitHubIcon, label: \"Github\", color: \"hover:bg-zinc-100 dark:hover:bg-zinc-800\" },\n { icon: TwitterIcon, label: \"Twitter\", color: \"hover:bg-zinc-100 dark:hover:bg-zinc-800\" },\n ]\n\n return (\n <>\n setIsOpen(true)}\n className={cn(\n \"inline-flex h-10 items-center justify-center rounded-full bg-zinc-900 px-8 text-sm font-medium text-zinc-50 transition-colors hover:bg-zinc-900/90 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-zinc-950 disabled:pointer-events-none disabled:opacity-50 dark:bg-zinc-50 dark:text-zinc-900 dark:hover:bg-zinc-50/90 dark:focus-visible:ring-zinc-300\",\n className\n )}\n >\n {triggerText}\n \n\n \n {isOpen && (\n
\n setIsOpen(false)}\n className=\"absolute inset-0 bg-zinc-950/20 backdrop-blur-sm dark:bg-zinc-950/40\"\n />\n\n \n
\n setIsOpen(false)}\n className=\"rounded-full p-2 text-zinc-400 hover:bg-zinc-100 hover:text-zinc-500 dark:hover:bg-zinc-900\"\n >\n \n \n
\n\n \n

\n Welcome back\n

\n

\n Sign in to your account to continue\n

\n
\n\n \n {socialButtons.map((btn, i) => (\n onLogin?.(btn.label)}\n className={cn(\n \"flex aspect-square items-center justify-center rounded-2xl border border-zinc-200 bg-white transition-all hover:scale-105 active:scale-95 dark:border-zinc-800 dark:bg-zinc-950\",\n btn.color\n )}\n aria-label={`Sign in with ${btn.label}`}\n >\n \n \n ))}\n \n\n \n
\n \n
\n
\n \n Or continue with email\n \n
\n
\n\n \n
\n \n setEmail(e.target.value)}\n placeholder=\"name@example.com\"\n className=\"h-10 w-full rounded-full border border-zinc-200 bg-zinc-50 pl-10 pr-10 text-sm outline-none transition-all focus:border-zinc-900 focus:bg-white focus:ring-1 focus:ring-zinc-900 dark:border-zinc-800 dark:bg-zinc-900/50 dark:focus:border-zinc-100 dark:focus:bg-zinc-900\"\n />\n \n \n \n
\n
\n\n \n

\n By clicking continue, you agree to our{\" \"}\n \n Terms of Service\n {\" \"}\n and{\" \"}\n \n Privacy Policy\n \n

\n
\n \n
\n )}\n
\n \n )\n}\n\nexport { AuthModal, type AuthModalProps }\n", "type": "registry:ui" } ] }