Feature #1312
open[EPIC] Tutoriel guidé GetYourJob — visite interactive "Take a tour" post-setup profil
0%
Description
Après qu'un nouvel utilisateur (candidat/développeur) a complété son profil, lui proposer un tutoriel interactif "visite guidée" : un spotlight met en évidence l'élément à cliquer, le reste de la page est assombri/flouté, une bulle explique l'action ("Maintenant que votre profil est rempli, vous pouvez…").
h2. Principes généraux (s'appliquent à tous les sous-tickets)
* *Un tutoriel indépendant par page* : Dashboard, Matching (modal de config), Match-offers (résultats), Mes offres sauvegardées (kanban), Mon profil (/profile/developer), Mes personas.
* *Skip indépendant par page* : bouton "Passer le tutoriel" toujours visible ; le skip d'une page ne skippe pas les autres.
* *Reprise* : si l'utilisateur quitte en cours de tutoriel (clic sur un élément qui navigue ailleurs, fermeture, etc.), à son retour sur la page il reprend à l'étape où il était.
* *Vu = terminé* : un tutoriel vu en entier (ou skippé) ne se réaffiche plus jamais.
* *Handoff inter-pages* : certains tutoriels envoient l'utilisateur vers une autre page (ex. fiche entreprise depuis match-offers) ; au retour il reprend à l'étape suivante.
* *Interaction réelle* : certaines étapes avancent quand l'utilisateur clique réellement l'élément cible (ouverture de modal, lancement du matching…), pas seulement via "Suivant".
h2. Architecture technique (framework partagé — voir sous-ticket core)
* Nouveau module @src/components/tour/@ : @TourProvider@ (contexte), @useTour@, @TourOverlay@ (spotlight par découpe + fond assombri/flouté, z-index au-dessus de 100000 pour passer devant toutes les modals existantes), configs de steps par page.
* Ancrage des cibles par attributs @data-tour="…"@ posés sur les composants existants.
* Persistance : localStorage clé versionnée @gyj_tour_state_v1@ (pattern existant @gyj_*@), par tour : @{ step, completedAt, skippedAt }@.
* i18n : copies FR dans @src/infrastructure/i18n/translations/fr.ts@ (+ EN), rendu via @useTranslation@.
* Aucune lib externe (pas de joyride/driver.js) — rien d'existant dans le repo, on garde le contrôle du blur/drag/handoff.
Sous-tickets = 1 framework core + 1 ticket par page.