Skip to content

fix: only treat blocking overlays as open modals - #15455

Draft
DrJKL wants to merge 1 commit into
mainfrom
glary/ctrl-s-modal-gate
Draft

fix: only treat blocking overlays as open modals#15455
DrJKL wants to merge 1 commit into
mainfrom
glary/ctrl-s-modal-gate

Conversation

@DrJKL

@DrJKL DrJKL commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

PR Created by the Glary-Bot Agent


Follow-up to #15066, which stopped Ctrl+S being handed to the browser but left it a silent no-op in the two scenarios users actually reported.

Summary

isModalOpen matched [role="dialog"][aria-modal="true"] by existence alone — no visibility check, and no exclusion for overlays that declare modality without blocking the page. Two very common things tripped it:

  • PrimeVue Popover renders role="dialog" with aria-modal="true" (popover/index.mjs), so hovering a workflow tab made the app consider itself modal for as long as the preview was up.
  • ComfyUI-Manager builds its dialog with role='dialog' + ariaModal: 'true' and an inline display: flex, parented to a mask (comfyui-gui-builder.js:104-110). close() hides only the mask, so the node stays in the DOM at display: flex for the rest of the session — one click on "Manager" left Ctrl+S dead until reload.

With #15066 merged the browser no longer hijacks the combo, but the gate still declines to run the command, so Ctrl+S silently does nothing in both cases.

Changes

A matched node now has to be neither popover content nor hidden (by itself or an ancestor) before it counts as an open modal. The same predicate is applied to the Reka query, so both role="dialog" checks agree — previously only the Reka one excluded popper content.

Hiding is detected by walking ancestors for display: none, because the mechanism in the wild is a hidden wrapper around a still-display: flex dialog. checkVisibility() would read better but is not implemented in happy-dom, so it is untestable here.

  • Breaking: none.
  • Dependencies: none.

Review Focus

Tests

modalUtil.test.ts is new and enumerates every overlay flavour the predicate claims to support — managed stack, ARIA modal, Reka dialog, native <dialog>, legacy .comfy-modal — plus their non-blocking and left-in-the-DOM counterparts. That structure is a direct answer to the point that a change like #12184 should have come with coverage across all dialog stories.

The 6 behavioural tests fail on main and pass here; 189 tests pass across modalUtil, all platform/keybindings, and changeTracker.

Validation

Verified in a browser against a real ComfyUI backend, reading event.defaultPrevented from a keydown listener:

scenario defaultPrevented workflow saved
canvas focused (baseline) true yes
workflow-tab popover open true yes
Manager node left in DOM true yes
genuine modal open true no (correctly suppressed)

Bare w with a genuine modal open stays unprevented and does not toggle the sidebar.

pnpm typecheck, ESLint, oxlint and oxfmt clean.

Known follow-up (not in this PR)

src/platform/assets/composables/useAssetGridSelection.ts:215 still uses the raw document.querySelector('[role="dialog"][aria-modal="true"]') check, so Ctrl+A in the asset grid remains broken by both of the same repros. Routing it through this predicate is a small, separate change.

Screenshots

ComfyUI's native Save workflow dialog opening on Ctrl+S after the fix, instead of the browser's Save Page As dialog

isModalOpen matched [role="dialog"][aria-modal="true"] by existence
alone. PrimeVue popovers set that attribute while being non-blocking
hover previews, and extensions that hide only a dialog's mask leave the
node in the DOM for the rest of the session. Either one made the
keybinding gate consider the page permanently modal, so Ctrl+S was
handed back to the browser instead of saving the workflow.

Require a matched node to be neither popover content nor hidden by
itself or an ancestor, and apply the same rule to the Reka check so both
dialog queries agree.

- Fixes #15639
@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 08/20/2026, 03:23:56 AM UTC

Links

🎭 Playwright: ✅ 1832 passed, 0 failed · 4 flaky

📊 Browser Reports
  • chromium: View Report (✅ 1811 / ❌ 0 / ⚠️ 4 / ⏭️ 5)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 18 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

📦 Bundle: 9.12 MB gzip 🔴 +388 B

Details

Summary

  • Raw size: 38.7 MB baseline 38.7 MB — 🔴 +911 B
  • Gzip: 9.12 MB baseline 9.12 MB — 🔴 +388 B
  • Brotli: 6.38 MB baseline 6.38 MB — 🔴 +386 B
  • Bundles: 439 current • 439 baseline • 145 added / 145 removed

Category Glance
Data & Services 🔴 +911 B (3.53 MB) · Vendor & Third-Party ⚪ 0 B (18.1 MB) · Other ⚪ 0 B (14.2 MB) · Graph Workspace ⚪ 0 B (1.37 MB) · Panels & Settings ⚪ 0 B (566 kB) · Utilities & Hooks ⚪ 0 B (549 kB) · + 5 more

