// Composant Avatar Patient — Alexandre Bouchard // Représentation SVG illustrée style flat moderne const PatientAvatar = ({ state = 'idle', mouthShape = 0 }) => { // state: 'idle' | 'listening' | 'speaking' | 'coughing' | 'exam' // Couleurs du personnage const skinTone = "#D4956A"; const skinShadow = "#C07A50"; const hairColor = "#3D2B1F"; const beardColor = "#4A3328"; const shirtColors = ["#8B9E7A", "#A8876A", "#7A8B9E"]; // carreaux const eyeWhite = "#FDFBF7"; const pupilColor = "#2C1810"; const irisColor = "#5C4033"; // Formes de bouche pour le lipsync (0=fermé, 1=petit, 2=moyen, 3=grand) const mouthPaths = [ "M 200 298 Q 220 302 240 298", // fermé "M 198 298 Q 220 308 242 298 Q 220 310 198 298 Z", // petit "M 196 296 Q 220 312 244 296 Q 220 316 196 296 Z", // moyen "M 194 294 Q 220 318 246 294 Q 220 322 194 294 Z", // grand ]; const isBlinking = state === 'idle'; // géré par le parent via prop return ( {/* Ombres douces */} {/* Dégradé peau */} {/* Dégradé corps */} {/* Lignes de la chemise à carreaux */} {/* === CORPS / TORSE === */} {/* Épaules et torse */} {/* Chemise à carreaux */} {/* Ombre chemise côtés */} {/* Col de la chemise */} {/* === COU === */} {/* === OREILLES === */} {/* === TÊTE / VISAGE === */} {/* Forme de la tête */} {/* Mâchoire légèrement angulaire */} {/* Rougeur des joues (fatigué/légèrement fébrile) */} {/* === CHEVEUX === */} {/* Masse principale des cheveux */} {/* Détail cheveux — coupe courte texturée */} {/* Naissance des cheveux */} {/* Cernes sous les yeux (fatigué) */} {/* === YEUX === */} {/* Sourcils légèrement froncés (préoccupé) */} {/* Orbites */} {/* Iris */} {/* Pupilles */} {/* Reflets */} {/* Paupières (clignement contrôlé par CSS/parent) */} {/* Paupières inférieures */} {/* === NEZ === */} {/* === BARBE / MOUSTACHE === */} {/* Barbe de quelques jours — pointillés/hachures */} {/* Texture barbe */} {[...Array(18)].map((_, i) => { const angle = (i / 18) * Math.PI; const r = 68 + Math.sin(i * 2.3) * 10; const x = 220 + Math.cos(angle + Math.PI * 0.9) * r * 1.1; const y = 310 + Math.sin(angle + 0.5) * 35 + i * 0.5; return ( ); })} {/* Moustache */} {/* === BOUCHE === */} {/* Lèvres */} 0 ? "#8B4A3A" : "none"} stroke="#8B4A3A" strokeWidth={mouthShape === 0 ? "2" : "0"} strokeLinecap="round" /> {/* Lèvre supérieure */} {mouthShape > 0 && ( <> {/* Dents légèrement visibles */} {mouthShape >= 2 && ( )} )} {/* === MAIN DROITE (visible légèrement) === */} {state !== 'coughing' && ( )} {/* Main vers bouche (état toux) */} {state === 'coughing' && ( )} ); }; // Exporter globalement window.PatientAvatar = PatientAvatar;