Skip to content

[FE-1250] Add credit auto-reload settings UI#13762

Draft
dante01yoon wants to merge 7 commits into
mainfrom
jaewon/fe-1250-settings-billing-credit-auto-top-up-monthly-top-up-budget
Draft

[FE-1250] Add credit auto-reload settings UI#13762
dante01yoon wants to merge 7 commits into
mainfrom
jaewon/fe-1250-settings-billing-credit-auto-top-up-monthly-top-up-budget

Conversation

@dante01yoon

@dante01yoon dante01yoon commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds the designer-authored credit auto-reload and optional monthly budget UI to workspace billing settings, gated by billing_control_enabled so the existing billing UI remains unchanged when the flag is off.

Changes

  • Ports the auto-reload section, setup/edit dialog, and progress states from Alex's prototype PRs feat: credit auto-reload with a monthly budget #13592 and [DO NOT MERGE] test(workspace): Team Plan V1 UI preview (billing mock harness) #13487.
  • Covers setup, configured, spend-limit, permission, and billing-lifecycle states.
  • Restricts controls to subscription managers. Paused, inactive, and ended plans are frozen; active canceled subscriptions remain interactive through their paid-through period.
  • Revalidates feature-flag, permission, lifecycle, workspace, and component state before dialog loading and saving.
  • Preserves canonical amounts across Credits/USD display changes and rejects malformed, fractional, or unsafe numeric input.
  • Keeps container-query containment inside the feature-gated wrapper, so flag-off rendering retains the legacy billing layout while flag-on responsive breakpoints stay unchanged.

Delivery status

  • This PR is draft while the auto-reload work is reshaped into a functional vertical slice backed by a production API contract.
  • The shared Switch and main-app PrimeVue migration have been extracted to #13778.
  • After refactor: migrate main app toggles to shared switch #13778 merges, this branch will merge main and remove its duplicate local Switch implementation.

Backend boundary

  • The production auto-reload API does not exist yet. This PR issues no production auto-reload request: configuration is same-session in-memory state, and billing_control_enabled must remain off for customer rollout.
  • BE-3324 owns settings CRUD, trigger/charge/grant idempotency, monthly enforcement, permissions, and payment-failure behavior.
  • FE-1248 payment-method management is related but is not a blocker for this UI/UX delivery.

Testing boundary

  • Unit and component tests cover the feature flag, permissions, lifecycle states, dialog validation, and same-session configuration behavior.
  • No feature-specific Playwright spec is included, and Playwright coverage is not currently planned for this PR.
  • The existing Playwright suite remains green, but it does not exercise auto-reload.

Review focus

  • Visual parity with the prototype markup, copy, Tailwind classes, responsive behavior, and frozen-state treatment.
  • Flag off must preserve the existing billing UI; flag on must expose controls only to subscription managers.
  • Live access revocation and stale lazy-dialog paths must abort without mutating configuration.
  • The typed UI seam should be replaceable by BE-3324 without changing presentation components.

Validation

  • Full Vitest: 13,088 passed, 8 skipped across 992 files
  • Focused follow-up on final merged HEAD 3e4e2510e7: 130 passed across 8 files
  • pnpm typecheck
  • pnpm lint — passes; 3 pre-existing Turnstile warnings remain
  • pnpm format:check
  • pnpm knip
  • pnpm build:cloud
  • GitHub final-head checks: 51 passed, 9 skipped, 0 failed/pending; unit, performance, all 16 Playwright shards plus cloud/mobile/0.5x/2x variants, lint/format, security, Codecov, and CodeRabbit passed. Preview returned HTTP 200 at https://fe-pr-13762.testenvs.comfy.org.
  • Independent adversarial review completed; confirmed findings have regression coverage

Screenshots

Captured from commit 5646df91c6 at a fixed 1440 × 1200 viewport in one authenticated Chrome/CDP session at https://local.comfy.org:5173, running the branch frontend against cloud.comfy.org.

BE-3324 is not implemented, so non-default spend, lifecycle, permission, and flag states were supplied through a temporary local-only harness. The harness and scenario query parameter are not included in this PR. The flag-off containment follow-up only moves the unpadded container boundary into the already gated branch; it preserves the captured markup and responsive content width, so this same-session set remains the current visual evidence.

Coverage Variations
Rollout and access Flag off, manager not configured, member hidden
Setup interaction Dialog opened, required-budget validation, valid Credits budget, USD conversion, saved result, edit prefill
Configured state No budget, healthy, near limit, insufficient remaining budget, exhausted, configured off
Billing lifecycle Paused/frozen, payment at risk, active cancellation
Rollout and access

Feature flag off — existing billing UI

Feature flag off — existing billing UI

Feature flag on — not configured

Feature flag on — not configured

Member — auto-reload controls hidden

Member — auto-reload controls hidden

Setup interaction sequence

1. Opened from Set up auto-reload

Initial setup dialog with monthly budget off

2. Monthly budget enabled without an amount

Monthly budget validation state

3. Valid Credits budget

Credits budget allowing two reloads per month

4. Converted to USD

USD conversion with monthly budget enabled

5. Configuration saved

Configured state after Update

6. Edit reopens the saved values

Edit dialog with saved values

Configured states

Enabled without a monthly budget

Enabled without a monthly budget

Healthy monthly budget

Healthy monthly budget

Near limit

Near-limit monthly budget

Remaining budget cannot fund one reload — Paused

Insufficient remaining monthly budget

Budget exhausted — Paused

Monthly budget exhausted

Configured Off

Configured Off

Billing lifecycle

Paused plan — shared banner

Paused subscription banner

Paused, inactive, or ended plan — section frozen

Frozen auto-reload section

Payment at risk — warning shown; section remains interactive

Payment-at-risk billing state

Active cancellation — ending banner shown; section remains interactive

Active canceled subscription state

References

@github-actions

github-actions Bot commented Jul 17, 2026

Copy link
Copy Markdown

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 07/17/2026, 10:18:29 PM UTC

Links

🎭 Playwright: ✅ 1713 passed, 0 failed · 2 flaky

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

📦 Bundle: 7.92 MB gzip 🔴 +9.81 kB

Details

Summary

  • Raw size: 33.5 MB baseline 33.4 MB — 🔴 +43.3 kB
  • Gzip: 7.92 MB baseline 7.91 MB — 🔴 +9.81 kB
  • Brotli: 5.46 MB baseline 5.45 MB — 🔴 +8.32 kB
  • Bundles: 305 current • 302 baseline • 173 added / 170 removed

