import React, { useState } from 'react'; import { generateAvatarImage } from '../services/geminiService'; import { analyzeAvatarImage } from '../services/visionService'; import LoadingSpinner from './LoadingSpinner'; import { Rect } from '../types'; interface AvatarCreatorProps { onAvatarGenerated: (url: string, name: string, initialData?: { leftEye: Rect, rightEye: Rect, mouth: Rect, skinColor: string }) => void; } const AvatarCreator: React.FC = ({ onAvatarGenerated }) => { const [prompt, setPrompt] = useState(''); const [name, setName] = useState(''); const [status, setStatus] = useState<'idle' | 'generating' | 'analyzing'>('idle'); const [error, setError] = useState(null); const handleGenerate = async () => { if (!prompt || !name) return; setStatus('generating'); setError(null); try { // 1. Generate Image const imageUrl = await generateAvatarImage(prompt); // 2. Analyze Image for Landmarks (Initial guess) setStatus('analyzing'); const analysisData = await analyzeAvatarImage(imageUrl); // 3. Pass to parent (to go to Rigging) if (analysisData) { onAvatarGenerated(imageUrl, name, analysisData); } else { onAvatarGenerated(imageUrl, name); } } catch (err) { console.error(err); setError("Failed to generate avatar. Please try again."); } finally { setStatus('idle'); } }; return (

Design Your Avatar

Describe your dream VTuber model and let Gemini bring it to life.

setName(e.target.value)} placeholder="e.g., Neon Kitsune" className="w-full bg-slate-900/50 border border-slate-600 rounded-xl px-4 py-3 text-white placeholder-slate-500 focus:ring-2 focus:ring-cyan-500 focus:border-transparent transition-all outline-none" />