1→import { useState } from 'react' 2→import { useNavigate } from 'react-router-dom' 3→import { useProjectStore } from '../stores/projectStore' 4→import { ArrowLeft, ArrowRight, Check, Loader2, Plus, X } from 'lucide-react' 5→ 6→interface TechStack { 7→ frontend: string[] 8→ backend: string[] 9→ database: string[] 10→ other: string[] 11→} 12→ 13→interface DesignPreferences { 14→ theme: 'light' | 'dark' | 'system' 15→ primaryColor: string 16→ style: 'minimal' | 'modern' | 'classic' 17→ designMode: 'mvp' | 'finished' 18→} 19→ 20→export default function ProjectWizard() { 21→ const navigate = useNavigate() 22→ const { createProject, isLoading } = useProjectStore() 23→ const [step, setStep] = useState(1) 24→ const [formData, setFormData] = useState({ 25→ name: '', 26→ description: '', 27→ complexity: 'medium', 28→ path: '', 29→ }) 30→ const [techStack, setTechStack] = useState({ 31→ frontend: [], 32→ backend: [], 33→ database: [], 34→ other: [], 35→ }) 36→ const [features, setFeatures] = useState([]) 37→ const [newFeature, setNewFeature] = useState('') 38→ const [designPreferences, setDesignPreferences] = useState({ 39→ theme: 'dark', 40→ primaryColor: '#0d9488', 41→ style: 'modern', 42→ designMode: 'mvp', 43→ }) 44→ const [errors, setErrors] = useState<{ name?: string }>({}) 45→ const [touched, setTouched] = useState<{ name?: boolean }>({}) 46→ 47→ const totalSteps = 5 48→ 49→ const validateName = (name: string): string | undefined => { 50→ if (!name.trim()) { 51→ return 'Project name is required' 52→ } 53→ if (name.trim().length < 2) { 54→ return 'Project name must be at least 2 characters' 55→ } 56→ if (name.trim().length > 100) { 57→ return 'Project name must be less than 100 characters' 58→ } 59→ return undefined 60→ } 61→ 62→ const handleNext = () => { 63→ if (step === 1) { 64→ const nameError = validateName(formData.name) 65→ setTouched({ ...touched, name: true }) 66→ setErrors({ ...errors, name: nameError }) 67→ if (nameError) return 68→ } 69→ if (step < totalSteps) { 70→ setStep(step + 1) 71→ } 72→ } 73→ 74→ const handleBack = () => { 75→ if (step > 1) { 76→ setStep(step - 1) 77→ } 78→ } 79→ 80→ const handleSubmit = async () => { 81→ try { 82→ await createProject({ 83→ name: formData.name, 84→ description: formData.description, 85→ design_mode: designPreferences.designMode, 86→ }) 87→ navigate('/') 88→ } catch (error) { 89→ console.error('Failed to create project:', error) 90→ } 91→ } 92→ 93→ return ( 94→
95→ {/* Progress */} 96→
97→
98→ 99→ Step {step} of {totalSteps} 100→ 101→ 102→ {Math.round((step / totalSteps) * 100)}% complete 103→ 104→
105→
106→
110→
111→
112→ 113→ {/* Step Content */} 114→
115→ {step === 1 && ( 116→
117→

Project Basics

118→
119→
120→ 123→ { 127→ const newName = e.target.value 128→ setFormData({ ...formData, name: newName }) 129→ if (touched.name) { 130→ setErrors({ ...errors, name: validateName(newName) }) 131→ } 132→ }} 133→ onBlur={() => { 134→ setTouched({ ...touched, name: true }) 135→ setErrors({ ...errors, name: validateName(formData.name) }) 136→ }} 137→ placeholder="My Awesome Project" 138→ className={`w-full px-4 py-2 bg-slate-700 border rounded-lg focus:outline-none focus:ring-2 ${ 139→ touched.name && errors.name 140→ ? 'border-red-500 focus:ring-red-500' 141→ : 'border-slate-600 focus:ring-accent' 142→ }`} 143→ /> 144→ {touched.name && errors.name && ( 145→

{errors.name}

146→ )} 147→
148→
149→ 152→