Skip to content

fix: warn instead of erroring on blocked or cancelled sign-in popups - #14944

Merged
MaanilVerma merged 8 commits into
mainfrom
fix/auth-popup-error-codes
Aug 23, 2026
Merged

fix: warn instead of erroring on blocked or cancelled sign-in popups#14944
MaanilVerma merged 8 commits into
mainfrom
fix/auth-popup-error-codes

Conversation

@MaanilVerma

@MaanilVerma MaanilVerma commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Summary

A blocked or cancelled sign-in popup now shows an amber warning that says what to do, instead of a red error saying something went wrong.

Changes

  • What: auth/popup-blocked was missing from auth.errors entirely, so a browser blocking the popup fell through to the generic "Something went wrong while signing you in", which never mentions pop-ups. Safari blocks popups not tied to a direct user gesture by default, so this is not an edge case.

    A POPUP_PERMISSION_ERROR_CODES group is checked ahead of the generic FirebaseError branch and surfaces those codes at warn. Closing a popup is a user action, not an app fault, and should not look like a crash.

    Also adds auth/account-exists-with-different-credential, which previously fell back to generic. That is a real collision: signed up with Google, later tries GitHub on the same address.

    The two pre-existing popup keys both read "Sign-in was cancelled. Please try again.", which did not distinguish closing the window from having a second one already open. Both are reworded.

  • Breaking: None.

Review Focus

The severity split is the judgement call. The three popup codes are warn because the user or their browser caused them. account-exists-with-different-credential stays error: it is a genuine account-state conflict, not a popup interaction.

That message does not name the original provider. It cannot — AuthError.customData carries only {appName, email?, phoneNumber?, tenantId?}, and naming the provider needs a fetchSignInMethodsForEmail round trip, which is a behaviour change rather than copy.

Worth knowing for future work in this file: AuthErrorCodes.UNAUTHORIZED_DOMAIN resolves to auth/unauthorized-continue-uri, not auth/unauthorized-domain. No SDK constant carries that value, so the hard-coded strings in the accessError branch are correct and must not be "tidied" into constants. The table test pins all three so that refactor fails loudly.

Only en is touched. Per src/locales/CONTRIBUTING.md, CI generates translations during release PRs, and vue-i18n falls back to en at runtime.

The pre-commit hook flags auth/popup-blocked as an unused key. False positive: it resolves dynamically through st(`auth.errors.${error.code}`), which a static scanner cannot trace.

Testing

43 tests. Every one was mutation-checked: the behaviour it pins was broken in the source, the test confirmed failing, then reverted. 43 killed, 0 survivors.

Case Mutation applied Result
Every locale key maps to its own message (11 rows) generic branch detail: st(...)t('auth.errors.generic') 11 fail
Popup codes map to their own message (3 rows) popup branch detail: st(...) → generic 3 fail
Every Firebase code distinct from generic set auth/popup-blocked to the generic string fails
Covers every popup-permission code delete auth/popup-blocked from the locale fails
Unknown code → generic fallback st(...) → raw `auth.errors.${code}` fails
Popup codes surface at warn (3 rows) popup branch condition && false; trim the list 3 fail
Branch ordering move popup branch after generic fails
Account collision stays error add the code to the popup group fails
signup_blocked substring match .includes(...)=== fails
signup_blocked case-insensitive drop .toLowerCase() fails
unauthorized-domain family (3 rows) delete accessError.value = true; hardcode domain; drop a code 3 fail
accessError stays false elsewhere ref(false)ref(true) fails
Non-Firebase errors delegate to toastErrorHandler route them to a toast instead fails
Auth-failure telemetry (5 rows) drop reportError; collapse the sign-up/sign-in action names 5 fail
Logout flow (10 rows) reorder storage clear vs logout; drop the cancel guards; truncate the save loop 10 fail

Screenshots

Captured against the running app.

Beforeauth/popup-blocked had no key, so it fell through to the generic red error.

After

auth/popup-blocked

auth/popup-closed-by-user

auth/cancelled-popup-request

auth/account-exists-with-different-credential — stays a red error

Any unmapped code — generic fallback, unchanged

Google and GitHub sign-in use signInWithPopup. When the browser blocks
the popup or the user closes it, Firebase throws auth/popup-blocked,
auth/popup-closed-by-user or auth/cancelled-popup-request. These are
user or browser actions, not app faults, so they now surface as a warn
toast with copy that names the cause and the fix, rather than a red
error.

auth/popup-blocked and auth/account-exists-with-different-credential
were missing from the locale entirely and fell through to the generic
"something went wrong" message, which told the user nothing actionable.
The account-collision copy does not name the original provider because
the error does not carry it: AuthError.customData exposes only appName,
email and phoneNumber, so naming it would need an extra
fetchSignInMethodsForEmail round-trip.

The regression net derives its table from the locale keys themselves
instead of a hand-maintained list, so a code without its own message
fails the suite. That hand-maintained list was the reason the two
missing keys went unnoticed.
@MaanilVerma
MaanilVerma requested a review from a team August 8, 2026 16:53
@dosubot dosubot Bot added the size:S This PR changes 10-29 lines, ignoring generated files. label Aug 8, 2026
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown

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

📊 Browser Reports
  • chromium: View Report (✅ 1811 / ❌ 0 / ⚠️ 1 / ⏭️ 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)

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 08/19/2026, 06:40:54 PM UTC

Links

📦 Bundle: 8.86 MB gzip 🔴 +157 B

Details

Summary

  • Raw size: 37.4 MB baseline 37.4 MB — 🔴 +915 B
  • Gzip: 8.86 MB baseline 8.86 MB — 🔴 +157 B
  • Brotli: 6.19 MB baseline 6.19 MB — 🔴 +40 B
  • Bundles: 438 current • 438 baseline • 156 added / 156 removed

