From 95b7540a94c8bf0dc9543282590064d7d3224e3c Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Thu, 26 Feb 2026 20:18:39 +0200 Subject: [PATCH 1/2] Keep Initializr loader style consistent until UI is ready --- docs/website/layouts/_default/initializr.html | 18 +++++++++++++++++- .../com/codename1/initializr/Initializr.java | 8 ++++++++ .../initializr/WebsiteThemeNative.java | 1 + ..._codename1_initializr_WebsiteThemeNative.js | 12 ++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/docs/website/layouts/_default/initializr.html b/docs/website/layouts/_default/initializr.html index 59020568bb..94a416b8e2 100644 --- a/docs/website/layouts/_default/initializr.html +++ b/docs/website/layouts/_default/initializr.html @@ -212,8 +212,24 @@ } if (frame && loader) { - frame.addEventListener("load", function () { + var loaderHidden = false; + var hideLoader = function () { + if (loaderHidden) { + return; + } + loaderHidden = true; loader.classList.add("done"); + }; + + frame.addEventListener("load", function () { + window.setTimeout(hideLoader, 8000); + }); + + window.addEventListener("message", function (evt) { + if (evt.source !== frame.contentWindow || !evt.data || evt.data.type !== "cn1-initializr-ui-ready") { + return; + } + hideLoader(); }); } })(); diff --git a/scripts/initializr/common/src/main/java/com/codename1/initializr/Initializr.java b/scripts/initializr/common/src/main/java/com/codename1/initializr/Initializr.java index 538dedf47e..8092772f86 100644 --- a/scripts/initializr/common/src/main/java/com/codename1/initializr/Initializr.java +++ b/scripts/initializr/common/src/main/java/com/codename1/initializr/Initializr.java @@ -150,6 +150,14 @@ public void run() { refresh.run(); initWebsiteThemeSync(form); form.show(); + notifyWebsiteUiReady(); + } + + private void notifyWebsiteUiReady() { + WebsiteThemeNative nativeBridge = NativeLookup.create(WebsiteThemeNative.class); + if (nativeBridge != null && nativeBridge.isSupported()) { + nativeBridge.notifyUiReady(); + } } private Container createLocalizationPanel(boolean[] includeLocalizationBundles, diff --git a/scripts/initializr/common/src/main/java/com/codename1/initializr/WebsiteThemeNative.java b/scripts/initializr/common/src/main/java/com/codename1/initializr/WebsiteThemeNative.java index 29f98d572c..607b4734d3 100644 --- a/scripts/initializr/common/src/main/java/com/codename1/initializr/WebsiteThemeNative.java +++ b/scripts/initializr/common/src/main/java/com/codename1/initializr/WebsiteThemeNative.java @@ -4,4 +4,5 @@ public interface WebsiteThemeNative extends NativeInterface { boolean isDarkMode(); + void notifyUiReady(); } diff --git a/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js b/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js index ca1014e911..a5e8db1bd3 100644 --- a/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js +++ b/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js @@ -29,6 +29,18 @@ var o = {}; callback.complete(!!dark); }; + + o.notifyUiReady_ = function(callback) { + try { + if (window.parent && window.parent !== window && window.parent.postMessage) { + window.parent.postMessage({ type: "cn1-initializr-ui-ready" }, "*"); + } + } catch (ignored) { + // Ignore cross-origin or sandbox restrictions. + } + callback.complete(); + }; + o.isSupported_ = function(callback) { callback.complete(true); }; From 15167b5c6c7dcb851cc9cf802ab0637d50fb652f Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Thu, 26 Feb 2026 20:32:30 +0200 Subject: [PATCH 2/2] Delay Initializr ready signal until post-render frame --- docs/website/layouts/_default/initializr.html | 4 +++- ...codename1_initializr_WebsiteThemeNative.js | 22 ++++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/docs/website/layouts/_default/initializr.html b/docs/website/layouts/_default/initializr.html index 94a416b8e2..77a9ffc50d 100644 --- a/docs/website/layouts/_default/initializr.html +++ b/docs/website/layouts/_default/initializr.html @@ -229,7 +229,9 @@ if (evt.source !== frame.contentWindow || !evt.data || evt.data.type !== "cn1-initializr-ui-ready") { return; } - hideLoader(); + window.requestAnimationFrame(function () { + hideLoader(); + }); }); } })(); diff --git a/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js b/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js index a5e8db1bd3..6aae17d052 100644 --- a/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js +++ b/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js @@ -31,14 +31,24 @@ var o = {}; o.notifyUiReady_ = function(callback) { - try { - if (window.parent && window.parent !== window && window.parent.postMessage) { - window.parent.postMessage({ type: "cn1-initializr-ui-ready" }, "*"); + var sendReady = function() { + try { + if (window.parent && window.parent !== window && window.parent.postMessage) { + window.parent.postMessage({ type: "cn1-initializr-ui-ready" }, "*"); + } + } catch (ignored) { + // Ignore cross-origin or sandbox restrictions. } - } catch (ignored) { - // Ignore cross-origin or sandbox restrictions. + callback.complete(); + }; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(function() { + window.requestAnimationFrame(sendReady); + }); + } else { + window.setTimeout(sendReady, 48); } - callback.complete(); }; o.isSupported_ = function(callback) {