From c27a16e31af122d60063217e0a25187a7578a00a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Thu, 8 Jan 2026 16:06:52 +0100 Subject: [PATCH] :tada: Make workspace loader to wait for first render --- frontend/src/app/main/ui/ds/z-index.scss | 2 ++ frontend/src/app/main/ui/workspace.cljs | 24 +++++++++++++++++++++--- frontend/src/app/main/ui/workspace.scss | 8 +++++++- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/ds/z-index.scss b/frontend/src/app/main/ui/ds/z-index.scss index 4d0e6c592e..3cdb47366d 100644 --- a/frontend/src/app/main/ui/ds/z-index.scss +++ b/frontend/src/app/main/ui/ds/z-index.scss @@ -10,6 +10,7 @@ $z-index-200: 200; $z-index-300: 300; $z-index-400: 400; $z-index-500: 500; +$z-index-600: 600; :global(:root) { --z-index-auto: #{$z-index-auto}; // Index for elements such as workspace, rulers ... @@ -18,4 +19,5 @@ $z-index-500: 500; --z-index-set: #{$z-index-300}; // Index for configuration elements like modals, color picker, grid edition elements --z-index-dropdown: #{$z-index-400}; // Index for dropdown like elements, selects, menus, dropdowns --z-index-notifications: #{$z-index-500}; // Index for notification + --z-index-loaders: #{$z-index-600}; // Index for loaders } diff --git a/frontend/src/app/main/ui/workspace.cljs b/frontend/src/app/main/ui/workspace.cljs index 0b44af4511..53a1dc2621 100644 --- a/frontend/src/app/main/ui/workspace.cljs +++ b/frontend/src/app/main/ui/workspace.cljs @@ -217,6 +217,10 @@ design-tokens? (features/use-feature "design-tokens/v1") + wasm-renderer-enabled? (features/use-feature "render-wasm/v1") + + first-frame-rendered? (mf/use-state false) + background-color (:background-color wglobal)] (mf/with-effect [] @@ -241,6 +245,17 @@ (when (and file-loaded? (not page-id)) (st/emit! (dcm/go-to-workspace :file-id file-id ::rt/replace true)))) + (mf/with-effect [file-id page-id] + (reset! first-frame-rendered? false)) + + (mf/with-effect [] + (let [handle-wasm-render + (fn [_] + (reset! first-frame-rendered? true)) + listener-key (events/listen globals/document "penpot:wasm:render" handle-wasm-render)] + (fn [] + (events/unlistenByKey listener-key)))) + [:> (mf/provider ctx/current-project-id) {:value project-id} [:> (mf/provider ctx/current-file-id) {:value file-id} [:> (mf/provider ctx/current-page-id) {:value page-id} @@ -249,15 +264,18 @@ [:> modal-container*] [:section {:class (stl/css :workspace) :style {:background-color background-color - :touch-action "none"}} + :touch-action "none" + :position "relative"}} [:> context-menu*] - (if (and file-loaded? page-id) + (when (and file-loaded? page-id) [:> workspace-inner* {:page-id page-id :file-id file-id :file file :wglobal wglobal - :layout layout}] + :layout layout}]) + (when (or (not (and file-loaded? page-id)) + (and wasm-renderer-enabled? (not @first-frame-rendered?))) [:> workspace-loader*])]]]]]])) (mf/defc workspace-page* diff --git a/frontend/src/app/main/ui/workspace.scss b/frontend/src/app/main/ui/workspace.scss index d6c21429dd..5cd617bab4 100644 --- a/frontend/src/app/main/ui/workspace.scss +++ b/frontend/src/app/main/ui/workspace.scss @@ -20,7 +20,13 @@ } .workspace-loader { - grid-area: viewport; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: var(--z-index-loaders); + background-color: var(--color-background-primary); } .workspace-content {