App Entry Points — 3.71 kB (baseline 3.71 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BFscHNkt.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.86 kB 🔴 +1.61 kB
assets/index-C62FrY-M.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.86 kB 🟢 -1.58 kB

Status: 1 added / 1 removed

Graph Workspace — 1.37 MB (baseline 1.37 MB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BLWWej5m.js (removed) 1.36 MB 🟢 -1.36 MB 🟢 -297 kB 🟢 -223 kB
assets/GraphView-CEUz31Os.js (new) 1.36 MB 🔴 +1.36 MB 🔴 +297 kB 🔴 +223 kB
assets/WidgetCompositor-Dy6yfOMQ.js (removed) 8.17 kB 🟢 -8.17 kB 🟢 -2.76 kB 🟢 -2.45 kB
assets/WidgetCompositor-uCJKbJfu.js (new) 8.17 kB 🔴 +8.17 kB 🔴 +2.76 kB 🔴 +2.45 kB

Status: 2 added / 2 removed / 1 unchanged

Views & Navigation — 124 kB (baseline 124 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BjJX-zNU.js (new) 25 kB 🔴 +25 kB 🔴 +6.25 kB 🔴 +5.52 kB
assets/CloudSurveyView-D91HTnc5.js (removed) 25 kB 🟢 -25 kB 🟢 -6.25 kB 🟢 -5.52 kB
assets/CloudLayoutView-BRaoBbkX.js (removed) 21.8 kB 🟢 -21.8 kB 🟢 -6.56 kB 🟢 -5.73 kB
assets/CloudLayoutView-DUSrbgIj.js (new) 21.8 kB 🔴 +21.8 kB 🔴 +6.57 kB 🔴 +5.74 kB
assets/UserCheckView-CF0ErN2E.js (new) 8.75 kB 🔴 +8.75 kB 🔴 +2.19 kB 🔴 +1.9 kB
assets/UserCheckView-MbRGj_cw.js (removed) 8.75 kB 🟢 -8.75 kB 🟢 -2.19 kB 🟢 -1.9 kB
assets/CloudLoginView-BtVGsXtM.js (removed) 8.74 kB 🟢 -8.74 kB 🟢 -2.55 kB 🟢 -2.26 kB
assets/CloudLoginView-C-hAKUf6.js (new) 8.74 kB 🔴 +8.74 kB 🔴 +2.56 kB 🔴 +2.27 kB
assets/useCloudAuthPage-DjPI3lAJ.js (removed) 7.08 kB 🟢 -7.08 kB 🟢 -2.51 kB 🟢 -2.2 kB
assets/useCloudAuthPage-jXGbODnl.js (new) 7.08 kB 🔴 +7.08 kB 🔴 +2.52 kB 🔴 +2.2 kB
assets/CloudSignupView-DaN_D0AP.js (removed) 6.96 kB 🟢 -6.96 kB 🟢 -2.28 kB 🟢 -2 kB
assets/CloudSignupView-eIQumoyV.js (new) 6.96 kB 🔴 +6.96 kB 🔴 +2.28 kB 🔴 +2 kB
assets/WidgetTextPreview-B7rlDcHY.js (new) 6.07 kB 🔴 +6.07 kB 🔴 +2.13 kB 🔴 +1.9 kB
assets/WidgetTextPreview-RpKX4VnH.js (removed) 6.07 kB 🟢 -6.07 kB 🟢 -2.13 kB 🟢 -1.9 kB
assets/CloudSubscriptionRedirectView-D1C2ileS.js (new) 6.05 kB 🔴 +6.05 kB 🔴 +2.25 kB 🔴 +1.96 kB
assets/CloudSubscriptionRedirectView-Du42XTIG.js (removed) 6.05 kB 🟢 -6.05 kB 🟢 -2.25 kB 🟢 -1.96 kB
assets/UserSelectView-AxZMvSXi.js (new) 5.49 kB 🔴 +5.49 kB 🔴 +1.96 kB 🔴 +1.71 kB
assets/UserSelectView-DkgASjF9.js (removed) 5.49 kB 🟢 -5.49 kB 🟢 -1.96 kB 🟢 -1.72 kB
assets/CloudForgotPasswordView-BhEXSgTp.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.72 kB 🟢 -1.49 kB
assets/CloudForgotPasswordView-kZAEeMMc.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.72 kB 🔴 +1.49 kB
assets/CloudAuthTimeoutView-CTANGfm2.js (removed) 4.43 kB 🟢 -4.43 kB 🟢 -1.54 kB 🟢 -1.34 kB
assets/CloudAuthTimeoutView-D2EQ7o7K.js (new) 4.43 kB 🔴 +4.43 kB 🔴 +1.54 kB 🔴 +1.34 kB
assets/OAuthLayoutView-53dn3yn4.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +701 B 🔴 +587 B
assets/OAuthLayoutView-BdRYL2XD.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -700 B 🟢 -586 B
assets/WidgetTextPreview-5BQ1-8m9.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +90 B
assets/WidgetTextPreview-CsHcka9w.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -92 B

Status: 13 added / 13 removed / 4 unchanged

Panels & Settings — 566 kB (baseline 566 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-B-Owovlx.js (new) 49.4 kB 🔴 +49.4 kB 🔴 +9.95 kB 🔴 +8.8 kB
assets/KeybindingPanel-DTLo6QaF.js (removed) 49.4 kB 🟢 -49.4 kB 🟢 -9.94 kB 🟢 -8.8 kB
assets/SecretsPanel-BQ7QSbam.js (removed) 33.7 kB 🟢 -33.7 kB 🟢 -7.88 kB 🟢 -6.91 kB
assets/SecretsPanel-UMtwYDYL.js (new) 33.7 kB 🔴 +33.7 kB 🔴 +7.88 kB 🔴 +6.91 kB
assets/CreditsPanel-CLAlf2AW.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.21 kB 🟢 -2.82 kB
assets/CreditsPanel-DmrZBO1f.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.21 kB 🔴 +2.82 kB
assets/AboutPanel-BRmB6f-K.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.12 kB 🟢 -2.8 kB
assets/AboutPanel-CXSNXIq7.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.12 kB 🔴 +2.79 kB
assets/ExtensionPanel-3Dn_E9zT.js (new) 9.19 kB 🔴 +9.19 kB 🔴 +2.51 kB 🔴 +2.23 kB
assets/ExtensionPanel-4biIGeaR.js (removed) 9.19 kB 🟢 -9.19 kB 🟢 -2.51 kB 🟢 -2.23 kB
assets/ServerConfigPanel-BckSXo4J.js (removed) 6.09 kB 🟢 -6.09 kB 🟢 -1.94 kB 🟢 -1.72 kB
assets/ServerConfigPanel-CkdQX3JB.js (new) 6.09 kB 🔴 +6.09 kB 🔴 +1.94 kB 🔴 +1.73 kB
assets/UserPanel-CW76_gQT.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -1.78 kB 🟢 -1.54 kB
assets/UserPanel-DilLh31n.js (new) 5.73 kB 🔴 +5.73 kB 🔴 +1.78 kB 🔴 +1.54 kB
assets/refreshRemoteConfig-gTm12Ue1.js (new) 4.24 kB 🔴 +4.24 kB 🔴 +1.51 kB 🔴 +1.34 kB
assets/refreshRemoteConfig-mavsT2OX.js (removed) 4.24 kB 🟢 -4.24 kB 🟢 -1.51 kB 🟢 -1.34 kB
assets/cloudRemoteConfig-DbfHQIEo.js (new) 951 B 🔴 +951 B 🔴 +514 B 🔴 +422 B
assets/cloudRemoteConfig-ZId093mx.js (removed) 951 B 🟢 -951 B 🟢 -514 B 🟢 -422 B
assets/refreshRemoteConfig-BssQp6YC.js (removed) 110 B 🟢 -110 B 🟢 -89 B 🟢 -89 B
assets/refreshRemoteConfig-DMKBOXqY.js (new) 110 B 🔴 +110 B 🔴 +89 B 🔴 +76 B

Status: 10 added / 10 removed / 16 unchanged

User & Accounts — 27.5 kB (baseline 27.5 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SignUpForm-Bdfyalyg.js (new) 13.3 kB 🔴 +13.3 kB 🔴 +4.53 kB 🔴 +3.93 kB
assets/SignUpForm-CiZQ7MHV.js (removed) 13.3 kB 🟢 -13.3 kB 🟢 -4.52 kB 🟢 -3.93 kB
assets/auth-B8SlLkqK.js (new) 3.48 kB 🔴 +3.48 kB 🔴 +1.21 kB 🔴 +1.01 kB
assets/auth-XmtpjAIL.js (removed) 3.48 kB 🟢 -3.48 kB 🟢 -1.21 kB 🟢 -1.01 kB
assets/UpdatePasswordContent-B0e3nOla.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -842 B 🟢 -741 B
assets/UpdatePasswordContent-VB3jwPDb.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +842 B 🔴 +738 B
assets/authStore-BveOgk9C.js (removed) 128 B 🟢 -128 B 🟢 -104 B 🟢 -105 B
assets/authStore-DxOLUghO.js (new) 128 B 🔴 +128 B 🔴 +104 B 🔴 +106 B
assets/workspaceAuthStore-BnPmZ6Tj.js (new) 108 B 🔴 +108 B 🔴 +99 B 🔴 +106 B
assets/workspaceAuthStore-Cj7DRy_A.js (removed) 108 B 🟢 -108 B 🟢 -99 B 🟢 -107 B
assets/auth-8SQhKNTp.js (new) 105 B 🔴 +105 B 🔴 +96 B 🔴 +80 B
assets/auth-B6cdt02-.js (removed) 105 B 🟢 -105 B 🟢 -96 B 🟢 -88 B

Status: 6 added / 6 removed / 5 unchanged

Editors & Dialogs — 125 kB (baseline 125 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-C8Raux0t.js (new) 90.1 kB 🔴 +90.1 kB 🔴 +19.3 kB 🔴 +16.5 kB
assets/ComfyHubPublishDialog-CVyrwE_g.js (removed) 90.1 kB 🟢 -90.1 kB 🟢 -19.3 kB 🟢 -16.5 kB
assets/useShareDialog-8oDHXP5c.js (removed) 23.9 kB 🟢 -23.9 kB 🟢 -5.7 kB 🟢 -5.04 kB
assets/useShareDialog-CawCxYbu.js (new) 23.9 kB 🔴 +23.9 kB 🔴 +5.69 kB 🔴 +5.03 kB
assets/feedbackDialog-C-X3Ae7o.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.87 kB 🔴 +1.59 kB
assets/feedbackDialog-Dri0fC2S.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.86 kB 🟢 -1.59 kB
assets/useRangeEditor-DCwIh_15.js (new) 3.29 kB 🔴 +3.29 kB 🔴 +1.14 kB 🔴 +1.04 kB
assets/useRangeEditor-qs1uxfMf.js (removed) 3.29 kB 🟢 -3.29 kB 🟢 -1.14 kB 🟢 -1.03 kB
assets/useLayerEditor-Ct8ohymn.js (new) 1.01 kB 🔴 +1.01 kB 🔴 +491 B 🔴 +405 B
assets/useLayerEditor-CxyazJr-.js (removed) 1.01 kB 🟢 -1.01 kB 🟢 -489 B 🟢 -405 B
assets/ComfyHubPublishDialog-DC2d73si.js (removed) 143 B 🟢 -143 B 🟢 -105 B 🟢 -92 B
assets/ComfyHubPublishDialog-sPag5qDk.js (new) 143 B 🔴 +143 B 🔴 +105 B 🔴 +89 B
assets/useSubscriptionDialog-YgCwvjYg.js (removed) 108 B 🟢 -108 B 🟢 -102 B 🟢 -94 B
assets/useSubscriptionDialog-ywg2wRtU.js (new) 108 B 🔴 +108 B 🔴 +102 B 🔴 +95 B

Status: 7 added / 7 removed / 1 unchanged

UI Components — 67.1 kB (baseline 67.1 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-5fj8Rshx.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.97 kB 🟢 -3.53 kB
assets/ComfyQueueButton-BM8iCYSJ.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.97 kB 🔴 +3.53 kB
assets/useTerminalTabs-C3lV2nuO.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.69 kB 🟢 -3.27 kB
assets/useTerminalTabs-D5NUQ2l9.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.69 kB 🔴 +3.27 kB
assets/InviteMembersForm-CqpfpMU4.js (removed) 8.23 kB 🟢 -8.23 kB 🟢 -2.74 kB 🟢 -2.43 kB
assets/InviteMembersForm-DuUhUj3N.js (new) 8.23 kB 🔴 +8.23 kB 🔴 +2.74 kB 🔴 +2.43 kB
assets/SubscribeButton-BiQVkAK6.js (removed) 2.15 kB 🟢 -2.15 kB 🟢 -969 B 🟢 -849 B
assets/SubscribeButton-DSAsSEdt.js (new) 2.15 kB 🔴 +2.15 kB 🔴 +969 B 🔴 +847 B
assets/cloudFeedbackTopbarButton-CB4JAg44.js (new) 705 B 🔴 +705 B 🔴 +418 B 🔴 +359 B
assets/cloudFeedbackTopbarButton-lIEBe63B.js (removed) 705 B 🟢 -705 B 🟢 -418 B 🟢 -361 B
assets/ComfyQueueButton-B9bWV1Fi.js (removed) 128 B 🟢 -128 B 🟢 -99 B 🟢 -90 B
assets/ComfyQueueButton-BNgd8eD5.js (new) 128 B 🔴 +128 B 🔴 +99 B 🔴 +93 B

Status: 6 added / 6 removed / 8 unchanged

Data & Services — 3.53 MB (baseline 3.53 MB) • 🔴 +911 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settingStore-s7J9JxXe.js (new) 3.16 MB 🔴 +3.16 MB 🔴 +742 kB 🔴 +558 kB
assets/settingStore-CexhRbNx.js (removed) 3.16 MB 🟢 -3.16 MB 🟢 -742 kB 🟢 -558 kB
assets/api-BvBZYfbG.js (removed) 186 kB 🟢 -186 kB 🟢 -39.8 kB 🟢 -33.4 kB
assets/api-DR-mQsLC.js (new) 186 kB 🔴 +186 kB 🔴 +39.8 kB 🔴 +33.4 kB
assets/load3dService-00lbswq6.js (removed) 132 kB 🟢 -132 kB 🟢 -29.3 kB 🟢 -24.7 kB
assets/load3dService-DgWHC92T.js (new) 132 kB 🔴 +132 kB 🔴 +29.3 kB 🔴 +24.7 kB
assets/workflowShareService-BNqnxbxA.js (new) 16.5 kB 🔴 +16.5 kB 🔴 +4.92 kB 🔴 +4.34 kB
assets/workflowShareService-LNOxkQqB.js (removed) 16.5 kB 🟢 -16.5 kB 🟢 -4.92 kB 🟢 -4.34 kB
assets/keybindingService-BUesONmv.js (new) 6.95 kB 🔴 +6.95 kB 🔴 +1.74 kB 🔴 +1.51 kB
assets/keybindingService-CQaKntz8.js (removed) 6.95 kB 🟢 -6.95 kB 🟢 -1.74 kB 🟢 -1.51 kB
assets/releaseStore-Dl6Iv6cI.js (removed) 6.72 kB 🟢 -6.72 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/releaseStore-I6jKzDN1.js (new) 6.72 kB 🔴 +6.72 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/systemStatsStore-DfXufZB5.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.74 kB 🔴 +1.47 kB
assets/systemStatsStore-fFYhewjj.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.74 kB 🟢 -1.47 kB
assets/userStore-BbounHt3.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +897 B 🔴 +794 B
assets/userStore-D0znhO-J.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -899 B 🟢 -795 B
assets/audioService-CTmJQhEm.js (removed) 1.71 kB 🟢 -1.71 kB 🟢 -829 B 🟢 -724 B
assets/audioService-DeNvc0TG.js (new) 1.71 kB 🔴 +1.71 kB 🔴 +829 B 🔴 +731 B
assets/dialogService-Dd3GwXa-.js (new) 98 B 🔴 +98 B 🔴 +97 B 🔴 +89 B
assets/dialogService-Dd4s9uH2.js (removed) 98 B 🟢 -98 B 🟢 -97 B 🟢 -86 B
assets/releaseStore-ClS8jj6Z.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -85 B
assets/releaseStore-ni8JYDHO.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +90 B
assets/settingStore-D4b-AQhC.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +84 B
assets/settingStore-D5nohNGQ.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -84 B
assets/assetsStore-BVZzetzH.js (new) 94 B 🔴 +94 B 🔴 +92 B 🔴 +85 B
assets/assetsStore-WwVf4zAU.js (removed) 94 B 🟢 -94 B 🟢 -92 B 🟢 -84 B
assets/api-DDNiATPI.js (removed) 62 B 🟢 -62 B 🟢 -74 B 🟢 -66 B
assets/api-DeMOV6Hs.js (new) 62 B 🔴 +62 B 🔴 +74 B 🔴 +66 B

Status: 14 added / 14 removed / 3 unchanged

Utilities & Hooks — 549 kB (baseline 549 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-Cz8WpIy9.js (new) 236 kB 🔴 +236 kB 🔴 +53.1 kB 🔴 +43.2 kB
assets/useConflictDetection-p9oRT-Uv.js (removed) 236 kB 🟢 -236 kB 🟢 -53.1 kB 🟢 -43.3 kB
assets/useLayerEditorSession-B_r7LmBz.js (new) 158 kB 🔴 +158 kB 🔴 +40.8 kB 🔴 +34.3 kB
assets/useLayerEditorSession-CJIX0QBM.js (removed) 158 kB 🟢 -158 kB 🟢 -40.8 kB 🟢 -34.3 kB
assets/useLoad3d-BSNtleKh.js (new) 25.8 kB 🔴 +25.8 kB 🔴 +5.8 kB 🔴 +5.15 kB
assets/useLoad3d-DqKY430a.js (removed) 25.8 kB 🟢 -25.8 kB 🟢 -5.8 kB 🟢 -5.15 kB
assets/useLoad3dViewer-D8eoFggx.js (new) 21.2 kB 🔴 +21.2 kB 🔴 +4.98 kB 🔴 +4.36 kB
assets/useLoad3dViewer-Dec6W5Qg.js (removed) 21.2 kB 🟢 -21.2 kB 🟢 -4.98 kB 🟢 -4.36 kB
assets/useImageCrop-BX47Jnji.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -3.42 kB 🟢 -2.98 kB
assets/useImageCrop-PsjJxTFn.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +3.42 kB 🔴 +2.99 kB
assets/useDowngradeToPersonal-BKWu58ge.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -2.73 kB 🟢 -2.35 kB
assets/useDowngradeToPersonal-D25GRYUo.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +2.73 kB 🔴 +2.35 kB
assets/useFeatureFlags-CcP_CcBX.js (removed) 7.32 kB 🟢 -7.32 kB 🟢 -2.06 kB 🟢 -1.74 kB
assets/useFeatureFlags-D3H7to-d.js (new) 7.32 kB 🔴 +7.32 kB 🔴 +2.06 kB 🔴 +1.76 kB
assets/useCompositorLayers-C8m-Qjls.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +899 B 🔴 +806 B
assets/useCompositorLayers-uaor0-DF.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -896 B 🟢 -803 B
assets/assetPreviewUtil-BoWVIU3M.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +969 B 🔴 +846 B
assets/assetPreviewUtil-DuDVyZiU.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -969 B 🟢 -851 B
assets/useUpstreamValue-DF5zPBL9.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -756 B 🟢 -684 B
assets/useUpstreamValue-RCwRFVpn.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +759 B 🔴 +683 B
assets/useWorkspaceTierLabel-Dc54LuKB.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +814 B 🔴 +693 B
assets/useWorkspaceTierLabel-nV_UOW7V.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -814 B 🟢 -694 B
assets/subscriptionCheckoutUtil-A0yRcduw.js (removed) 877 B 🟢 -877 B 🟢 -521 B 🟢 -434 B
assets/subscriptionCheckoutUtil-B_WvjgVO.js (new) 877 B 🔴 +877 B 🔴 +522 B 🔴 +435 B
assets/useSessionCookie-CPtFRVnR.js (removed) 652 B 🟢 -652 B 🟢 -337 B 🟢 -293 B
assets/useSessionCookie-WehH2nUQ.js (new) 652 B 🔴 +652 B 🔴 +336 B 🔴 +290 B
assets/useLoad3d-Bj4kUBKP.js (new) 311 B 🔴 +311 B 🔴 +162 B 🔴 +147 B
assets/useLoad3d-DkRhVy9-.js (removed) 311 B 🟢 -311 B 🟢 -164 B 🟢 -147 B
assets/useSessionCookie-D0nkIGFQ.js (new) 101 B 🔴 +101 B 🔴 +86 B 🔴 +83 B
assets/useSessionCookie-DC68S9Ac.js (removed) 101 B 🟢 -101 B 🟢 -86 B 🟢 -82 B
assets/useFeatureFlags-7buW2qWk.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -76 B
assets/useFeatureFlags-Czkxut97.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +80 B
assets/useLoad3dViewer-BwtvOdSE.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -92 B
assets/useLoad3dViewer-DLdIoWXf.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +85 B
assets/useCurrentUser-C45EpPuX.js (new) 94 B 🔴 +94 B 🔴 +95 B 🔴 +90 B
assets/useCurrentUser-XruvXW3O.js (removed) 94 B 🟢 -94 B 🟢 -95 B 🟢 -87 B

Status: 18 added / 18 removed / 19 unchanged

Vendor & Third-Party — 18.1 MB (baseline 18.1 MB) • ⚪ 0 B

External libraries and shared vendor chunks

Status: 18 unchanged

Other — 14.2 MB (baseline 14.2 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-B8Szucsw.js (removed) 115 kB 🟢 -115 kB 🟢 -30 kB 🟢 -25.3 kB
assets/core-C0ht1aFl.js (new) 115 kB 🔴 +115 kB 🔴 +30 kB 🔴 +25.3 kB
assets/WidgetSelect-B6lHm0P8.js (new) 88.8 kB 🔴 +88.8 kB 🔴 +20.1 kB 🔴 +17.2 kB
assets/WidgetSelect-BDuDeGd2.js (removed) 88.8 kB 🟢 -88.8 kB 🟢 -20.1 kB 🟢 -17.2 kB
assets/SubscriptionPanelContentWorkspace-B4rF3Vrl.js (new) 81.2 kB 🔴 +81.2 kB 🔴 +16.1 kB 🔴 +13.8 kB
assets/SubscriptionPanelContentWorkspace-wKqyEyFG.js (removed) 81.2 kB 🟢 -81.2 kB 🟢 -16.1 kB 🟢 -13.9 kB
assets/Load3D-BhVb_-f8.js (removed) 73.3 kB 🟢 -73.3 kB 🟢 -12.1 kB 🟢 -10.3 kB
assets/Load3D-CqM0QeDO.js (new) 73.3 kB 🔴 +73.3 kB 🔴 +12.1 kB 🔴 +10.3 kB
assets/WidgetVideoEdit-BmR_OYmO.js (removed) 71.2 kB 🟢 -71.2 kB 🟢 -17 kB 🟢 -14.9 kB
assets/WidgetVideoEdit-wE_nrlO-.js (new) 71.2 kB 🔴 +71.2 kB 🔴 +17 kB 🔴 +14.9 kB
assets/SubscriptionTransitionPreviewWorkspace-DmlcbGht.js (new) 66.6 kB 🔴 +66.6 kB 🔴 +13.4 kB 🔴 +11.7 kB
assets/SubscriptionTransitionPreviewWorkspace-Dw8Y17pI.js (removed) 66.6 kB 🟢 -66.6 kB 🟢 -13.4 kB 🟢 -11.7 kB
assets/WorkspaceSettingsPanelContent-BXllU2jc.js (removed) 58.2 kB 🟢 -58.2 kB 🟢 -12.4 kB 🟢 -10.8 kB
assets/WorkspaceSettingsPanelContent-DEgtdk0T.js (new) 58.2 kB 🔴 +58.2 kB 🔴 +12.4 kB 🔴 +10.8 kB
assets/Preview3d-CGNFdvKg.js (removed) 50.9 kB 🟢 -50.9 kB 🟢 -8.31 kB 🟢 -7.25 kB
assets/Preview3d-D_FckwGh.js (new) 50.9 kB 🔴 +50.9 kB 🔴 +8.32 kB 🔴 +7.25 kB
assets/main-BkEibOWu.js (new) 45.4 kB 🔴 +45.4 kB 🔴 +13.2 kB 🔴 +11.4 kB
assets/main-DToCOBWk.js (removed) 45.4 kB 🟢 -45.4 kB 🟢 -13.2 kB 🟢 -11.4 kB
assets/SubscriptionRequiredDialogContentUnified-BcqNweE7.js (new) 42.7 kB 🔴 +42.7 kB 🔴 +9.39 kB 🔴 +8.18 kB
assets/SubscriptionRequiredDialogContentUnified-D9j0-1YJ.js (removed) 42.7 kB 🟢 -42.7 kB 🟢 -9.39 kB 🟢 -8.18 kB
assets/LayerEditorContent-bh6VUDi2.js (removed) 42.5 kB 🟢 -42.5 kB 🟢 -9.62 kB 🟢 -8.44 kB
assets/LayerEditorContent-DCoaFd7j.js (new) 42.5 kB 🔴 +42.5 kB 🔴 +9.62 kB 🔴 +8.43 kB
assets/WidgetBoundingBoxes-D6WEJ8BM.js (new) 33.7 kB 🔴 +33.7 kB 🔴 +9.16 kB 🔴 +8.12 kB
assets/WidgetBoundingBoxes-DPoCJsy9.js (removed) 33.7 kB 🟢 -33.7 kB 🟢 -9.16 kB 🟢 -8.12 kB
assets/WidgetPainter-R69sO957.js (new) 32.6 kB 🔴 +32.6 kB 🔴 +7.87 kB 🔴 +6.95 kB
assets/WidgetPainter-RIjvS5bD.js (removed) 32.6 kB 🟢 -32.6 kB 🟢 -7.87 kB 🟢 -6.98 kB
assets/Load3dViewerContent-DSp_yp1E.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +6.28 kB 🔴 +5.45 kB
assets/Load3dViewerContent-Im-djtVO.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -6.28 kB 🟢 -5.45 kB
assets/SubscriptionRequiredDialogContent-Dc31Z9QO.js (new) 26.9 kB 🔴 +26.9 kB 🔴 +6.36 kB 🔴 +5.61 kB
assets/SubscriptionRequiredDialogContent-DuIUt83G.js (removed) 26.9 kB 🟢 -26.9 kB 🟢 -6.36 kB 🟢 -5.6 kB
assets/SubscriptionRequiredDialogContentWorkspace-D0ZggBko.js (removed) 25.1 kB 🟢 -25.1 kB 🟢 -5.81 kB 🟢 -5.12 kB
assets/SubscriptionRequiredDialogContentWorkspace-elMOcHYT.js (new) 25.1 kB 🔴 +25.1 kB 🔴 +5.81 kB 🔴 +5.12 kB
assets/CreditsTile-ChxAnxbm.js (new) 24.9 kB 🔴 +24.9 kB 🔴 +6.65 kB 🔴 +5.84 kB
assets/CreditsTile-D_rzH4XA.js (removed) 24.9 kB 🟢 -24.9 kB 🟢 -6.65 kB 🟢 -5.84 kB
assets/load3d-BdrbB6Vs.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.41 kB 🟢 -4.68 kB
assets/load3d-Bv1i2Sad.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.41 kB 🔴 +4.68 kB
assets/CurrentUserPopoverWorkspace-D-B_NMu9.js (removed) 21.9 kB 🟢 -21.9 kB 🟢 -5 kB 🟢 -4.44 kB
assets/CurrentUserPopoverWorkspace-EmgAxOAv.js (new) 21.9 kB 🔴 +21.9 kB 🔴 +5 kB 🔴 +4.44 kB
assets/SignInContent-DinxZ4Z3.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.18 kB 🟢 -4.54 kB
assets/SignInContent-DYPUw1F9.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.18 kB 🔴 +4.54 kB
assets/WidgetRecordAudio-CgqL5_ri.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.6 kB 🔴 +4.1 kB
assets/WidgetRecordAudio-DsR76aPT.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.6 kB 🟢 -4.1 kB
assets/WidgetInputNumber-BqYVwcB9.js (new) 13.9 kB 🔴 +13.9 kB 🔴 +3.63 kB 🔴 +3.22 kB
assets/WidgetInputNumber-CtJhYLCO.js (removed) 13.9 kB 🟢 -13.9 kB 🟢 -3.63 kB 🟢 -3.22 kB
assets/WidgetRange-C4UsNt67.js (new) 13.7 kB 🔴 +13.7 kB 🔴 +3.55 kB 🔴 +3.13 kB
assets/WidgetRange-NsqOGGNr.js (removed) 13.7 kB 🟢 -13.7 kB 🟢 -3.55 kB 🟢 -3.13 kB
assets/WaveAudioPlayer-BAF0RkvO.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.46 kB 🔴 +3.04 kB
assets/WaveAudioPlayer-Crk7Kk6R.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.46 kB 🟢 -3.06 kB
assets/WidgetCurve-b63kc1pL.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.48 kB 🔴 +3.14 kB
assets/WidgetCurve-tM37-hU0.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.48 kB 🟢 -3.14 kB
assets/TeamWorkspacesDialogContent-DpKmp4oZ.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +2.97 kB 🔴 +2.63 kB
assets/TeamWorkspacesDialogContent-DUw5giOP.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -2.97 kB 🟢 -2.63 kB
assets/onboardingCloudRoutes-BuGYVIK7.js (new) 9.49 kB 🔴 +9.49 kB 🔴 +2.85 kB 🔴 +2.44 kB
assets/onboardingCloudRoutes-D9ALIhLy.js (removed) 9.49 kB 🟢 -9.49 kB 🟢 -2.85 kB 🟢 -2.45 kB
assets/Load3DConfiguration-BE7hH9dY.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.61 kB 🟢 -2.3 kB
assets/Load3DConfiguration-BV8gaDfu.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.61 kB 🔴 +2.3 kB
assets/WidgetImageCrop-DhjjVBAp.js (new) 8.49 kB 🔴 +8.49 kB 🔴 +2.66 kB 🔴 +2.34 kB
assets/WidgetImageCrop-OZOmr7C-.js (removed) 8.49 kB 🟢 -8.49 kB 🟢 -2.66 kB 🟢 -2.34 kB
assets/SetMemberCreditLimitDialogContent-C-n3T2Al.js (removed) 8.47 kB 🟢 -8.47 kB 🟢 -2.34 kB 🟢 -2.05 kB
assets/SetMemberCreditLimitDialogContent-MbciRLH-.js (new) 8.47 kB 🔴 +8.47 kB 🔴 +2.34 kB 🔴 +2.06 kB
assets/nodeTemplates-irbIAmD-.js (removed) 8.32 kB 🟢 -8.32 kB 🟢 -2.85 kB 🟢 -2.5 kB
assets/nodeTemplates-vnRoMpIG.js (new) 8.32 kB 🔴 +8.32 kB 🔴 +2.85 kB 🔴 +2.5 kB
assets/NightlySurveyController-C5QxTuu4.js (removed) 7.5 kB 🟢 -7.5 kB 🟢 -2.55 kB 🟢 -2.25 kB
assets/NightlySurveyController-CmMOyNev.js (new) 7.5 kB 🔴 +7.5 kB 🔴 +2.55 kB 🔴 +2.25 kB
assets/CloudRunButtonWrapper-Chl7cGlY.js (new) 7.29 kB 🔴 +7.29 kB 🔴 +2.29 kB 🔴 +2.01 kB
assets/CloudRunButtonWrapper-DvriTkrm.js (removed) 7.29 kB 🟢 -7.29 kB 🟢 -2.29 kB 🟢 -2.01 kB
assets/WidgetWithControl-CN4jMPog.js (removed) 6.51 kB 🟢 -6.51 kB 🟢 -2.66 kB 🟢 -2.36 kB
assets/WidgetWithControl-ymtU7RMP.js (new) 6.51 kB 🔴 +6.51 kB 🔴 +2.66 kB 🔴 +2.35 kB
assets/missingModelMetadata-CcNIiC5F.js (removed) 6.45 kB 🟢 -6.45 kB 🟢 -2.21 kB 🟢 -1.93 kB
assets/missingModelMetadata-DIQ843Nf.js (new) 6.45 kB 🔴 +6.45 kB 🔴 +2.21 kB 🔴 +1.93 kB
assets/CancelSubscriptionDialogContent-B5wICGYw.js (removed) 5.97 kB 🟢 -5.97 kB 🟢 -1.98 kB 🟢 -1.75 kB
assets/CancelSubscriptionDialogContent-Cui5FV-d.js (new) 5.97 kB 🔴 +5.97 kB 🔴 +1.98 kB 🔴 +1.75 kB
assets/load3dPreviewExtensions-CHc-ABon.js (removed) 5.88 kB 🟢 -5.88 kB 🟢 -1.81 kB 🟢 -1.6 kB
assets/load3dPreviewExtensions-CQZAheV6.js (new) 5.88 kB 🔴 +5.88 kB 🔴 +1.81 kB 🔴 +1.6 kB
assets/launchCancellationFlow-DB-rtqKy.js (new) 5.18 kB 🔴 +5.18 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/launchCancellationFlow-DtzRA4c4.js (removed) 5.18 kB 🟢 -5.18 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/CreateWorkspaceDialogContent-DGP33tbt.js (new) 5.12 kB 🔴 +5.12 kB 🔴 +1.79 kB 🔴 +1.55 kB
assets/CreateWorkspaceDialogContent-DSQAmWrQ.js (removed) 5.12 kB 🟢 -5.12 kB 🟢 -1.79 kB 🟢 -1.55 kB
assets/ChangeMemberRoleDialogContent-BYuBdH6k.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/ChangeMemberRoleDialogContent-CggdhXXP.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/InviteMemberDialogContent-DKCOfr6M.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.65 kB 🟢 -1.44 kB
assets/InviteMemberDialogContent-DpXFIyvA.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.65 kB 🔴 +1.45 kB
assets/EditWorkspaceDialogContent-Dsp4J_Ck.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.76 kB 🟢 -1.52 kB
assets/EditWorkspaceDialogContent-nidPrvdV.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.76 kB 🔴 +1.53 kB
assets/WidgetTextarea-B8seCE9K.js (new) 4.83 kB 🔴 +4.83 kB 🔴 +1.88 kB 🔴 +1.64 kB
assets/WidgetTextarea-Ci5N3JF_.js (removed) 4.83 kB 🟢 -4.83 kB 🟢 -1.88 kB 🟢 -1.65 kB
assets/saveMesh-BdMx_Ipg.js (new) 4.76 kB 🔴 +4.76 kB 🔴 +1.52 kB 🔴 +1.35 kB
assets/saveMesh-BuP9WTP2.js (removed) 4.76 kB 🟢 -4.76 kB 🟢 -1.52 kB 🟢 -1.35 kB
assets/WorkspacePanelContent-C-6qA4KL.js (removed) 4.74 kB 🟢 -4.74 kB 🟢 -1.62 kB 🟢 -1.44 kB
assets/WorkspacePanelContent-hExQPFJE.js (new) 4.74 kB 🔴 +4.74 kB 🔴 +1.63 kB 🔴 +1.44 kB
assets/ValueControlPopover-DrUWJgwX.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.55 kB 🔴 +1.38 kB
assets/ValueControlPopover-wQmgIfXR.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.55 kB 🟢 -1.38 kB
assets/DeleteWorkspaceDialogContent-BvpjOWii.js (new) 3.84 kB 🔴 +3.84 kB 🔴 +1.44 kB 🔴 +1.24 kB
assets/DeleteWorkspaceDialogContent-Dyrz33oI.js (removed) 3.84 kB 🟢 -3.84 kB 🟢 -1.44 kB 🟢 -1.24 kB
assets/RemoveMemberDialogContent-DgZcrY-6.js (new) 3.76 kB 🔴 +3.76 kB 🔴 +1.39 kB 🔴 +1.2 kB
assets/RemoveMemberDialogContent-VLuNs07O.js (removed) 3.76 kB 🟢 -3.76 kB 🟢 -1.39 kB 🟢 -1.2 kB
assets/RevokeInviteDialogContent-BfJd4E_S.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.39 kB 🟢 -1.21 kB
assets/RevokeInviteDialogContent-CrWejvpa.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.39 kB 🔴 +1.22 kB
assets/LeaveWorkspaceDialogContent-D9f6i74M.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.39 kB 🔴 +1.19 kB
assets/LeaveWorkspaceDialogContent-DsC933cx.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.39 kB 🟢 -1.21 kB
assets/InviteMemberUpsellDialogContent-BdZlOI5w.js (new) 3.47 kB 🔴 +3.47 kB 🔴 +1.24 kB 🔴 +1.09 kB
assets/InviteMemberUpsellDialogContent-DJGJ80qP.js (removed) 3.47 kB 🟢 -3.47 kB 🟢 -1.24 kB 🟢 -1.08 kB
assets/workspaceCheckoutTelemetry-4tpuXHo1.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.52 kB 🟢 -1.33 kB
assets/workspaceCheckoutTelemetry-CLG_9xeN.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.52 kB 🔴 +1.33 kB
assets/GlobalToast-BDWsN-T-.js (removed) 3.25 kB 🟢 -3.25 kB 🟢 -1.3 kB 🟢 -1.11 kB
assets/GlobalToast-IWlxE9FM.js (new) 3.25 kB 🔴 +3.25 kB 🔴 +1.3 kB 🔴 +1.11 kB
assets/Media3DTop-Bd3ndpvD.js (new) 3.21 kB 🔴 +3.21 kB 🔴 +1.27 kB 🔴 +1.11 kB
assets/Media3DTop-Ch-WT-c_.js (removed) 3.21 kB 🟢 -3.21 kB 🟢 -1.27 kB 🟢 -1.11 kB
assets/load3dAdvanced-DgXfDOn9.js (new) 2.82 kB 🔴 +2.82 kB 🔴 +1.09 kB 🔴 +957 B
assets/load3dAdvanced-g9ZUaoUl.js (removed) 2.82 kB 🟢 -2.82 kB 🟢 -1.1 kB 🟢 -954 B
assets/SubscribeToRun-CRkCDibx.js (new) 2.39 kB 🔴 +2.39 kB 🔴 +1.04 kB 🔴 +909 B
assets/SubscribeToRun-D7Quq0dl.js (removed) 2.39 kB 🟢 -2.39 kB 🟢 -1.03 kB 🟢 -911 B
assets/MediaAudioTop-BhLVUoOP.js (new) 1.62 kB 🔴 +1.62 kB 🔴 +808 B 🔴 +670 B
assets/MediaAudioTop-DdyDhmJ3.js (removed) 1.62 kB 🟢 -1.62 kB 🟢 -809 B 🟢 -673 B
assets/cloudSessionCookie-BRQAGw-u.js (removed) 933 B 🟢 -933 B 🟢 -430 B 🟢 -378 B
assets/cloudSessionCookie-BU--kWz5.js (new) 933 B 🔴 +933 B 🔴 +432 B 🔴 +377 B
assets/cloudBadges-BnaIRgME.js (new) 922 B 🔴 +922 B 🔴 +513 B 🔴 +440 B
assets/cloudBadges-DIZHEEVa.js (removed) 922 B 🟢 -922 B 🟢 -512 B 🟢 -439 B
assets/Load3DAdvanced-CVvCZd8-.js (new) 761 B 🔴 +761 B 🔴 +424 B 🔴 +359 B
assets/Load3DAdvanced-ryX17sa5.js (removed) 761 B 🟢 -761 B 🟢 -422 B 🟢 -358 B
assets/nightlyBadges-crObWOlo.js (removed) 411 B 🟢 -411 B 🟢 -270 B 🟢 -263 B
assets/nightlyBadges-CTu4pz-_.js (new) 411 B 🔴 +411 B 🔴 +271 B 🔴 +260 B
assets/Load3dViewerContent-BmzVvFzJ.js (removed) 137 B 🟢 -137 B 🟢 -103 B 🟢 -93 B
assets/Load3dViewerContent-COmQTjFr.js (new) 137 B 🔴 +137 B 🔴 +103 B 🔴 +108 B
assets/missingModelMetadata-L-P4j5Yn.js (removed) 125 B 🟢 -125 B 🟢 -103 B 🟢 -106 B
assets/missingModelMetadata-Nh-Z25nI.js (new) 125 B 🔴 +125 B 🔴 +103 B 🔴 +105 B
assets/Load3DAdvanced-BJkfzMtj.js (new) 122 B 🔴 +122 B 🔴 +97 B 🔴 +91 B
assets/Load3DAdvanced-DiHEx9pK.js (removed) 122 B 🟢 -122 B 🟢 -97 B 🟢 -87 B
assets/WidgetLegacy-D9R5MiTN.js (new) 117 B 🔴 +117 B 🔴 +106 B 🔴 +101 B
assets/WidgetLegacy-DcQUot50.js (removed) 117 B 🟢 -117 B 🟢 -106 B 🟢 -103 B
assets/workflowDraftStoreV2-A6J_gtZw.js (removed) 112 B 🟢 -112 B 🟢 -101 B 🟢 -108 B
assets/workflowDraftStoreV2-CZ2mzJPa.js (new) 112 B 🔴 +112 B 🔴 +101 B 🔴 +109 B
assets/Load3D-DcrwfOl0.js (removed) 98 B 🟢 -98 B 🟢 -89 B 🟢 -80 B
assets/Load3D-yuXePuys.js (new) 98 B 🔴 +98 B 🔴 +89 B 🔴 +84 B
assets/changeTracker-5qnbBkUD.js (new) 91 B 🔴 +91 B 🔴 +93 B 🔴 +82 B
assets/changeTracker-BL2IzVBn.js (removed) 91 B 🟢 -91 B 🟢 -93 B 🟢 -89 B

Status: 68 added / 68 removed / 219 unchanged

⚡ Performance

⏳ Performance tests in progress…

@coderabbitai

coderabbitai Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e4a86738-c828-4182-8c5b-5259c705f4d8

📥 Commits

Reviewing files that changed from the base of the PR and between d88bb9c and bf6d50a.

📒 Files selected for processing (3)
  • src/platform/keybindings/keybindingService.dialog.test.ts
  • src/utils/modalUtil.test.ts
  • src/utils/modalUtil.ts

Included review availability: 2 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 4 reviews per hour.


📝 Walkthrough

Walkthrough

The modal utility now detects visible blocking dialogs and excludes hidden or non-blocking overlays. Tests cover modal detection and Ctrl+S workflow saving when popovers or masked dialogs are open.

Changes

Modal detection and shortcut handling

Layer / File(s) Summary
Blocking modal detection
src/utils/modalUtil.ts
isModalOpen now recognizes visible ARIA modals and filters hidden dialogs, popovers, and dropdown overlays. Reka dialog detection uses the shared blocking-modal predicate.
Modal detection regression tests
src/utils/modalUtil.test.ts
Added coverage for managed, ARIA, native, legacy, Reka, masked, hidden, and sibling dialogs, plus non-blocking popovers.
Ctrl+S shortcut regression tests
src/platform/keybindings/keybindingService.dialog.test.ts
Added tests for workflow saving and browser-default prevention when popovers or dialogs inside hidden masks are open.

Estimated code review effort: 2 (Simple) | ~10 minutes

Merge Risk: ⚪ Minimal · up to bf6d5

This localized change makes global shortcuts ignore hidden or non-blocking overlays while continuing to suppress them for genuine modals; no actionable merge-blocking risk remains beyond normal checks and review.

Possibly related PRs

Suggested labels: size:XS, risk:R2


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
End-To-End Regression Coverage For Fixes ❓ Inconclusive Changed files are available, but the PR title and commit subjects are not provided; the required bug-fix signal cannot be verified. Provide the PR title and commit subjects to determine whether the explicit failure conditions apply.
✅ Passed checks (6 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the primary change: modal detection now counts only blocking overlays as open.
Description check ✅ Passed The description covers the required summary, changes, review focus, testing, validation, issue link, and screenshots.
Linked Issues check ✅ Passed The changes restore Ctrl+S workflow saving and preserve shortcut suppression for genuinely open modals, with regression coverage [#15639] [#13987].
Out of Scope Changes check ✅ Passed The implementation and tests are focused on modal detection and related keyboard shortcut behavior, with no unrelated code changes identified.
Website End-To-End Regression Coverage ✅ Passed The changed files are under src/ and do not include apps/website/src/ or apps/website/public/, so this website-specific check does not apply.
Adr Compliance For Entity/Litegraph Changes ✅ Passed The changed files are keybinding and modal utility files. None are under src/lib/litegraph/, src/ecs/, or graph-entity files, so this check does not apply.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch glary/ctrl-s-modal-gate

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added the risk:R2 PR risk grade (advisory shadow check; grader-owned) label Aug 20, 2026
@codecov

codecov Bot commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@            Coverage Diff             @@
##             main   #15455      +/-   ##
==========================================
+ Coverage   79.16%   81.76%   +2.59%     
==========================================
  Files        2213     1886     -327     
  Lines      112075   107190    -4885     
  Branches    35684    33930    -1754     
==========================================
- Hits        88725    87642    -1083     
+ Misses      22898    19196    -3702     
+ Partials      452      352     -100     
Flag Coverage Δ
unit 73.27% <100.00%> (+0.01%) ⬆️
website-unit ?

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/utils/modalUtil.ts 100.00% <100.00%> (ø)

... and 336 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@glary-bot

glary-bot Bot commented Aug 20, 2026

Copy link
Copy Markdown

Thanks — noting for human reviewers that CodeRabbit's pass generated no actionable comments, so no changes were made in response. CI is green on bf6d50a: test, lint-and-format, website-unit-gate, storybook-build, validate-licenses and the Socket checks all pass, with no failures.

For anyone picking this up, two things in the diff are deliberate rather than oversights, and are the parts worth a human eye:

  1. The in-dialog escape hatch from fix: disable global keybindings while a modal dialog is open #12184 is intentionally not restored. fix: resolve dialog, model import, and mask editor regressions #14024 removed it on purpose — its QA repro was pressing W inside an Add Secret dialog and getting the Workflows sidebar behind it. main has a test pinning that behaviour (does NOT execute a global keybinding from inside an open dialog) and it still passes unchanged here.

  2. .p-popover is a deny-list entry, not a component fix. All 15 PrimeVue Popover call sites emit role="dialog" aria-modal="true", so patching WorkflowTabPopover alone would leave the other 14 and every future one. Putting the rule in the single predicate also matches how Reka popovers were already handled on main via [data-reka-popper-content-wrapper].

The one thing knowingly left out of scope: src/platform/assets/composables/useAssetGridSelection.ts:215 still does the raw document.querySelector('[role="dialog"][aria-modal="true"]'), so Ctrl+A in the asset grid stays broken by both of the repros this PR fixes. Happy to fold that in here or send it as a separate PR — reviewer's call.

@DrJKL DrJKL added area:testing area:ui General user interface and experience improvements audit:testing Testing and quality labels Aug 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:testing area:ui General user interface and experience improvements audit:testing Testing and quality risk:R2 PR risk grade (advisory shadow check; grader-owned)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Ctrl-S is now Browser-Save instead of Workflow-Save Reka-UI dialog bugs from 1.47 RC QA (5: modal-close/scrim/shortcuts/scroll/mask-icons)

2 participants