// Export Web/SCORM — port de screens/rendering/render_overlay.py (3.4, // overlay/modale réutilisable) : voile plein écran EN MODE JOUABLE // uniquement (ctx._forge_play_mode), comportement de conteneur normal // dans l'éditeur (non pertinent hors ligne, qui ne sert jamais l'éditeur, // mais le port reste fidèle pour ne pas diverger inutilement). function forgeRenderOverlay(el, meta, gameData, childrenMap, ctx, parentFlexDirection) { var isPlayMode = !!(ctx && ctx._forge_play_mode); var attrsRaw = el.attributes || {}; var boxColor = attrsRaw._couleur_boite || "#1f2430"; var radius = attrsRaw._arrondi || "12"; var attrs = forgeVisibleAttrs(el, meta, ctx); var style, wrapperClass; if (isPlayMode) { var baseOverlayStyle = "position:fixed; inset:0; z-index:9999; display:flex; " + "align-items:center; justify-content:center; background:rgba(0,0,0,0.6);"; style = baseOverlayStyle + " " + forgeStyleString(el, parentFlexDirection, el.widget); wrapperClass = "modal is-active"; } else { style = forgeStyleString(el, parentFlexDirection, el.widget); wrapperClass = ""; } var attrParts = ['style="' + forgeHtmlEscape(style) + '"']; Object.keys(attrs).forEach(function (k) { var v = attrs[k]; if (v === null || v === undefined || v === "" || v === false) return; attrParts.push(v === true ? forgeHtmlEscape(k) : forgeHtmlEscape(k) + '="' + forgeHtmlEscape(v) + '"'); }); var boxStyle = "background:" + forgeHtmlEscape(String(boxColor)) + "; border-radius:" + forgeHtmlEscape(String(radius)) + "px; " + "color:#e8eaf0; padding:24px; width:100%; max-width:min(560px, 90%); max-height:90%; overflow:auto; box-sizing:border-box;"; var childHtml = forgeRenderChildren(el, gameData, childrenMap, ctx); var wrapperClassAttr = wrapperClass ? 'class="' + wrapperClass + '" ' : ""; return ( '