# Navigation & Architecture Mobile

## Architecture de navigation

L'application mobile utilise une navigation par onglets (Bottom Navigation Bar) avec 4 sections principales.

```mermaid
graph TD
    A[App Shell] --> B[🏠 Accueil]
    A --> C[🗺️ Carte]
    A --> D[🎵 Bibliothèque]
    A --> E[👤 Profil]

    B --> B1[Feed Recommandations]
    B --> B2[Lecteur Audio]

    C --> C1[Vue Carte]
    C --> C2[Détail Point]

    D --> D1[Mes Playlists]
    D --> D2[Contenus Sauvegardés]
    D --> D3[Historique]

    E --> E1[Jauges Intérêt]
    E --> E2[Paramètres]
    E --> E3[Abonnements]
```

## Bottom Navigation Bar

### Onglet 1 : Accueil 🏠
Point d'entrée principal après le lancement de l'app.

**Fonctionnalités** :
- Feed de recommandations basé sur la géolocalisation + intérêts
- Rafraîchissement pull-to-refresh
- Lecture directe depuis le feed

**Navigation vers** :
- Détail d'un contenu (push)
- Lecteur plein écran (modal)
- Profil d'un créateur (push)

### Onglet 2 : Carte 🗺️
Exploration visuelle des contenus par géolocalisation.

**Fonctionnalités** :
- Carte interactive (MapLibre GL)
- Markers pour contenus à proximité
- Clusters pour zones denses
- Recherche par adresse

**Navigation vers** :
- Détail d'un point (bottom sheet)
- Lecteur audio (modal persistant)

### Onglet 3 : Bibliothèque 🎵
Accès aux contenus sauvegardés, historique, playlists.

**Fonctionnalités** :
- Playlists personnelles
- Contenus favoris
- Historique d'écoute
- Téléchargements offline

### Onglet 4 : Profil 👤
Gestion du compte, préférences, jauges d'intérêt.

**Fonctionnalités** :
- Visualisation/édition jauges d'intérêt
- Paramètres de l'app
- Gestion abonnement Premium
- Déconnexion

## Lecteur Audio (Modal persistant)

Le lecteur est un composant modal qui persiste lors de la navigation entre onglets.

```mermaid
stateDiagram-v2
    [*] --> Collapsed: Lecture démarre
    Collapsed --> Expanded: Tap sur mini-player
    Expanded --> Collapsed: Swipe down
    Collapsed --> [*]: Stop audio

    Expanded --> Queue: Tap "À suivre"
    Queue --> Expanded: Retour
```

=== "État Collapsed (Mini-player)"
    - Hauteur : 60dp
    - Position : Bottom (au-dessus de la Bottom Nav Bar)
    - Affiche : Titre, artiste, play/pause, skip
    - Interaction : Tap pour expand

=== "État Expanded (Lecteur plein écran)"
    - Plein écran modal
    - Cover art grande taille
    - Contrôles avancés (repeat, shuffle, queue)
    - Scrubber timeline
    - Boutons : like, share, download, add to playlist

## Routing Flutter

### Configuration

Utilisation de **go_router** (voir [ADR-020](../../adr/020-librairies-flutter.md)).

```dart
// Exemple simplifié
GoRouter(
  routes: [
    ShellRoute(
      builder: (context, state, child) => AppShell(child: child),
      routes: [
        GoRoute(path: '/home', builder: (context, state) => HomeScreen()),
        GoRoute(path: '/map', builder: (context, state) => MapScreen()),
        GoRoute(path: '/library', builder: (context, state) => LibraryScreen()),
        GoRoute(path: '/profile', builder: (context, state) => ProfileScreen()),
      ],
    ),
    GoRoute(
      path: '/content/:id',
      builder: (context, state) => ContentDetailScreen(
        contentId: state.pathParameters['id']!,
      ),
    ),
  ],
);
```

### Deep Links

L'app supporte les deep links pour :
- `roadwave://content/{id}` : Ouvrir un contenu spécifique
- `roadwave://map?lat={lat}&lon={lon}` : Ouvrir la carte à une position
- `roadwave://profile` : Ouvrir le profil

## Gestion d'état

- **Provider** pour l'état global (user, player, location)
- **BLoC** pour les features complexes (recommendation, map)
- **Riverpod** pour l'injection de dépendances

Voir [ADR-020](../../adr/020-librairies-flutter.md) pour les détails.

## Permissions système

La navigation gère les demandes de permissions de manière contextuelle :

1. **Géolocalisation** : Demandée au premier lancement, avant d'afficher l'accueil
2. **Notifications** : Demandée après 3 sessions utilisateur (opt-in soft)
3. **Stockage** : Demandée lors du premier téléchargement offline

Voir [mobile/permissions-strategy.md](../../mobile/permissions-strategy.md) pour la stratégie complète.

## Transitions et animations

### Transitions entre onglets
- Aucune animation (changement instantané)
- Préservation du scroll state sur chaque onglet

### Navigation push/pop
- iOS : Slide transition (standard Cupertino)
- Android : Fade + Slide transition (Material Design)

### Mini-player expand/collapse
- Spring animation (bounce léger)
- Durée : 300ms
- Curve : `Curves.easeInOutCubic`

## Gestion du back button (Android)

```mermaid
graph TD
    A[Back pressed] --> B{Lecteur expanded?}
    B -->|Oui| C[Collapse lecteur]
    B -->|Non| D{Sur onglet Accueil?}
    D -->|Non| E[Retour à Accueil]
    D -->|Oui| F{Audio en cours?}
    F -->|Oui| G[Dialog: Quitter?]
    F -->|Non| H[Quitter app]
    G -->|Confirme| H
    G -->|Annule| I[Rester]
```

## Accessibilité

- **Screen readers** : Labels sémantiques sur tous les boutons
- **Navigation clavier** : Support complet (pour tablettes avec clavier)
- **Contraste** : WCAG 2.1 AA minimum (4.5:1 pour texte)
- **Taille des touch targets** : 48dp minimum

## Mode sombre

Support obligatoire du mode sombre (conduite de nuit).

=== "Mode Clair"
    - Fond : White / Light Gray (#F5F5F5)
    - Texte : Dark Gray (#212121)
    - Accent : Indigo (#3F51B5)

=== "Mode Sombre"
    - Fond : Dark (#121212)
    - Texte : White (#FFFFFF)
    - Accent : Indigo clair (#7986CB)

Détection automatique via `MediaQuery.platformBrightness` ou choix manuel dans les paramètres.
