React for Designers and PMs
Signup form
A React component that collects a name, email, and role via a form, then displays a personalized welcome message on submit.
LLM Written
Human Reviewed
Output
File Structure
├── src
` `├── App.tsx `← we are here`
` `├── index.css
` `└── main.tsxDistraction free code
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [role, setRole] = useState('Designer');
const [submitted, setSubmitted] = useState(false);
{/*Form with onSubmit*/}
<form onSubmit={(e) => {
e.preventDefault();
setSubmitted(true);
}}>
<input value={name} onChange={(e) => setName(e.target.value)} />
<input value={email} onChange={(e) => setEmail(e.target.value)} />
<select value={role} onChange={(e) => setRole(e.target.value)}>
<option>Designer</option>
<option>Developer</option>
<option>PM</option>
</select>
<button type='submit'>Sign up</button>
</form>
{/*Welcome message after submit*/}
{submitted && (
<div>
<p>Welcome, {name}!</p>
<p>{email}</p>
<p>{role}</p>
</div>
)}Code
'use client';
import { UserCheck } from 'lucide-react';
import { useState } from 'react';
export default function Home() {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [role, setRole] = useState('Designer');
const [submitted, setSubmitted] = useState(false);
return (
<>
{!submitted ? (
<form
onSubmit={(e) => {
e.preventDefault();
setSubmitted(true);
}}
className='flex flex-col gap-4 p-6'
>
<h2 className='text-lg font-semibold text-gray-800'>Create your account</h2>
<label className='flex flex-col gap-1'>
<span className='text-sm text-gray-500'>Name</span>
<input
type='text'
placeholder='Alice Smith'
value={name}
onChange={(e) => setName(e.target.value)}
required
className='border border-gray-200 rounded-md px-3 py-2 text-sm text-gray-700 outline-none focus:border-blue-400'
/>
</label>
<label className='flex flex-col gap-1'>
<span className='text-sm text-gray-500'>Email</span>
<input
type='email'
placeholder='alice@example.com'
value={email}
onChange={(e) => setEmail(e.target.value)}
required
className='border border-gray-200 rounded-md px-3 py-2 text-sm text-gray-700 outline-none focus:border-blue-400'
/>
</label>
<label className='flex flex-col gap-1'>
<span className='text-sm text-gray-500'>Role</span>
<select
value={role}
onChange={(e) => setRole(e.target.value)}
className='border border-gray-200 rounded-md px-3 py-2 text-sm text-gray-700 outline-none focus:border-blue-400 bg-white'
>
<option value='Designer'>Designer</option>
<option value='Developer'>Developer</option>
<option value='PM'>PM</option>
</select>
</label>
<button
type='submit'
className='bg-blue-500 text-white text-sm font-medium rounded-md px-4 py-2 mt-2 hover:bg-blue-600'
>
Sign up
</button>
</form>
) : (
<div className='flex flex-col items-center gap-3 p-6 text-center'>
<UserCheck size={32} className='text-green-500' />
<h2 className='text-lg font-semibold text-gray-800'>Welcome, {name}!</h2>
<p className='text-sm text-gray-500'>We'll send updates to {email}</p>
<span className='text-xs bg-gray-100 text-gray-600 rounded-full px-3 py-1'>{role}</span>
<button
onClick={() => {
setSubmitted(false);
setName('');
setEmail('');
setRole('Designer');
}}
className='text-sm text-blue-500 mt-2 hover:underline'
>
Start over
</button>
</div>
)}
</>
);
}What's new and what's happening?
New!