# Story 4.2: Intro narrative et premier choix Status: done ## Story As a visiteur aventurier, I want une introduction narrative captivante suivie d'un premier choix, so that je suis immergé dès le début de l'aventure. ## Acceptance Criteria 1. **Given** le visiteur a sélectionné son héros sur la landing page **When** il commence l'aventure **Then** une séquence d'intro narrative s'affiche avec le narrateur (Le Bug) 2. **And** le texte présente le "héros mystérieux" (le développeur) à découvrir 3. **And** l'effet typewriter anime le texte (skippable par clic/Espace) 4. **And** l'ambiance visuelle est immersive (fond sombre, illustrations) 5. **And** un bouton "Continuer" permet d'avancer 6. **And** à la fin de l'intro, le premier choix binaire s'affiche via `ChoiceCards` 7. **And** le choix propose deux zones à explorer en premier (ex: Projets vs Compétences) 8. **And** le contenu est bilingue (FR/EN) et adapté au héros (vouvoiement/tutoiement) 9. **And** la durée de l'intro est courte (15-30s max, skippable) ## Tasks / Subtasks - [x] **Task 1: Créer les textes d'intro dans l'API** (AC: #2, #8) - [x] Ajouter les contextes `intro_sequence_1`, `intro_sequence_2`, `intro_sequence_3` dans narrator_texts - [x] Variantes pour chaque type de héros (vouvoiement/tutoiement) - [x] Textes mystérieux présentant le développeur - [x] **Task 2: Créer la page intro** (AC: #1, #4, #9) - [x] Créer `frontend/app/pages/intro.vue` - [x] Rediriger automatiquement depuis landing après choix du héros - [x] Fond sombre avec ambiance mystérieuse - [x] Structure en étapes (séquences de texte) - [x] **Task 3: Implémenter la séquence narrative** (AC: #2, #3, #5) - [x] Créer composant `IntroSequence.vue` - [x] Afficher le Bug avec le texte en typewriter - [x] Bouton "Continuer" pour passer à l'étape suivante - [x] Clic/Espace pour skip le typewriter - [x] 3 séquences de texte courtes - [x] **Task 4: Ajouter les illustrations d'ambiance** (AC: #4) - [x] Illustrations de fond (toiles d'araignée, particules code flottant) - [x] Animation subtile sur les éléments de fond - [x] Cohérence avec l'univers de Le Bug - [x] **Task 5: Intégrer le premier choix** (AC: #6, #7) - [x] Après la dernière séquence, afficher ChoiceCards - [x] Choix : Projets vs Compétences - [x] La sélection navigue vers la zone choisie - [x] **Task 6: Gérer le skip global** (AC: #9) - [x] Bouton discret "Passer l'intro" visible en permanence - [x] Navigation directe vers le choix si skip - [x] Enregistrer dans le store que l'intro a été vue/skip - [x] **Task 7: Tests et validation** - [x] Build production réussi - [x] Composants intro intégrés au bundle ## Dev Notes ### Textes d'intro (exemples) ```php // À ajouter dans NarratorTextSeeder.php // Intro séquence 1 - Recruteur (vouvoiement) ['context' => 'intro_sequence_1', 'text_key' => 'narrator.intro_seq.1.recruteur', 'variant' => 1, 'hero_type' => 'recruteur'], // Intro séquence 1 - Client/Dev (tutoiement) ['context' => 'intro_sequence_1', 'text_key' => 'narrator.intro_seq.1.casual', 'variant' => 1, 'hero_type' => 'client'], ['context' => 'intro_sequence_1', 'text_key' => 'narrator.intro_seq.1.casual', 'variant' => 1, 'hero_type' => 'dev'], // Traductions ['key' => 'narrator.intro_seq.1.recruteur', 'fr' => "Bienvenue dans mon domaine, voyageur... Je suis Le Bug, et je vais vous guider dans cette aventure.", 'en' => "Welcome to my domain, traveler... I am The Bug, and I will guide you through this adventure."], ['key' => 'narrator.intro_seq.1.casual', 'fr' => "Hey ! Bienvenue chez moi. Je suis Le Bug, ton guide pour cette aventure.", 'en' => "Hey! Welcome to my place. I'm The Bug, your guide for this adventure."], ['key' => 'narrator.intro_seq.2', 'fr' => "Il y a quelqu'un ici que tu cherches... Un développeur mystérieux qui a créé tout ce que tu vois autour de toi.", 'en' => "There's someone here you're looking for... A mysterious developer who created everything you see around you."], ['key' => 'narrator.intro_seq.3', 'fr' => "Pour le trouver, tu devras explorer ce monde. Chaque zone cache une partie de son histoire. Es-tu prêt ?", 'en' => "To find them, you'll have to explore this world. Each zone hides a part of their story. Are you ready?"], ``` ### Page intro.vue ```vue ``` ### Composant IntroSequence ```vue ``` ### Composant IntroBackground ```vue ``` ### Clés i18n **fr.json :** ```json { "intro": { "continue": "Continuer", "startExploring": "Commencer l'exploration", "skip": "Passer l'intro" } } ``` **en.json :** ```json { "intro": { "continue": "Continue", "startExploring": "Start exploring", "skip": "Skip intro" } } ``` ### Dépendances **Cette story nécessite :** - Story 3.1 : API narrateur (contextes intro_sequence_*) - Story 3.2 : NarratorBubble et useTypewriter - Story 4.1 : ChoiceCards pour le premier choix - Story 1.5 : Landing page (choix du héros) **Cette story prépare pour :** - Story 4.3 : Chemins narratifs (suite de l'aventure) ### Project Structure Notes **Fichiers à créer :** ``` frontend/app/ ├── pages/ │ └── intro.vue # CRÉER └── components/feature/ ├── IntroSequence.vue # CRÉER └── IntroBackground.vue # CRÉER ``` **Fichiers à modifier :** ``` api/database/seeders/NarratorTextSeeder.php # AJOUTER intro_sequence_* frontend/i18n/fr.json # AJOUTER intro.* frontend/i18n/en.json # AJOUTER intro.* ``` ### References - [Source: docs/planning-artifacts/epics.md#Story-4.2] - [Source: docs/planning-artifacts/ux-design-specification.md#Intro-Sequence] - [Source: docs/brainstorming-gamification-2026-01-26.md#Onboarding] ### Technical Requirements | Requirement | Value | Source | |-------------|-------|--------| | Durée intro | 15-30s max (skippable) | Epics | | Séquences | 3-4 textes courts | Décision technique | | Premier choix | Projets vs Compétences | Epics | | Adaptation héros | Vouvoiement/tutoiement | UX Spec | ## Dev Agent Record ### Agent Model Used Claude Opus 4.5 (claude-opus-4-5-20251101) ### Debug Log References ### Completion Notes List - Page intro.vue avec séquence narrative en 3 étapes - IntroSequence.vue avec typewriter et skip - IntroBackground.vue avec particules code et toiles d'araignée - Intégration ChoiceCards pour premier choix - Textes d'intro ajoutés au NarratorTextSeeder - Store progression mis à jour avec introSeen - Fallback i18n si API non disponible - Build production validé ### Change Log | Date | Change | Author | |------|--------|--------| | 2026-02-04 | Story créée avec contexte complet | SM Agent | | 2026-02-08 | Implémentation complète | Dev Agent | ### File List - frontend/app/pages/intro.vue (CREATED) - frontend/app/components/feature/IntroSequence.vue (CREATED) - frontend/app/components/feature/IntroBackground.vue (CREATED) - frontend/app/stores/progression.ts (MODIFIED - ajout introSeen) - frontend/app/pages/index.vue (MODIFIED - redirection vers /intro) - frontend/app/composables/useFetchNarratorText.ts (MODIFIED - contextes intro_sequence_*) - frontend/i18n/fr.json (MODIFIED - ajout intro.*) - frontend/i18n/en.json (MODIFIED - ajout intro.*) - api/database/seeders/NarratorTextSeeder.php (MODIFIED - textes intro_sequence_*)