{t('Construction du corps')}
renameActiveAvatar(event.currentTarget.value)} onFocus={event => { if (focusAvatarName) event.currentTarget.select() }} onBlur={event => { if (!event.currentTarget.value.trim()) renameActiveAvatar('Unknown') setFocusAvatarName(false) }} />{t('Choisis la forme principale puis assemble les primitives autour d’elle.')}
{activeAvatar.name}
{t( mode === 'manual' ? 'Pose' : mode === 'avatars' ? 'Avatars' : mode === 'expressions' ? 'Expressions' : mode === 'states' ? 'Animations' : mode === 'photo' ? 'Mode photo' : 'Exporter' )}
{t( 'Définis l’identité du regard de cet avatar. Les poses s’ajoutent ensuite à cette base.' )}
{(['width', 'height', 'size'] as const).map(dimension => ({t( { width: 'Largeur', height: 'Hauteur', size: 'Taille proportionnelle', }[dimension] )}
{t('Position et espacement')}
{t('Coordonnées propres à l’avatar, indépendantes des poses.')}
{t(side === 'Left' ? 'Œil gauche' : 'Œil droit')}
{expressions.length} presets
{sequences.length} {t('animations')}
{selectedExportAnimations.length}/{sequences.length} {t('sélectionnées')}
{t('Animations à exporter')}
-
{runtimeExportErrors.map((error, index) => (
- {error} ))}
{t( 'Corrige les clés signalées dans les éditeurs Expressions ou Animations.' )}
{t('Démarrage rapide')}
{exportFormat === 'react' ? reactQuickStartInstall : webQuickStartInstall}
{exportFormat === 'react'
? reactQuickStartExample(runtimePreviewAnimation)
: webQuickStartExample(runtimePreviewAnimation)}
{t( exportFormat === 'javascript' ? 'Le ZIP contient le JSON exporté, une démo index.html et son README. La démo charge avatar-web depuis un CDN.' : 'Le ZIP contient le JSON exporté et un projet Vite React TypeScript prêt à lancer avec npm install puis npm run dev.' )}
{t( 'Choisis une expression, ajuste la pose et cadre l’avatar dans un espace dédié.' )}
{projectImportError}
)}{t('Détails de l’animation')}
{activeSequenceLabel}
{activeSequence.builtIn ? t(activeSequence.description) : activeSequence.description}