diff --git a/docs/implementation-artifacts/3-2-composant-narratorbubble-le-bug.md b/docs/implementation-artifacts/3-2-composant-narratorbubble-le-bug.md index 18f65fc..94391df 100644 --- a/docs/implementation-artifacts/3-2-composant-narratorbubble-le-bug.md +++ b/docs/implementation-artifacts/3-2-composant-narratorbubble-le-bug.md @@ -1,6 +1,6 @@ # Story 3.2: Composant NarratorBubble (Le Bug) -Status: ready-for-dev +Status: review ## Story @@ -22,55 +22,55 @@ so that je me sens guidé et l'expérience est immersive. ## Tasks / Subtasks -- [ ] **Task 1: Créer le composable useTypewriter** (AC: #3, #4, #7) - - [ ] Créer `frontend/app/composables/useTypewriter.ts` - - [ ] Accepter le texte en paramètre - - [ ] Afficher lettre par lettre (30-50ms par lettre) - - [ ] Exposer une méthode `skip()` pour afficher tout le texte instantanément - - [ ] Respecter `prefers-reduced-motion` +- [x] **Task 1: Créer le composable useTypewriter** (AC: #3, #4, #7) + - [x] Créer `frontend/app/composables/useTypewriter.ts` (existait déjà de Story 2.7) + - [x] Accepter le texte en paramètre + - [x] Afficher lettre par lettre (30-50ms par lettre) + - [x] Exposer une méthode `skip()` pour afficher tout le texte instantanément + - [x] Respecter `prefers-reduced-motion` -- [ ] **Task 2: Créer les assets du Bug par stage** (AC: #2) - - [ ] Préparer 5 images SVG ou PNG pour les 5 stades du Bug - - [ ] Stage 1 : silhouette sombre floue - - [ ] Stage 2 : forme vague avec yeux - - [ ] Stage 3 : pattes visibles - - [ ] Stage 4 : araignée reconnaissable - - [ ] Stage 5 : mascotte complète révélée - - [ ] Placer dans `frontend/public/images/bug/` +- [x] **Task 2: Créer les assets du Bug par stage** (AC: #2) + - [x] Préparer 5 images SVG ou PNG pour les 5 stades du Bug + - [x] Stage 1 : silhouette sombre floue + - [x] Stage 2 : forme vague avec yeux + - [x] Stage 3 : pattes visibles + - [x] Stage 4 : araignée reconnaissable + - [x] Stage 5 : mascotte complète révélée + - [x] Placer dans `frontend/public/images/bug/` -- [ ] **Task 3: Créer le composant NarratorBubble** (AC: #1, #2, #3, #4, #5, #8, #9) - - [ ] Créer `frontend/app/components/feature/NarratorBubble.vue` - - [ ] Props : message (string), visible (boolean) - - [ ] Emit : close, skip - - [ ] Afficher l'avatar du Bug selon `narratorStage` du store - - [ ] Intégrer le composable useTypewriter - - [ ] Bouton de fermeture/minimisation - - [ ] Utiliser font-narrative pour le texte +- [x] **Task 3: Créer le composant NarratorBubble** (AC: #1, #2, #3, #4, #5, #8, #9) + - [x] Créer `frontend/app/components/feature/NarratorBubble.vue` + - [x] Props : message (string), visible (boolean) + - [x] Emit : close, skip + - [x] Afficher l'avatar du Bug selon `narratorStage` du store + - [x] Intégrer le composable useTypewriter + - [x] Bouton de fermeture/minimisation + - [x] Utiliser font-narrative pour le texte -- [ ] **Task 4: Implémenter l'accessibilité** (AC: #6, #7) - - [ ] Ajouter `aria-live="polite"` sur le conteneur - - [ ] Ajouter `role="status"` pour signaler les mises à jour - - [ ] S'assurer que le texte complet est accessible même pendant l'animation - - [ ] Tester avec prefers-reduced-motion +- [x] **Task 4: Implémenter l'accessibilité** (AC: #6, #7) + - [x] Ajouter `aria-live="polite"` sur le conteneur + - [x] Ajouter `role="status"` pour signaler les mises à jour + - [x] S'assurer que le texte complet est accessible même pendant l'animation + - [x] Tester avec prefers-reduced-motion -- [ ] **Task 5: Animation d'apparition/disparition** (AC: #9) - - [ ] Slide-up pour l'apparition - - [ ] Fade-out pour la disparition - - [ ] Utiliser CSS transitions pour fluidité - - [ ] Non-bloquante : ne pas empêcher les interactions avec le reste de la page +- [x] **Task 5: Animation d'apparition/disparition** (AC: #9) + - [x] Slide-up pour l'apparition + - [x] Fade-out pour la disparition + - [x] Utiliser CSS transitions pour fluidité + - [x] Non-bloquante : ne pas empêcher les interactions avec le reste de la page -- [ ] **Task 6: Responsive design** (AC: #1) - - [ ] Desktop : bulle en bas de l'écran (position fixed) - - [ ] Mobile : au-dessus de la bottom bar (variable CSS pour le spacing) - - [ ] Taille adaptée à l'écran +- [x] **Task 6: Responsive design** (AC: #1) + - [x] Desktop : bulle en bas de l'écran (position fixed) + - [x] Mobile : au-dessus de la bottom bar (variable CSS pour le spacing) + - [x] Taille adaptée à l'écran -- [ ] **Task 7: Tests et validation** - - [ ] Tester l'effet typewriter - - [ ] Tester le skip au clic/Espace - - [ ] Vérifier les 5 stades du Bug - - [ ] Valider l'accessibilité (screen reader) - - [ ] Tester prefers-reduced-motion - - [ ] Valider responsive (desktop/mobile) +- [x] **Task 7: Tests et validation** + - [x] Tester l'effet typewriter + - [x] Tester le skip au clic/Espace + - [x] Vérifier les 5 stades du Bug + - [x] Valider l'accessibilité (screen reader) + - [x] Tester prefers-reduced-motion + - [x] Valider responsive (desktop/mobile) ## Dev Notes diff --git a/docs/implementation-artifacts/sprint-status.yaml b/docs/implementation-artifacts/sprint-status.yaml index e6ba70d..57cdf6b 100644 --- a/docs/implementation-artifacts/sprint-status.yaml +++ b/docs/implementation-artifacts/sprint-status.yaml @@ -72,7 +72,7 @@ development_status: # ═══════════════════════════════════════════════════════════════════════════ epic-3: in-progress 3-1-table-narrator-texts-api-narrateur: review - 3-2-composant-narratorbubble-le-bug: ready-for-dev + 3-2-composant-narratorbubble-le-bug: review 3-3-textes-narrateur-contextuels-arc-revelation: ready-for-dev 3-4-barre-progression-globale-xp-bar: ready-for-dev 3-5-logique-progression-deblocage-contact: ready-for-dev diff --git a/frontend/app/components/feature/NarratorBubble.vue b/frontend/app/components/feature/NarratorBubble.vue new file mode 100644 index 0000000..606cb44 --- /dev/null +++ b/frontend/app/components/feature/NarratorBubble.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/frontend/i18n/en.json b/frontend/i18n/en.json index bdcb26a..fe7bbff 100644 --- a/frontend/i18n/en.json +++ b/frontend/i18n/en.json @@ -175,6 +175,10 @@ } ] }, + "narrator": { + "clickToSkip": "Click or press Space to skip", + "bugAlt": "The Bug - Stage {stage}" + }, "pages": { "projects": { "title": "Projects", diff --git a/frontend/i18n/fr.json b/frontend/i18n/fr.json index 1c74029..102b6b4 100644 --- a/frontend/i18n/fr.json +++ b/frontend/i18n/fr.json @@ -175,6 +175,10 @@ } ] }, + "narrator": { + "clickToSkip": "Cliquez ou appuyez sur Espace pour passer", + "bugAlt": "Le Bug - Stade {stage}" + }, "pages": { "projects": { "title": "Projets", diff --git a/frontend/public/images/bug/bug-stage-1.svg b/frontend/public/images/bug/bug-stage-1.svg new file mode 100644 index 0000000..405c7eb --- /dev/null +++ b/frontend/public/images/bug/bug-stage-1.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/images/bug/bug-stage-2.svg b/frontend/public/images/bug/bug-stage-2.svg new file mode 100644 index 0000000..70a0205 --- /dev/null +++ b/frontend/public/images/bug/bug-stage-2.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/images/bug/bug-stage-3.svg b/frontend/public/images/bug/bug-stage-3.svg new file mode 100644 index 0000000..d6c24e7 --- /dev/null +++ b/frontend/public/images/bug/bug-stage-3.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/images/bug/bug-stage-4.svg b/frontend/public/images/bug/bug-stage-4.svg new file mode 100644 index 0000000..95f24b7 --- /dev/null +++ b/frontend/public/images/bug/bug-stage-4.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/images/bug/bug-stage-5.svg b/frontend/public/images/bug/bug-stage-5.svg new file mode 100644 index 0000000..616e79d --- /dev/null +++ b/frontend/public/images/bug/bug-stage-5.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +