Corrige la vraie cause : la boîte de dialogue restait invisible DANS L'ÉDITEUR (masquée par défaut)

Après vérification serveur, le texte était bel et bien rendu dans le HTML
(couleur correcte incluse) — donc pas un souci de contenu ni de couleur.
La vraie cause : le widget "Superposition / boîte de dialogue" démarre
MASQUÉ par défaut à sa création (display:none, voir
default_style_for_widget.py — pour ne pas couvrir tout l'écran dès qu'on
le pose). Ce display:none est écrit tel quel dans le HTML aussi bien en
mode jouable QUE dans l'éditeur, puisque le rendu de ce widget est
partagé par les deux. Résultat : toute la boîte (et donc son contenu,
peu importe le texte ou sa couleur) restait invisible dans le CANEVAS DE
L'ÉDITEUR dès l'instant de sa création — impossible d'y voir/positionner
visuellement ce qu'on pose dedans tant qu'on n'a pas pensé à basculer
manuellement "Visibilité" sur "Visible" (puis à y repenser pour la
remettre sur "Masqué" avant de tester en jeu).

Correctif (render_overlay.py) : dans l'ÉDITEUR uniquement (détecté via le
ctx "_forge_play_mode" déjà posé par list_elements.py pour le mode
jouable), un "display:flex" est ajouté en dernier dans le style —
gagnant sur le "display:none" par défaut (CSS : la dernière déclaration
de la même propriété l'emporte). Le mode JOUABLE, lui, continue de
respecter ce réglage normalement (masqué tant qu'aucune action ne
l'affiche).

Nouveau test, confirmé en échec sur l'ancien code puis au vert avec le
correctif : vérifie explicitement que le style se termine par
"display:flex;" dans l'éditeur et par "display:none;" en mode jouable.
139 tests au vert au total. Jeu de démo régénéré.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-08-28 06:30:24 +02:00
co-authored by Claude Sonnet 5
parent 69bafcb5c5
commit 78a373a536
2 changed files with 46 additions and 0 deletions
+29
View File
@@ -203,6 +203,35 @@ def test_overlay_box_default_text_color_survives_the_bulma_box_class(client, gam
assert "color:#e8eaf0" in box_tag
def test_overlay_stays_visible_in_the_editor_despite_starting_masked(client, game):
"""Régression : une "superposition" démarre MASQUÉE par défaut à sa
création (display:none — voir default_style_for_widget.py, pour ne
pas couvrir tout l'écran dès qu'on la pose). Ce display:none est écrit
tel quel dans le HTML, aussi bien en mode jouable QUE dans l'éditeur —
sans forçage, la boîte de dialogue restait donc invisible dans le
CANEVAS DE L'ÉDITEUR dès l'instant où elle était créée, rendant
impossible d'y voir/positionner visuellement titres/textes/boutons
posés à l'intérieur ("j'ai mis un texte dedans mais il ne se voit pas"
— le texte était là, mais toute la boîte qui le contient était
display:none). Seul le mode JOUABLE doit respecter ce réglage."""
screen_id = _create_screen(client, game)
overlay_id = _add_element(client, game, screen_id, "superposition")
client.post(f"/game/{game}/elements/{overlay_id}/children/add", data={"widget": "texte"})
edit_html = client.get(f"/game/{game}/screens/{screen_id}/edit").data.decode()
idx = edit_html.find(f'id="elt-{overlay_id}"')
assert idx != -1
wrapper_style = re.search(r'style="([^"]*)"', edit_html[edit_html.rfind("<div", 0, idx):idx]).group(1)
# display:none PUIS display:flex (la dernière déclaration CSS gagne).
assert wrapper_style.rstrip().endswith("display:flex;")
play_html = client.get(f"/game/{game}/play").data.decode()
idx2 = play_html.find(f'id="elt-{overlay_id}"')
wrapper_style2 = re.search(r'style="([^"]*)"', play_html[play_html.rfind("<div", 0, idx2):idx2]).group(1)
# En mode jouable, pas de forçage : le display:none par défaut reste actif.
assert wrapper_style2.rstrip().endswith("display:none;")
def test_overlay_wrapper_does_not_trap_its_own_z_index(client, game):
"""Régression : le cadre .playElement/.canvasElement partagé par TOUS
les widgets (voir filters/element_style_filter.py) posait quand même