// Onboarding guidé (templates/onboarding/onboarding_new.html) — interactions // pures DOM, aucune logique métier ici (voir routes/onboarding/ // onboarding_new.py pour la validation réelle, côté serveur). Deux // "pages" (choix du type / nom du jeu) posées côte à côte dans // #onboardingTrack, révélées par un défilement horizontal animé en CSS // (voir .onboardingTrack--step2 dans static/style.css) plutôt qu'un vrai // changement de page — pas de rechargement, pas d'aller-retour serveur // tant que le formulaire n'est pas soumis pour de vrai. function forgeOnboardingGoToStep(step) { var track = document.getElementById("onboardingTrack"); if (track) track.classList.toggle("onboardingTrack--step2", step === 2); if (step === 2) { var nameField = document.getElementById("onboardingNameInput"); // Après la fin de l'animation de défilement (voir la durée de // transition posée sur .onboardingTrack) — focus immédiat plus tôt // ferait sauter le scroll du champ à moitié visible. if (nameField) setTimeout(function () { nameField.focus(); }, 500); } } function forgeOnboardingChooseType(card) { document.querySelectorAll(".onboardingCard").forEach(function (c) { c.classList.toggle("is-selected", c === card); }); var hiddenType = document.getElementById("onboardingTypeHidden"); if (hiddenType) hiddenType.value = card.dataset.type || ""; forgeOnboardingUpdateSubmitState(); forgeOnboardingGoToStep(2); } function forgeOnboardingUpdateSubmitState() { var nameField = document.getElementById("onboardingNameInput"); var hiddenType = document.getElementById("onboardingTypeHidden"); var submitBtn = document.getElementById("onboardingSubmitBtn"); if (!nameField || !hiddenType || !submitBtn) return; submitBtn.disabled = !(hiddenType.value && nameField.value.trim()); } function forgeOnboardingInit() { // Appelé directement (pas de DOMContentLoaded) : ce fichier est chargé // par un