# Coaster World v1.100.6 — 2026-08-18

## Mon classeur

- Restaure et renforce le reflet holographique dynamique de la carte 3D au survol, tout en conservant la carte parfaitement à plat au repos.
- Corrige la visionneuse sur téléphone/tablette : la modale commence sous le header, utilise la hauteur restante de l'écran et possède son propre défilement pour garder le bas accessible.
- Les cartes verrouillées n'exposent plus leur véritable recto dans le DOM : elles affichent un visuel mystère.
- Ajoute le type de carte (Coaster / Attraction) dans la visionneuse.

## Protection des visuels

- Les nouveaux rectos/versos sont stockés dans `storage/app/private/coaster-cards` au lieu de `storage/app/public`.
- Les visuels sont servis uniquement par des routes Laravel authentifiées et temporairement signées.
- Le contrôleur vérifie que l'utilisateur possède réellement la carte, sauf administrateur.
- Ajout d'en-têtes `no-store`, `same-origin`, `noindex` et affichage `inline`.
- Blocage UI du clic droit, du glisser-déposer et de l'appel long sur les images de carte.
- Ajout de `php artisan cw:cards:protect-media` pour déplacer les anciens visuels publics vers le stockage privé puis supprimer les copies publiques.

## Administration des cartes

- Une carte peut désormais être associée à un coaster **ou** à une attraction standard.
- Le sélecteur admin regroupe les coasters et les attractions dans deux groupes recherchables.
- Les attractions déjà classées comme coasters restent gérées via leur entrée coaster afin d'éviter les doublons.
- La série/collection est maintenant automatique et reprend le nom du parc associé.
- Les cartes d'attraction sont débloquées par les rides existants de la même manière que les cartes de coaster.

## Base de données

- `coaster_cards.coaster_id` devient nullable.
- Ajout de `coaster_cards.attraction_id` nullable, unique et lié à `attractions.id`.
- Les séries des cartes coaster existantes sont réalignées automatiquement sur le nom de leur parc.
