# Story 3.7: Navigation mobile - Chemin Libre et Bottom Bar Status: ready-for-dev ## Story As a visiteur mobile, I want naviguer facilement avec une interface adaptée au tactile, so that l'expérience reste immersive sur petit écran. ## Acceptance Criteria 1. **Given** le visiteur est sur mobile (< 768px) **When** il accède à la navigation **Then** le "Chemin Libre" affiche les zones en cards verticales scrollables (`ZoneCard`) 2. **And** chaque `ZoneCard` affiche : illustration, nom de la zone, statut (visité/nouveau/verrouillé) 3. **And** une ligne décorative relie les cards visuellement (effet chemin) 4. **And** un tap sur une zone navigue vers la section correspondante 5. **And** la zone Contact affiche un cadenas si `contactUnlocked` est `false` 6. **Given** la bottom bar mobile est affichée **When** le visiteur interagit **Then** 3 icônes sont accessibles : Carte (ouvre le Chemin Libre), Progression (affiche le %), Paramètres 7. **And** les touch targets font au minimum 48x48px 8. **And** la bottom bar est fixe et toujours visible 9. **And** le narrateur s'affiche au-dessus de la bottom bar quand actif ## Tasks / Subtasks - [ ] **Task 1: Créer le composant ZoneCard** (AC: #1, #2, #5) - [ ] Créer `frontend/app/components/feature/ZoneCard.vue` - [ ] Props : zone (MapZone), isVisited, isLocked, isCurrent - [ ] Afficher illustration, nom traduit, statut visuel - [ ] Icône cadenas si verrouillé - [ ] Badge "Nouveau" si non visité - [ ] Checkmark si visité - [ ] **Task 2: Créer le composant CheminLibre** (AC: #1, #3, #4) - [ ] Créer `frontend/app/components/feature/CheminLibre.vue` - [ ] Afficher les 5 zones en cards verticales - [ ] Ligne décorative reliant les cards (SVG ou CSS) - [ ] Scroll vertical natif - [ ] Gestion du tap pour navigation - [ ] **Task 3: Créer le composant BottomBar** (AC: #6, #7, #8) - [ ] Créer `frontend/app/components/layout/BottomBar.vue` - [ ] 3 boutons : Carte, Progression, Paramètres - [ ] Touch targets minimum 48x48px - [ ] Position fixe en bas - [ ] Variable CSS --bottom-bar-height pour le spacing - [ ] **Task 4: Intégrer le drawer Chemin Libre** (AC: #1) - [ ] Au tap sur Carte dans BottomBar, ouvrir le CheminLibre - [ ] Le CheminLibre s'affiche en slide-up depuis le bas - [ ] Overlay pour fermer en tapant à l'extérieur - [ ] Handle de glissement pour fermer - [ ] **Task 5: Intégrer le modal Progression** (AC: #6) - [ ] Au tap sur Progression, afficher le détail - [ ] Réutiliser le composant ProgressIcon de Story 3.4 - [ ] Afficher la liste des sections visitées/restantes - [ ] **Task 6: Intégrer les paramètres** (AC: #6) - [ ] Au tap sur Paramètres, ouvrir un drawer - [ ] Options : langue, mode Express/Aventure, réinitialiser - [ ] Consentement RGPD accessible - [ ] **Task 7: Gérer le positionnement du narrateur** (AC: #9) - [ ] Variable CSS --bottom-bar-height définie - [ ] Le NarratorBubble utilise cette variable pour son bottom - [ ] Pas de chevauchement entre narrateur et bottom bar - [ ] **Task 8: Responsive design** - [ ] BottomBar visible uniquement < 768px - [ ] CheminLibre adapté aux petits écrans - [ ] Safe-area-inset pour les appareils avec notch - [ ] **Task 9: Tests et validation** - [ ] Tester sur mobile réel ou émulateur - [ ] Vérifier les touch targets (48px minimum) - [ ] Tester navigation entre zones - [ ] Valider le drawer Chemin Libre - [ ] Tester le positionnement du narrateur ## Dev Notes ### Composant ZoneCard ```vue ``` ### Composant CheminLibre ```vue ``` ### Composant BottomBar ```vue ``` ### Composant ProgressDetail (pour le modal) ```vue ``` ### Composant SettingsDrawer ```vue ``` ### Clés i18n **fr.json :** ```json { "zone": { "locked": "Verrouillé", "visited": "Visité", "new": "À découvrir", "newBadge": "Nouveau" }, "cheminLibre": { "title": "Chemin Libre" }, "bottomBar": { "map": "Carte", "progress": "Progression", "settings": "Options" }, "settings": { "title": "Paramètres", "language": "Langue", "expressMode": "Mode Express", "expressModeDesc": "Navigation rapide sans aventure", "saveProgress": "Sauvegarder ma progression", "saveProgressDesc": "Permet de reprendre là où vous vous êtes arrêté", "reset": "Réinitialiser ma progression", "confirmReset": "Êtes-vous sûr de vouloir réinitialiser votre progression ?" } } ``` **en.json :** ```json { "zone": { "locked": "Locked", "visited": "Visited", "new": "To discover", "newBadge": "New" }, "cheminLibre": { "title": "Free Path" }, "bottomBar": { "map": "Map", "progress": "Progress", "settings": "Settings" }, "settings": { "title": "Settings", "language": "Language", "expressMode": "Express Mode", "expressModeDesc": "Quick navigation without adventure", "saveProgress": "Save my progress", "saveProgressDesc": "Allows you to resume where you left off", "reset": "Reset my progress", "confirmReset": "Are you sure you want to reset your progress?" } } ``` ### Variable CSS pour la Bottom Bar ```css /* frontend/app/assets/css/main.css ou variables.css */ :root { --bottom-bar-height: 64px; } /* Padding bottom pour le contenu principal sur mobile */ @media (max-width: 767px) { .main-content { padding-bottom: calc(var(--bottom-bar-height) + 1rem); } } ``` ### Dépendances **Cette story nécessite :** - Story 3.4 : ProgressBar composant - Story 3.5 : Store de progression - Story 3.2 : NarratorBubble (pour le positionnement) **Cette story prépare pour :** - Story 4.2 : Intro narrative (navigation mobile) - Epic 4 : Chemins narratifs (utilise la navigation) ### Project Structure Notes **Fichiers à créer :** ``` frontend/app/components/ ├── feature/ │ ├── ZoneCard.vue # CRÉER │ ├── CheminLibre.vue # CRÉER │ ├── ProgressDetail.vue # CRÉER │ └── SettingsDrawer.vue # CRÉER └── layout/ └── BottomBar.vue # CRÉER ``` **Fichiers à modifier :** ``` frontend/app/layouts/default.vue # AJOUTER BottomBar frontend/app/assets/css/main.css # AJOUTER variables CSS frontend/i18n/fr.json # AJOUTER traductions frontend/i18n/en.json # AJOUTER traductions ``` ### References - [Source: docs/planning-artifacts/epics.md#Story-3.7] - [Source: docs/planning-artifacts/ux-design-specification.md#Mobile-Navigation] - [Source: docs/planning-artifacts/ux-design-specification.md#Bottom-Bar] ### Technical Requirements | Requirement | Value | Source | |-------------|-------|--------| | Breakpoint mobile | < 768px | Epics | | Touch targets | 48x48px minimum | WCAG | | Bottom bar height | 64px | Décision technique | | Safe area | env(safe-area-inset-bottom) | iOS | ## Dev Agent Record ### Agent Model Used {{agent_model_name_version}} ### Debug Log References ### Completion Notes List ### Change Log | Date | Change | Author | |------|--------|--------| | 2026-02-04 | Story créée avec contexte complet | SM Agent | ### File List