Sign Up Form
A minimal sign up form with email validation and clear error feedback.
SignUpForm.jsx
'use client' import { useState } from 'react' export default function SignUpForm() { const [email, setEmail] = useState('') const [emailError, setEmailError] = useState('') const validateEmail = (value) => { return /^[^s@]+@[^s@]+.[^s@]+$/.test(value) } const handleSubmit = (e) => { e.preventDefault() if (!validateEmail(email)) { setEmailError('Please enter a valid email address.') return } setEmailError('') } const handleEmailChange = (value) => { setEmail(value) if (!value) { setEmailError('') return } if (!validateEmail(value)) { setEmailError('Please enter a valid email address.') } else { setEmailError('') } } return ( <div className="w-full max-w-md"> <form onSubmit={handleSubmit} className="rounded-3xl backdrop-blur-xl bg-white/80 dark:bg-[#1e1e1e] border dark:border-[#4c4c4c] border-zinc-200 p-8"> <div className="mb-8"> <h2 className="text-2xl font-semibold tracking-tight text-zinc-900 dark:text-[#f1f1f1]">Create account</h2> <p className="mt-2 text-sm text-zinc-500">Join and get access to your dashboard.</p> </div> <div className="space-y-5"> <div> <label htmlFor="email" className="mb-2 block text-sm font-medium text-zinc-700 dark:text-[#f1f1f1]"> Email </label> <input id="email" type="email" autoComplete="email" value={email} onChange={(e) => handleEmailChange(e.target.value)} placeholder="name@example.com" className={`w-full rounded-2xl border bg-white dark:bg-[#151515] dark:border-[#4a4a4a] px-4 py-3 text-sm outline-none transition-all ${emailError ? 'focus:border-[#e57373] border-[#e57373]' : 'border-zinc-200 focus:border-zinc-900'}`}/> {emailError && <p className="mt-2 text-sm text-[#e57373]">{emailError}</p>} </div> <button type="submit" className="cursor-pointer w-full rounded-2xl bg-zinc-900 px-4 py-3 text-sm font-medium text-white dark:bg-[#e6e6e6] dark:border dark:border-[#5a5a5a] dark:text-[#111111] dark:hover:bg-[#ffffff] dark:hover:border-[#777777] active:scale-[0.99]"> Create account </button> </div> <div className="mt-6 text-center text-sm text-zinc-500"> Already have an account?{' '} <button type="button" className="cursor-pointer font-medium text-zinc-900 dark:text-[#f1f1f1] hover:underline"> Sign in </button> </div> </form> </div> ) }