# Coaster World v1.92.0 — Performance / SEO / Accessibilité

Base : **v1.91.0**.

## SEO technique

- Ajout de métadonnées globales propres dans le layout :
  - description ;
  - robots ;
  - URL canonique ;
  - OpenGraph ;
  - Twitter Card ;
  - couleur de thème.
- Les pages privées et d'administration sont maintenant explicitement en `noindex`.
- Les résultats de recherche sont en `noindex,follow`.
- Les pages Explorer filtrées/recherchées ne créent plus de variantes indexables inutiles.
- Les fiches **Parc**, **Attraction** et **Coaster** disposent de métadonnées localisées et d'une URL canonique dédiée.
- Ajout de données structurées Schema.org :
  - `AmusementPark` pour les parcs ;
  - `TouristAttraction` pour les attractions et coasters ;
  - `BreadcrumbList` pour les fiches catalogue ;
  - `WebSite` + `SearchAction` sur l'accueil.
- Les images principales sont reprises dans OpenGraph/Twitter lorsqu'elles existent.

## Sitemap & robots

- Nouvelle route publique `/sitemap.xml`.
- Le sitemap contient :
  - accueil ;
  - Explorer ;
  - Local Experts ;
  - galerie communautaire ;
  - parcs publiés ;
  - attractions publiées non-coaster ;
  - coasters publiés.
- Génération par lots pour ne pas charger tout le catalogue Eloquent en une seule requête.
- Sitemap mis en cache pendant une heure.
- `robots.txt` est maintenant généré dynamiquement afin d'utiliser la bonne URL absolue du sitemap quel que soit l'environnement.
- Le fichier `public/robots.txt` reste présent comme fallback serveur.
- Les zones privées (admin, profil, notifications, amis, groupes, Road Trips, visite, collection...) sont exclues du crawl.

## Performance

### Accueil

- Cache court des données catalogue stables :
  - parcs récents : 10 min ;
  - points du globe : 30 min ;
  - statistiques globales : 15 min.
- Les données Live des coasters **ne sont pas mises en cache** par ce mécanisme afin de conserver les temps d'attente à jour.

### Explorer

- Cache des pays pendant 30 min.
- Cache des jeux de résultats catalogue pendant 10 min selon langue/type/pays/statut.
- Les tris et la recherche texte restent appliqués normalement.
- Pagination à **60 résultats par page** afin d'éviter de rendre plusieurs centaines de cartes simultanément dans le DOM.
- Les paramètres de filtre sont conservés lors de la pagination.

### Notifications

- Le compteur de notifications du header utilise un cache très court de 8 secondes afin d'éviter la même requête agrégée sur chaque page.
- Ce cache est invalidé immédiatement lorsqu'une notification est lue ou supprimée depuis le Centre de notifications.

### Images

- `decoding="async"` ajouté aux images chargées paresseusement des galeries, du fil communautaire et des pages photos.
- Les images principales au-dessus de la ligne de flottaison restent prioritaires.
- Préchargement de l'image bannière sur les fiches parc / attraction / coaster lorsqu'elle existe.

## Accessibilité

- Ajout d'un lien **Aller au contenu principal** visible au focus clavier.
- Le contenu principal possède désormais une cible de navigation clavier stable.
- Focus clavier `:focus-visible` renforcé sur liens, boutons, champs, sélecteurs et éléments interactifs.
- Navigation desktop et mobile avec labels accessibles localisés.
- `aria-current="page"` ajouté sur plusieurs navigations actives.
- Les fils d'Ariane Parc / Attraction / Coaster utilisent maintenant un élément `nav` avec libellé accessible.
- Le menu de langue et le menu mobile exposent leurs relations `aria-controls`.
- Le badge de notifications utilise une zone `aria-live`.
- Respect de `prefers-reduced-motion` : animations et transitions sont fortement réduites pour les utilisateurs qui le demandent.
- Dimensions explicites sur les logos principaux pour réduire les décalages de mise en page.

## Robustesse Blade

- Reformatage complet de la vue Explorer afin d'éviter les directives Blade compactées sur une seule ligne.
- Nettoyage du dernier bloc compact Ride Together dans le Mode Visite.
- Contrôle statique de l'équilibre des directives Blade sur l'ensemble des vues.

## Base de données

**Aucune nouvelle migration SQL.**
