From 1b1307bb85c36cc966860e34520fcb211f4a7e13 Mon Sep 17 00:00:00 2001 From: william Date: Sun, 20 Sep 2026 14:43:26 +0200 Subject: [PATCH] Association et Memory restent affiches une fois termines, seul Recommencer bascule Les deux mini-jeux gardaient jusqu'ici un ecran de resultat separe qui remplacait le plateau de jeu (comme le Quiz). Le plateau reste desormais visible en permanence ; seule une barre partagee .docMinigameRestartBar apparait/disparait. Le Quiz garde son propre comportement (ecran de resultat separe), inchange. Co-Authored-By: Claude Sonnet 5 --- .../rendering/render_document_element.py | 20 ++++++---- document_engine/rendering/rendering.md | 9 ++++- static/document/document-editor.css | 39 ++++++++----------- static/document/js/document-editor.js | 24 ++++++------ 4 files changed, 49 insertions(+), 43 deletions(-) diff --git a/document_engine/rendering/render_document_element.py b/document_engine/rendering/render_document_element.py index d26e7637..a25f1ca9 100644 --- a/document_engine/rendering/render_document_element.py +++ b/document_engine/rendering/render_document_element.py @@ -221,11 +221,15 @@ def _render_association_player(config: dict[str, Any]) -> str: f'
' f"" f'
' - f"" - f'" ) @@ -277,11 +281,11 @@ def _render_memory_player(config: dict[str, Any]) -> str: f'
' f'
' f'
' + # Même choix que l'Association ci-dessus : le plateau reste + # affiché une fois le jeu terminé, seul ce bouton apparaît. + f'
' + f'' f"
" - f'" ) diff --git a/document_engine/rendering/rendering.md b/document_engine/rendering/rendering.md index 68b82f32..c64992a6 100644 --- a/document_engine/rendering/rendering.md +++ b/document_engine/rendering/rendering.md @@ -57,7 +57,11 @@ regroupement à chaque appel. mélangées INDÉPENDAMMENT (`random.shuffle`, mélange d'affichage — voir `CODE_QUALITY.md`) puis embarquées en JSON dans un attribut `data-assoc-config`, échappé pour l'HTML — même principe que le Quiz, - aucun aller-retour serveur pendant qu'on joue. + aucun aller-retour serveur pendant qu'on joue. Contrairement au Quiz, + le plateau reste affiché en permanence une fois la partie terminée : + seul le bouton "Recommencer" (`.docMinigameRestartBar`, partagé avec + Memory) apparaît, jamais d'écran de résultat séparé qui le + remplacerait. - **Memory** : toujours une carte résumant la config réelle (nombre de cartes définies, mode paire/simple) — sanitizée (`sanitize_memory_config`) avant lecture. Si au moins une carte existe, @@ -70,6 +74,9 @@ regroupement à chaque appel. d'affichage — voir `CODE_QUALITY.md`) puis embarquées en JSON dans un attribut `data-memory-config`, échappé pour l'HTML — même principe que le Quiz/l'Association, aucun aller-retour serveur pendant qu'on joue. + Comme l'Association, le plateau reste affiché une fois toutes les + paires trouvées (ou toutes les cartes révélées en mode `"single"`) : + seul le bouton "Recommencer" (`.docMinigameRestartBar`) apparaît. - **Autres mini-jeux** (`mots`/`scenario`/`zones`) : carte placeholder portant le libellé du type (voir `document_engine/labels/element_kind_labels.py`) — emplacement réservé, diff --git a/static/document/document-editor.css b/static/document/document-editor.css index 88bb06e6..2be08b99 100644 --- a/static/document/document-editor.css +++ b/static/document/document-editor.css @@ -747,18 +747,13 @@ img.docImage { "relier visuellement deux éléments qui vont ensemble"). Réutilise .docQuizFeedback/.docQuizKicker (même rôle visuel) plutôt que de dupliquer ces règles. ---- */ -.docAssocCard, -.docAssocResultCard { +.docAssocCard { background: linear-gradient(180deg, var(--doc-card), var(--doc-bg-2)); border: 1px solid var(--doc-border); border-radius: 16px; padding: 1.8rem; } -.docAssocResultCard { - text-align: center; -} - .docAssocTitle { font-size: 1.15rem; font-weight: 700; @@ -826,8 +821,21 @@ img.docImage { background: var(--doc-quiz-danger-bg); } -.docAssocRestartBtn { +/* ---- Barre de bouton "Recommencer" partagée par tous les mini-jeux SAUF + le Quiz (qui garde son propre écran de résultat séparé) : le plateau de + jeu reste affiché en permanence une fois terminé, seul ce bouton + apparaît/disparaît (voir retour utilisateur du 20/09/2026). ---- */ +.docMinigameRestartBar { + display: none; margin-top: 20px; + text-align: center; +} + +.docMinigameRestartBar.is-visible { + display: block; +} + +.docMinigameRestartBar button { padding: 0.7rem 1.5rem; border-radius: 10px; background: transparent; @@ -838,19 +846,6 @@ img.docImage { cursor: pointer; } -.docAssocResultBig { - font-size: 40px; - line-height: 1; - color: var(--doc-quiz-success-border); -} - -.docAssocResultSub { - margin-top: 10px; - margin-bottom: 4px; - font-size: 14px; - color: var(--doc-text); -} - /* ---- Association : panneau Propriétés — paires reliées visuellement par un glyphe entre les deux champs (voir forgeDocRenderAssociationPairHtml, static/document/js/document-editor.js). Empilement VERTICAL (pas côte à @@ -902,8 +897,8 @@ img.docImage { /* ---- Memory : plateau de jeu (voir docs/plan/PLAN.md, "retourner des cartes pour constituer des paires d'images identiques"). Réutilise - .docAssocTitle/.docAssocMeta/.docAssocResultCard (mêmes rôles visuels, - voir forgeDocRenderMemoryProps ci-dessus). ---- */ + .docAssocTitle/.docAssocMeta/.docMinigameRestartBar (mêmes rôles + visuels, voir forgeDocRenderMemoryProps ci-dessus). ---- */ .docMemoryCardWrap { background: linear-gradient(180deg, var(--doc-card), var(--doc-bg-2)); border: 1px solid var(--doc-border); diff --git a/static/document/js/document-editor.js b/static/document/js/document-editor.js index b99f2af8..44aa8ec2 100644 --- a/static/document/js/document-editor.js +++ b/static/document/js/document-editor.js @@ -653,8 +653,12 @@ function forgeDocAssociationMatchResult(playerEl, state, pairIndex, itemEl, slot feedbackEl.textContent = 'Bonne association !'; playerEl.querySelector('.docAssocProg').textContent = `${state.matched.size} / ${state.total} associées`; if (state.matched.size >= state.total) { - playerEl.querySelector('.docAssocCard').style.display = 'none'; - playerEl.querySelector('.docAssocResultCard').style.display = 'block'; + // Le plateau reste affiché une fois le jeu terminé (voir retour + // utilisateur du 20/09/2026 : "tous les mini-jeux à part le quiz + // doivent continuer à s'afficher même une fois terminé") — seul le + // bouton Recommencer apparaît, jamais un écran de résultat séparé qui + // remplacerait le plateau (ça reste le comportement du Quiz). + playerEl.querySelector('.docMinigameRestartBar').classList.add('is-visible'); } } @@ -728,8 +732,7 @@ function forgeDocAssociationRestart(playerEl) { selected: null, selectedPairIndex: null, }; - playerEl.querySelector('.docAssocResultCard').style.display = 'none'; - playerEl.querySelector('.docAssocCard').style.display = 'block'; + playerEl.querySelector('.docMinigameRestartBar').classList.remove('is-visible'); playerEl.querySelector('.docAssocFeedback').className = 'docAssocFeedback docQuizFeedback'; playerEl.querySelector('.docAssocProg').textContent = `0 / ${state.total} associées`; forgeDocRenderAssociationBoard(playerEl, state); @@ -830,12 +833,10 @@ function forgeDocMemoryUpdateProgress(playerEl, state) { function forgeDocMemoryCheckComplete(playerEl, state) { const done = state.mode === 'single' ? state.revealed >= state.total : state.matched >= state.totalPairs; if (!done) return; - playerEl.querySelector('.docMemoryCardWrap').style.display = 'none'; - const resultCard = playerEl.querySelector('.docMemoryResultCard'); - resultCard.style.display = 'block'; - playerEl.querySelector('.docMemoryResultSub').textContent = state.mode === 'single' - ? 'Toutes les cartes ont été retournées !' - : 'Toutes les paires ont été trouvées !'; + // Le plateau reste affiché une fois le jeu terminé (voir retour + // utilisateur du 20/09/2026) — seul le bouton Recommencer apparaît, + // jamais un écran de résultat séparé (ça reste le comportement du Quiz). + playerEl.querySelector('.docMinigameRestartBar').classList.add('is-visible'); } function forgeDocMemoryFlip(playerEl, state, cardEl) { @@ -885,8 +886,7 @@ function forgeDocMemoryRestart(playerEl) { flippedCards: [], busy: false, }; - playerEl.querySelector('.docMemoryResultCard').style.display = 'none'; - playerEl.querySelector('.docMemoryCardWrap').style.display = 'block'; + playerEl.querySelector('.docMinigameRestartBar').classList.remove('is-visible'); playerEl.querySelector('.docMemoryTitle').textContent = state.mode === 'single' ? 'Retournez chaque carte' : 'Retrouvez les paires';