Dev #4

Merged
w-vandal merged 16 commits from dev into main 2026-08-29 04:02:11 +00:00
2 changed files with 46 additions and 0 deletions
Showing only changes of commit 78a373a536 - Show all commits
+17
View File
@@ -44,6 +44,23 @@ def _render_overlay(el, meta, slug, children_map=None, ctx=None, parent_flex_dir
"align-items:center; justify-content:center; background:rgba(0,0,0,0.6);"
)
style = base_overlay_style + " " + _style_string(el, parent_flex_direction=parent_flex_direction)
if not (ctx and ctx.get("_forge_play_mode")):
# Dans l'ÉDITEUR (ctx sans _forge_play_mode — voir list_elements.py,
# posé uniquement en mode JOUABLE), ce widget doit rester visible
# quel que soit son réglage de visibilité statique — "Masqué" par
# défaut à SA création (default_style_for_widget.py), pour ne pas
# couvrir tout l'écran dès qu'on le pose. Sans ce forçage, la boîte
# de dialogue reste display:none dans le canevas de l'éditeur, donc
# invisible dès sa création : impossible d'y voir/positionner son
# contenu tant qu'on n'a pas basculé "Visibilité" sur "Visible" à la
# main (puis pensé à la remettre sur "Masqué" avant de tester). Le
# "display:flex;" ajouté ICI, en dernier dans la chaîne de style,
# gagne sur le "display:none" éventuellement posé plus tôt par
# _style_string (CSS : même propriété déclarée deux fois -> la
# dernière l'emporte). Seul le mode JOUABLE respecte réellement ce
# réglage (ou une action "Modifier un élément → Visibilité" qui le
# change en cours de partie)."""
style += " display:flex;"
attr_parts = [f'style="{html_lib.escape(style)}"']
for k, v in attrs.items():
+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