Category Glance
Data & Services 🔴 +540 B (3.53 MB) · Other 🔴 +375 B (14.2 MB) · Vendor & Third-Party ⚪ 0 B (16.8 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-CULex0ow.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.86 kB 🔴 +1.6 kB
assets/index-CWSwLYJd.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.86 kB 🟢 -1.63 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-7IHIZLKa.js (removed) 1.36 MB 🟢 -1.36 MB 🟢 -297 kB 🟢 -224 kB
assets/GraphView-CCecpNnU.js (new) 1.36 MB 🔴 +1.36 MB 🔴 +297 kB 🔴 +223 kB
assets/WidgetCompositor-C7dztQiw.js (new) 8.17 kB 🔴 +8.17 kB 🔴 +2.76 kB 🔴 +2.46 kB
assets/WidgetCompositor-CRWnsyTG.js (removed) 8.17 kB 🟢 -8.17 kB 🟢 -2.76 kB 🟢 -2.46 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-Bg4Uw5vS.js (removed) 25 kB 🟢 -25 kB 🟢 -6.24 kB 🟢 -5.52 kB
assets/CloudSurveyView-CM9pLEbv.js (new) 25 kB 🔴 +25 kB 🔴 +6.24 kB 🔴 +5.52 kB
assets/CloudLayoutView-0eNQtHbZ.js (removed) 21.8 kB 🟢 -21.8 kB 🟢 -6.57 kB 🟢 -5.74 kB
assets/CloudLayoutView-CiOchAts.js (new) 21.8 kB 🔴 +21.8 kB 🔴 +6.57 kB 🔴 +5.75 kB
assets/UserCheckView-CE9L56lJ.js (new) 8.75 kB 🔴 +8.75 kB 🔴 +2.19 kB 🔴 +1.9 kB
assets/UserCheckView-DPGZ1M9F.js (removed) 8.75 kB 🟢 -8.75 kB 🟢 -2.19 kB 🟢 -1.91 kB
assets/CloudLoginView-BBS73Ycv.js (new) 8.74 kB 🔴 +8.74 kB 🔴 +2.55 kB 🔴 +2.26 kB
assets/CloudLoginView-CgpIcXZt.js (removed) 8.74 kB 🟢 -8.74 kB 🟢 -2.55 kB 🟢 -2.27 kB
assets/useCloudAuthPage-B-Zd04_j.js (new) 7.08 kB 🔴 +7.08 kB 🔴 +2.51 kB 🔴 +2.21 kB
assets/useCloudAuthPage-CbOkxzzI.js (removed) 7.08 kB 🟢 -7.08 kB 🟢 -2.51 kB 🟢 -2.21 kB
assets/CloudSignupView-B_b1WFZs.js (removed) 6.96 kB 🟢 -6.96 kB 🟢 -2.28 kB 🟢 -2 kB
assets/CloudSignupView-BfKXSyLh.js (new) 6.96 kB 🔴 +6.96 kB 🔴 +2.28 kB 🔴 +2 kB
assets/WidgetTextPreview-DRDaka5x.js (removed) 6.07 kB 🟢 -6.07 kB 🟢 -2.13 kB 🟢 -1.9 kB
assets/WidgetTextPreview-YTZuuWkB.js (new) 6.07 kB 🔴 +6.07 kB 🔴 +2.13 kB 🔴 +1.9 kB
assets/CloudSubscriptionRedirectView-_lo49-RR.js (removed) 6.05 kB 🟢 -6.05 kB 🟢 -2.25 kB 🟢 -1.96 kB
assets/CloudSubscriptionRedirectView-5xocLcTy.js (new) 6.05 kB 🔴 +6.05 kB 🔴 +2.25 kB 🔴 +1.96 kB
assets/UserSelectView-CxgRHZKK.js (removed) 5.49 kB 🟢 -5.49 kB 🟢 -1.96 kB 🟢 -1.71 kB
assets/UserSelectView-QsqHk6F6.js (new) 5.49 kB 🔴 +5.49 kB 🔴 +1.96 kB 🔴 +1.71 kB
assets/CloudForgotPasswordView-BCFQhR5X.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.72 kB 🟢 -1.49 kB
assets/CloudForgotPasswordView-DAv5vqwP.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.72 kB 🔴 +1.49 kB
assets/CloudAuthTimeoutView-BDJmrkQY.js (new) 4.43 kB 🔴 +4.43 kB 🔴 +1.54 kB 🔴 +1.34 kB
assets/CloudAuthTimeoutView-DQ4XBfes.js (removed) 4.43 kB 🟢 -4.43 kB 🟢 -1.54 kB 🟢 -1.34 kB
assets/OAuthLayoutView-_eCCGpRB.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -701 B 🟢 -587 B
assets/OAuthLayoutView-3LQueVio.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +700 B 🔴 +587 B
assets/WidgetTextPreview-CGR1Jk6Q.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -81 B
assets/WidgetTextPreview-J1zYdhAz.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +90 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-C-LuUq-A.js (new) 49.4 kB 🔴 +49.4 kB 🔴 +9.94 kB 🔴 +8.79 kB
assets/KeybindingPanel-C7soCF4L.js (removed) 49.4 kB 🟢 -49.4 kB 🟢 -9.95 kB 🟢 -8.79 kB
assets/SecretsPanel-D7xApi30.js (new) 33.7 kB 🔴 +33.7 kB 🔴 +7.88 kB 🔴 +6.91 kB
assets/SecretsPanel-DZWY_G6m.js (removed) 33.7 kB 🟢 -33.7 kB 🟢 -7.88 kB 🟢 -6.9 kB
assets/CreditsPanel-BgHmghzr.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.21 kB 🟢 -2.81 kB
assets/CreditsPanel-ByidR6_f.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.21 kB 🔴 +2.81 kB
assets/AboutPanel-EAgxStGb.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.03 kB 🟢 -2.72 kB
assets/AboutPanel-hzg-VPbM.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.03 kB 🔴 +2.72 kB
assets/ExtensionPanel-bY_S9KlD.js (new) 9.19 kB 🔴 +9.19 kB 🔴 +2.51 kB 🔴 +2.23 kB
assets/ExtensionPanel-rCT8Ntfr.js (removed) 9.19 kB 🟢 -9.19 kB 🟢 -2.51 kB 🟢 -2.23 kB
assets/ServerConfigPanel-BWgOkASI.js (new) 6.09 kB 🔴 +6.09 kB 🔴 +1.94 kB 🔴 +1.72 kB
assets/ServerConfigPanel-CdBfxC7K.js (removed) 6.09 kB 🟢 -6.09 kB 🟢 -1.94 kB 🟢 -1.72 kB
assets/UserPanel-BD0RzNmq.js (new) 5.73 kB 🔴 +5.73 kB 🔴 +1.78 kB 🔴 +1.54 kB
assets/UserPanel-CcVJiCK_.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -1.78 kB 🟢 -1.54 kB
assets/refreshRemoteConfig-DaDbejpz.js (new) 4.24 kB 🔴 +4.24 kB 🔴 +1.51 kB 🔴 +1.34 kB
assets/refreshRemoteConfig-ljoO9Nhh.js (removed) 4.24 kB 🟢 -4.24 kB 🟢 -1.51 kB 🟢 -1.34 kB
assets/cloudRemoteConfig-1PsHsj_w.js (removed) 951 B 🟢 -951 B 🟢 -515 B 🟢 -422 B
assets/cloudRemoteConfig-yTUC4lNf.js (new) 951 B 🔴 +951 B 🔴 +513 B 🔴 +422 B
assets/refreshRemoteConfig-DQ5nUV3H.js (removed) 110 B 🟢 -110 B 🟢 -89 B 🟢 -81 B
assets/refreshRemoteConfig-DZKq97Rd.js (new) 110 B 🔴 +110 B 🔴 +89 B 🔴 +84 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-CZUsWVh7.js (new) 13.3 kB 🔴 +13.3 kB 🔴 +4.52 kB 🔴 +3.94 kB
assets/SignUpForm-DiXUO5Ui.js (removed) 13.3 kB 🟢 -13.3 kB 🟢 -4.52 kB 🟢 -3.94 kB
assets/auth-CqtBfKqf.js (new) 3.48 kB 🔴 +3.48 kB 🔴 +1.21 kB 🔴 +1.01 kB
assets/auth-NHsRWyc7.js (removed) 3.48 kB 🟢 -3.48 kB 🟢 -1.21 kB 🟢 -1.01 kB
assets/UpdatePasswordContent-C50Lwyi-.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +841 B 🔴 +736 B
assets/UpdatePasswordContent-CWYI5scg.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -840 B 🟢 -735 B
assets/authStore-CV4A0oaO.js (new) 128 B 🔴 +128 B 🔴 +104 B 🔴 +109 B
assets/authStore-DCrcToCo.js (removed) 128 B 🟢 -128 B 🟢 -104 B 🟢 -104 B
assets/workspaceAuthStore-CNIjduaJ.js (new) 108 B 🔴 +108 B 🔴 +99 B 🔴 +106 B
assets/workspaceAuthStore-ZbGgUEcG.js (removed) 108 B 🟢 -108 B 🟢 -99 B 🟢 -111 B
assets/auth-B70vB32B.js (removed) 105 B 🟢 -105 B 🟢 -96 B 🟢 -76 B
assets/auth-CgbIF-So.js (new) 105 B 🔴 +105 B 🔴 +96 B 🔴 +73 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-4dq8SVL7.js (removed) 90.1 kB 🟢 -90.1 kB 🟢 -19.3 kB 🟢 -16.5 kB
assets/ComfyHubPublishDialog-CVbOzqlF.js (new) 90.1 kB 🔴 +90.1 kB 🔴 +19.3 kB 🔴 +16.5 kB
assets/useShareDialog-D74iF4oZ.js (new) 23.9 kB 🔴 +23.9 kB 🔴 +5.69 kB 🔴 +5.04 kB
assets/useShareDialog-DBgagt2j.js (removed) 23.9 kB 🟢 -23.9 kB 🟢 -5.7 kB 🟢 -5.04 kB
assets/feedbackDialog-Bsd3IF8G.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.87 kB 🟢 -1.59 kB
assets/feedbackDialog-Cw-R9Q4b.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.87 kB 🔴 +1.59 kB
assets/useRangeEditor-DNDlW99E.js (removed) 3.29 kB 🟢 -3.29 kB 🟢 -1.14 kB 🟢 -1.03 kB
assets/useRangeEditor-eHaQgSIW.js (new) 3.29 kB 🔴 +3.29 kB 🔴 +1.14 kB 🔴 +1.03 kB
assets/useLayerEditor-3G6WAwGO.js (new) 1.01 kB 🔴 +1.01 kB 🔴 +492 B 🔴 +407 B
assets/useLayerEditor-DPhkx1ca.js (removed) 1.01 kB 🟢 -1.01 kB 🟢 -492 B 🟢 -405 B
assets/ComfyHubPublishDialog-BUVKT85f.js (removed) 143 B 🟢 -143 B 🟢 -105 B 🟢 -88 B
assets/ComfyHubPublishDialog-DUsD-Uw8.js (new) 143 B 🔴 +143 B 🔴 +105 B 🔴 +91 B
assets/useSubscriptionDialog-BNinwXGB.js (removed) 108 B 🟢 -108 B 🟢 -102 B 🟢 -97 B
assets/useSubscriptionDialog-Ci1ms64S.js (new) 108 B 🔴 +108 B 🔴 +102 B 🔴 +90 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-BsXSZ2RW.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.97 kB 🟢 -3.53 kB
assets/ComfyQueueButton-DN7j6LoD.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.97 kB 🔴 +3.53 kB
assets/useTerminalTabs-CNNzWJX-.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.69 kB 🟢 -3.28 kB
assets/useTerminalTabs-uF9FuDdp.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.69 kB 🔴 +3.27 kB
assets/InviteMembersForm-04pq6yCN.js (removed) 8.23 kB 🟢 -8.23 kB 🟢 -2.74 kB 🟢 -2.44 kB
assets/InviteMembersForm-cbqa33lY.js (new) 8.23 kB 🔴 +8.23 kB 🔴 +2.74 kB 🔴 +2.43 kB
assets/SubscribeButton-DMDRxUFm.js (new) 2.15 kB 🔴 +2.15 kB 🔴 +969 B 🔴 +845 B
assets/SubscribeButton-VRRlOZVQ.js (removed) 2.15 kB 🟢 -2.15 kB 🟢 -969 B 🟢 -847 B
assets/cloudFeedbackTopbarButton-aR_2XrcW.js (new) 705 B 🔴 +705 B 🔴 +421 B 🔴 +359 B
assets/cloudFeedbackTopbarButton-DEQH2Nn1.js (removed) 705 B 🟢 -705 B 🟢 -421 B 🟢 -359 B
assets/ComfyQueueButton-BAGv78fq.js (new) 128 B 🔴 +128 B 🔴 +99 B 🔴 +92 B
assets/ComfyQueueButton-BiuapiXA.js (removed) 128 B 🟢 -128 B 🟢 -99 B 🟢 -94 B

Status: 6 added / 6 removed / 8 unchanged

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

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settingStore-D0sJnDUQ.js (new) 3.16 MB 🔴 +3.16 MB 🔴 +742 kB 🔴 +557 kB
assets/settingStore-DIBHQpEH.js (removed) 3.16 MB 🟢 -3.16 MB 🟢 -741 kB 🟢 -557 kB
assets/api-DtMYg3WA.js (new) 186 kB 🔴 +186 kB 🔴 +39.8 kB 🔴 +33.3 kB
assets/api-HBMg-x0-.js (removed) 186 kB 🟢 -186 kB 🟢 -39.8 kB 🟢 -33.4 kB
assets/load3dService-B_STELm7.js (removed) 132 kB 🟢 -132 kB 🟢 -29.3 kB 🟢 -24.6 kB
assets/load3dService-CKUsKpwp.js (new) 132 kB 🔴 +132 kB 🔴 +29.3 kB 🔴 +24.6 kB
assets/workflowShareService-CV4uvrWU.js (removed) 16.5 kB 🟢 -16.5 kB 🟢 -4.91 kB 🟢 -4.35 kB
assets/workflowShareService-w9d15LJJ.js (new) 16.5 kB 🔴 +16.5 kB 🔴 +4.91 kB 🔴 +4.35 kB
assets/keybindingService-B6IxabMa.js (removed) 6.89 kB 🟢 -6.89 kB 🟢 -1.73 kB 🟢 -1.5 kB
assets/keybindingService-DMuhJV0x.js (new) 6.89 kB 🔴 +6.89 kB 🔴 +1.73 kB 🔴 +1.49 kB
assets/releaseStore-9-raeV0J.js (new) 6.72 kB 🔴 +6.72 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/releaseStore-CAmcXePV.js (removed) 6.72 kB 🟢 -6.72 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/systemStatsStore-BcgvwE12.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.74 kB 🔴 +1.47 kB
assets/systemStatsStore-zqREtFhj.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.74 kB 🟢 -1.47 kB
assets/userStore-3KkcwdkT.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +899 B 🔴 +795 B
assets/userStore-DAq594dt.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -896 B 🟢 -795 B
assets/audioService-6Bpsv67W.js (new) 1.71 kB 🔴 +1.71 kB 🔴 +831 B 🔴 +731 B
assets/audioService-DJ_MT_ZO.js (removed) 1.71 kB 🟢 -1.71 kB 🟢 -830 B 🟢 -722 B
assets/dialogService-B8dhyJAS.js (new) 98 B 🔴 +98 B 🔴 +97 B 🔴 +86 B
assets/dialogService-DSHmeS61.js (removed) 98 B 🟢 -98 B 🟢 -97 B 🟢 -93 B
assets/releaseStore-BIkWU3Yh.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +88 B
assets/releaseStore-Bqe-RGQ3.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -91 B
assets/settingStore-CqcgDKFj.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +87 B
assets/settingStore-F6WlHRwF.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -73 B
assets/assetsStore-BIdsCXTU.js (new) 94 B 🔴 +94 B 🔴 +92 B 🔴 +84 B
assets/assetsStore-iV2G_BUZ.js (removed) 94 B 🟢 -94 B 🟢 -92 B 🟢 -83 B
assets/api-D6OaCD1i.js (removed) 62 B 🟢 -62 B 🟢 -74 B 🟢 -66 B
assets/api-Dmw9rzTJ.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-5kNVF1fB.js (removed) 236 kB 🟢 -236 kB 🟢 -53.1 kB 🟢 -43.2 kB
assets/useConflictDetection-DAu33rfa.js (new) 236 kB 🔴 +236 kB 🔴 +53.1 kB 🔴 +43.2 kB
assets/useLayerEditorSession-D5JlAPGZ.js (new) 158 kB 🔴 +158 kB 🔴 +40.8 kB 🔴 +34.3 kB
assets/useLayerEditorSession-DIQxO9xo.js (removed) 158 kB 🟢 -158 kB 🟢 -40.8 kB 🟢 -34.3 kB
assets/useLoad3d-DMPJHbaS.js (removed) 25.8 kB 🟢 -25.8 kB 🟢 -5.8 kB 🟢 -5.15 kB
assets/useLoad3d-lSr0geDA.js (new) 25.8 kB 🔴 +25.8 kB 🔴 +5.8 kB 🔴 +5.14 kB
assets/useLoad3dViewer-fTAEzMGf.js (removed) 21.2 kB 🟢 -21.2 kB 🟢 -4.98 kB 🟢 -4.37 kB
assets/useLoad3dViewer-rkatTpfc.js (new) 21.2 kB 🔴 +21.2 kB 🔴 +4.98 kB 🔴 +4.37 kB
assets/useImageCrop-BdA-LxED.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -3.42 kB 🟢 -2.99 kB
assets/useImageCrop-DJ-tvYVY.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +3.42 kB 🔴 +2.98 kB
assets/useDowngradeToPersonal-CIPr1nmt.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +2.73 kB 🔴 +2.35 kB
assets/useDowngradeToPersonal-qPhBpFcl.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -2.74 kB 🟢 -2.35 kB
assets/useFeatureFlags-B_SvPVlp.js (removed) 7.32 kB 🟢 -7.32 kB 🟢 -2.06 kB 🟢 -1.74 kB
assets/useFeatureFlags-fl6wsIHv.js (new) 7.32 kB 🔴 +7.32 kB 🔴 +2.06 kB 🔴 +1.74 kB
assets/useCompositorLayers-C8EkdpGc.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +898 B 🔴 +805 B
assets/useCompositorLayers-DlWflmLu.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -899 B 🟢 -806 B
assets/useExternalLink-D3VIRdy9.js (new) 2.85 kB 🔴 +2.85 kB 🔴 +1.07 kB 🔴 +924 B
assets/useExternalLink-gepO665q.js (removed) 2.85 kB 🟢 -2.85 kB 🟢 -1.07 kB 🟢 -928 B
assets/assetPreviewUtil-CjuTjLbv.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -968 B 🟢 -845 B
assets/assetPreviewUtil-mNAyskQ1.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +970 B 🔴 +848 B
assets/downloadUtil-BOhRaIzE.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -907 B 🟢 -729 B
assets/downloadUtil-ClmmwjjV.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +906 B 🔴 +727 B
assets/useUpstreamValue-BvsFwdHl.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +758 B 🔴 +684 B
assets/useUpstreamValue-D-Pio9GS.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -758 B 🟢 -672 B
assets/useWorkspaceTierLabel-DVn94v9-.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -814 B 🟢 -698 B
assets/useWorkspaceTierLabel-jD1yLeyT.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +813 B 🔴 +697 B
assets/useErrorHandling-JNUwqPSy.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -614 B 🟢 -522 B
assets/useErrorHandling-kCJSPi-c.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +614 B 🔴 +522 B
assets/subscriptionCheckoutUtil-CJi12oK6.js (removed) 877 B 🟢 -877 B 🟢 -521 B 🟢 -432 B
assets/subscriptionCheckoutUtil-CYT1Qw-_.js (new) 877 B 🔴 +877 B 🔴 +522 B 🔴 +437 B
assets/useSessionCookie-SNnf3vWl.js (new) 652 B 🔴 +652 B 🔴 +337 B 🔴 +290 B
assets/useSessionCookie-x1007x8p.js (removed) 652 B 🟢 -652 B 🟢 -337 B 🟢 -292 B
assets/useLoad3d-C4z9v9dX.js (new) 311 B 🔴 +311 B 🔴 +163 B 🔴 +148 B
assets/useLoad3d-DuDe5L5W.js (removed) 311 B 🟢 -311 B 🟢 -164 B 🟢 -147 B
assets/useSessionCookie-CSKHbZhV.js (removed) 101 B 🟢 -101 B 🟢 -86 B 🟢 -78 B
assets/useSessionCookie-CygnYoXw.js (new) 101 B 🔴 +101 B 🔴 +86 B 🔴 +82 B
assets/useFeatureFlags-BWcane5r.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +78 B
assets/useFeatureFlags-DKVb4S0r.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -84 B
assets/useLoad3dViewer-C-dezxSy.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -86 B
assets/useLoad3dViewer-DZSfxYl7.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +83 B
assets/useCurrentUser-B0iLGja9.js (new) 94 B 🔴 +94 B 🔴 +95 B 🔴 +86 B
assets/useCurrentUser-CxJy4kF0.js (removed) 94 B 🟢 -94 B 🟢 -95 B 🟢 -96 B

Status: 21 added / 21 removed / 16 unchanged

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

External libraries and shared vendor chunks

Status: 18 unchanged

Other — 14.2 MB (baseline 14.2 MB) • 🔴 +375 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/main-xbVZhs53.js (new) 207 kB 🔴 +207 kB 🔴 +60.2 kB 🔴 +50.5 kB
assets/main-C2VbHNI1.js (removed) 207 kB 🟢 -207 kB 🟢 -60.1 kB 🟢 -50.4 kB
assets/core-Cmr0jGBc.js (removed) 114 kB 🟢 -114 kB 🟢 -29.7 kB 🟢 -25.1 kB
assets/core-Cub1bESu.js (new) 114 kB 🔴 +114 kB 🔴 +29.7 kB 🔴 +25.1 kB
assets/WidgetSelect-DHDc0NEd.js (removed) 88.8 kB 🟢 -88.8 kB 🟢 -20.1 kB 🟢 -17.2 kB
assets/WidgetSelect-jCVW42rt.js (new) 88.8 kB 🔴 +88.8 kB 🔴 +20.1 kB 🔴 +17.2 kB
assets/SubscriptionPanelContentWorkspace-DG7YlOlc.js (new) 81.2 kB 🔴 +81.2 kB 🔴 +16.1 kB 🔴 +13.9 kB
assets/SubscriptionPanelContentWorkspace-DQOf7x4Y.js (removed) 81.2 kB 🟢 -81.2 kB 🟢 -16.1 kB 🟢 -13.9 kB
assets/Load3D-4BxPiUFt.js (removed) 73.3 kB 🟢 -73.3 kB 🟢 -12.1 kB 🟢 -10.3 kB
assets/Load3D-Ce-Tc8Jh.js (new) 73.3 kB 🔴 +73.3 kB 🔴 +12.1 kB 🔴 +10.3 kB
assets/WidgetVideoEdit-63gNcmv9.js (new) 67.5 kB 🔴 +67.5 kB 🔴 +15.7 kB 🔴 +13.9 kB
assets/WidgetVideoEdit-B9F4PxjG.js (removed) 67.5 kB 🟢 -67.5 kB 🟢 -15.7 kB 🟢 -13.9 kB
assets/SubscriptionTransitionPreviewWorkspace-BhrIVDG4.js (new) 66.6 kB 🔴 +66.6 kB 🔴 +13.5 kB 🔴 +11.7 kB
assets/SubscriptionTransitionPreviewWorkspace-Ss4jLoov.js (removed) 66.6 kB 🟢 -66.6 kB 🟢 -13.5 kB 🟢 -11.7 kB
assets/WorkspaceSettingsPanelContent-DprnNBWm.js (removed) 58.2 kB 🟢 -58.2 kB 🟢 -12.4 kB 🟢 -10.8 kB
assets/WorkspaceSettingsPanelContent-DUpykpYb.js (new) 58.2 kB 🔴 +58.2 kB 🔴 +12.4 kB 🔴 +10.8 kB
assets/Preview3d-DdyZD2oM.js (new) 50.9 kB 🔴 +50.9 kB 🔴 +8.32 kB 🔴 +7.24 kB
assets/Preview3d-VqeOg_T1.js (removed) 50.9 kB 🟢 -50.9 kB 🟢 -8.32 kB 🟢 -7.24 kB
assets/main-CabppSTg.js (new) 45.4 kB 🔴 +45.4 kB 🔴 +13.2 kB 🔴 +11.4 kB
assets/main-D0Jvms3f.js (removed) 45.4 kB 🟢 -45.4 kB 🟢 -13.2 kB 🟢 -11.5 kB
assets/SubscriptionRequiredDialogContentUnified-FivSb3n1.js (new) 42.7 kB 🔴 +42.7 kB 🔴 +9.39 kB 🔴 +8.19 kB
assets/SubscriptionRequiredDialogContentUnified-v5tb64TW.js (removed) 42.7 kB 🟢 -42.7 kB 🟢 -9.39 kB 🟢 -8.18 kB
assets/LayerEditorContent-DCKOZomD.js (removed) 42.5 kB 🟢 -42.5 kB 🟢 -9.62 kB 🟢 -8.43 kB
assets/LayerEditorContent-h570nZMg.js (new) 42.5 kB 🔴 +42.5 kB 🔴 +9.62 kB 🔴 +8.43 kB
assets/WidgetBoundingBoxes-CccMuVNb.js (removed) 33.7 kB 🟢 -33.7 kB 🟢 -9.16 kB 🟢 -8.12 kB
assets/WidgetBoundingBoxes-DlrJR1Bf.js (new) 33.7 kB 🔴 +33.7 kB 🔴 +9.16 kB 🔴 +8.14 kB
assets/WidgetPainter-CLiFV7Hf.js (removed) 32.6 kB 🟢 -32.6 kB 🟢 -7.88 kB 🟢 -6.98 kB
assets/WidgetPainter-CZiviVEY.js (new) 32.6 kB 🔴 +32.6 kB 🔴 +7.88 kB 🔴 +6.98 kB
assets/Load3dViewerContent-CTj6Lmhl.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -6.28 kB 🟢 -5.44 kB
assets/Load3dViewerContent-DdO2d2uf.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +6.28 kB 🔴 +5.45 kB
assets/HdrViewerContent-Cq_bnyKq.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +8.25 kB 🔴 +7.28 kB
assets/HdrViewerContent-G4KqaKRJ.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -8.25 kB 🟢 -7.28 kB
assets/SubscriptionRequiredDialogContent-BzL-XutL.js (new) 26.9 kB 🔴 +26.9 kB 🔴 +6.36 kB 🔴 +5.6 kB
assets/SubscriptionRequiredDialogContent-DQf0nQ8h.js (removed) 26.9 kB 🟢 -26.9 kB 🟢 -6.36 kB 🟢 -5.61 kB
assets/SubscriptionRequiredDialogContentWorkspace-AR1StnXH.js (removed) 25.1 kB 🟢 -25.1 kB 🟢 -5.81 kB 🟢 -5.12 kB
assets/SubscriptionRequiredDialogContentWorkspace-BB0g1rgw.js (new) 25.1 kB 🔴 +25.1 kB 🔴 +5.81 kB 🔴 +5.13 kB
assets/CreditsTile-BEZBRocK.js (removed) 24.9 kB 🟢 -24.9 kB 🟢 -6.65 kB 🟢 -5.84 kB
assets/CreditsTile-DyVoYABE.js (new) 24.9 kB 🔴 +24.9 kB 🔴 +6.65 kB 🔴 +5.83 kB
assets/load3d-CO0_V7CH.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.41 kB 🟢 -4.68 kB
assets/load3d-DZCtji0S.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.4 kB 🔴 +4.68 kB
assets/CurrentUserPopoverWorkspace-3j4snmxu.js (removed) 21.9 kB 🟢 -21.9 kB 🟢 -5 kB 🟢 -4.44 kB
assets/CurrentUserPopoverWorkspace-JDcQPuU2.js (new) 21.9 kB 🔴 +21.9 kB 🔴 +5 kB 🔴 +4.44 kB
assets/SignInContent-DD3W6MoU.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.18 kB 🟢 -4.54 kB
assets/SignInContent-oharyxFn.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.18 kB 🔴 +4.54 kB
assets/i18n-CAHdjfEg.js (new) 16.7 kB 🔴 +16.7 kB 🔴 +4.55 kB 🔴 +3.81 kB
assets/i18n-CYd0Ci8m.js (removed) 16.7 kB 🟢 -16.7 kB 🟢 -4.55 kB 🟢 -3.81 kB
assets/WidgetRecordAudio-8tkVaqTh.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.6 kB 🔴 +4.1 kB
assets/WidgetRecordAudio-CsJ6FBgH.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.61 kB 🟢 -4.11 kB
assets/WidgetInputNumber-9wal2469.js (new) 13.9 kB 🔴 +13.9 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/WidgetInputNumber-CKalhiSA.js (removed) 13.9 kB 🟢 -13.9 kB 🟢 -3.63 kB 🟢 -3.22 kB
assets/WidgetRange-B9UmHhkd.js (new) 13.7 kB 🔴 +13.7 kB 🔴 +3.55 kB 🔴 +3.13 kB
assets/WidgetRange-p7xLXjWk.js (removed) 13.7 kB 🟢 -13.7 kB 🟢 -3.55 kB 🟢 -3.13 kB
assets/WaveAudioPlayer-BTdNn4fH.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.46 kB 🟢 -3.03 kB
assets/WaveAudioPlayer-CLriHYIP.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.46 kB 🔴 +3.04 kB
assets/WidgetCurve-CqJGI9zX.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.48 kB 🔴 +3.15 kB
assets/WidgetCurve-DccnFFTS.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.48 kB 🟢 -3.15 kB
assets/AudioPreviewPlayer-BTo1t_wM.js (removed) 10.6 kB 🟢 -10.6 kB 🟢 -3.05 kB 🟢 -2.72 kB
assets/AudioPreviewPlayer-COCYtAA8.js (new) 10.6 kB 🔴 +10.6 kB 🔴 +3.05 kB 🔴 +2.72 kB
assets/TeamWorkspacesDialogContent-CihTdn6m.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +2.97 kB 🔴 +2.62 kB
assets/TeamWorkspacesDialogContent-DLU33hLB.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -2.97 kB 🟢 -2.63 kB
assets/onboardingCloudRoutes-CKCqUCAt.js (new) 9.49 kB 🔴 +9.49 kB 🔴 +2.85 kB 🔴 +2.44 kB
assets/onboardingCloudRoutes-Dhk6ZicO.js (removed) 9.49 kB 🟢 -9.49 kB 🟢 -2.85 kB 🟢 -2.44 kB
assets/Load3DConfiguration-D4KA9aNS.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.61 kB 🔴 +2.3 kB
assets/Load3DConfiguration-DPi6VzRk.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.61 kB 🟢 -2.3 kB
assets/WidgetImageCrop-DEFj8GjT.js (removed) 8.49 kB 🟢 -8.49 kB 🟢 -2.66 kB 🟢 -2.34 kB
assets/WidgetImageCrop-p9zgMGR9.js (new) 8.49 kB 🔴 +8.49 kB 🔴 +2.66 kB 🔴 +2.36 kB
assets/SetMemberCreditLimitDialogContent-BJPP2Alr.js (removed) 8.47 kB 🟢 -8.47 kB 🟢 -2.34 kB 🟢 -2.06 kB
assets/SetMemberCreditLimitDialogContent-dpF3GgTM.js (new) 8.47 kB 🔴 +8.47 kB 🔴 +2.34 kB 🔴 +2.05 kB
assets/nodeTemplates-AVnpfWGW.js (new) 8.32 kB 🔴 +8.32 kB 🔴 +2.85 kB 🔴 +2.5 kB
assets/nodeTemplates-GMEjAsPU.js (removed) 8.32 kB 🟢 -8.32 kB 🟢 -2.85 kB 🟢 -2.5 kB
assets/NightlySurveyController-Q35hFw7H.js (new) 7.5 kB 🔴 +7.5 kB 🔴 +2.55 kB 🔴 +2.25 kB
assets/NightlySurveyController-wqdujswm.js (removed) 7.5 kB 🟢 -7.5 kB 🟢 -2.55 kB 🟢 -2.25 kB
assets/CloudRunButtonWrapper-B8BwrAZu.js (new) 7.29 kB 🔴 +7.29 kB 🔴 +2.29 kB 🔴 +2.01 kB
assets/CloudRunButtonWrapper-dA3xl7ZQ.js (removed) 7.29 kB 🟢 -7.29 kB 🟢 -2.29 kB 🟢 -2.01 kB
assets/WidgetWithControl-CxJnMz3v.js (removed) 6.51 kB 🟢 -6.51 kB 🟢 -2.67 kB 🟢 -2.33 kB
assets/WidgetWithControl-DsKovxc4.js (new) 6.51 kB 🔴 +6.51 kB 🔴 +2.67 kB 🔴 +2.37 kB
assets/missingModelMetadata-beOEMdPr.js (removed) 6.45 kB 🟢 -6.45 kB 🟢 -2.21 kB 🟢 -1.93 kB
assets/missingModelMetadata-BI7FJqAE.js (new) 6.45 kB 🔴 +6.45 kB 🔴 +2.21 kB 🔴 +1.93 kB
assets/CancelSubscriptionDialogContent-B_slt6HJ.js (new) 5.97 kB 🔴 +5.97 kB 🔴 +1.98 kB 🔴 +1.74 kB
assets/CancelSubscriptionDialogContent-BwHHryuX.js (removed) 5.97 kB 🟢 -5.97 kB 🟢 -1.98 kB 🟢 -1.74 kB
assets/main-CEUpmmm4.js (removed) 5.92 kB 🟢 -5.92 kB 🟢 -1.91 kB 🟢 -1.59 kB
assets/main-ijDB0ljy.js (new) 5.92 kB 🔴 +5.92 kB 🔴 +1.91 kB 🔴 +1.59 kB
assets/load3dPreviewExtensions-DkS1V3V0.js (removed) 5.88 kB 🟢 -5.88 kB 🟢 -1.81 kB 🟢 -1.6 kB
assets/load3dPreviewExtensions-DoO5SQPn.js (new) 5.88 kB 🔴 +5.88 kB 🔴 +1.81 kB 🔴 +1.6 kB
assets/launchCancellationFlow-BVekx2VM.js (new) 5.18 kB 🔴 +5.18 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/launchCancellationFlow-DDYYfyxa.js (removed) 5.18 kB 🟢 -5.18 kB 🟢 -1.78 kB 🟢 -1.58 kB
assets/CreateWorkspaceDialogContent-BzoCmYgw.js (new) 5.12 kB 🔴 +5.12 kB 🔴 +1.79 kB 🔴 +1.55 kB
assets/CreateWorkspaceDialogContent-CKXOK_iq.js (removed) 5.12 kB 🟢 -5.12 kB 🟢 -1.79 kB 🟢 -1.55 kB
assets/ChangeMemberRoleDialogContent-CSkAD7WC.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/ChangeMemberRoleDialogContent-DVpl8Njz.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/InviteMemberDialogContent-BW8TXU1_.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.64 kB 🔴 +1.44 kB
assets/InviteMemberDialogContent-KrooUJJP.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.65 kB 🟢 -1.44 kB
assets/EditWorkspaceDialogContent-CsglqTQA.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.76 kB 🔴 +1.53 kB
assets/EditWorkspaceDialogContent-CYhwxoqC.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.76 kB 🟢 -1.53 kB
assets/WidgetTextarea-BmLClkCO.js (removed) 4.83 kB 🟢 -4.83 kB 🟢 -1.88 kB 🟢 -1.64 kB
assets/WidgetTextarea-jBM4gNdf.js (new) 4.83 kB 🔴 +4.83 kB 🔴 +1.88 kB 🔴 +1.65 kB
assets/saveMesh-CKI_nO23.js (removed) 4.76 kB 🟢 -4.76 kB 🟢 -1.52 kB 🟢 -1.34 kB
assets/saveMesh-CtcMXXpZ.js (new) 4.76 kB 🔴 +4.76 kB 🔴 +1.52 kB 🔴 +1.34 kB
assets/WorkspacePanelContent-BhYKBYlw.js (removed) 4.74 kB 🟢 -4.74 kB 🟢 -1.63 kB 🟢 -1.44 kB
assets/WorkspacePanelContent-efex6K09.js (new) 4.74 kB 🔴 +4.74 kB 🔴 +1.63 kB 🔴 +1.44 kB
assets/ValueControlPopover-BiAuNQNo.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.55 kB 🟢 -1.38 kB
assets/ValueControlPopover-CrOmxwbz.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.55 kB 🔴 +1.38 kB
assets/ApiNodesSignInContent-CJWJw3PM.js (removed) 4.08 kB 🟢 -4.08 kB 🟢 -1.31 kB 🟢 -1.16 kB
assets/ApiNodesSignInContent-jzfWuHPI.js (new) 4.08 kB 🔴 +4.08 kB 🔴 +1.31 kB 🔴 +1.15 kB
assets/DeleteWorkspaceDialogContent-1QdCPLmr.js (removed) 3.84 kB 🟢 -3.84 kB 🟢 -1.44 kB 🟢 -1.24 kB
assets/DeleteWorkspaceDialogContent-C1LvOO0b.js (new) 3.84 kB 🔴 +3.84 kB 🔴 +1.44 kB 🔴 +1.24 kB
assets/RemoveMemberDialogContent-BCY4USS1.js (new) 3.76 kB 🔴 +3.76 kB 🔴 +1.39 kB 🔴 +1.2 kB
assets/RemoveMemberDialogContent-BY_6cJSK.js (removed) 3.76 kB 🟢 -3.76 kB 🟢 -1.39 kB 🟢 -1.2 kB
assets/RevokeInviteDialogContent-BwcocAnl.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.39 kB 🟢 -1.21 kB
assets/RevokeInviteDialogContent-CLzyJCIM.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.39 kB 🔴 +1.21 kB
assets/LeaveWorkspaceDialogContent-BQHKkBX8.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.38 kB 🔴 +1.19 kB
assets/LeaveWorkspaceDialogContent-ujTWWYx9.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.39 kB 🟢 -1.19 kB
assets/InviteMemberUpsellDialogContent-DGz-_ujd.js (new) 3.47 kB 🔴 +3.47 kB 🔴 +1.24 kB 🔴 +1.09 kB
assets/InviteMemberUpsellDialogContent-H-m1kecl.js (removed) 3.47 kB 🟢 -3.47 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/workspaceCheckoutTelemetry-DffbmzZJ.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.52 kB 🔴 +1.33 kB
assets/workspaceCheckoutTelemetry-Dk0SH68a.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.52 kB 🟢 -1.32 kB
assets/GlobalToast-11j2suVW.js (new) 3.25 kB 🔴 +3.25 kB 🔴 +1.3 kB 🔴 +1.11 kB
assets/GlobalToast-D_xIMq3f.js (removed) 3.25 kB 🟢 -3.25 kB 🟢 -1.3 kB 🟢 -1.11 kB
assets/Media3DTop-BlArLr9E.js (removed) 3.21 kB 🟢 -3.21 kB 🟢 -1.26 kB 🟢 -1.11 kB
assets/Media3DTop-CBFmZn79.js (new) 3.21 kB 🔴 +3.21 kB 🔴 +1.26 kB 🔴 +1.11 kB
assets/load3dAdvanced-CIeLbuC-.js (removed) 2.82 kB 🟢 -2.82 kB 🟢 -1.09 kB 🟢 -957 B
assets/load3dAdvanced-Jv8t4NoC.js (new) 2.82 kB 🔴 +2.82 kB 🔴 +1.09 kB 🔴 +955 B
assets/SubscribeToRun-BtSTkO_x.js (removed) 2.39 kB 🟢 -2.39 kB 🟢 -1.03 kB 🟢 -910 B
assets/SubscribeToRun-DWrF3Ksq.js (new) 2.39 kB 🔴 +2.39 kB 🔴 +1.03 kB 🔴 +934 B
assets/MediaAudioTop-cKzQmdd6.js (new) 1.62 kB 🔴 +1.62 kB 🔴 +808 B 🔴 +673 B
assets/MediaAudioTop-DNEErIYI.js (removed) 1.62 kB 🟢 -1.62 kB 🟢 -807 B 🟢 -668 B
assets/signInSchema-Cv2vxR9H.js (new) 1.55 kB 🔴 +1.55 kB 🔴 +554 B 🔴 +516 B
assets/signInSchema-DgpC9WBv.js (removed) 1.55 kB 🟢 -1.55 kB 🟢 -554 B 🟢 -481 B
assets/cloudSessionCookie-Bg_OnhTK.js (new) 933 B 🔴 +933 B 🔴 +431 B 🔴 +378 B
assets/cloudSessionCookie-DpkUAPKH.js (removed) 933 B 🟢 -933 B 🟢 -434 B 🟢 -378 B
assets/cloudBadges-BDZisT84.js (new) 922 B 🔴 +922 B 🔴 +514 B 🔴 +441 B
assets/cloudBadges-tXhujtBZ.js (removed) 922 B 🟢 -922 B 🟢 -514 B 🟢 -442 B
assets/Load3DAdvanced-B3Pg8das.js (new) 761 B 🔴 +761 B 🔴 +422 B 🔴 +358 B
assets/Load3DAdvanced-Dwdwc_Cg.js (removed) 761 B 🟢 -761 B 🟢 -422 B 🟢 -361 B
assets/nightlyBadges-BQHVajnL.js (new) 411 B 🔴 +411 B 🔴 +272 B 🔴 +264 B
assets/nightlyBadges-By8Bb95B.js (removed) 411 B 🟢 -411 B 🟢 -271 B 🟢 -231 B
assets/Load3dViewerContent-BncJeyxW.js (removed) 137 B 🟢 -137 B 🟢 -103 B 🟢 -91 B
assets/Load3dViewerContent-CMryyMOh.js (new) 137 B 🔴 +137 B 🔴 +103 B 🔴 +91 B
assets/missingModelMetadata-BbzupG2N.js (new) 125 B 🔴 +125 B 🔴 +103 B 🔴 +109 B
assets/missingModelMetadata-DNklTNOi.js (removed) 125 B 🟢 -125 B 🟢 -103 B 🟢 -102 B
assets/Load3DAdvanced-C8eN3g97.js (removed) 122 B 🟢 -122 B 🟢 -97 B 🟢 -89 B
assets/Load3DAdvanced-CZcgLvE8.js (new) 122 B 🔴 +122 B 🔴 +97 B 🔴 +97 B
assets/WidgetLegacy-CKmW5nBc.js (new) 117 B 🔴 +117 B 🔴 +106 B 🔴 +103 B
assets/WidgetLegacy-VQ3taxzH.js (removed) 117 B 🟢 -117 B 🟢 -106 B 🟢 -95 B
assets/workflowDraftStoreV2-Btx9rVXS.js (new) 112 B 🔴 +112 B 🔴 +101 B 🔴 +109 B
assets/workflowDraftStoreV2-DZwhNh3Y.js (removed) 112 B 🟢 -112 B 🟢 -101 B 🟢 -108 B
assets/Load3D-C4y6rDUo.js (new) 98 B 🔴 +98 B 🔴 +89 B 🔴 +89 B
assets/Load3D-DIsMd6CU.js (removed) 98 B 🟢 -98 B 🟢 -89 B 🟢 -79 B
assets/i18n-Cf9qupbz.js (removed) 97 B 🟢 -97 B 🟢 -92 B 🟢 -87 B
assets/i18n-SSK4RSF3.js (new) 97 B 🔴 +97 B 🔴 +92 B 🔴 +101 B
assets/changeTracker-BpzPr4bf.js (removed) 91 B 🟢 -91 B 🟢 -93 B 🟢 -83 B
assets/changeTracker-Dfbp1k8H.js (new) 91 B 🔴 +91 B 🔴 +93 B 🔴 +82 B

Status: 76 added / 76 removed / 210 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.1 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.0 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 60.0 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.7 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 73.8 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 78.4 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.9 MB heap
legacy-node-drag: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 88.3 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.8 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.7 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 62.8 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 61.9 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 141ms TBT · 91.4 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 79.2 MB heap
vue-large-graph-idle: · 55.4 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 169.0 MB heap
vue-large-graph-pan: · 56.3 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 97ms TBT · 173.0 MB heap
workflow-execution: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 60.7 MB heap

⚠️ 6 regressions detected

Show regressions
Metric Baseline PR (median) Δ Sig
canvas-idle: task duration 387ms 505ms +30% ⚠️ z=3.5
canvas-mouse-sweep: layout duration 3ms 4ms +36% ⚠️ z=2.3
canvas-mouse-sweep: task duration 679ms 1038ms +53% ⚠️ z=3.0
large-graph-pan: task duration 929ms 1199ms +29% ⚠️ z=2.7
minimap-idle: task duration 488ms 649ms +33% ⚠️ z=2.6
subgraph-idle: task duration 383ms 508ms +32% ⚠️ z=4.4
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms +0% z=-0.1
canvas-idle: p95 frame time 17ms 17ms +1%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 6ms 8ms +32% z=-3.0
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 10 9 -15% z=-4.7
canvas-idle: task duration 387ms 505ms +30% ⚠️ z=3.5
canvas-idle: script duration 6ms 7ms +28% z=-8.1
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 60.2 MB 67.1 MB +11%
canvas-idle: DOM nodes -281 -283 +1% z=-239.6
canvas-idle: event listeners -151 -181 +20% z=-40.7
canvas-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.9
canvas-mouse-sweep: p95 frame time 17ms 17ms +0%
canvas-mouse-sweep: layout duration 3ms 4ms +36% ⚠️ z=2.3
canvas-mouse-sweep: style recalc duration 27ms 45ms +64% z=0.6
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 71 77 +8% z=-0.9
canvas-mouse-sweep: task duration 679ms 1038ms +53% ⚠️ z=3.0
canvas-mouse-sweep: script duration 82ms 133ms +61% z=-0.5
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 55.0 MB 65.0 MB +18%
canvas-mouse-sweep: DOM nodes -282 -279 -1% z=-132.0
canvas-mouse-sweep: event listeners -151 -166 +10% z=-41.8
canvas-zoom-sweep: avg frame time 17ms 17ms +0% z=0.5
canvas-zoom-sweep: p95 frame time 17ms 17ms +0%
canvas-zoom-sweep: layout duration 1ms 1ms -2% z=-2.3
canvas-zoom-sweep: style recalc duration 13ms 16ms +20% z=-1.9
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 30 31 +2% z=-1.7
canvas-zoom-sweep: task duration 287ms 363ms +26% z=1.6
canvas-zoom-sweep: script duration 9ms 10ms +22% z=-5.6
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 60.2 MB 60.0 MB -0%
canvas-zoom-sweep: DOM nodes 76 76 -1% z=-4.7
canvas-zoom-sweep: event listeners 19 19 +0% z=-0.9
dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.5
dom-widget-clipping: p95 frame time 17ms 17ms +0%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 6ms 7ms +16% z=-3.7
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 11 10 -9% z=-6.2
dom-widget-clipping: task duration 288ms 371ms +29% z=0.4
dom-widget-clipping: script duration 43ms 57ms +34% z=-3.3
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 67.5 MB 67.7 MB +0%
dom-widget-clipping: DOM nodes 18 16 -11% z=-4.3
dom-widget-clipping: event listeners 0 2 variance too high
large-graph-idle: avg frame time 17ms 17ms -0% z=-0.2
large-graph-idle: p95 frame time 17ms 17ms +0%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 6ms 7ms +14% z=-5.3
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 9 8 -17% z=-13.1
large-graph-idle: task duration 489ms 594ms +22% z=1.0
large-graph-idle: script duration 12ms 15ms +22% z=-8.3
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 60.1 MB 73.8 MB +23%
large-graph-idle: DOM nodes -282 -263 -7% z=-317.7
large-graph-idle: event listeners -179 -149 -17% z=-28.7
large-graph-pan: avg frame time 17ms 17ms -0% z=-0.2
large-graph-pan: p95 frame time 17ms 17ms +0%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 14ms 13ms -4% z=-5.2
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 69 68 -1% z=-2.4
large-graph-pan: task duration 929ms 1199ms +29% ⚠️ z=2.7
large-graph-pan: script duration 255ms 343ms +35% z=-3.3
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 72.6 MB 78.4 MB +8%
large-graph-pan: DOM nodes -264 -276 +4% z=-178.5
large-graph-pan: event listeners -147 -164 +12% z=-204.0
large-graph-zoom: avg frame time 17ms 17ms -0%
large-graph-zoom: p95 frame time 17ms 17ms +0%
large-graph-zoom: layout duration 7ms 7ms +11%
large-graph-zoom: style recalc duration 12ms 15ms +19%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 64 65 +1%
large-graph-zoom: task duration 1081ms 1437ms +33%
large-graph-zoom: script duration 328ms 400ms +22%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 74.4 MB 70.9 MB -5%
large-graph-zoom: DOM nodes 8 -280 -3594%
large-graph-zoom: event listeners 8 -165 -2163%
legacy-node-drag: avg frame time 17ms 17ms +0%
legacy-node-drag: p95 frame time 17ms 17ms +0%
legacy-node-drag: layout duration 0ms 0ms +0%
legacy-node-drag: style recalc duration 10ms 10ms -0%
legacy-node-drag: layout count 0 0 +0%
legacy-node-drag: style recalc count 47 47 -1%
legacy-node-drag: task duration 1201ms 1452ms +21%
legacy-node-drag: script duration 379ms 469ms +23%
legacy-node-drag: TBT 0ms 0ms +0%
legacy-node-drag: heap used 59.9 MB 88.3 MB +47%
legacy-node-drag: DOM nodes -236 13 -106%
legacy-node-drag: event listeners 33 186 +464%
minimap-idle: avg frame time 17ms 17ms +0% z=-0.4
minimap-idle: p95 frame time 17ms 17ms -0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 6ms 10ms +75% z=0.3
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 9 9 -6% z=-1.6
minimap-idle: task duration 488ms 649ms +33% ⚠️ z=2.6
minimap-idle: script duration 13ms 15ms +14% z=-8.4
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 71.9 MB 64.8 MB -10%
minimap-idle: DOM nodes -267 -276 +3% z=-215.4
minimap-idle: event listeners -149 -163 +9% z=-253.8
subgraph-dom-widget-clipping: avg frame time 17ms 17ms -0% z=-0.4
subgraph-dom-widget-clipping: p95 frame time 17ms 17ms +0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 9ms 10ms +14% z=-2.6
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 47 46 -3% z=-4.2
subgraph-dom-widget-clipping: task duration 301ms 404ms +34% z=1.4
subgraph-dom-widget-clipping: script duration 93ms 121ms +30% z=-1.2
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 68.4 MB 68.7 MB +0%
subgraph-dom-widget-clipping: DOM nodes 20 17 -15% z=-4.6
subgraph-dom-widget-clipping: event listeners 6 8 +33% z=-1.4
subgraph-idle: avg frame time 17ms 17ms +0% z=0.4
subgraph-idle: p95 frame time 17ms 17ms +0%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 6ms 8ms +32% z=-3.2
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 9 9 +0% z=-2.9
subgraph-idle: task duration 383ms 508ms +32% ⚠️ z=4.4
subgraph-idle: script duration 6ms 8ms +34% z=-4.7
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 55.1 MB 62.8 MB +14%
subgraph-idle: DOM nodes -282 -280 -1% z=-201.9
subgraph-idle: event listeners -151 -165 +9% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.1
subgraph-mouse-sweep: p95 frame time 17ms 17ms -1%
subgraph-mouse-sweep: layout duration 3ms 5ms +44% z=0.4
subgraph-mouse-sweep: style recalc duration 28ms 40ms +44% z=-0.7
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 75 76 +1% z=-2.1
subgraph-mouse-sweep: task duration 628ms 835ms +33% z=1.0
subgraph-mouse-sweep: script duration 67ms 88ms +32% z=-1.9
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 57.7 MB 61.9 MB +7%
subgraph-mouse-sweep: DOM nodes -280 -281 +0% z=-155.5
subgraph-mouse-sweep: event listeners -151 -167 +11% variance too high
subgraph-transition-enter: avg frame time 17ms 17ms -0%
subgraph-transition-enter: p95 frame time 17ms 17ms -1%
subgraph-transition-enter: layout duration 11ms 15ms +42%
subgraph-transition-enter: style recalc duration 25ms 33ms +31%
subgraph-transition-enter: layout count 16 14 -13%
subgraph-transition-enter: style recalc count 21 19 -10%
subgraph-transition-enter: task duration 714ms 998ms +40%
subgraph-transition-enter: script duration 12ms 18ms +45%
subgraph-transition-enter: TBT 93ms 141ms +52%
subgraph-transition-enter: heap used 95.4 MB 91.4 MB -4%
subgraph-transition-enter: DOM nodes 13673 13673 +0%
subgraph-transition-enter: event listeners 2373 2373 +0%
viewport-pan-sweep: avg frame time 17ms 17ms +0%
viewport-pan-sweep: p95 frame time 17ms 17ms +0%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 36ms 37ms +2%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 249 249 +0%
viewport-pan-sweep: task duration 3165ms 4350ms +37%
viewport-pan-sweep: script duration 796ms 1076ms +35%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 80.0 MB 79.2 MB -1%
viewport-pan-sweep: DOM nodes -263 -264 +0%
viewport-pan-sweep: event listeners -133 -131 -2%
vue-large-graph-idle: avg frame time 17ms 18ms +5%
vue-large-graph-idle: p95 frame time 17ms 17ms -0%
vue-large-graph-idle: layout duration 0ms 0ms +0%
vue-large-graph-idle: style recalc duration 0ms 0ms +0%
vue-large-graph-idle: layout count 0 0 +0%
vue-large-graph-idle: style recalc count 0 0 +0%
vue-large-graph-idle: task duration 14237ms 16668ms +17%
vue-large-graph-idle: script duration 94ms 108ms +15%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 169.1 MB 169.0 MB -0%
vue-large-graph-idle: DOM nodes -8312 -8312 +0%
vue-large-graph-idle: event listeners -16389 -16388 -0%
vue-large-graph-pan: avg frame time 17ms 18ms +3%
vue-large-graph-pan: p95 frame time 17ms 17ms -0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 16ms 20ms +27%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 151 167 +10%
vue-large-graph-pan: task duration 16866ms 20166ms +20%
vue-large-graph-pan: script duration 356ms 425ms +20%
vue-large-graph-pan: TBT 5ms 97ms +1830%
vue-large-graph-pan: heap used 165.6 MB 173.0 MB +4%
vue-large-graph-pan: DOM nodes -8312 -8312 +0%
vue-large-graph-pan: event listeners -16385 -16383 -0%
workflow-execution: avg frame time 17ms 17ms +0% z=0.6
workflow-execution: p95 frame time 17ms 17ms +0%
workflow-execution: layout duration 0ms 1ms +177% z=-3.8
workflow-execution: style recalc duration 14ms 15ms +9% z=-4.1
workflow-execution: layout count 2 3 +25% z=-4.5
workflow-execution: style recalc count 13 8 -42% z=-5.0
workflow-execution: task duration 79ms 76ms -4% z=-4.4
workflow-execution: script duration 6ms 5ms -8% z=-8.1
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 62.5 MB 60.7 MB -3%
workflow-execution: DOM nodes 125 120 -4% z=-5.8
workflow-execution: event listeners 99 38 -62% z=-3.2
Historical variance (last 15 runs)
Metric μ σ CV
canvas-idle: avg frame time 17ms 0ms 0.0%
canvas-idle: layout duration 0ms 0ms 0.0%
canvas-idle: style recalc duration 11ms 1ms 8.2%
canvas-idle: layout count 0 0 0.0%
canvas-idle: style recalc count 11 1 5.0%
canvas-idle: task duration 395ms 31ms 7.9%
canvas-idle: script duration 25ms 2ms 8.8%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
canvas-mouse-sweep: avg frame time 17ms 0ms 0.0%
canvas-mouse-sweep: layout duration 4ms 0ms 5.4%
canvas-mouse-sweep: style recalc duration 43ms 3ms 7.4%
canvas-mouse-sweep: layout count 12 0 0.0%
canvas-mouse-sweep: style recalc count 79 2 3.0%
canvas-mouse-sweep: task duration 865ms 58ms 6.7%
canvas-mouse-sweep: script duration 136ms 6ms 4.8%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
canvas-zoom-sweep: avg frame time 17ms 0ms 0.0%
canvas-zoom-sweep: layout duration 1ms 0ms 7.0%
canvas-zoom-sweep: style recalc duration 19ms 2ms 8.0%
canvas-zoom-sweep: layout count 6 0 0.0%
canvas-zoom-sweep: style recalc count 31 0 1.5%
canvas-zoom-sweep: task duration 327ms 23ms 7.1%
canvas-zoom-sweep: script duration 27ms 3ms 11.1%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
dom-widget-clipping: avg frame time 17ms 0ms 0.0%
dom-widget-clipping: layout duration 0ms 0ms 0.0%
dom-widget-clipping: style recalc duration 10ms 1ms 8.0%
dom-widget-clipping: layout count 0 0 0.0%
dom-widget-clipping: style recalc count 13 0 3.8%
dom-widget-clipping: task duration 365ms 16ms 4.5%
dom-widget-clipping: script duration 68ms 3ms 4.8%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
large-graph-idle: avg frame time 17ms 0ms 0.0%
large-graph-idle: layout duration 0ms 0ms 0.0%
large-graph-idle: style recalc duration 12ms 1ms 8.6%
large-graph-idle: layout count 0 0 0.0%
large-graph-idle: style recalc count 12 0 2.7%
large-graph-idle: task duration 542ms 54ms 10.0%
large-graph-idle: script duration 102ms 11ms 10.3%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
large-graph-pan: avg frame time 17ms 0ms 0.0%
large-graph-pan: layout duration 0ms 0ms 0.0%
large-graph-pan: style recalc duration 17ms 1ms 4.6%
large-graph-pan: layout count 0 0 0.0%
large-graph-pan: style recalc count 70 1 0.9%
large-graph-pan: task duration 1082ms 43ms 4.0%
large-graph-pan: script duration 408ms 20ms 4.8%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
minimap-idle: avg frame time 17ms 0ms 0.0%
minimap-idle: layout duration 0ms 0ms 0.0%
minimap-idle: style recalc duration 10ms 1ms 8.6%
minimap-idle: layout count 0 0 0.0%
minimap-idle: style recalc count 10 1 7.1%
minimap-idle: task duration 527ms 47ms 9.0%
minimap-idle: script duration 98ms 10ms 10.1%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
subgraph-dom-widget-clipping: avg frame time 17ms 0ms 0.0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalc duration 13ms 1ms 7.4%
subgraph-dom-widget-clipping: layout count 0 0 0.0%
subgraph-dom-widget-clipping: style recalc count 48 1 1.2%
subgraph-dom-widget-clipping: task duration 378ms 18ms 4.9%
subgraph-dom-widget-clipping: script duration 128ms 6ms 4.9%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.0%
subgraph-dom-widget-clipping: event listeners 16 6 36.0%
subgraph-idle: avg frame time 17ms 0ms 0.0%
subgraph-idle: layout duration 0ms 0ms 0.0%
subgraph-idle: style recalc duration 10ms 1ms 7.5%
subgraph-idle: layout count 0 0 0.0%
subgraph-idle: style recalc count 11 1 6.0%
subgraph-idle: task duration 370ms 31ms 8.5%
subgraph-idle: script duration 20ms 3ms 13.2%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
subgraph-mouse-sweep: avg frame time 17ms 0ms 0.0%
subgraph-mouse-sweep: layout duration 5ms 0ms 6.8%
subgraph-mouse-sweep: style recalc duration 42ms 3ms 7.8%
subgraph-mouse-sweep: layout count 16 0 0.0%
subgraph-mouse-sweep: style recalc count 80 2 2.4%
subgraph-mouse-sweep: task duration 766ms 69ms 9.0%
subgraph-mouse-sweep: script duration 101ms 7ms 6.5%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
workflow-execution: avg frame time 17ms 0ms 0.0%
workflow-execution: layout duration 2ms 0ms 9.4%
workflow-execution: style recalc duration 24ms 2ms 9.1%
workflow-execution: layout count 5 1 11.0%
workflow-execution: style recalc count 18 2 11.5%
workflow-execution: task duration 123ms 11ms 8.8%
workflow-execution: script duration 29ms 3ms 10.2%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: DOM nodes 161 7 4.4%
workflow-execution: event listeners 52 4 8.4%
Trend (last 15 commits on main)
Metric Trend Dir Latest
canvas-idle: avg frame time ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: p95 frame time ➡️ NaNms
canvas-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: style recalc duration ▇▇▆▆▃█▄▃▄▃▇▄▁▆▇ ➡️ 11ms
canvas-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: style recalc count █▃▅▂▅▆▃▁▂▁▂▅▆▅▆ ➡️ 12
canvas-idle: task duration ▃▃▃▆▂▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: script duration ▄▃▅▇▂▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
canvas-mouse-sweep: avg frame time ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: p95 frame time ➡️ NaNms
canvas-mouse-sweep: layout duration ▁▃▂▄▁▂▁▃▆▂█▇▆▄▃ ➡️ 4ms
canvas-mouse-sweep: style recalc duration ▄▄▂▄▁▂▃▃▅▄█▆▂▄▄ ➡️ 43ms
canvas-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: style recalc count █▅▄▃▂▂▁▄▄▅▆▅▂▇▄ ➡️ 79
canvas-mouse-sweep: task duration █▆▄▂▂▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: script duration ▄▅▄▆▄▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
canvas-zoom-sweep: avg frame time ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: p95 frame time ➡️ NaNms
canvas-zoom-sweep: layout duration ▆▅▅▄▁▁█▅▃▅▇▆▁▂▆ ➡️ 1ms
canvas-zoom-sweep: style recalc duration ▆▅▄▆▅▃█▆▇▅▇▄▁▃▅ ➡️ 20ms
canvas-zoom-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: style recalc count ▁▁▃▄▆▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: task duration ▄▂▁▇▂▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: script duration ▃▃▂▇▂▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
dom-widget-clipping: avg frame time ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: p95 frame time ➡️ NaNms
dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: style recalc duration ▆▆▂▆▄▃██▄▁▆▇▆▃▅ ➡️ 10ms
dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: style recalc count ▇█▅█▅▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: task duration ▃▃▁▅▄▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: script duration ▅▄▄▆▆▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
large-graph-idle: avg frame time ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: p95 frame time ➡️ NaNms
large-graph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: style recalc duration ▅▅▅▆▄▅▃▄▅▅▆█▁▄▆ ➡️ 13ms
large-graph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: style recalc count █▆█▃▃▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: task duration ▂▃▂▆▂▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: script duration ▄▅▄▆▄▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
large-graph-pan: avg frame time ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: p95 frame time ➡️ NaNms
large-graph-pan: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: style recalc duration ▃▂▄▄▁▅▂▂▁▄▄█▃▁▂ ➡️ 17ms
large-graph-pan: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: style recalc count ▆▃█▂▃▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: task duration ▄▃▄▆▄▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: script duration ▅▄▅▆▆▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
minimap-idle: avg frame time ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: p95 frame time ➡️ NaNms
minimap-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: style recalc duration ▄█▁█▅▅█▅▅▃▅▁▁▄▆ ➡️ 10ms
minimap-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: style recalc count ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 9
minimap-idle: task duration ▃▄▁▅▁▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: script duration ▄▆▃▇▃▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
subgraph-dom-widget-clipping: avg frame time ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: p95 frame time ➡️ NaNms
subgraph-dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: style recalc duration ▂▄▃▅▅▃▂▅▇▃▄█▁▄▆ ➡️ 14ms
subgraph-dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: style recalc count ▇█▆▃▆▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: task duration ▂▃▃▆▅▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: script duration ▃▃▃▄▅▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
subgraph-idle: avg frame time ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: p95 frame time ➡️ NaNms
subgraph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: style recalc duration ▁▇▃▆▂▄▂▃▃▆▆▄▃▇█ ➡️ 12ms
subgraph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: style recalc count ▃▆▃▃▂▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: task duration ▁▃▁▇▁▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: script duration ▁▃▂▇▁▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
subgraph-mouse-sweep: avg frame time ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: p95 frame time ➡️ NaNms
subgraph-mouse-sweep: layout duration ▁▄▄▄▃▃▅▅▅▂█▇▂▃▆ ➡️ 5ms
subgraph-mouse-sweep: style recalc duration ▃▂▄▅▂▃▄▅█▃█▆▁▂▅ ➡️ 43ms
subgraph-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: style recalc count ▅▂▅▅▁▄▃▅█▅▆▄▂▄▅ ➡️ 81
subgraph-mouse-sweep: task duration ▃▂▄▅▂▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: script duration ▄▅▄▇▅▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
workflow-execution: avg frame time ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: p95 frame time ➡️ NaNms
workflow-execution: layout duration ▁▆▁▃▂▄▃▂▃▃▅█▄▂▅ ➡️ 2ms
workflow-execution: style recalc duration ▃▇▅▇▁▅▆▇█▁██▂▄▆ ➡️ 25ms
workflow-execution: layout count ▁█▂▃▂▃▃▁▃▃▄▃▂▃▂ ➡️ 5
workflow-execution: style recalc count ▃█▅▇▁▄▅▆▅▅▅▅▄▄▂ ➡️ 15
workflow-execution: task duration ▂▅▄▅▁▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: script duration ▄▃▄▄▃▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-08-19T18:51:45.917Z",
  "gitSha": "d75b5c073ec526e562183d82c0b2da60bb577da0",
  "branch": "fix/auth-popup-error-codes",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2067.924000000005,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.707000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 517.358,
      "heapDeltaBytes": 9157044,
      "heapUsedBytes": 70378880,
      "domNodes": -283,
      "jsHeapTotalBytes": 4186112,
      "scriptDurationMs": 7.156999999999998,
      "eventListeners": -181,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-idle",
      "durationMs": 2027.278000000024,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.568999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 491.75,
      "heapDeltaBytes": 9851340,
      "heapUsedBytes": 70379044,
      "domNodes": -283,
      "jsHeapTotalBytes": 4186112,
      "scriptDurationMs": 7.238999999999999,
      "eventListeners": -181,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2382.5800000000186,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 49.164,
      "layouts": 12,
      "layoutDurationMs": 4.129,
      "taskDurationMs": 1200.223,
      "heapDeltaBytes": 14285292,
      "heapUsedBytes": 75510324,
      "domNodes": -277,
      "jsHeapTotalBytes": 5234688,
      "scriptDurationMs": 149.697,
      "eventListeners": -181,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1819.7150000000875,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 39.849999999999994,
      "layouts": 12,
      "layoutDurationMs": 3.992,
      "taskDurationMs": 875.5440000000001,
      "heapDeltaBytes": -361952,
      "heapUsedBytes": 60731464,
      "domNodes": -281,
      "jsHeapTotalBytes": 4448256,
      "scriptDurationMs": 115.543,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1715.54900000001,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 14.852,
      "layouts": 6,
      "layoutDurationMs": 0.5289999999999999,
      "taskDurationMs": 338.517,
      "heapDeltaBytes": 2815052,
      "heapUsedBytes": 63184324,
      "domNodes": 75,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 8.457,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1731.318999999985,
      "styleRecalcs": 30,
      "styleRecalcDurationMs": 17.462,
      "layouts": 6,
      "layoutDurationMs": 0.5509999999999998,
      "taskDurationMs": 387.23299999999995,
      "heapDeltaBytes": 2524208,
      "heapUsedBytes": 62594248,
      "domNodes": 76,
      "jsHeapTotalBytes": 4718592,
      "scriptDurationMs": 12.372,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 552.8600000000097,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 6.725999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 360.182,
      "heapDeltaBytes": 10632152,
      "heapUsedBytes": 71109296,
      "domNodes": 16,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 56.147000000000006,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 596.2080000000469,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.2109999999999985,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 380.97400000000005,
      "heapDeltaBytes": 10384872,
      "heapUsedBytes": 70906076,
      "domNodes": 16,
      "jsHeapTotalBytes": 4980736,
      "scriptDurationMs": 58.36000000000001,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2018.6819999999557,
      "styleRecalcs": 6,
      "styleRecalcDurationMs": 5.6000000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 564.112,
      "heapDeltaBytes": 2429024,
      "heapUsedBytes": 77286288,
      "domNodes": -265,
      "jsHeapTotalBytes": -2625536,
      "scriptDurationMs": 12.851,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2066.701999999964,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.751000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 623.599,
      "heapDeltaBytes": 3004280,
      "heapUsedBytes": 77462100,
      "domNodes": -260,
      "jsHeapTotalBytes": -2363392,
      "scriptDurationMs": 16.758,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2199.3979999999738,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 13.979000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1198.733,
      "heapDeltaBytes": 13084492,
      "heapUsedBytes": 87869488,
      "domNodes": -283,
      "jsHeapTotalBytes": 4677632,
      "scriptDurationMs": 344.348,
      "eventListeners": -181,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2174.0520000000743,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 12.258000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1198.6729999999998,
      "heapDeltaBytes": 955400,
      "heapUsedBytes": 76601016,
      "domNodes": -268,
      "jsHeapTotalBytes": -2662400,
      "scriptDurationMs": 342.382,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3196.6879999999946,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 13.897000000000004,
      "layouts": 60,
      "layoutDurationMs": 7.058,
      "taskDurationMs": 1391.3310000000001,
      "heapDeltaBytes": -484212,
      "heapUsedBytes": 76143240,
      "domNodes": -272,
      "jsHeapTotalBytes": -1839104,
      "scriptDurationMs": 387.078,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3331.7799999999806,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 15.625999999999998,
      "layouts": 60,
      "layoutDurationMs": 7.681,
      "taskDurationMs": 1483.2610000000002,
      "heapDeltaBytes": -4564908,
      "heapUsedBytes": 72582724,
      "domNodes": -287,
      "jsHeapTotalBytes": 5238784,
      "scriptDurationMs": 412.38599999999997,
      "eventListeners": -183,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 2305.7059999999865,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 10.974000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1422.479,
      "heapDeltaBytes": 12383416,
      "heapUsedBytes": 95332008,
      "domNodes": 14,
      "jsHeapTotalBytes": 6815744,
      "scriptDurationMs": 457.46500000000003,
      "eventListeners": 186,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 2448.443999999995,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 9.946,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1481.7740000000001,
      "heapDeltaBytes": 11745640,
      "heapUsedBytes": 89750740,
      "domNodes": 12,
      "jsHeapTotalBytes": 7270400,
      "scriptDurationMs": 479.61799999999994,
      "eventListeners": 186,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2073.431000000028,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 11.172999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 601.9499999999999,
      "heapDeltaBytes": -7086028,
      "heapUsedBytes": 73850960,
      "domNodes": -269,
      "jsHeapTotalBytes": 4259840,
      "scriptDurationMs": 13.436,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "minimap-idle",
      "durationMs": 2033.9579999999842,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 8.443000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 695.959,
      "heapDeltaBytes": -13442236,
      "heapUsedBytes": 61965040,
      "domNodes": -282,
      "jsHeapTotalBytes": 3141632,
      "scriptDurationMs": 17.244,
      "eventListeners": -179,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 601.9939999999906,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 10.042,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 401.998,
      "heapDeltaBytes": 11403148,
      "heapUsedBytes": 72074400,
      "domNodes": 16,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 124.052,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 610.5830000000196,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 10.534999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 406.845,
      "heapDeltaBytes": 11372952,
      "heapUsedBytes": 71987096,
      "domNodes": 18,
      "jsHeapTotalBytes": 4980736,
      "scriptDurationMs": 117.567,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2042.9429999999797,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.4319999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 498.806,
      "heapDeltaBytes": 10881828,
      "heapUsedBytes": 71825924,
      "domNodes": -279,
      "jsHeapTotalBytes": 4186112,
      "scriptDurationMs": 7.193,
      "eventListeners": -181,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2011.3629999999603,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.459999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 516.235,
      "heapDeltaBytes": -659648,
      "heapUsedBytes": 59894036,
      "domNodes": -281,
      "jsHeapTotalBytes": 4710400,
      "scriptDurationMs": 8.207,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1726.6759999999977,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 39.989999999999995,
      "layouts": 16,
      "layoutDurationMs": 4.694999999999999,
      "taskDurationMs": 799.879,
      "heapDeltaBytes": -2635640,
      "heapUsedBytes": 58196140,
      "domNodes": -280,
      "jsHeapTotalBytes": 5496832,
      "scriptDurationMs": 85.257,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1778.5770000000412,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 40.586999999999996,
      "layouts": 16,
      "layoutDurationMs": 4.962999999999999,
      "taskDurationMs": 871.113,
      "heapDeltaBytes": 10915624,
      "heapUsedBytes": 71679324,
      "domNodes": -281,
      "jsHeapTotalBytes": 4972544,
      "scriptDurationMs": 91.257,
      "eventListeners": -183,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1401.5889999999445,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 32.501999999999995,
      "layouts": 14,
      "layoutDurationMs": 14.963000000000005,
      "taskDurationMs": 998.1990000000001,
      "heapDeltaBytes": -444956,
      "heapUsedBytes": 95886244,
      "domNodes": 13673,
      "jsHeapTotalBytes": 11010048,
      "scriptDurationMs": 17.803999999999995,
      "eventListeners": 2373,
      "totalBlockingTimeMs": 141,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8252.98300000003,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 35.696000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4196.003,
      "heapDeltaBytes": 7448544,
      "heapUsedBytes": 82040636,
      "domNodes": -265,
      "jsHeapTotalBytes": -1351680,
      "scriptDurationMs": 1056.1670000000001,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8617.343000000004,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 38.094,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4504.839000000001,
      "heapDeltaBytes": 9759248,
      "heapUsedBytes": 84122516,
      "domNodes": -263,
      "jsHeapTotalBytes": -565248,
      "scriptDurationMs": 1095.401,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 16876.621999999996,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16259.987,
      "heapDeltaBytes": -43780492,
      "heapUsedBytes": 176233176,
      "domNodes": -8312,
      "jsHeapTotalBytes": -14311424,
      "scriptDurationMs": 95.91599999999998,
      "eventListeners": -16389,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18016.433000000005,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17076.286,
      "heapDeltaBytes": -28779220,
      "heapUsedBytes": 178231688,
      "domNodes": -8312,
      "jsHeapTotalBytes": -9035776,
      "scriptDurationMs": 119.50800000000002,
      "eventListeners": -16387,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.333333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 20378.004999999972,
      "styleRecalcs": 164,
      "styleRecalcDurationMs": 21.389999999999993,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 19814.962,
      "heapDeltaBytes": -30320380,
      "heapUsedBytes": 177916680,
      "domNodes": -8312,
      "jsHeapTotalBytes": -19668992,
      "scriptDurationMs": 434.584,
      "eventListeners": -16385,
      "totalBlockingTimeMs": 67,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 21084.884999999987,
      "styleRecalcs": 169,
      "styleRecalcDurationMs": 18.681999999999977,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20518.037,
      "heapDeltaBytes": -35611372,
      "heapUsedBytes": 184807124,
      "domNodes": -8312,
      "jsHeapTotalBytes": -11759616,
      "scriptDurationMs": 415.864,
      "eventListeners": -16381,
      "totalBlockingTimeMs": 126,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 110.84699999992154,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 14.702000000000002,
      "layouts": 2,
      "layoutDurationMs": 0.654,
      "taskDurationMs": 75.51299999999999,
      "heapDeltaBytes": 3048408,
      "heapUsedBytes": 63991016,
      "domNodes": 111,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 5.205000000000001,
      "eventListeners": 49,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 128.82200000001376,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 15.681000000000001,
      "layouts": 3,
      "layoutDurationMs": 1.3309999999999997,
      "taskDurationMs": 76.00599999999999,
      "heapDeltaBytes": 2939984,
      "heapUsedBytes": 63263844,
      "domNodes": 128,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 5.235,
      "eventListeners": 27,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

@coderabbitai

coderabbitai Bot commented Aug 8, 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: e66a12f9-7ed1-4857-8f6e-a8396837d456

📥 Commits

Reviewing files that changed from the base of the PR and between 7de4f5e and 5608b47.

📒 Files selected for processing (1)
  • src/locales/en/main.json

Included review availability: Your plan provides up to 4 included reviews per hour; 2 remain after this review.


📝 Walkthrough

Walkthrough

The authentication error handler reports closed, expired, and blocked popups as warnings. English translations cover popup and account-collision cases. Tests derive error coverage from locale messages and verify warning, interpolation, and accessError behavior.

Changes

Authentication popup error handling

Layer / File(s) Summary
Popup error handling and messages
src/composables/auth/useAuthActions.ts, src/locales/en/main.json
The handler classifies popup closure, expiration, and blocking errors as warnings. English messages provide specific guidance for these cases and for accounts using another sign-in method.
Data-driven authentication error tests
src/composables/auth/useAuthActions.test.ts
Tests derive Firebase error coverage from localized messages. They verify distinct messages, popup warning severity, account-collision handling, unauthorized-domain interpolation, and accessError state changes.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to 5608b

This is a localized sign-in messaging change, and no actionable merge-blocking risk remains after normal checks and review.


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 The changed files are available, but the PR title and commit subjects are not provided, so the required bug-fix signal cannot be verified. Provide the PR title and commit subjects, then assess whether the src/ changes lack browser_tests/ coverage and a concrete E2E-test rationale.
✅ Passed checks (6 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: popup sign-in failures now produce warnings instead of errors.
Description check ✅ Passed The description includes the required summary, changes, review focus, testing details, screenshots, and breaking-change information.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
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-file list contains only auth composable, test, and English locale files; none are under litegraph, ecs, or graph-entity paths, so this check does not apply.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/auth-popup-error-codes

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/composables/auth/useAuthActions.test.ts`:
- Around line 2-7: Move authErrorMessages and its related
firebaseCodesWithOwnMessage, popupPermissionCodes, and accessErrorCodes
initialization into vi.hoisted state in the test setup. Ensure the
vi.mock('`@/i18n`', ...) factory and useAuthActions can access these values
without referencing module-level variables before initialization.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 2f82eb26-2ecd-4e5c-8e3b-910420c90973

📥 Commits

Reviewing files that changed from the base of the PR and between bdc0345 and a2a63c8.

📒 Files selected for processing (3)
  • src/composables/auth/useAuthActions.test.ts
  • src/composables/auth/useAuthActions.ts
  • src/locales/en/main.json

Comment thread src/composables/auth/useAuthActions.test.ts
@codecov

codecov Bot commented Aug 8, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@            Coverage Diff             @@
##             main   #14944      +/-   ##
==========================================
+ Coverage   79.09%   80.64%   +1.54%     
==========================================
  Files        2210     1883     -327     
  Lines      120774   111640    -9134     
  Branches    37693    33988    -3705     
==========================================
- Hits        95532    90033    -5499     
+ Misses      24693    21162    -3531     
+ Partials      549      445     -104     
Flag Coverage Δ
unit 73.23% <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/composables/auth/useAuthActions.ts 74.35% <100.00%> (-5.45%) ⬇️

... and 562 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.

The unused-key pruner ran on an earlier commit and swept in unrelated
changes: it added auth.login.signUpFreeTierPromo and dropped
subscription.perYear / usdPerYear, none of which this PR is about.
coderabbitai[bot]
coderabbitai Bot previously approved these changes Aug 10, 2026
@MaanilVerma

Copy link
Copy Markdown
Collaborator Author

@christian-byrne This is awaiting your review, incase missed.

pull Bot pushed a commit to Penguinjanator/ComfyUI_frontend that referenced this pull request Aug 14, 2026
…n settles (Comfy-Org#14945)

## Summary

The cloud sign-up email form was live and submittable for up to two
seconds before the region check finished, so a user the China rule is
meant to block could create the account inside that window.

## Changes

- **What**: `userIsInChina` was a `ref(false)` resolved in a mount hook,
so `false` meant both "still checking" and "not in China" and the form
rendered immediately. Region state is now a three-way `pending | blocked
| allowed` behind `useRegionGate()`, with a skeleton holding the space
until detection settles. The form cannot render early because it sits
behind `v-else`.

`isInChina()` now prefers Cloudflare's edge geo-IP over the reachability
heuristic. The heuristic was unsound in both directions — a VPN user in
China reaches Google and is waved through, a `zh-CN` user anywhere is
blocked whenever Google is briefly unreachable — and it pinged
google.com and baidu.com with the user's IP from the page whose purpose
is minimizing data exposure. It stays as the fallback when the edge
cannot answer, so the desktop mirror picker keeps its current tolerance.

Every probe leg is now bounded; two previously had no deadline at all
and could hang until the browser's own network timeout. Detection always
settles, so callers need no timeout of their own.

`SignInContent.vue` had the identical construction and now consumes the
same composable, so the race is closed on both sign-up surfaces rather
than one.

- **Breaking**: None. Email sign-up stays blocked in China, Google and
GitHub stay allowed, login stays unguarded, and the user-facing copy is
byte-identical.

## Review Focus

The policy shape is unchanged; only the timing of the gate is.
Previously the form was interactive during detection, which under a
data-controllership rule is a real hole rather than a cosmetic flash.

Two constants carry over from the old code rather than being retuned:
`PROBE_TIMEOUT_MS` (2000, previously the Google leg's race) and
`CHINA_LATENCY_MS` (150). No new timeout was introduced, and the
composable and both views contain no timers — a caller-side deadline
would decide "allowed" while a real "blocked" answer was still in
flight.

`getClientCountry()` reads `loc=` from `/cdn-cgi/trace`. Cloudflare
documents that path only as a troubleshooting aid, not a supported API,
so the durable form is a first-party endpoint echoing `CF-IPCountry`.
Failure returns `undefined` and falls through to the heuristic.

A client-side gate is bypassable by design. See the comment below on
where enforcement has to live.

## Screenshots

Simulated China conditions, same moments on each branch, after choosing
**Use email instead**.

**Before** — the form is live throughout detection.

300 ms

<img
src="https://github.com/user-attachments/assets/a829cf19-663f-4d32-9058-2f1d92177df6"
width="640">

1200 ms

<img
src="https://github.com/user-attachments/assets/cb2de729-3d10-4df2-82d8-c46d00af21d8"
width="640">

2800 ms — the notice finally replaces it

<img
src="https://github.com/user-attachments/assets/9f87673a-4934-423d-8fe7-91ca73399236"
width="640">

**After** — a skeleton holds the space; no email or password field
exists in the DOM.

300 ms

<img
src="https://github.com/user-attachments/assets/b0b6d743-d08d-4a56-91de-c8717e6fb257"
width="640">

1200 ms

<img
src="https://github.com/user-attachments/assets/ae73b761-f360-4f1f-81a2-e25040b6e5b2"
width="640">

2800 ms — settled to the notice

<img
src="https://github.com/user-attachments/assets/26ed1bf0-9753-4a50-bc49-a2cd82003e05"
width="640">

## Testing

44 tests across five files, every one mutation-checked. **43 killed, 1
survivor** (recorded below rather than papered over).

`isInChina` / `getClientCountry` — 17 cases, 100% branch coverage:

| Case | Mutation applied | Result |
| --- | --- | --- |
| Uppercases the `loc` value | drop `.toUpperCase()` | fails |
| `undefined` for non-200 | delete the `response.ok` guard | fails |
| `undefined` for a body with no `loc` | default the missing line to a
country | fails |
| `undefined` for an empty `loc` | `\|\| undefined` → `?? undefined` |
fails |
| `undefined` for `XX` / `T1` sentinels | return the country unfiltered;
trim the sentinel set | 2 fail |
| `undefined` for a network error | rethrow instead of catching | fails
|
| Edge never answers → gives up | bare `fetch`; deadline never rejects;
timeout 2000→4000 | fails |
| Prefers the edge over the heuristic | run the probe eagerly alongside
the edge | fails |
| Edge `CN` → blocked / other → allowed | `country === 'CN'` → `!==` | 2
fail |
| Falls back to the heuristic on a sentinel | remove the sentinel filter
| 2 fail |
| Edge down + Google reachable → allowed | invert the google-success
return | fails |
| Edge down + Baidu fast → blocked | latency compare → `false`;
threshold 150→0 | fails |
| Neither probe answers → locale decides | inner catch → `true`; force
the locale check | fails |
| Every probe hangs → still settles | unbound a probe leg | fails |

Region gate and both sign-up surfaces — 27 cases:

| Case | Mutation applied | Result |
| --- | --- | --- |
| Starts pending | `ref('pending')` → `ref('allowed')` | fails |
| Pending → blocked / → allowed | invert the two status branches | 2
fail |
| Rejection fails open to allowed | remove `.catch`; `.catch(() =>
true)` | fails |
| A slow real answer is never pre-empted | add a caller-side 3s deadline
| fails |
| Form withheld while pending (both surfaces) | pending branch →
`v-if="false"` | 2 fail |
| Notice replaces form in China (both) | blocked branch →
`v-else-if="false"` | 2 fail |
| Form renders outside China (both) | invert the blocked branch | 2 fail
|
| Form released when detection fails (both) | invert the blocked branch
| 2 fail |
| Never renders the form in China, pending or settled | disable both
branches | fails |
| Social sign-up unaffected in every state (4 rows) | gate the social
buttons on `regionStatus === 'allowed'` | 4 fail |
| Login view has no region gate | `CloudSignInForm` → `v-if="false"` |
fails |
| Query forwarding, free-runs copy, email toggle, webview notice | drop
`query: route.query`; alter the count; force the branch | 4 fail |

**One survivor, left in place.** `SignInContent > leaves sign-in ungated
by region` is a real assertion — deleting `SignInForm` kills it, and it
catches a gate that withholds sign-in *while the probe is pending*. What
it cannot catch is a gate that revokes sign-in once the probe settles to
`blocked`, which is what its name promises. Cause is timing: the
assertion resolves on the first tick, before `onMounted`'s gate flips.
Its `CloudLoginView` twin is genuinely killed, because that view has no
gate wired at all.

Also worth recording: renaming the locale key `signupBlocked` breaks no
test, because `t`/`st` are mocked to echo the key. The two
`signup_blocked` tests still pin real branch routing (killed three
ways), but locale-key existence is not covered on this branch.
`auth/popup-blocked` is covered, via the locale-derived table in Comfy-Org#14944.

The `SignInContent` dialog is covered by unit assertions rather than a
screenshot — driving it needs a local ComfyUI backend.

@christian-byrne christian-byrne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you fix the merge conflicts?

…codes

# Conflicts:
#	src/composables/auth/useAuthActions.test.ts
@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

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

@christian-byrne christian-byrne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-approving on the new head — my earlier approval was auto-dismissed by a push, twice.

Verified since then: the change is scoped to auth error presentation. Three browser/user-caused popup outcomes (POPUP_CLOSED_BY_USER, EXPIRED_POPUP_REQUEST, POPUP_BLOCKED) move from an error toast to a warn toast, which is the right severity for something the user or their browser did rather than an app fault. Locale additions cover the two new codes plus account-exists-with-different-credential.

Nice touch in the test: deriving the known-code set from en/main.json instead of a hardcoded Set means a new locale entry can no longer drift out of sync with the test's idea of what is known.

codecov/project is a coverage-threshold check, and this PR adds test coverage rather than removing it.

@MaanilVerma
MaanilVerma merged commit 893efff into main Aug 23, 2026
70 of 71 checks passed
@MaanilVerma
MaanilVerma deleted the fix/auth-popup-error-codes branch August 23, 2026 03:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:R3 PR risk grade (advisory shadow check; grader-owned) size:S This PR changes 10-29 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants