$base . $life_rel . '?ver=' . rawurlencode( $life_ver ), 'js' => $base . $js_rel . '?ver=' . rawurlencode( $js_ver ), 'css' => $base . $css_rel . '?ver=' . rawurlencode( $css_ver ), ); $assets_json = Script_Json::encode( $assets ); if ( '' === $assets_json ) { return; } $handle = 'reactwoo-atomic-smart-menu-editor'; if ( ! wp_script_is( $handle, 'registered' ) ) { wp_register_script( $handle, false, array(), $ver, true ); } wp_enqueue_script( $handle ); $bridge = 'window.reactwooAtomicSmartMenuAssets=' . $assets_json . ';' . <<<'JS' (function () { if (window.__rwaSmartMenuEditorBridge) { return; } window.__rwaSmartMenuEditorBridge = true; var assets = window.reactwooAtomicSmartMenuAssets || {}; function frames() { var list = []; try { if (window.elementor && elementor.$preview && elementor.$preview[0]) { list.push(elementor.$preview[0]); } } catch (e1) {} try { document.querySelectorAll('iframe').forEach(function (frame) { if (list.indexOf(frame) === -1) { list.push(frame); } }); } catch (e2) {} return list; } function inject(win, doc) { if (!win || !doc || !doc.head) { return; } /* Skip when the widget stylesheet is already enqueued in the canvas; otherwise place it right after * Elementor's base styles so V4 classes and local styles (printed later) still override it. */ if (assets.css && !doc.querySelector('link[data-rwa-sm-css="1"]') && !doc.getElementById('reactwoo-atomic-smart-menu-css')) { var link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = assets.css; link.setAttribute('data-rwa-sm-css', '1'); var rwaBase = doc.getElementById('base-desktop-css'); if (rwaBase && rwaBase.parentNode) { rwaBase.parentNode.insertBefore(link, rwaBase.nextSibling); } else { doc.head.appendChild(link); } } function append(src, mark) { if (!src || doc.querySelector('script[' + mark + '="1"]')) { return null; } var el = doc.createElement('script'); el.src = src; el.async = false; el.setAttribute(mark, '1'); doc.head.appendChild(el); return el; } append(assets.lifecycle, 'data-rwa-lifecycle-bridge'); var sm = append(assets.js, 'data-rwa-sm-bridge'); function boot() { try { if (!doc.querySelector('[data-rwa-smart-menu="1"]')) { return; } if (win.reactwooAtomicSmartMenu && typeof win.reactwooAtomicSmartMenu.boot === 'function') { win.reactwooAtomicSmartMenu.boot(doc); } } catch (err) {} } if (sm) { sm.addEventListener('load', boot); } [50, 250, 800, 1600, 3200].forEach(function (ms) { window.setTimeout(boot, ms); }); // Do NOT observe canvas DOM for Smart Menu nodes: mount syncs mobile // via innerHTML and a subtree MutationObserver would loop / freeze the editor. } function bootAllFrames() { frames().forEach(function (frame) { try { inject(frame.contentWindow, frame.contentDocument); } catch (err) {} }); } function bind() { bootAllFrames(); [300, 1000, 2500].forEach(function (ms) { window.setTimeout(bootAllFrames, ms); }); try { if (window.elementor && typeof elementor.on === 'function') { elementor.on('preview:loaded', function () { window.setTimeout(bootAllFrames, 50); window.setTimeout(bootAllFrames, 400); }); } } catch (err) {} try { var scheduled = null; var rootMo = new MutationObserver(function (mutations) { var worth = false; for (var i = 0; i < mutations.length; i++) { var nodes = mutations[i].addedNodes; for (var j = 0; j < nodes.length; j++) { var n = nodes[j]; if (n && n.tagName === 'IFRAME') { worth = true; break; } } if (worth) { break; } } if (!worth) { return; } if (scheduled) { window.clearTimeout(scheduled); } scheduled = window.setTimeout(bootAllFrames, 100); }); rootMo.observe(document.documentElement, { childList: true, subtree: true }); } catch (err3) {} } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', bind); } else { bind(); } })(); JS; wp_add_inline_script( $handle, $bridge, 'after' ); } }