feat(web): moteur de tutoriel guidé driver.js (#42) #60
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/tour-engine"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Le moteur front du tutoriel guidé, sur le socle backend de #42/#44 (PRs #58 + #59). Deux tours : orientation générale (auto sur
/) et correction des métadonnées de recette (auto à l'ouverture du premier popover de correction).Contenu
driver.js(~5 ko gzippé, MIT, zéro dépendance — cf. le comparatif de l'issue #42).features/tour/tour-engine.ts— wrapper vanilla (aucun React) autour dedriver.js.driver.jsgère le halo/popover et attend qu'une cible soit montée (waitForElement) ; ce wrapper ajoute les deux choses qu'il ne fait pas seul :routediffère du chemin courant,navigate();onFinishappelé exactement une fois,"completed"seulement si on atteint la fin,"skipped"pour la croix / Échap / clic sur l'overlay.features/tour/TourContext.tsx—TourProvider(charge scénarios + progression, effet keyed suruser?.idcommeThemeContext) etuseTour()(startTour(key)/isTourCompleted(key)/tours/isReady).isReadyest calculé au render contre l'id utilisateur pour lequel les données ont été chargées — pas stocké dans un state. Sans ça, une course réelle : à l'instant oùuserarrive, les effets enfants tournent avant celui du parent, donc l'auto-déclenchement voyaitisReady === trueavec uncompletedKeysencore vide (chargé déconnecté) et relançait le tour même s'il avait déjà été vu. (Reproduit puis corrigé — cf. le scénario Cypress « un tour déjà vu ne se relance pas ».)main.tsx—<TourProvider>sousThemeProvider.data-tour: liens de nav (AppLayout), grille du planning + bouton+du 1er créneau + bouton « Cuisiner » (PlanningPage), page liste de courses (ShoppingListPage), description d'étape éditable + section technique du popover (StepDescription/TechStepCorrectionPopover).generalsur/(PlanningPage,useRefpour ne tirer qu'une fois par montage), tourtechStepMetadataquandactiveCorrectionpasse non-null en mode éditable (StepDescription).startTourno-ope si déjà vu / déjà en cours./parametres/preferences-utilisateur— unmapsurtours, un bouton « Revoir » par scénario (scale à un 3e tour sans changement).tour.scssre-skinne le popoverdriver.jssur les tokens du thème.tour.*— chrome uniquement (boutons du popover, section « Revoir ») ; le contenu des étapes vient de la base (texte libre administrable, cf. #44).Le tour
techStepMetadatareste court (2 étapes) : #36 (popover qui se ferme en pleine sélection) est ouvert — v1 ne couvre que les gestes qui marchent déjà.Tests
cypress/e2e/tour.feature(5) : auto-démarrage + élément surligné (.driver-active-element) pour un nouveau venu ; « Terminé » → complétion enregistréeskipped:false; croix →skipped:true; un tour déjà vu ne se relance pas ; « Revoir » le relance depuis les paramètres. 5/5 en local, + 35 spécs de non-régression (smoke/layout/planning-page/sidebar/recipes/user-preferences) vertes.pnpm build+pnpm lintverts.Suite
Page admin
/admin/didacticiels(l'UI CRUD par-dessus l'API #59) — prête, poussée juste après.Refs #42
🤖 Generated with Claude Code