Category Glance
Other 🔴 +35.5 kB (11.9 MB) · Utilities & Hooks 🔴 +7.71 kB (3.4 MB) · UI Components 🟢 -4.12 kB (52.7 kB) · Vendor & Third-Party 🔴 +4.02 kB (15.7 MB) · Editors & Dialogs 🔴 +40 B (122 kB) · Views & Navigation 🔴 +40 B (109 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BS-h1RBa.js (new) 47.3 kB 🔴 +47.3 kB 🔴 +14 kB 🔴 +12.1 kB
assets/index-JlzmmnQG.js (removed) 47.3 kB 🟢 -47.3 kB 🟢 -14.1 kB 🟢 -12.2 kB

Status: 1 added / 1 removed

Graph Workspace — 1.25 MB (baseline 1.25 MB) • 🔴 +37 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BGF8gwfP.js (new) 1.25 MB 🔴 +1.25 MB 🔴 +266 kB 🔴 +200 kB
assets/GraphView-XGmZHAUY.js (removed) 1.25 MB 🟢 -1.25 MB 🟢 -266 kB 🟢 -200 kB

Status: 1 added / 1 removed

Views & Navigation — 109 kB (baseline 109 kB) • 🔴 +40 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-Yxw2tJ4d.js (new) 25 kB 🔴 +25 kB 🔴 +6.27 kB 🔴 +5.56 kB
assets/CloudSurveyView-Dt1lJNwI.js (removed) 25 kB 🟢 -25 kB 🟢 -6.26 kB 🟢 -5.53 kB
assets/OAuthConsentView-B1dKWaRM.js (removed) 15 kB 🟢 -15 kB 🟢 -4.1 kB 🟢 -3.57 kB
assets/OAuthConsentView-BR1TYs2r.js (new) 15 kB 🔴 +15 kB 🔴 +4.1 kB 🔴 +3.57 kB
assets/CloudLoginView-Cq9_v5Cf.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.07 kB 🔴 +2.71 kB
assets/CloudLoginView-DNB8NSyf.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.07 kB 🟢 -2.69 kB
assets/CloudSignupView-B9CublT9.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.74 kB 🟢 -2.4 kB
assets/CloudSignupView-CUGU1xZW.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.75 kB 🔴 +2.4 kB
assets/CloudLayoutView-BZgmlGuU.js (removed) 9.54 kB 🟢 -9.54 kB 🟢 -2.35 kB 🟢 -2.03 kB
assets/CloudLayoutView-CsuIVkcz.js (new) 9.54 kB 🔴 +9.54 kB 🔴 +2.35 kB 🔴 +2.03 kB
assets/UserCheckView-BxGTqaBu.js (new) 8.8 kB 🔴 +8.8 kB 🔴 +2.22 kB 🔴 +1.92 kB
assets/UserCheckView-HpvlfeY3.js (removed) 8.8 kB 🟢 -8.8 kB 🟢 -2.22 kB 🟢 -1.93 kB
assets/WidgetTextPreview-BAGDBsMs.js (removed) 6.13 kB 🟢 -6.13 kB 🟢 -2.17 kB 🟢 -1.92 kB
assets/WidgetTextPreview-Cavq-NlA.js (new) 6.13 kB 🔴 +6.13 kB 🔴 +2.17 kB 🔴 +1.92 kB
assets/CloudSubscriptionRedirectView-C2klTi37.js (removed) 6.06 kB 🟢 -6.06 kB 🟢 -2.27 kB 🟢 -1.97 kB
assets/CloudSubscriptionRedirectView-opNivaQs.js (new) 6.06 kB 🔴 +6.06 kB 🔴 +2.27 kB 🔴 +1.97 kB
assets/UserSelectView-BAISO9Qb.js (new) 5.54 kB 🔴 +5.54 kB 🔴 +1.99 kB 🔴 +1.74 kB
assets/UserSelectView-m8jJGLFf.js (removed) 5.54 kB 🟢 -5.54 kB 🟢 -1.99 kB 🟢 -1.74 kB
assets/CloudForgotPasswordView-DFxuXoPM.js (removed) 5.15 kB 🟢 -5.15 kB 🟢 -1.76 kB 🟢 -1.54 kB
assets/CloudForgotPasswordView-DShjIpUA.js (new) 5.15 kB 🔴 +5.15 kB 🔴 +1.77 kB 🔴 +1.54 kB
assets/CloudAuthTimeoutView-B2_Ir6MW.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/CloudAuthTimeoutView-B8iUiU5_.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.57 kB 🟢 -1.36 kB
assets/WidgetTextPreview-BbvtcYHx.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +93 B
assets/WidgetTextPreview-DRbv6vd0.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -88 B

Status: 12 added / 12 removed / 2 unchanged

Panels & Settings — 550 kB (baseline 550 kB) • 🔴 +33 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-B_e1vIAx.js (new) 49.5 kB 🔴 +49.5 kB 🔴 +9.97 kB 🔴 +8.83 kB
assets/KeybindingPanel-DUBukUt3.js (removed) 49.5 kB 🟢 -49.5 kB 🟢 -9.97 kB 🟢 -8.83 kB
assets/SecretsPanel-8xkUyoRV.js (removed) 31 kB 🟢 -31 kB 🟢 -7.51 kB 🟢 -6.57 kB
assets/SecretsPanel-CVhX65Bp.js (new) 31 kB 🔴 +31 kB 🔴 +7.51 kB 🔴 +6.58 kB
assets/CreditsPanel-Du6ZIuFo.js (removed) 16 kB 🟢 -16 kB 🟢 -4.67 kB 🟢 -4.09 kB
assets/CreditsPanel-DZoOienA.js (new) 16 kB 🔴 +16 kB 🔴 +4.67 kB 🔴 +4.09 kB
assets/SubscriptionPanel-CBw414v8.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.65 kB 🔴 +3.22 kB
assets/SubscriptionPanel-Bx2t1-tp.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.64 kB 🟢 -3.21 kB
assets/AboutPanel-B6MBzr3Q.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.06 kB 🔴 +2.74 kB
assets/AboutPanel-CdR4tmcq.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.06 kB 🟢 -2.75 kB
assets/ExtensionPanel-a4yOJRPp.js (new) 9.04 kB 🔴 +9.04 kB 🔴 +2.5 kB 🔴 +2.2 kB
assets/ExtensionPanel-DZ3mYGM7.js (removed) 9.04 kB 🟢 -9.04 kB 🟢 -2.5 kB 🟢 -2.19 kB
assets/ServerConfigPanel-C55PNFIl.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -1.98 kB 🟢 -1.76 kB
assets/ServerConfigPanel-DOHDAYhQ.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +1.98 kB 🔴 +1.76 kB
assets/UserPanel-DaAeOWQy.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.82 kB 🟢 -1.58 kB
assets/UserPanel-YXgaDLcI.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.82 kB 🔴 +1.58 kB
assets/refreshRemoteConfig-DHg4PqAL.js (new) 2.84 kB 🔴 +2.84 kB 🔴 +1.24 kB 🔴 +1.08 kB
assets/refreshRemoteConfig-DQG94FNe.js (removed) 2.84 kB 🟢 -2.84 kB 🟢 -1.24 kB 🟢 -1.08 kB
assets/cloudRemoteConfig-aXpmjy1j.js (removed) 990 B 🟢 -990 B 🟢 -541 B 🟢 -471 B
assets/cloudRemoteConfig-IUfslxnI.js (new) 990 B 🔴 +990 B 🔴 +540 B 🔴 +459 B
assets/refreshRemoteConfig-_fL4gUXZ.js (removed) 110 B 🟢 -110 B 🟢 -89 B 🟢 -92 B
assets/refreshRemoteConfig-B8rpttbE.js (new) 110 B 🔴 +110 B 🔴 +89 B 🔴 +93 B

Status: 11 added / 11 removed / 15 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SignUpForm-B_O8uVch.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -4.19 kB 🟢 -3.66 kB
assets/SignUpForm-CgJcD005.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +4.19 kB 🔴 +3.65 kB
assets/auth-CTt3dwHn.js (removed) 3.69 kB 🟢 -3.69 kB 🟢 -1.3 kB 🟢 -1.14 kB
assets/auth-jRnfj5Df.js (new) 3.69 kB 🔴 +3.69 kB 🔴 +1.3 kB 🔴 +1.14 kB
assets/usePostAuthRedirect-BvO1elYK.js (new) 3.33 kB 🔴 +3.33 kB 🔴 +1.28 kB 🔴 +1.11 kB
assets/usePostAuthRedirect-CzvSa36t.js (removed) 3.33 kB 🟢 -3.33 kB 🟢 -1.27 kB 🟢 -1.1 kB
assets/UpdatePasswordContent-Tlf3vkeN.js (removed) 1.92 kB 🟢 -1.92 kB 🟢 -876 B 🟢 -764 B
assets/UpdatePasswordContent-V3GbtkPc.js (new) 1.92 kB 🔴 +1.92 kB 🔴 +878 B 🔴 +764 B
assets/authStore-D0RGjlj2.js (removed) 130 B 🟢 -130 B 🟢 -109 B 🟢 -122 B
assets/authStore-dfWf-LTJ.js (new) 130 B 🔴 +130 B 🔴 +109 B 🔴 +105 B
assets/workspaceAuthStore-DcjkKnMz.js (removed) 110 B 🟢 -110 B 🟢 -104 B 🟢 -114 B
assets/workspaceAuthStore-hD_zkPu3.js (new) 110 B 🔴 +110 B 🔴 +104 B 🔴 +112 B
assets/auth-Bgt7pUv6.js (new) 105 B 🔴 +105 B 🔴 +96 B 🔴 +74 B
assets/auth-DTU_3x-W.js (removed) 105 B 🟢 -105 B 🟢 -96 B 🟢 -81 B

Status: 7 added / 7 removed / 3 unchanged

Editors & Dialogs — 122 kB (baseline 121 kB) • 🔴 +40 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-BoMWplBQ.js (new) 90.5 kB 🔴 +90.5 kB 🔴 +19.3 kB 🔴 +16.6 kB
assets/ComfyHubPublishDialog-nrdpTFhA.js (removed) 90.5 kB 🟢 -90.5 kB 🟢 -19.3 kB 🟢 -16.5 kB
assets/useShareDialog-BnD4dZIE.js (new) 23.7 kB 🔴 +23.7 kB 🔴 +5.59 kB 🔴 +4.96 kB
assets/useShareDialog-ClIgdZP0.js (removed) 23.7 kB 🟢 -23.7 kB 🟢 -5.58 kB 🟢 -4.97 kB
assets/feedbackDialog-D0ejr9CP.js (removed) 4.51 kB 🟢 -4.51 kB 🟢 -1.9 kB 🟢 -1.63 kB
assets/feedbackDialog-VG6WQiAs.js (new) 4.51 kB 🔴 +4.51 kB 🔴 +1.9 kB 🔴 +1.62 kB
assets/SubscriptionInactiveMemberDialog-Cwns_zRr.js (removed) 2.55 kB 🟢 -2.55 kB 🟢 -1.03 kB 🟢 -883 B
assets/SubscriptionInactiveMemberDialog-wjf08Fdu.js (new) 2.55 kB 🔴 +2.55 kB 🔴 +1.03 kB 🔴 +891 B
assets/ComfyHubPublishDialog-B-p1H-4s.js (new) 143 B 🔴 +143 B 🔴 +105 B 🔴 +92 B
assets/ComfyHubPublishDialog-B9YiZMc3.js (removed) 143 B 🟢 -143 B 🟢 -105 B 🟢 -90 B
assets/useSubscriptionDialog-C8vzntpl.js (removed) 110 B 🟢 -110 B 🟢 -102 B 🟢 -94 B
assets/useSubscriptionDialog-D3XerjXz.js (new) 110 B 🔴 +110 B 🔴 +102 B 🔴 +90 B

Status: 6 added / 6 removed

UI Components — 52.7 kB (baseline 56.8 kB) • 🟢 -4.12 kB

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-0T84cxdv.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -3.8 kB 🟢 -3.39 kB
assets/ComfyQueueButton-CAjK2a7y.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +3.81 kB 🔴 +3.4 kB
assets/useTerminalTabs-Cmge2xpR.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.72 kB 🟢 -3.29 kB
assets/useTerminalTabs-DVe5cWZl.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.73 kB 🔴 +3.29 kB
assets/ScrubableNumberInput-CNv5_dqh.js (removed) 6.55 kB 🟢 -6.55 kB 🟢 -2.2 kB 🟢 -1.94 kB
assets/ScrubableNumberInput-D2E592du.js (new) 6.55 kB 🔴 +6.55 kB 🔴 +2.2 kB 🔴 +1.94 kB
assets/toggle-group-CKXVR29Q.js (removed) 4.16 kB 🟢 -4.16 kB 🟢 -1.45 kB 🟢 -1.28 kB
assets/Button--5ONtWlj.js (removed) 3.69 kB 🟢 -3.69 kB 🟢 -1.4 kB 🟢 -1.22 kB
assets/Button-LyLX_B2L.js (new) 3.69 kB 🔴 +3.69 kB 🔴 +1.4 kB 🔴 +1.22 kB
assets/SubscribeButton-BqfrbsSU.js (removed) 2.18 kB 🟢 -2.18 kB 🟢 -993 B 🟢 -875 B
assets/SubscribeButton-CnJjWXO_.js (new) 2.18 kB 🔴 +2.18 kB 🔴 +995 B 🔴 +883 B
assets/WidgetButton-B0n_fovk.js (new) 1.98 kB 🔴 +1.98 kB 🔴 +917 B 🔴 +808 B
assets/WidgetButton-DmkrPzjy.js (removed) 1.98 kB 🟢 -1.98 kB 🟢 -919 B 🟢 -826 B
assets/cloudFeedbackTopbarButton-Bfe_Advo.js (new) 771 B 🔴 +771 B 🔴 +459 B 🔴 +394 B
assets/cloudFeedbackTopbarButton-JDnZbJfQ.js (removed) 771 B 🟢 -771 B 🟢 -460 B 🟢 -419 B
assets/ComfyQueueButton-2MuPJiiz.js (removed) 128 B 🟢 -128 B 🟢 -99 B 🟢 -88 B
assets/ComfyQueueButton-DSUsMFVe.js (new) 128 B 🔴 +128 B 🔴 +99 B 🔴 +97 B
assets/toggle-group-mC_a-Xe-.js (new) 40 B 🔴 +40 B 🔴 +60 B 🔴 +44 B

Status: 9 added / 9 removed / 4 unchanged

Data & Services — 270 kB (baseline 270 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/load3dService-B-Wlz10B.js (removed) 132 kB 🟢 -132 kB 🟢 -29.5 kB 🟢 -25 kB
assets/load3dService-DZdwI42K.js (new) 132 kB 🔴 +132 kB 🔴 +29.5 kB 🔴 +24.9 kB
assets/api-CI_Qfy84.js (new) 89.1 kB 🔴 +89.1 kB 🔴 +24.5 kB 🔴 +21.1 kB
assets/api-D5BfHjpu.js (removed) 89.1 kB 🟢 -89.1 kB 🟢 -24.5 kB 🟢 -21.1 kB
assets/workflowShareService-DKdmll7f.js (new) 17 kB 🔴 +17 kB 🔴 +5 kB 🔴 +4.44 kB
assets/workflowShareService-U9d1bM0B.js (removed) 17 kB 🟢 -17 kB 🟢 -5 kB 🟢 -4.44 kB
assets/keybindingService-B7DAlG8a.js (removed) 7.21 kB 🟢 -7.21 kB 🟢 -1.88 kB 🟢 -1.61 kB
assets/keybindingService-DwUse2FI.js (new) 7.21 kB 🔴 +7.21 kB 🔴 +1.88 kB 🔴 +1.61 kB
assets/releaseStore-B1iVtLgB.js (new) 6.77 kB 🔴 +6.77 kB 🔴 +2.07 kB 🔴 +1.8 kB
assets/releaseStore-CQmFvjkm.js (removed) 6.77 kB 🟢 -6.77 kB 🟢 -2.07 kB 🟢 -1.81 kB
assets/systemStatsStore-C4R_Ay2C.js (new) 4.99 kB 🔴 +4.99 kB 🔴 +1.77 kB 🔴 +1.49 kB
assets/systemStatsStore-DiEJTjGx.js (removed) 4.99 kB 🟢 -4.99 kB 🟢 -1.77 kB 🟢 -1.49 kB
assets/userStore-Dd7B5W0A.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -931 B 🟢 -820 B
assets/userStore-DJ1swcEe.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +930 B 🔴 +818 B
assets/audioService-BUVikOm0.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -861 B 🟢 -751 B
assets/audioService-CPnw23Du.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +862 B 🔴 +748 B
assets/dialogService-a5-WrxoU.js (new) 100 B 🔴 +100 B 🔴 +99 B 🔴 +94 B
assets/dialogService-DhMecbyl.js (removed) 100 B 🟢 -100 B 🟢 -99 B 🟢 -95 B
assets/settingStore-CfDRokuq.js (new) 98 B 🔴 +98 B 🔴 +98 B 🔴 +98 B
assets/settingStore-iCpv4TH9.js (removed) 98 B 🟢 -98 B 🟢 -98 B 🟢 -90 B
assets/assetsStore-1qLGVpvE.js (removed) 96 B 🟢 -96 B 🟢 -97 B 🟢 -85 B
assets/assetsStore-BLRNNXl8.js (new) 96 B 🔴 +96 B 🔴 +97 B 🔴 +86 B
assets/releaseStore-7Ojpj30z.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -85 B
assets/releaseStore-CJlj2-en.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +88 B
assets/api-CCD1Uew5.js (new) 62 B 🔴 +62 B 🔴 +74 B 🔴 +66 B
assets/api-CmUzwjcs.js (removed) 62 B 🟢 -62 B 🟢 -74 B 🟢 -66 B

Status: 13 added / 13 removed / 3 unchanged

Utilities & Hooks — 3.4 MB (baseline 3.4 MB) • 🔴 +7.71 kB

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/promotionUtils-Dt4OzuqQ.js (new) 3.04 MB 🔴 +3.04 MB 🔴 +704 kB 🔴 +531 kB
assets/promotionUtils-55CLiObf.js (removed) 3.04 MB 🟢 -3.04 MB 🟢 -704 kB 🟢 -531 kB
assets/useConflictDetection-D316d3xK.js (new) 235 kB 🔴 +235 kB 🔴 +52.3 kB 🔴 +42.6 kB
assets/useConflictDetection-HB6BNsLU.js (removed) 235 kB 🟢 -235 kB 🟢 -52.3 kB 🟢 -42.6 kB
assets/useLoad3d-4vylWCzp.js (new) 25.7 kB 🔴 +25.7 kB 🔴 +5.82 kB 🔴 +5.16 kB
assets/useLoad3d-BAm3EZ1v.js (removed) 25.7 kB 🟢 -25.7 kB 🟢 -5.82 kB 🟢 -5.17 kB
assets/useLoad3dViewer-DmBjd_Fo.js (removed) 21.2 kB 🟢 -21.2 kB 🟢 -4.99 kB 🟢 -4.38 kB
assets/useLoad3dViewer-VGO7MEMm.js (new) 21.2 kB 🔴 +21.2 kB 🔴 +4.99 kB 🔴 +4.37 kB
assets/useAutoReload-DoUoMA89.js (new) 6.75 kB 🔴 +6.75 kB 🔴 +2.13 kB 🔴 +1.89 kB
assets/useFeatureFlags-D3GzBDxV.js (removed) 6.75 kB 🟢 -6.75 kB 🟢 -2.07 kB 🟢 -1.74 kB
assets/useFeatureFlags-inyjuSAu.js (new) 6.75 kB 🔴 +6.75 kB 🔴 +2.07 kB 🔴 +1.74 kB
assets/useDowngradeToPersonal-B13REVo8.js (removed) 3 kB 🟢 -3 kB 🟢 -1.18 kB 🟢 -1.04 kB
assets/useDowngradeToPersonal-DmFx8332.js (new) 3 kB 🔴 +3 kB 🔴 +1.18 kB 🔴 +1.04 kB
assets/useExternalLink-CErRAb43.js (new) 2.86 kB 🔴 +2.86 kB 🔴 +1.08 kB 🔴 +943 B
assets/useExternalLink-sChfxkDQ.js (removed) 2.86 kB 🟢 -2.86 kB 🟢 -1.08 kB 🟢 -934 B
assets/downloadUtil-BuBUZawv.js (removed) 2.45 kB 🟢 -2.45 kB 🟢 -1.12 kB 🟢 -895 B
assets/downloadUtil-Dc_0IEto.js (new) 2.45 kB 🔴 +2.45 kB 🔴 +1.11 kB 🔴 +893 B
assets/assetPreviewUtil-BVMDErcM.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1 kB 🟢 -874 B
assets/assetPreviewUtil-DBTUAsW6.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1 kB 🔴 +875 B
assets/useUpstreamValue-BkY3XATh.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +794 B 🔴 +698 B
assets/useUpstreamValue-BRcgcadh.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -791 B 🟢 -701 B
assets/useWorkspaceTierLabel-CpqLHaiQ.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +852 B 🔴 +735 B
assets/useWorkspaceTierLabel-DIn0_RWo.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -852 B 🟢 -739 B
assets/useErrorHandling-C-ETM_WX.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -648 B 🟢 -552 B
assets/useErrorHandling-kpdE9HlV.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +643 B 🔴 +548 B
assets/useSessionCookie-BGs4FKZ_.js (new) 995 B 🔴 +995 B 🔴 +519 B 🔴 +455 B
assets/useSessionCookie-BTIEi8VF.js (removed) 995 B 🟢 -995 B 🟢 -520 B 🟢 -438 B
assets/subscriptionCheckoutUtil-Ik9eMbGr.js (new) 905 B 🔴 +905 B 🔴 +537 B 🔴 +458 B
assets/subscriptionCheckoutUtil-zpqkgeTR.js (removed) 905 B 🟢 -905 B 🟢 -537 B 🟢 -454 B
assets/useLoad3d-BsMY2XuD.js (removed) 311 B 🟢 -311 B 🟢 -164 B 🟢 -147 B
assets/useLoad3d-w6yU92R1.js (new) 311 B 🔴 +311 B 🔴 +163 B 🔴 +147 B
assets/useSessionCookie-5l1EZihU.js (removed) 101 B 🟢 -101 B 🟢 -86 B 🟢 -88 B
assets/useSessionCookie-xPC3qD32.js (new) 101 B 🔴 +101 B 🔴 +86 B 🔴 +77 B
assets/useFeatureFlags-BLpxDnHN.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -83 B
assets/useFeatureFlags-BYwYvb8m.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +86 B
assets/useLoad3dViewer-K0QaDIgB.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -85 B
assets/useLoad3dViewer-osa3QNd4.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +93 B
assets/useCurrentUser-BsL8QNhI.js (removed) 96 B 🟢 -96 B 🟢 -97 B 🟢 -92 B
assets/useCurrentUser-DsY4trYG.js (new) 96 B 🔴 +96 B 🔴 +97 B 🔴 +84 B

Status: 20 added / 19 removed / 17 unchanged

Vendor & Third-Party — 15.7 MB (baseline 15.7 MB) • 🔴 +4.02 kB

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-reka-ui-YCHYsgQQ.js (new) 510 kB 🔴 +510 kB 🔴 +93.5 kB 🔴 +72 kB
assets/vendor-reka-ui-Cb3qQInv.js (removed) 506 kB 🟢 -506 kB 🟢 -93.1 kB 🟢 -71.7 kB

Status: 1 added / 1 removed / 15 unchanged

Other — 11.9 MB (baseline 11.9 MB) • 🔴 +35.5 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/main-BrRmxYIX.js (new) 191 kB 🔴 +191 kB 🔴 +55.8 kB 🔴 +46.8 kB
assets/main-BkkxWTck.js (removed) 189 kB 🟢 -189 kB 🟢 -55.3 kB 🟢 -46.5 kB
assets/core-Crft_9NO.js (new) 111 kB 🔴 +111 kB 🔴 +28.7 kB 🔴 +24.3 kB
assets/core-BQ2DH-S-.js (removed) 111 kB 🟢 -111 kB 🟢 -28.6 kB 🟢 -24.2 kB
assets/WidgetSelect-CYibi2Ko.js (removed) 88.1 kB 🟢 -88.1 kB 🟢 -20 kB 🟢 -17.1 kB
assets/WidgetSelect-YJCS7GiV.js (new) 88.1 kB 🔴 +88.1 kB 🔴 +20 kB 🔴 +17.1 kB
assets/Load3D-DAx1qtoL.js (removed) 68.8 kB 🟢 -68.8 kB 🟢 -11 kB 🟢 -9.5 kB
assets/Load3D-DP1wtqYQ.js (new) 68.8 kB 🔴 +68.8 kB 🔴 +11.1 kB 🔴 +9.51 kB
assets/Preview3d-dIW8SPn5.js (removed) 51 kB 🟢 -51 kB 🟢 -8.36 kB 🟢 -7.3 kB
assets/Preview3d-DTfLF1x6.js (new) 51 kB 🔴 +51 kB 🔴 +8.36 kB 🔴 +7.3 kB
assets/SubscriptionTransitionPreviewWorkspace-CK21H3gh.js (new) 46.8 kB 🔴 +46.8 kB 🔴 +9.66 kB 🔴 +8.54 kB
assets/SubscriptionTransitionPreviewWorkspace-WvQOBGSR.js (removed) 46.8 kB 🟢 -46.8 kB 🟢 -9.66 kB 🟢 -8.55 kB
assets/SubscriptionRequiredDialogContentUnified-aUIJaKGI.js (removed) 41.2 kB 🟢 -41.2 kB 🟢 -9.17 kB 🟢 -7.99 kB
assets/SubscriptionRequiredDialogContentUnified-BLCsNE48.js (new) 41.2 kB 🔴 +41.2 kB 🔴 +9.17 kB 🔴 +7.98 kB
assets/WorkspacePanelContent-DSstKwFk.js (new) 40.8 kB 🔴 +40.8 kB 🔴 +8.63 kB 🔴 +7.63 kB
assets/WorkspacePanelContent-DTXaoKPM.js (removed) 40.8 kB 🟢 -40.8 kB 🟢 -8.63 kB 🟢 -7.63 kB
assets/SubscriptionPanelContentWorkspace-Cak7POLn.js (new) 35.4 kB 🔴 +35.4 kB 🔴 +7.88 kB 🔴 +6.94 kB
assets/WidgetBoundingBoxes-B0YiXz8Z.js (removed) 33.8 kB 🟢 -33.8 kB 🟢 -9.2 kB 🟢 -8.16 kB
assets/WidgetBoundingBoxes-XjqWgRVp.js (new) 33.8 kB 🔴 +33.8 kB 🔴 +9.2 kB 🔴 +8.16 kB
assets/WidgetPainter-CJwQGaoO.js (removed) 32.7 kB 🟢 -32.7 kB 🟢 -7.91 kB 🟢 -6.99 kB
assets/WidgetPainter-CZGdvq-m.js (new) 32.7 kB 🔴 +32.7 kB 🔴 +7.91 kB 🔴 +7.01 kB
assets/Load3dViewerContent-DIM6uqcu.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +6.33 kB 🔴 +5.49 kB
assets/Load3dViewerContent-BYe17XRB.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -6.31 kB 🟢 -5.47 kB
assets/HdrViewerContent-BeIBGU8w.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +8.28 kB 🔴 +7.3 kB
assets/HdrViewerContent-dPiQQjZM.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -8.28 kB 🟢 -7.3 kB
assets/SubscriptionPanelContentWorkspace-Bj5MG-1k.js (removed) 25 kB 🟢 -25 kB 🟢 -5.86 kB 🟢 -5.14 kB
assets/ColorPicker-BdVvHva3.js (new) 25 kB 🔴 +25 kB 🔴 +6.54 kB 🔴 +5.77 kB
assets/ColorPicker-0Qi7V4Rk.js (removed) 25 kB 🟢 -25 kB 🟢 -6.54 kB 🟢 -5.77 kB
assets/SubscriptionRequiredDialogContentWorkspace-BCcsTJVF.js (new) 24.6 kB 🔴 +24.6 kB 🔴 +5.67 kB 🔴 +4.97 kB
assets/SubscriptionRequiredDialogContentWorkspace-FSSpO3yT.js (removed) 24.6 kB 🟢 -24.6 kB 🟢 -5.66 kB 🟢 -4.97 kB
assets/SubscriptionRequiredDialogContent-B8s-0Qfc.js (removed) 24.4 kB 🟢 -24.4 kB 🟢 -6 kB 🟢 -5.3 kB
assets/SubscriptionRequiredDialogContent-CbO6bZOi.js (new) 24.4 kB 🔴 +24.4 kB 🔴 +6 kB 🔴 +5.29 kB
assets/WidgetImageCrop-BY9wE_AJ.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.75 kB 🟢 -5.05 kB
assets/WidgetImageCrop-DW_nqU5X.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +5.75 kB 🔴 +5.05 kB
assets/load3d-DE4z5Joc.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.46 kB 🔴 +4.72 kB
assets/load3d-DjWsLb7b.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.46 kB 🟢 -4.72 kB
assets/CurrentUserPopoverWorkspace-BwDnQQj7.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +4.72 kB 🔴 +4.21 kB
assets/CurrentUserPopoverWorkspace-CpTCR2dx.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -4.72 kB 🟢 -4.21 kB
assets/SignInContent-BljZtpAT.js (removed) 20 kB 🟢 -20 kB 🟢 -5.05 kB 🟢 -4.41 kB
assets/SignInContent-CZfQv3Wh.js (new) 20 kB 🔴 +20 kB 🔴 +5.05 kB 🔴 +4.41 kB
assets/AutoReloadDialogContent-ChzqJ1Lw.js (new) 19.3 kB 🔴 +19.3 kB 🔴 +4.29 kB 🔴 +3.79 kB
assets/WidgetInputNumber-CGgPsx7s.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.83 kB 🔴 +4.29 kB
assets/WidgetInputNumber-CJ8EyaAv.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.83 kB 🟢 -4.29 kB
assets/CreditsTile-CddryjFC.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.54 kB 🟢 -4 kB
assets/CreditsTile-CWy62sUO.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.54 kB 🔴 +4.02 kB
assets/WidgetRecordAudio-CQzA3iQT.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.63 kB 🔴 +4.14 kB
assets/WidgetRecordAudio-DnPO_qrK.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.63 kB 🟢 -4.14 kB
assets/WidgetRange-BJhFly9L.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.17 kB 🔴 +3.72 kB
assets/WidgetRange-Djkxyxib.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.17 kB 🟢 -3.72 kB
assets/DialogHeader-ChbrJ17B.js (removed) 15 kB 🟢 -15 kB 🟢 -4.1 kB 🟢 -3.64 kB
assets/DialogHeader-DGbK29n_.js (new) 15 kB 🔴 +15 kB 🔴 +4.1 kB 🔴 +3.64 kB
assets/WaveAudioPlayer-DaFFsYrK.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.49 kB 🔴 +3.07 kB
assets/WaveAudioPlayer-KGqD4Pll.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.49 kB 🟢 -3.06 kB
assets/i18n-BF4lr5A8.js (removed) 12.5 kB 🟢 -12.5 kB 🟢 -3.31 kB 🟢 -2.8 kB
assets/i18n-Dy18_Bsw.js (new) 12.5 kB 🔴 +12.5 kB 🔴 +3.31 kB 🔴 +2.79 kB
assets/WidgetCurve-DWWZMinl.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.51 kB 🟢 -3.16 kB
assets/WidgetCurve-Z3hjV8q5.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.51 kB 🔴 +3.17 kB
assets/AudioPreviewPlayer-BcFCO66-.js (removed) 10.6 kB 🟢 -10.6 kB 🟢 -3.08 kB 🟢 -2.75 kB
assets/AudioPreviewPlayer-DH2IDwcZ.js (new) 10.6 kB 🔴 +10.6 kB 🔴 +3.08 kB 🔴 +2.74 kB
assets/TeamWorkspacesDialogContent-B2kAGlx9.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -3 kB 🟢 -2.66 kB
assets/TeamWorkspacesDialogContent-BpyVmHYM.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +3 kB 🔴 +2.66 kB
assets/SelectValue-Bas-ts8C.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.48 kB 🔴 +2.19 kB
assets/SelectValue-g8K3mtln.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.48 kB 🟢 -2.19 kB
assets/Load3DConfiguration-D7zwR8hK.js (removed) 9.02 kB 🟢 -9.02 kB 🟢 -2.67 kB 🟢 -2.35 kB
assets/Load3DConfiguration-DGyo8gGJ.js (new) 9.02 kB 🔴 +9.02 kB 🔴 +2.67 kB 🔴 +2.35 kB
assets/onboardingCloudRoutes-DbnV4UGJ.js (new) 8.48 kB 🔴 +8.48 kB 🔴 +2.65 kB 🔴 +2.29 kB
assets/onboardingCloudRoutes-Ck-QnppC.js (removed) 8.44 kB 🟢 -8.44 kB 🟢 -2.63 kB 🟢 -2.27 kB
assets/nodeTemplates-DhxjVj3k.js (removed) 8.33 kB 🟢 -8.33 kB 🟢 -2.88 kB 🟢 -2.53 kB
assets/nodeTemplates-DK78fXJx.js (new) 8.33 kB 🔴 +8.33 kB 🔴 +2.88 kB 🔴 +2.54 kB
assets/WidgetImageCompare-C8Uukccj.js (removed) 8.19 kB 🟢 -8.19 kB 🟢 -2.33 kB 🟢 -2.04 kB
assets/WidgetImageCompare-DNrequky.js (new) 8.19 kB 🔴 +8.19 kB 🔴 +2.33 kB 🔴 +2.04 kB
assets/NightlySurveyController-BhHnoLOH.js (removed) 7.56 kB 🟢 -7.56 kB 🟢 -2.59 kB 🟢 -2.3 kB
assets/NightlySurveyController-CbY6Fuar.js (new) 7.56 kB 🔴 +7.56 kB 🔴 +2.59 kB 🔴 +2.29 kB
assets/Popover-B6QjPPvp.js (new) 7.52 kB 🔴 +7.52 kB 🔴 +2.72 kB 🔴 +2.39 kB
assets/Popover-BFfMZRpx.js (removed) 7.52 kB 🟢 -7.52 kB 🟢 -2.72 kB 🟢 -2.4 kB
assets/InviteMemberDialogContent-CQ6qfsfc.js (removed) 6.76 kB 🟢 -6.76 kB 🟢 -2.23 kB 🟢 -1.96 kB
assets/InviteMemberDialogContent-CukkFKfo.js (new) 6.76 kB 🔴 +6.76 kB 🔴 +2.22 kB 🔴 +1.96 kB
assets/WidgetWithControl-Bbh-CQ2S.js (removed) 6.36 kB 🟢 -6.36 kB 🟢 -2.58 kB 🟢 -2.27 kB
assets/WidgetWithControl-Cdoyrz__.js (new) 6.36 kB 🔴 +6.36 kB 🔴 +2.58 kB 🔴 +2.28 kB
assets/AnimationControls-CNFR8R6N.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +1.88 kB 🔴 +1.67 kB
assets/AnimationControls-DYRnPsHK.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -1.88 kB 🟢 -1.67 kB
assets/tierBenefits-BWGSNfbR.js (removed) 6.02 kB 🟢 -6.02 kB 🟢 -1.93 kB 🟢 -1.67 kB
assets/tierBenefits-diQPMxCq.js (new) 6.02 kB 🔴 +6.02 kB 🔴 +1.93 kB 🔴 +1.67 kB
assets/load3dPreviewExtensions-DmmWi-Ib.js (new) 5.95 kB 🔴 +5.95 kB 🔴 +1.85 kB 🔴 +1.64 kB
assets/load3dPreviewExtensions-nb1w1WBk.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -1.85 kB 🟢 -1.64 kB
assets/main-BydRIOYH.js (new) 5.84 kB 🔴 +5.84 kB 🔴 +1.86 kB 🔴 +1.57 kB
assets/main-jTplWtYj.js (removed) 5.84 kB 🟢 -5.84 kB 🟢 -1.86 kB 🟢 -1.58 kB
assets/CancelSubscriptionDialogContent-3llCJZRq.js (new) 5.76 kB 🔴 +5.76 kB 🔴 +1.97 kB 🔴 +1.74 kB
assets/CancelSubscriptionDialogContent-ChNiBwpW.js (removed) 5.76 kB 🟢 -5.76 kB 🟢 -1.97 kB 🟢 -1.73 kB
assets/FreeTierDialogContent-BHKijUBo.js (removed) 5.25 kB 🟢 -5.25 kB 🟢 -1.76 kB 🟢 -1.55 kB
assets/FreeTierDialogContent-CsOzXIMO.js (new) 5.25 kB 🔴 +5.25 kB 🔴 +1.76 kB 🔴 +1.55 kB
assets/CreateWorkspaceDialogContent-C69iocw2.js (new) 5.19 kB 🔴 +5.19 kB 🔴 +1.83 kB 🔴 +1.58 kB
assets/CreateWorkspaceDialogContent-DHeon8A0.js (removed) 5.19 kB 🟢 -5.19 kB 🟢 -1.83 kB 🟢 -1.58 kB
assets/CloudNotificationContent-C_VQ8y4h.js (new) 5.11 kB 🔴 +5.11 kB 🔴 +1.79 kB 🔴 +1.54 kB
assets/CloudNotificationContent-D1Rmt-PH.js (removed) 5.11 kB 🟢 -5.11 kB 🟢 -1.79 kB 🟢 -1.54 kB
assets/ChangeMemberRoleDialogContent-BmZQYQmW.js (removed) 5.04 kB 🟢 -5.04 kB 🟢 -1.67 kB 🟢 -1.46 kB
assets/ChangeMemberRoleDialogContent-D1kV7GwF.js (new) 5.04 kB 🔴 +5.04 kB 🔴 +1.67 kB 🔴 +1.46 kB
assets/missingModelDownload-28TRVN8z.js (new) 5.04 kB 🔴 +5.04 kB 🔴 +1.96 kB 🔴 +1.7 kB
assets/missingModelDownload-yTzXT0uR.js (removed) 5.04 kB 🟢 -5.04 kB 🟢 -1.95 kB 🟢 -1.7 kB
assets/EditWorkspaceDialogContent-Ccy_rp54.js (new) 5 kB 🔴 +5 kB 🔴 +1.79 kB 🔴 +1.56 kB
assets/EditWorkspaceDialogContent-vy3SimWH.js (removed) 5 kB 🟢 -5 kB 🟢 -1.79 kB 🟢 -1.55 kB
assets/PaletteSwatchRow-D7rjYvso.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.9 kB 🟢 -1.69 kB
assets/PaletteSwatchRow-DzOY6gOV.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.9 kB 🔴 +1.69 kB
assets/WidgetTextarea-DDwnWutv.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/WidgetTextarea-pYis9JKU.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.91 kB 🟢 -1.66 kB
assets/DowngradeRemoveMembersDialogContent-AZY9ZR3n.js (removed) 4.83 kB 🟢 -4.83 kB 🟢 -1.71 kB 🟢 -1.47 kB
assets/DowngradeRemoveMembersDialogContent-D95NlsZx.js (new) 4.83 kB 🔴 +4.83 kB 🔴 +1.7 kB 🔴 +1.46 kB
assets/saveMesh-BR_sXK9n.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.56 kB 🟢 -1.38 kB
assets/saveMesh-DPluLvMa.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.56 kB 🔴 +1.38 kB
assets/ValueControlPopover-obXglOB-.js (removed) 4.55 kB 🟢 -4.55 kB 🟢 -1.58 kB 🟢 -1.42 kB
assets/ValueControlPopover-s1WPWHnv.js (new) 4.55 kB 🔴 +4.55 kB 🔴 +1.58 kB 🔴 +1.42 kB
assets/ToggleGroupItem-BVPAxeut.js (new) 4.17 kB 🔴 +4.17 kB 🔴 +1.45 kB 🔴 +1.28 kB
assets/ApiNodesSignInContent-lSB-LVqF.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.34 kB 🔴 +1.17 kB
assets/ApiNodesSignInContent-p5pvdEVP.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.34 kB 🟢 -1.18 kB
assets/Slider-0Es0MshB.js (new) 3.92 kB 🔴 +3.92 kB 🔴 +1.45 kB 🔴 +1.25 kB
assets/Slider-teOSgffu.js (removed) 3.92 kB 🟢 -3.92 kB 🟢 -1.45 kB 🟢 -1.25 kB
assets/DeleteWorkspaceDialogContent-BcuJwPdI.js (new) 3.91 kB 🔴 +3.91 kB 🔴 +1.48 kB 🔴 +1.27 kB
assets/DeleteWorkspaceDialogContent-BlNBYEWx.js (removed) 3.91 kB 🟢 -3.91 kB 🟢 -1.47 kB 🟢 -1.27 kB
assets/WidgetBoundingBox-Cpsr5u_y.js (removed) 3.82 kB 🟢 -3.82 kB 🟢 -1.06 kB 🟢 -925 B
assets/WidgetBoundingBox-DbfEk8VI.js (new) 3.82 kB 🔴 +3.82 kB 🔴 +1.06 kB 🔴 +932 B
assets/LeaveWorkspaceDialogContent-Be8QHLI5.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.42 kB 🔴 +1.22 kB
assets/LeaveWorkspaceDialogContent-dZst7Kmj.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.41 kB 🟢 -1.22 kB
assets/RemoveMemberDialogContent-DYnVAIJQ.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.37 kB 🔴 +1.19 kB
assets/RemoveMemberDialogContent-NPTP6IFu.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.37 kB 🟢 -1.18 kB
assets/WidgetToggleSwitch-DIWKYh4J.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.42 kB 🔴 +1.25 kB
assets/WidgetToggleSwitch-CRBEF1zg.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.41 kB 🟢 -1.24 kB
assets/RevokeInviteDialogContent-8zA9Dntz.js (new) 3.63 kB 🔴 +3.63 kB 🔴 +1.38 kB 🔴 +1.21 kB
assets/RevokeInviteDialogContent-DmBe6_q7.js (removed) 3.63 kB 🟢 -3.63 kB 🟢 -1.38 kB 🟢 -1.2 kB
assets/InviteMemberUpsellDialogContent-D5BFycky.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.26 kB 🟢 -1.12 kB
assets/InviteMemberUpsellDialogContent-DyqYs1Kh.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.26 kB 🔴 +1.1 kB
assets/workspaceCheckoutTelemetry-BH0EEVJO.js (new) 3.47 kB 🔴 +3.47 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/workspaceCheckoutTelemetry-Gf0xlEYd.js (removed) 3.47 kB 🟢 -3.47 kB 🟢 -1.56 kB 🟢 -1.36 kB
assets/Media3DTop-D5mmX27U.js (removed) 3.26 kB 🟢 -3.26 kB 🟢 -1.3 kB 🟢 -1.13 kB
assets/Media3DTop-fsda4qJ7.js (new) 3.26 kB 🔴 +3.26 kB 🔴 +1.3 kB 🔴 +1.13 kB
assets/GlobalToast-0arCmkS8.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.26 kB 🔴 +1.09 kB
assets/GlobalToast-D9FF6Kon.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/load3dAdvanced-C12mQhfL.js (removed) 2.87 kB 🟢 -2.87 kB 🟢 -1.13 kB 🟢 -987 B
assets/load3dAdvanced-DTFYY0eI.js (new) 2.87 kB 🔴 +2.87 kB 🔴 +1.13 kB 🔴 +988 B
assets/ErrorPanelSurveyCta-D9sqW3n5.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.18 kB 🔴 +1.04 kB
assets/ErrorPanelSurveyCta-duKE7gD3.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.18 kB 🟢 -1.04 kB
assets/SubscribeToRun-BMTQ2SIV.js (removed) 2.45 kB 🟢 -2.45 kB 🟢 -1.07 kB 🟢 -933 B
assets/SubscribeToRun-cbSYlRh5.js (new) 2.45 kB 🔴 +2.45 kB 🔴 +1.07 kB 🔴 +930 B
assets/graphHasMissingNodes-DcWCZD2d.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +906 B 🔴 +809 B
assets/graphHasMissingNodes-Ydn636bR.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -905 B 🟢 -787 B
assets/WidgetColorPicker-d4fOLQPC.js (new) 1.74 kB 🔴 +1.74 kB 🔴 +787 B 🔴 +698 B
assets/WidgetColorPicker-DYwQAYg1.js (removed) 1.74 kB 🟢 -1.74 kB 🟢 -790 B 🟢 -701 B
assets/WidgetColors-CFrdijEw.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +835 B 🔴 +733 B
assets/WidgetColors-ZX8J8-TA.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -837 B 🟢 -739 B
assets/MediaAudioTop-C1s1BUFJ.js (removed) 1.67 kB 🟢 -1.67 kB 🟢 -837 B 🟢 -695 B
assets/MediaAudioTop-CZQaw9g2.js (new) 1.67 kB 🔴 +1.67 kB 🔴 +837 B 🔴 +698 B
assets/signInSchema-DeJvmpav.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +581 B 🔴 +513 B
assets/signInSchema-DxznaqFc.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -584 B 🟢 -507 B
assets/CloudRunButtonWrapper-CqZLyodd.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -551 B 🟢 -488 B
assets/CloudRunButtonWrapper-DB0BRnK9.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +551 B 🔴 +491 B
assets/cloudSessionCookie-Bm4MK9AE.js (new) 991 B 🔴 +991 B 🔴 +468 B 🔴 +430 B
assets/cloudSessionCookie-BY5dAZfN.js (removed) 991 B 🟢 -991 B 🟢 -468 B 🟢 -413 B
assets/cloudBadges-CKwNm7sD.js (removed) 973 B 🟢 -973 B 🟢 -549 B 🟢 -467 B
assets/cloudBadges-DRNlvqVs.js (new) 973 B 🔴 +973 B 🔴 +548 B 🔴 +469 B
assets/Load3DAdvanced-BQxRYRlG.js (removed) 813 B 🟢 -813 B 🟢 -453 B 🟢 -401 B
assets/Load3DAdvanced-Cbn1l9QO.js (new) 813 B 🔴 +813 B 🔴 +454 B 🔴 +415 B
assets/nightlyBadges-DEZ_wRkW.js (new) 464 B 🔴 +464 B 🔴 +307 B 🔴 +260 B
assets/nightlyBadges-DnadzXV6.js (removed) 464 B 🟢 -464 B 🟢 -306 B 🟢 -256 B
assets/missingModelDownload-BijLI3-P.js (removed) 228 B 🟢 -228 B 🟢 -150 B 🟢 -128 B
assets/missingModelDownload-C9W7vDtV.js (new) 228 B 🔴 +228 B 🔴 +150 B 🔴 +131 B
assets/SubscriptionPanelContentWorkspace-BxmpfjIW.js (removed) 179 B 🟢 -179 B 🟢 -117 B 🟢 -108 B
assets/SubscriptionPanelContentWorkspace-DBdngspk.js (new) 179 B 🔴 +179 B 🔴 +117 B 🔴 +84 B
assets/Load3dViewerContent-CdWL0jp6.js (new) 137 B 🔴 +137 B 🔴 +103 B 🔴 +92 B
assets/Load3dViewerContent-ChTXerUE.js (removed) 137 B 🟢 -137 B 🟢 -103 B 🟢 -92 B
assets/WidgetBoundingBox-C47tw-HE.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +95 B
assets/WidgetBoundingBox-DZVGi1Yh.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -92 B
assets/Load3DAdvanced-C_QvHLAt.js (removed) 122 B 🟢 -122 B 🟢 -97 B 🟢 -89 B
assets/Load3DAdvanced-CdxPCd67.js (new) 122 B 🔴 +122 B 🔴 +97 B 🔴 +88 B
assets/WidgetLegacy-C8tFFDaL.js (new) 119 B 🔴 +119 B 🔴 +108 B 🔴 +95 B
assets/WidgetLegacy-D_0UfLev.js (removed) 119 B 🟢 -119 B 🟢 -108 B 🟢 -94 B
assets/workflowDraftStoreV2-CfxNgxIH.js (new) 113 B 🔴 +113 B 🔴 +105 B 🔴 +109 B
assets/workflowDraftStoreV2-DX_yNfBk.js (removed) 113 B 🟢 -113 B 🟢 -105 B 🟢 -114 B
assets/Load3D--JbCM_4W.js (new) 98 B 🔴 +98 B 🔴 +89 B 🔴 +78 B
assets/Load3D-hnZSfdmX.js (removed) 98 B 🟢 -98 B 🟢 -89 B 🟢 -88 B
assets/i18n-BogQhhCa.js (removed) 97 B 🟢 -97 B 🟢 -92 B 🟢 -87 B
assets/i18n-DeRYVxxx.js (new) 97 B 🔴 +97 B 🔴 +92 B 🔴 +88 B
assets/changeTracker-BhL_hNCF.js (new) 93 B 🔴 +93 B 🔴 +95 B 🔴 +81 B
assets/changeTracker-Bvu5fLLE.js (removed) 93 B 🟢 -93 B 🟢 -95 B 🟢 -92 B

Status: 92 added / 90 removed / 73 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.1 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 51.0 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 72.8 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.5 MB heap
large-graph-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 61.5 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.2 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.9 MB heap
minimap-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 63.3 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 55.0 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.4 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.2 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 145ms TBT · 81.5 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.2 MB heap
vue-large-graph-idle: · 58.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 160.7 MB heap
vue-large-graph-pan: · 59.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 31ms TBT · 156.6 MB heap
workflow-execution: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 49.8 MB heap

✅ No regressions detected.

All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms +0% z=-0.5
canvas-idle: p95 frame time 17ms 17ms +0%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 8ms 7ms -17% z=-4.5
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 10 9 -15% z=-4.7
canvas-idle: task duration 435ms 409ms -6% z=0.5
canvas-idle: script duration 18ms 17ms -6% z=-3.7
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 69.3 MB 57.1 MB -18%
canvas-idle: DOM nodes 14 -125 -989% z=-115.3
canvas-idle: event listeners 4 -64 -1688% z=-15.9
canvas-mouse-sweep: avg frame time 17ms 17ms +0% z=0.2
canvas-mouse-sweep: p95 frame time 17ms 17ms -1%
canvas-mouse-sweep: layout duration 4ms 3ms -10% z=-0.8
canvas-mouse-sweep: style recalc duration 39ms 34ms -14% z=-2.8
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 73 73 -1% z=-2.6
canvas-mouse-sweep: task duration 802ms 760ms -5% z=-1.8
canvas-mouse-sweep: script duration 122ms 116ms -5% z=-3.0
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 49.9 MB 51.0 MB +2%
canvas-mouse-sweep: DOM nodes -265 -267 +1% z=-127.3
canvas-mouse-sweep: event listeners -133 -133 +0% z=-33.9
canvas-zoom-sweep: avg frame time 17ms 17ms -0% z=-0.3
canvas-zoom-sweep: p95 frame time 17ms 17ms +0%
canvas-zoom-sweep: layout duration 1ms 1ms +1% z=0.7
canvas-zoom-sweep: style recalc duration 17ms 17ms +1% z=-1.1
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 32 32 -2% z=0.5
canvas-zoom-sweep: task duration 304ms 313ms +3% z=-0.6
canvas-zoom-sweep: script duration 17ms 20ms +20% z=-2.3
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 72.9 MB 72.8 MB -0%
canvas-zoom-sweep: DOM nodes 79 77 -3% z=-2.8
canvas-zoom-sweep: event listeners 19 19 +0% z=-0.9
dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
dom-widget-clipping: p95 frame time 17ms 17ms +0%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 9ms 11ms +20% z=1.9
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 13 12 -8% z=-2.2
dom-widget-clipping: task duration 341ms 349ms +2% z=-0.9
dom-widget-clipping: script duration 56ms 60ms +8% z=-2.3
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 54.6 MB 54.5 MB -0%
dom-widget-clipping: DOM nodes 22 20 -9% z=-1.5
dom-widget-clipping: event listeners 2 1 -50% variance too high
large-graph-idle: avg frame time 17ms 17ms +0% z=-0.2
large-graph-idle: p95 frame time 17ms 17ms +1%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 9ms 10ms +3% z=-2.6
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 9 9 +0% z=-8.3
large-graph-idle: task duration 532ms 533ms +0% z=-0.2
large-graph-idle: script duration 92ms 88ms -4% z=-1.4
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 62.3 MB 61.5 MB -1%
large-graph-idle: DOM nodes -265 -268 +1% z=-323.8
large-graph-idle: event listeners -129 -129 +0% z=-25.4
large-graph-pan: avg frame time 17ms 17ms +0% z=-0.8
large-graph-pan: p95 frame time 17ms 17ms +0%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 14ms 14ms -6% z=-4.5
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 1090ms 1090ms +0% z=0.2
large-graph-pan: script duration 387ms 394ms +2% z=-0.7
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 54.0 MB 56.2 MB +4%
large-graph-pan: DOM nodes -269 -270 +0% z=-174.9
large-graph-pan: event listeners -129 -128 -1% z=-160.5
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 -4%
large-graph-zoom: style recalc duration 15ms 16ms +4%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 65 66 +2%
large-graph-zoom: task duration 1340ms 1334ms -0%
large-graph-zoom: script duration 481ms 485ms +1%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 53.6 MB 53.9 MB +1%
large-graph-zoom: DOM nodes -273 -271 -1%
large-graph-zoom: event listeners -133 -133 +0%
minimap-idle: avg frame time 17ms 17ms -0% z=-0.4
minimap-idle: p95 frame time 17ms 17ms -1%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 8ms 7ms -14% z=-3.0
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 9 8 -17% z=-3.0
minimap-idle: task duration 559ms 533ms -5% z=0.1
minimap-idle: script duration 97ms 92ms -5% z=-0.6
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 63.6 MB 63.3 MB -0%
minimap-idle: DOM nodes -267 -271 +1% z=-211.8
minimap-idle: event listeners -129 -128 -1% z=-200.8
subgraph-dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
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 11ms 11ms +6% z=-1.3
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 47 48 +2% z=0.1
subgraph-dom-widget-clipping: task duration 358ms 365ms +2% z=-0.7
subgraph-dom-widget-clipping: script duration 118ms 119ms +1% z=-1.4
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 54.9 MB 55.0 MB +0%
subgraph-dom-widget-clipping: DOM nodes 20 22 +10% z=-0.2
subgraph-dom-widget-clipping: event listeners 6 7 +17% z=-1.6
subgraph-idle: avg frame time 17ms 17ms -0% z=-0.2
subgraph-idle: p95 frame time 17ms 17ms +0%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 9ms 8ms -20% z=-3.7
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 9 9 -6% z=-3.7
subgraph-idle: task duration 392ms 371ms -5% z=0.0
subgraph-idle: script duration 13ms 12ms -5% z=-3.0
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 45.4 MB 57.4 MB +27%
subgraph-idle: DOM nodes -266 -125 -53% z=-98.2
subgraph-idle: event listeners -133 -65 -52% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms +0% z=0.4
subgraph-mouse-sweep: p95 frame time 17ms 17ms -1%
subgraph-mouse-sweep: layout duration 4ms 4ms -0% z=-2.2
subgraph-mouse-sweep: style recalc duration 37ms 35ms -5% z=-2.2
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 76 76 +0% z=-2.1
subgraph-mouse-sweep: task duration 708ms 659ms -7% z=-1.5
subgraph-mouse-sweep: script duration 89ms 87ms -2% z=-2.2
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 47.5 MB 54.2 MB +14%
subgraph-mouse-sweep: DOM nodes -263 -101 -62% z=-74.9
subgraph-mouse-sweep: event listeners -133 -65 -52% 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 15ms 15ms +3%
subgraph-transition-enter: style recalc duration 33ms 33ms -0%
subgraph-transition-enter: layout count 15 15 +0%
subgraph-transition-enter: style recalc count 19 19 +0%
subgraph-transition-enter: task duration 843ms 788ms -7%
subgraph-transition-enter: script duration 37ms 30ms -18%
subgraph-transition-enter: TBT 148ms 145ms -2%
subgraph-transition-enter: heap used 81.9 MB 81.5 MB -0%
subgraph-transition-enter: DOM nodes 13673 13673 +0%
subgraph-transition-enter: event listeners 2371 2369 -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 37ms 38ms +2%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 250 250 -0%
viewport-pan-sweep: task duration 3758ms 3784ms +1%
viewport-pan-sweep: script duration 1228ms 1234ms +0%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 70.4 MB 71.2 MB +1%
viewport-pan-sweep: DOM nodes -267 -266 -0%
viewport-pan-sweep: event listeners -115 -113 -2%
vue-large-graph-idle: avg frame time 17ms 17ms +0%
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 12728ms 12827ms +1%
vue-large-graph-idle: script duration 533ms 541ms +2%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 163.2 MB 160.7 MB -2%
vue-large-graph-idle: DOM nodes -8311 -8311 +0%
vue-large-graph-idle: event listeners -16384 -16385 +0%
vue-large-graph-pan: avg frame time 17ms 17ms -2%
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 12ms 13ms +8%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 77 77 +0%
vue-large-graph-pan: task duration 15448ms 15483ms +0%
vue-large-graph-pan: script duration 860ms 845ms -2%
vue-large-graph-pan: TBT 55ms 31ms -44%
vue-large-graph-pan: heap used 169.2 MB 156.6 MB -7%
vue-large-graph-pan: DOM nodes -8311 -8311 +0%
vue-large-graph-pan: event listeners -16382 -16382 +0%
workflow-execution: avg frame time 17ms 17ms -0% z=0.1
workflow-execution: p95 frame time 17ms 17ms -0%
workflow-execution: layout duration 0ms 1ms +139% z=-4.1
workflow-execution: style recalc duration 21ms 22ms +6% z=-1.1
workflow-execution: layout count 2 3 +50% z=-3.6
workflow-execution: style recalc count 14 16 +14% z=-0.9
workflow-execution: task duration 120ms 121ms +1% z=-0.2
workflow-execution: script duration 10ms 10ms -2% z=-6.5
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 49.3 MB 49.8 MB +1%
workflow-execution: DOM nodes 121 137 +13% z=-3.4
workflow-execution: event listeners 65 66 +2% 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-07-17T22:28:07.321Z",
  "gitSha": "19579a3a9057bdceebce25cee96361ff8ebe6a88",
  "branch": "jaewon/fe-1250-settings-billing-credit-auto-top-up-monthly-top-up-budget",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2076.134999999994,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 6.666000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 410.79499999999996,
      "heapDeltaBytes": 3897276,
      "heapUsedBytes": 72589736,
      "domNodes": 18,
      "jsHeapTotalBytes": 19935232,
      "scriptDurationMs": 17.897000000000002,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-idle",
      "durationMs": 2029.600999999957,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 6.957999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 406.64000000000004,
      "heapDeltaBytes": -21508048,
      "heapUsedBytes": 47235980,
      "domNodes": -267,
      "jsHeapTotalBytes": 19537920,
      "scriptDurationMs": 16.306,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1776.094999999998,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 34.815,
      "layouts": 12,
      "layoutDurationMs": 3.5370000000000004,
      "taskDurationMs": 757.733,
      "heapDeltaBytes": -15265600,
      "heapUsedBytes": 53715564,
      "domNodes": -265,
      "jsHeapTotalBytes": 19537920,
      "scriptDurationMs": 115.724,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1795.1060000000325,
      "styleRecalcs": 71,
      "styleRecalcDurationMs": 32.977,
      "layouts": 12,
      "layoutDurationMs": 3.359,
      "taskDurationMs": 762.786,
      "heapDeltaBytes": -15503960,
      "heapUsedBytes": 53294096,
      "domNodes": -269,
      "jsHeapTotalBytes": 20848640,
      "scriptDurationMs": 117.16299999999998,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1738.8599999999883,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 16.579000000000004,
      "layouts": 6,
      "layoutDurationMs": 0.576,
      "taskDurationMs": 300.296,
      "heapDeltaBytes": 7694952,
      "heapUsedBytes": 76583960,
      "domNodes": 76,
      "jsHeapTotalBytes": 19410944,
      "scriptDurationMs": 18.761,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1682.262000000037,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 18.192,
      "layouts": 6,
      "layoutDurationMs": 0.771,
      "taskDurationMs": 325.351,
      "heapDeltaBytes": 7418152,
      "heapUsedBytes": 76189752,
      "domNodes": 78,
      "jsHeapTotalBytes": 19935232,
      "scriptDurationMs": 21.666,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 596.9770000000096,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 9.036999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 357.539,
      "heapDeltaBytes": -11617228,
      "heapUsedBytes": 57207156,
      "domNodes": 20,
      "jsHeapTotalBytes": 19673088,
      "scriptDurationMs": 59.940000000000005,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 591.9680000000085,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 13.711999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 341.411,
      "heapDeltaBytes": -11637392,
      "heapUsedBytes": 57150100,
      "domNodes": 20,
      "jsHeapTotalBytes": 19935232,
      "scriptDurationMs": 60.467999999999996,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2023.1840000000147,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.918,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 523.846,
      "heapDeltaBytes": 5547784,
      "heapUsedBytes": 64792580,
      "domNodes": -268,
      "jsHeapTotalBytes": 4927488,
      "scriptDurationMs": 86.643,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2034.2180000000099,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 10.147,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 542.497,
      "heapDeltaBytes": 4806880,
      "heapUsedBytes": 64228684,
      "domNodes": -268,
      "jsHeapTotalBytes": 4141056,
      "scriptDurationMs": 89.21300000000001,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2116.42599999999,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 13.300000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1110.767,
      "heapDeltaBytes": 1069056,
      "heapUsedBytes": 62082856,
      "domNodes": -270,
      "jsHeapTotalBytes": 4870144,
      "scriptDurationMs": 400.05199999999996,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2118.50800000002,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 14.042000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1069.059,
      "heapDeltaBytes": -4105168,
      "heapUsedBytes": 55850308,
      "domNodes": -269,
      "jsHeapTotalBytes": 5189632,
      "scriptDurationMs": 388.57599999999996,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3149.1060000000175,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 15.382000000000003,
      "layouts": 60,
      "layoutDurationMs": 7.189,
      "taskDurationMs": 1321.472,
      "heapDeltaBytes": -5664716,
      "heapUsedBytes": 56655668,
      "domNodes": -271,
      "jsHeapTotalBytes": 8335360,
      "scriptDurationMs": 473.685,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3135.874000000001,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 15.722,
      "layouts": 60,
      "layoutDurationMs": 7.169999999999999,
      "taskDurationMs": 1346.697,
      "heapDeltaBytes": -5307196,
      "heapUsedBytes": 56374620,
      "domNodes": -271,
      "jsHeapTotalBytes": 8073216,
      "scriptDurationMs": 497.20699999999994,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2017.2749999999837,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.1850000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 521.9430000000001,
      "heapDeltaBytes": 5279636,
      "heapUsedBytes": 66246464,
      "domNodes": -269,
      "jsHeapTotalBytes": 5451776,
      "scriptDurationMs": 87.77099999999999,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "minimap-idle",
      "durationMs": 2020.5459999999675,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 7.078999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 544.141,
      "heapDeltaBytes": 5139356,
      "heapUsedBytes": 66554912,
      "domNodes": -272,
      "jsHeapTotalBytes": 5713920,
      "scriptDurationMs": 96.56200000000001,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 542.6989999999705,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 10.578,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 349.1650000000001,
      "heapDeltaBytes": -11036320,
      "heapUsedBytes": 57792448,
      "domNodes": 20,
      "jsHeapTotalBytes": 19935232,
      "scriptDurationMs": 117.38000000000001,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 603.240000000028,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 12.399000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 380.60699999999997,
      "heapDeltaBytes": -11550044,
      "heapUsedBytes": 57649080,
      "domNodes": 24,
      "jsHeapTotalBytes": 20459520,
      "scriptDurationMs": 121.44300000000001,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2018.6589999999853,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.356,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 379.347,
      "heapDeltaBytes": -21483192,
      "heapUsedBytes": 47615308,
      "domNodes": -268,
      "jsHeapTotalBytes": 20586496,
      "scriptDurationMs": 12.749,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2037.2820000000047,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.681,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 362.257,
      "heapDeltaBytes": 3960160,
      "heapUsedBytes": 72845460,
      "domNodes": 18,
      "jsHeapTotalBytes": 19935232,
      "scriptDurationMs": 11.649000000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1714.2959999999903,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 36.869,
      "layouts": 16,
      "layoutDurationMs": 3.842,
      "taskDurationMs": 691.196,
      "heapDeltaBytes": -19043220,
      "heapUsedBytes": 49841008,
      "domNodes": -264,
      "jsHeapTotalBytes": 19537920,
      "scriptDurationMs": 87.97399999999999,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1682.2260000000142,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 33.455,
      "layouts": 16,
      "layoutDurationMs": 4.113,
      "taskDurationMs": 627.1,
      "heapDeltaBytes": -5064548,
      "heapUsedBytes": 63853516,
      "domNodes": 63,
      "jsHeapTotalBytes": 20459520,
      "scriptDurationMs": 85.07900000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 997.5519999999847,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 32.749,
      "layouts": 15,
      "layoutDurationMs": 15.138999999999996,
      "taskDurationMs": 787.52,
      "heapDeltaBytes": 1178004,
      "heapUsedBytes": 85507980,
      "domNodes": 13673,
      "jsHeapTotalBytes": 14417920,
      "scriptDurationMs": 30.04799999999999,
      "eventListeners": 2369,
      "totalBlockingTimeMs": 145,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8168.806999999959,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 37.927,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3688.37,
      "heapDeltaBytes": 15168356,
      "heapUsedBytes": 74297536,
      "domNodes": -266,
      "jsHeapTotalBytes": 6705152,
      "scriptDurationMs": 1217.3890000000001,
      "eventListeners": -113,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8168.203000000062,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 38.114000000000004,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3879.269,
      "heapDeltaBytes": 15704040,
      "heapUsedBytes": 74941176,
      "domNodes": -266,
      "jsHeapTotalBytes": 6705152,
      "scriptDurationMs": 1249.865,
      "eventListeners": -113,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12670.585999999957,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12654.143999999998,
      "heapDeltaBytes": -55685880,
      "heapUsedBytes": 170784212,
      "domNodes": -8311,
      "jsHeapTotalBytes": -8851456,
      "scriptDurationMs": 520.702,
      "eventListeners": -16386,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 13014.348999999926,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12999.690999999999,
      "heapDeltaBytes": -44942680,
      "heapUsedBytes": 166297908,
      "domNodes": -8311,
      "jsHeapTotalBytes": -15405056,
      "scriptDurationMs": 561.4780000000001,
      "eventListeners": -16384,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 15266.612000000008,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 11.648999999999965,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 15243.827,
      "heapDeltaBytes": -44598136,
      "heapUsedBytes": 163735324,
      "domNodes": -8311,
      "jsHeapTotalBytes": -5705728,
      "scriptDurationMs": 826.8539999999999,
      "eventListeners": -16380,
      "totalBlockingTimeMs": 12,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 15744.745999999963,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 13.999999999999957,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 15721.426999999998,
      "heapDeltaBytes": -43432680,
      "heapUsedBytes": 164719024,
      "domNodes": -8311,
      "jsHeapTotalBytes": -15667200,
      "scriptDurationMs": 862.31,
      "eventListeners": -16384,
      "totalBlockingTimeMs": 50,
      "frameDurationMs": 16.66333333333326,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 470.8479999999895,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 23.383000000000003,
      "layouts": 3,
      "layoutDurationMs": 1.179,
      "taskDurationMs": 130.072,
      "heapDeltaBytes": -15491928,
      "heapUsedBytes": 52688912,
      "domNodes": 154,
      "jsHeapTotalBytes": 6565888,
      "scriptDurationMs": 10.653999999999998,
      "eventListeners": 67,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "workflow-execution",
      "durationMs": 453.5710000000108,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 20.352999999999998,
      "layouts": 3,
      "layoutDurationMs": 0.7260000000000001,
      "taskDurationMs": 111.72699999999999,
      "heapDeltaBytes": -16571632,
      "heapUsedBytes": 51664316,
      "domNodes": 119,
      "jsHeapTotalBytes": 7614464,
      "scriptDurationMs": 9.268999999999998,
      "eventListeners": 65,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a frontend credit auto-reload experience with workspace-scoped state, configuration and status UI, billing-panel gating, frozen lifecycle states, localized validation, dialog integration, and comprehensive component, composable, and integration tests.

Changes

Credit auto-reload

Layer / File(s) Summary
State model and UI primitives
docs/superpowers/specs/..., src/platform/workspace/composables/useAutoReload.*, src/components/ui/switch/*, src/platform/workspace/components/dialogs/settings/ProgressBar.vue, src/locales/en/main.json
Defines auto-reload state derivation and workspace scoping, adds localized copy, documents UI and validation requirements, and introduces reusable Switch and progress primitives with tests and stories.
Auto-reload section and budget display
src/platform/workspace/components/dialogs/settings/*
Adds configured and unconfigured states, status badges, budget progress, frozen behavior, workspace synchronization, and UI tests.
Configuration dialog
src/platform/workspace/components/dialogs/AutoReloadDialogContent.*, src/services/dialogService.*
Adds threshold, reload, budget, unit conversion, locale-aware parsing, validation, save/cancel behavior, workspace guards, lazy loading, and dialog registration.
Billing access and panel integration
src/platform/workspace/composables/useAutoReloadAccess.*, src/platform/workspace/components/SubscriptionPanelContentWorkspace.*
Mounts the section under feature-flag and subscription-manager gates, freezes it for paused, inactive, or ended billing states, and tests lifecycle routing.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant SubscriptionPanelContentWorkspace
  participant AutoReloadSection
  participant dialogService
  participant AutoReloadDialogContent
  participant useAutoReload
  SubscriptionPanelContentWorkspace->>AutoReloadSection: render when flag and permission allow
  AutoReloadSection->>dialogService: showAutoReloadDialog()
  dialogService->>AutoReloadDialogContent: open headless workspace dialog
  AutoReloadDialogContent->>useAutoReload: save validated configuration
  useAutoReload->>AutoReloadSection: expose updated scoped state
Loading

Possibly related PRs

Suggested labels: released:cloud

Suggested reviewers: drjkl


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 Commit subjects and PR title aren’t available, so I can’t verify whether this is a bug-fix PR or apply the regression-test rule. Provide the PR title and commit subjects; then I can check for bug-fix wording and whether a browser_tests Playwright regression is required.
✅ Passed checks (5 passed)
Check name Status Explanation
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.
Adr Compliance For Entity/Litegraph Changes ✅ Passed No changed files under src/lib/litegraph/, src/ecs/, or graph-entity paths, so ADR 0003/0008 checks are not applicable.
Title check ✅ Passed The title is concise and accurately summarizes the main change: adding credit auto-reload settings UI.
Description check ✅ Passed The description covers the required summary, changes, review focus, and screenshots sections with sufficient detail.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch jaewon/fe-1250-settings-billing-credit-auto-top-up-monthly-top-up-budget

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: 4

🤖 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/platform/workspace/components/dialogs/AutoReloadDialogContent.vue`:
- Line 52: Update the currency indicator spans in AutoReloadDialogContent to use
vue-i18n/Intl.NumberFormat for localized USD formatting instead of hardcoded
"$". Preserve the existing conditional rendering and display the locale-aware
USD symbol or localized USD label in both occurrences.
- Around line 53-84: Update the validation state used by the Update action to
cover every disabling condition: an empty reload threshold and an enabled zero
budget, in addition to the existing reload minimum check. Add user-friendly,
actionable localized messages via vue-i18n, expose each field’s invalid state
with aria-invalid, and connect its message through aria-describedby. Apply this
consistently to the reload amount input and the corresponding budget input
validation flow.

In
`@src/platform/workspace/components/dialogs/settings/AutoReloadSection.test.ts`:
- Around line 102-120: Replace the Tailwind class assertions in the
AutoReloadSection tests, including the near-limit and exhausted-budget cases,
with assertions against visible or accessible semantic state. Update the
relevant component symbol to expose a semantic near-limit status if none exists,
then assert that status and retain the existing text, paused-state, and progress
value checks.

In `@src/platform/workspace/composables/useAutoReload.ts`:
- Around line 29-36: Update the isPaused calculation in the auto-reload state
logic to pause whenever the remaining budget cannot fund another reload,
including positive budgetLeftCents values below reloadCostCents. Preserve
existing disabled and exhausted-budget behavior, and add a regression case
covering 0 < budgetLeftCents < reloadCostCents.
🪄 Autofix (Beta)

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: 15b7e184-f7d3-463d-808f-48c07e8d764c

📥 Commits

Reviewing files that changed from the base of the PR and between e6c0435 and c9a7b46.

📒 Files selected for processing (16)
  • docs/superpowers/specs/2026-07-17-fe-1250-credit-auto-reload-design.md
  • src/components/ui/switch/Switch.stories.ts
  • src/components/ui/switch/Switch.test.ts
  • src/components/ui/switch/Switch.vue
  • src/locales/en/main.json
  • src/platform/workspace/components/SubscriptionPanelContentWorkspace.test.ts
  • src/platform/workspace/components/SubscriptionPanelContentWorkspace.vue
  • src/platform/workspace/components/dialogs/AutoReloadDialogContent.test.ts
  • src/platform/workspace/components/dialogs/AutoReloadDialogContent.vue
  • src/platform/workspace/components/dialogs/settings/AutoReloadSection.test.ts
  • src/platform/workspace/components/dialogs/settings/AutoReloadSection.vue
  • src/platform/workspace/components/dialogs/settings/ProgressBar.vue
  • src/platform/workspace/composables/useAutoReload.test.ts
  • src/platform/workspace/composables/useAutoReload.ts
  • src/services/dialogService.renderer.test.ts
  • src/services/dialogService.ts

Comment thread src/platform/workspace/components/dialogs/AutoReloadDialogContent.vue Outdated
Comment thread src/platform/workspace/composables/useAutoReload.ts Outdated
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 17, 2026
@codecov

codecov Bot commented Jul 17, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.02233% with 12 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...ace/components/dialogs/AutoReloadDialogContent.vue 95.49% 8 Missing and 2 partials ⚠️
...rc/platform/workspace/composables/useAutoReload.ts 96.96% 2 Missing ⚠️
@@            Coverage Diff             @@
##             main   #13762      +/-   ##
==========================================
+ Coverage   78.45%   78.50%   +0.04%     
==========================================
  Files        1679     1689      +10     
  Lines       96185    96868     +683     
  Branches    34920    35200     +280     
==========================================
+ Hits        75462    76045     +583     
- Misses      20100    20393     +293     
+ Partials      623      430     -193     
Flag Coverage Δ
unit 67.39% <97.02%> (+0.14%) ⬆️

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

Files with missing lines Coverage Δ
src/components/ui/switch/Switch.vue 100.00% <100.00%> (ø)
...e/components/SubscriptionPanelContentWorkspace.vue 95.48% <100.00%> (+0.08%) ⬆️
.../components/dialogs/settings/AutoReloadSection.vue 100.00% <100.00%> (ø)
...kspace/components/dialogs/settings/ProgressBar.vue 100.00% <100.00%> (ø)
...tform/workspace/composables/useAutoReloadAccess.ts 100.00% <100.00%> (ø)
src/services/dialogService.ts 62.02% <100.00%> (+0.61%) ⬆️
...rc/platform/workspace/composables/useAutoReload.ts 96.96% <96.96%> (ø)
...ace/components/dialogs/AutoReloadDialogContent.vue 95.49% <95.49%> (ø)

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

@dante01yoon
dante01yoon marked this pull request as ready for review July 17, 2026 15:02
@dante01yoon
dante01yoon requested a review from a team July 17, 2026 15:02
@dosubot dosubot Bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Jul 17, 2026
@dosubot dosubot Bot added size:XXL This PR changes 1000+ lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Jul 17, 2026
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 17, 2026
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 17, 2026
Comment thread docs/superpowers/specs/2026-07-17-fe-1250-credit-auto-reload-design.md Outdated
@DrJKL DrJKL removed their assignment Jul 17, 2026

@DrJKL DrJKL 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.

Please consider consolidating these tests before merge. The goal is a smaller suite with the same behavioral confidence.

mockError.value = null
})

it('preserves the existing billing UI while billing control is disabled', () => {

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.

This block repeats the complete lifecycle matrix already covered by isAutoReloadFrozen. Since AutoReloadSection is stubbed here, these cases mostly retest mocked access state. Can we keep the full status table in useAutoReloadAccess.test.ts, then retain only three composition cases here: reactive flag gating, reactive permission gating, and one representative assertion that the computed frozen value reaches the child?

setConfig()
})

it('blocks an update below the minimum reload amount', async () => {

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.

The component suite below exercises a full locale-aware numeric parser and conversion matrix through a 518-line SFC. That makes pure input rules slow and costly to refactor. Can we extract the parser and canonical credits/cents form model, table-test malformed input, locale digits/grouping, rounding, and overflow directly, then keep only representative component cases for minimum reload, required budget, one malformed value, and unsafe USD overflow?

)
})

it('renders normalized values for malformed financial state', () => {

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.

This malformed-state case repeats normalization already tested directly in deriveAutoReloadState. The section tests should prove that meaningful derived states render, while invalid-number permutations stay in the pure function suite. Can we delete this case and table-drive the healthy, warning, and paused rendering cases instead?

@dante01yoon
dante01yoon marked this pull request as draft July 18, 2026 00:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants