// Form validation schema
const formSchema = z.object({
// Personal Information
firstName: z.string().min(2, "First name must be at least 2 characters"),
lastName: z.string().min(2, "Last name must be at least 2 characters"),
email: z.string().email("Invalid email address"),
phone: z.string().min(10, "Phone number must be at least 10 digits"),
dateOfBirth: z.string().min(1, "Date of birth is required"),
// Address Information (nested object)
address: z.object({
street: z.string().min(5, "Street address is required"),
city: z.string().min(2, "City is required"),
state: z.string().min(2, "State is required"),
zipCode: z.string().min(5, "ZIP code must be at least 5 characters"),
country: z.string().min(2, "Country is required"),
}),
// Professional Information
company: z.string().min(2, "Company name is required"),
position: z.string().min(2, "Position is required"),
experience: z.enum(["entry", "junior", "mid", "senior", "lead", "executive"]),
salary: z.number().min(0, "Salary must be a positive number"),
skills: z.array(z.string()).min(1, "At least one skill is required"),
// Preferences (nested object with boolean values)
preferences: z.object({
newsletter: z.boolean(),
notifications: z.boolean(),
publicProfile: z.boolean(),
dataSharing: z.boolean(),
}),
// Additional Information
bio: z.string().max(500, "Bio must be less than 500 characters"),
website: z.string().url("Invalid URL").optional().or(z.literal("")),
linkedIn: z.string().url("Invalid LinkedIn URL").optional().or(z.literal("")),
github: z.string().url("Invalid GitHub URL").optional().or(z.literal("")),
});
type FormData = z.infer<typeof formSchema>;