'
+ # Le plateau reste affiché une fois toutes les paires trouvées
+ # (voir docs/plan/PLAN.md, retour utilisateur du 20/09/2026) —
+ # seul ce bouton apparaît (.is-visible posé par
+ # forgeDocAssociationMatchResult), jamais un écran de résultat
+ # séparé qui remplacerait le plateau (ça reste le comportement du
+ # Quiz, seul mini-jeu concerné par un écran de fin distinct).
+ 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'
'
- 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';