Skip to content

Fix snap offset for reroutes and subgraph IO#10229

Open
AustinMroz wants to merge 3 commits intomainfrom
austin/snap-ocd
Open

Fix snap offset for reroutes and subgraph IO#10229
AustinMroz wants to merge 3 commits intomainfrom
austin/snap-ocd

Conversation

@AustinMroz
Copy link
Collaborator

@AustinMroz AustinMroz commented Mar 18, 2026

When snapping to grid, reroutes and subgraph IO would snap at an awful y offset.

Before After
before after

Regretfully, the PR leaves more magic constants than I would like. There's a hardcoded 0.7 multiplier on NODE_SLOT_HEIGHT that isn't defined as a constant, and it seems circular imports prevent constants being used to declare the subgraphIO roundedRadius

See #8838 (Sorry for the delay. This change wound up being real simple)

┆Issue is synchronized with this Notion page by Unito

@github-actions
Copy link

github-actions bot commented Mar 18, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/18/2026, 01:45:22 AM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 18, 2026

🎭 Playwright: ✅ 629 passed, 0 failed · 5 flaky

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 18, 2026

📝 Walkthrough

Walkthrough

Three files updated: LGraphCanvas.drawSnapGuide now accepts an optional { offsetToSlot } flag to adjust Y-offset toward slot positions; Reroute.snapToGrid applies a slot-height-based vertical offset when snapping; SubgraphIONodeBase.static roundedRadius changed from 10 to 14, affecting layout calculations.

Changes

Cohort / File(s) Summary
Snap guide API
src/lib/litegraph/src/LGraphCanvas.ts
Extended drawSnapGuide(ctx, item, shape = RenderShape.ROUND)drawSnapGuide(ctx, item, shape = RenderShape.ROUND, { offsetToSlot }: { offsetToSlot?: boolean } = {}). When offsetToSlot is true, computed Y-offset is decreased by NODE_SLOT_HEIGHT * 0.7 before snapping and then restored.
Reroute snapping
src/lib/litegraph/src/Reroute.ts
Imported LiteGraph and adjusted snapToGrid to compute offsetY = LiteGraph.NODE_SLOT_HEIGHT * 0.7 and apply it when snapping vertical positions, aligning reroute snaps with slot layout.
Subgraph IO layout
src/lib/litegraph/src/subgraph/SubgraphIONodeBase.ts
Changed static roundedRadius from 10 to 14, affecting initial y-offset, per-slot positioning/sizing, and node width/height calculations that reference roundedRadius.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐇 I hopped along the canvas line,

nudged offsets to the socket sign,
reroutes snug where slots reside,
rounded corners stretched with pride,
a tiny rabbit, code and cheer—align!


Caution

Pre-merge checks failed

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

  • Ignore (reviewers only)

❌ Failed checks (1 error, 1 inconclusive)

Check name Status Explanation Resolution
End-To-End Regression Coverage For Fixes ❌ Error PR title uses bug-fix language 'Fix', triggering regression test requirement. No browser_tests/ files changed and PR description lacks explanation for missing E2E test. Add Playwright regression test under browser_tests/ for snap offset fix, or explain in PR description why E2E test is impractical.
Description check ❓ Inconclusive PR description includes visual before/after comparison and references the related issue, but lacks structured sections following the repository template. Reorganize the description to follow the template: provide a concise summary sentence, detailed 'What' and 'Breaking' changes, and 'Review Focus' section highlighting the magic constants issue.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: fixing snap offset positioning for reroutes and subgraph IO nodes when snapping to grid.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch austin/snap-ocd
📝 Coding Plan
  • Generate coding plan for human review comments

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 and usage tips.

@github-actions
Copy link

github-actions bot commented Mar 18, 2026

📦 Bundle: 5 MB gzip 🔴 +93 B

Details

Summary

  • Raw size: 23.1 MB baseline 23.1 MB — 🔴 +175 B
  • Gzip: 5 MB baseline 5 MB — 🔴 +93 B
  • Brotli: 3.87 MB baseline 3.87 MB — 🟢 -78 B
  • Bundles: 244 current • 244 baseline • 114 added / 114 removed

Category Glance
Data & Services 🔴 +175 B (2.91 MB) · Vendor & Third-Party ⚪ 0 B (9.78 MB) · Other ⚪ 0 B (8.24 MB) · Graph Workspace ⚪ 0 B (1.1 MB) · Panels & Settings ⚪ 0 B (461 kB) · Utilities & Hooks ⚪ 0 B (322 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-B4UJdq4P.js (removed) 22.7 kB 🟢 -22.7 kB 🟢 -8.04 kB 🟢 -6.89 kB
assets/index-CLJf8895.js (new) 22.7 kB 🔴 +22.7 kB 🔴 +8.04 kB 🔴 +6.87 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-C9WOIih0.js (removed) 1.1 MB 🟢 -1.1 MB 🟢 -234 kB 🟢 -177 kB
assets/GraphView-fbSWF0Im.js (new) 1.1 MB 🔴 +1.1 MB 🔴 +234 kB 🔴 +177 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BwsNbGxp.js (new) 15.6 kB 🔴 +15.6 kB 🔴 +3.38 kB 🔴 +2.88 kB
assets/CloudSurveyView-CtbRy6eK.js (removed) 15.6 kB 🟢 -15.6 kB 🟢 -3.38 kB 🟢 -2.88 kB
assets/CloudLoginView-DGns-Z8V.js (new) 11.9 kB 🔴 +11.9 kB 🔴 +3.31 kB 🔴 +2.92 kB
assets/CloudLoginView-lK8FQeLe.js (removed) 11.9 kB 🟢 -11.9 kB 🟢 -3.31 kB 🟢 -2.92 kB
assets/CloudSignupView-DqgrPnUh.js (new) 9.64 kB 🔴 +9.64 kB 🔴 +2.8 kB 🔴 +2.46 kB
assets/CloudSignupView-P7NsCAgc.js (removed) 9.64 kB 🟢 -9.64 kB 🟢 -2.8 kB 🟢 -2.46 kB
assets/UserCheckView-7jrMkuTn.js (removed) 9.01 kB 🟢 -9.01 kB 🟢 -2.31 kB 🟢 -2.01 kB
assets/UserCheckView-nh843qJC.js (new) 9.01 kB 🔴 +9.01 kB 🔴 +2.31 kB 🔴 +2.01 kB
assets/CloudLayoutView-BFMxz2i3.js (removed) 7.42 kB 🟢 -7.42 kB 🟢 -2.31 kB 🟢 -2.01 kB
assets/CloudLayoutView-CMJIVW5m.js (new) 7.42 kB 🔴 +7.42 kB 🔴 +2.31 kB 🔴 +2.02 kB
assets/CloudForgotPasswordView-BMQ2jqi4.js (new) 5.85 kB 🔴 +5.85 kB 🔴 +2.04 kB 🔴 +1.79 kB
assets/CloudForgotPasswordView-C87Ytfqg.js (removed) 5.85 kB 🟢 -5.85 kB 🟢 -2.04 kB 🟢 -1.8 kB
assets/CloudAuthTimeoutView-tBD7y0J8.js (removed) 5.21 kB 🟢 -5.21 kB 🟢 -1.88 kB 🟢 -1.64 kB
assets/CloudAuthTimeoutView-yrrxIzpR.js (new) 5.21 kB 🔴 +5.21 kB 🔴 +1.88 kB 🔴 +1.65 kB
assets/CloudSubscriptionRedirectView-0ekUBPpB.js (new) 4.98 kB 🔴 +4.98 kB 🔴 +1.86 kB 🔴 +1.64 kB
assets/CloudSubscriptionRedirectView-C_v4mZRD.js (removed) 4.98 kB 🟢 -4.98 kB 🟢 -1.86 kB 🟢 -1.64 kB
assets/UserSelectView-D6QE1U3v.js (removed) 4.67 kB 🟢 -4.67 kB 🟢 -1.73 kB 🟢 -1.53 kB
assets/UserSelectView-Dq3ZPxt4.js (new) 4.67 kB 🔴 +4.67 kB 🔴 +1.73 kB 🔴 +1.52 kB

Status: 9 added / 9 removed / 2 unchanged

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-Bgk_2fBe.js (new) 28.9 kB 🔴 +28.9 kB 🔴 +6.19 kB 🔴 +5.5 kB
assets/KeybindingPanel-Conf9GZz.js (removed) 28.9 kB 🟢 -28.9 kB 🟢 -6.19 kB 🟢 -5.5 kB
assets/SecretsPanel-C8QbJKLa.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.42 kB 🔴 +4.76 kB
assets/SecretsPanel-D0gFe5-x.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.41 kB 🟢 -4.77 kB
assets/LegacyCreditsPanel-CkSUAyFk.js (removed) 21.4 kB 🟢 -21.4 kB 🟢 -5.71 kB 🟢 -5.03 kB
assets/LegacyCreditsPanel-CnEGliF-.js (new) 21.4 kB 🔴 +21.4 kB 🔴 +5.71 kB 🔴 +5.03 kB
assets/SubscriptionPanel-CKhvkSwp.js (new) 19.3 kB 🔴 +19.3 kB 🔴 +4.9 kB 🔴 +4.31 kB
assets/SubscriptionPanel-DZKEMttA.js (removed) 19.3 kB 🟢 -19.3 kB 🟢 -4.9 kB 🟢 -4.32 kB
assets/AboutPanel-BP2PkOEI.js (new) 12 kB 🔴 +12 kB 🔴 +3.31 kB 🔴 +2.96 kB
assets/AboutPanel-Bvu7gJ51.js (removed) 12 kB 🟢 -12 kB 🟢 -3.31 kB 🟢 -2.97 kB
assets/ExtensionPanel-Dh7R7k5d.js (new) 9.66 kB 🔴 +9.66 kB 🔴 +2.77 kB 🔴 +2.45 kB
assets/ExtensionPanel-fIFIaeQf.js (removed) 9.66 kB 🟢 -9.66 kB 🟢 -2.77 kB 🟢 -2.45 kB
assets/ServerConfigPanel-44C5owQT.js (removed) 6.74 kB 🟢 -6.74 kB 🟢 -2.24 kB 🟢 -2 kB
assets/ServerConfigPanel-CEnicz_D.js (new) 6.74 kB 🔴 +6.74 kB 🔴 +2.24 kB 🔴 +2 kB
assets/UserPanel-BFD0MLVQ.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.1 kB 🔴 +1.84 kB
assets/UserPanel-laGNzk_F.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.1 kB 🟢 -1.85 kB
assets/cloudRemoteConfig-Cd2rNppL.js (removed) 1.74 kB 🟢 -1.74 kB 🟢 -851 B 🟢 -726 B
assets/cloudRemoteConfig-Da_9GDJZ.js (new) 1.74 kB 🔴 +1.74 kB 🔴 +851 B 🔴 +731 B
assets/refreshRemoteConfig-BUEtkNwx.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +648 B 🔴 +548 B
assets/refreshRemoteConfig-BUT5Nwlg.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -650 B 🟢 -552 B

Status: 10 added / 10 removed / 12 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BnJlfaee.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/auth-Dmpk4-Jk.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/SignUpForm-B3xGNs_m.js (new) 3.18 kB 🔴 +3.18 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/SignUpForm-BLLokZuE.js (removed) 3.18 kB 🟢 -3.18 kB 🟢 -1.29 kB 🟢 -1.15 kB
assets/UpdatePasswordContent-BFisxdJn.js (new) 2.56 kB 🔴 +2.56 kB 🔴 +1.14 kB 🔴 +1.01 kB
assets/UpdatePasswordContent-sSy2V4zR.js (removed) 2.56 kB 🟢 -2.56 kB 🟢 -1.14 kB 🟢 -1.01 kB
assets/firebaseAuthStore-BpfozeIo.js (removed) 907 B 🟢 -907 B 🟢 -437 B 🟢 -389 B
assets/firebaseAuthStore-Dxq2-Twc.js (new) 907 B 🔴 +907 B 🔴 +437 B 🔴 +383 B
assets/auth-B_rYZKb2.js (removed) 313 B 🟢 -313 B 🟢 -200 B 🟢 -186 B
assets/auth-DXVx8hnF.js (new) 313 B 🔴 +313 B 🔴 +203 B 🔴 +181 B

Status: 5 added / 5 removed / 2 unchanged

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-BxX0TDMS.js (new) 81.2 kB 🔴 +81.2 kB 🔴 +16.9 kB 🔴 +14.5 kB
assets/useShareDialog-OIfMc3EP.js (removed) 81.2 kB 🟢 -81.2 kB 🟢 -16.9 kB 🟢 -14.5 kB
assets/useSubscriptionDialog-C34o4bSZ.js (removed) 855 B 🟢 -855 B 🟢 -427 B 🟢 -371 B
assets/useSubscriptionDialog-CUD8Hf5v.js (new) 855 B 🔴 +855 B 🔴 +428 B 🔴 +369 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-BJs-zGBs.js (new) 14.3 kB 🔴 +14.3 kB 🔴 +4 kB 🔴 +3.58 kB
assets/ComfyQueueButton-CTPDxZQk.js (removed) 14.3 kB 🟢 -14.3 kB 🟢 -4 kB 🟢 -3.58 kB
assets/useTerminalTabs-5WlaBciC.js (new) 10.6 kB 🔴 +10.6 kB 🔴 +3.55 kB 🔴 +3.11 kB
assets/useTerminalTabs-zjkPNvCi.js (removed) 10.6 kB 🟢 -10.6 kB 🟢 -3.55 kB 🟢 -3.12 kB
assets/SubscribeButton-5gFyk39t.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.05 kB 🔴 +914 B
assets/SubscribeButton-CNFtcd1p.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -914 B
assets/cloudFeedbackTopbarButton-BfHBoUZD.js (new) 1.55 kB 🔴 +1.55 kB 🔴 +793 B 🔴 +704 B
assets/cloudFeedbackTopbarButton-C5vxdQaY.js (removed) 1.55 kB 🟢 -1.55 kB 🟢 -793 B 🟢 -705 B
assets/ComfyQueueButton-B5JJHeOQ.js (removed) 912 B 🟢 -912 B 🟢 -439 B 🟢 -394 B
assets/ComfyQueueButton-BdLSataT.js (new) 912 B 🔴 +912 B 🔴 +441 B 🔴 +391 B

Status: 5 added / 5 removed / 8 unchanged

Data & Services — 2.91 MB (baseline 2.91 MB) • 🔴 +175 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-CjoFOOU8.js (new) 1.91 MB 🔴 +1.91 MB 🔴 +439 kB 🔴 +333 kB
assets/dialogService-Tput-Hxv.js (removed) 1.91 MB 🟢 -1.91 MB 🟢 -439 kB 🟢 -333 kB
assets/api-ClPTVMWi.js (new) 864 kB 🔴 +864 kB 🔴 +206 kB 🔴 +163 kB
assets/api-CxAMijRG.js (removed) 864 kB 🟢 -864 kB 🟢 -206 kB 🟢 -163 kB
assets/load3dService-DWxfjJKf.js (removed) 92.3 kB 🟢 -92.3 kB 🟢 -19.6 kB 🟢 -16.8 kB
assets/load3dService-DzlVRiW2.js (new) 92.3 kB 🔴 +92.3 kB 🔴 +19.6 kB 🔴 +16.9 kB
assets/workflowShareService-BG_-hhgZ.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -4.32 kB 🟢 -3.8 kB
assets/workflowShareService-Dr4vz51Q.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +4.32 kB 🔴 +3.8 kB
assets/releaseStore-DJmgYdya.js (removed) 8.12 kB 🟢 -8.12 kB 🟢 -2.26 kB 🟢 -1.99 kB
assets/releaseStore-DpGDuKNZ.js (new) 8.12 kB 🔴 +8.12 kB 🔴 +2.27 kB 🔴 +1.99 kB
assets/keybindingService-D7oieOyN.js (new) 7.03 kB 🔴 +7.03 kB 🔴 +1.75 kB 🔴 +1.5 kB
assets/keybindingService-tFm-_-lN.js (removed) 7.03 kB 🟢 -7.03 kB 🟢 -1.75 kB 🟢 -1.5 kB
assets/systemStatsStore-C6aiXuH-.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.67 kB 🔴 +1.45 kB
assets/systemStatsStore-CsGIq7Mf.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.67 kB 🟢 -1.45 kB
assets/userStore-D_O9JsOL.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +871 B 🔴 +763 B
assets/userStore-xIoRoaOa.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -867 B 🟢 -770 B
assets/audioService-Bb1rg-Yo.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +863 B 🔴 +743 B
assets/audioService-CRrqm_2j.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -863 B 🟢 -743 B
assets/releaseStore-CiKZqhL_.js (removed) 879 B 🟢 -879 B 🟢 -431 B 🟢 -377 B
assets/releaseStore-q9uP4Y_V.js (new) 879 B 🔴 +879 B 🔴 +433 B 🔴 +373 B
assets/workflowDraftStore-CqT604qA.js (new) 855 B 🔴 +855 B 🔴 +428 B 🔴 +376 B
assets/workflowDraftStore-Cy3DOaXJ.js (removed) 855 B 🟢 -855 B 🟢 -427 B 🟢 -377 B
assets/dialogService-C_a_u5mc2.js (removed) 844 B 🟢 -844 B 🟢 -419 B 🟢 -371 B
assets/dialogService-p7Hf8o2V2.js (new) 844 B 🔴 +844 B 🔴 +420 B 🔴 +371 B
assets/settingStore-BYL3ziTk.js (new) 842 B 🔴 +842 B 🔴 +423 B 🔴 +365 B
assets/settingStore-ByOOtBWZ.js (removed) 842 B 🟢 -842 B 🟢 -422 B 🟢 -370 B
assets/assetsStore-BIMaYSE8.js (new) 841 B 🔴 +841 B 🔴 +422 B 🔴 +365 B
assets/assetsStore-BqBxYoOr.js (removed) 841 B 🟢 -841 B 🟢 -422 B 🟢 -367 B

Status: 14 added / 14 removed / 3 unchanged

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-BB4zbGKr.js (removed) 231 kB 🟢 -231 kB 🟢 -51.2 kB 🟢 -41.7 kB
assets/useConflictDetection-DE8uHyOk.js (new) 231 kB 🔴 +231 kB 🔴 +51.2 kB 🔴 +41.7 kB
assets/useLoad3dViewer-KwRUor9B.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.42 kB 🔴 +3.89 kB
assets/useLoad3dViewer-vZ13gqsJ.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.43 kB 🟢 -3.9 kB
assets/useLoad3d-CRXWiiOl.js (removed) 15 kB 🟢 -15 kB 🟢 -3.78 kB 🟢 -3.37 kB
assets/useLoad3d-D6X3CLev.js (new) 15 kB 🔴 +15 kB 🔴 +3.78 kB 🔴 +3.36 kB
assets/useFeatureFlags-BSzMd1ri.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.75 kB 🔴 +1.48 kB
assets/useFeatureFlags-Cu80HcgW.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.75 kB 🟢 -1.48 kB
assets/useWorkspaceUI-CzSR3ikQ.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +981 B 🔴 +813 B
assets/useWorkspaceUI-U6N2xyvt.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -980 B 🟢 -809 B
assets/subscriptionCheckoutUtil-B_iok-PA.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.32 kB 🔴 +1.15 kB
assets/subscriptionCheckoutUtil-CETTSS84.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.31 kB 🟢 -1.15 kB
assets/assetPreviewUtil-BWlVZHWd.js (removed) 2.27 kB 🟢 -2.27 kB 🟢 -958 B 🟢 -833 B
assets/assetPreviewUtil-YiU4K77w.js (new) 2.27 kB 🔴 +2.27 kB 🔴 +959 B 🔴 +833 B
assets/useUpstreamValue-CezaiDKi.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +805 B 🔴 +715 B
assets/useUpstreamValue-CVnJ-T_E.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -803 B 🟢 -722 B
assets/useErrorHandling-DJEBYABD.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -650 B 🟢 -551 B
assets/useErrorHandling-OKxLXPwL.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +651 B 🔴 +551 B
assets/useLoad3d-D8VzKFB2.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +492 B 🔴 +436 B
assets/useLoad3d-G-b4YeV3.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -489 B 🟢 -436 B
assets/audioUtils-8Pev97x3.js (removed) 958 B 🟢 -958 B 🟢 -563 B 🟢 -490 B
assets/audioUtils-BVJZcZjU.js (new) 958 B 🔴 +958 B 🔴 +564 B 🔴 +458 B
assets/useLoad3dViewer-0IPruafv.js (new) 957 B 🔴 +957 B 🔴 +457 B 🔴 +406 B
assets/useLoad3dViewer-GyfylH7p.js (removed) 957 B 🟢 -957 B 🟢 -455 B 🟢 -405 B
assets/useCurrentUser-B4yeMQlX.js (new) 841 B 🔴 +841 B 🔴 +423 B 🔴 +370 B
assets/useCurrentUser-Cm96a9Ab.js (removed) 841 B 🟢 -841 B 🟢 -422 B 🟢 -369 B
assets/useWorkspaceSwitch-CbA5hX7U.js (removed) 747 B 🟢 -747 B 🟢 -382 B 🟢 -331 B
assets/useWorkspaceSwitch-D-f0cQQr.js (new) 747 B 🔴 +747 B 🔴 +386 B 🔴 +331 B

Status: 14 added / 14 removed / 8 unchanged

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

External libraries and shared vendor chunks

Status: 16 unchanged

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

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-B2lr3cHw.js (new) 76.2 kB 🔴 +76.2 kB 🔴 +19.7 kB 🔴 +16.8 kB
assets/core-mJg7a4fQ.js (removed) 76.2 kB 🟢 -76.2 kB 🟢 -19.7 kB 🟢 -16.8 kB
assets/groupNode-BpuVDmbN.js (removed) 73.9 kB 🟢 -73.9 kB 🟢 -18.5 kB 🟢 -16.2 kB
assets/groupNode-DJRd760w.js (new) 73.9 kB 🔴 +73.9 kB 🔴 +18.5 kB 🔴 +16.3 kB
assets/WidgetSelect-8P3e40Au.js (removed) 63.3 kB 🟢 -63.3 kB 🟢 -13.8 kB 🟢 -11.9 kB
assets/WidgetSelect-oKRVERYp.js (new) 63.3 kB 🔴 +63.3 kB 🔴 +13.8 kB 🔴 +11.9 kB
assets/SubscriptionRequiredDialogContentWorkspace-Btvbff5f.js (new) 47.2 kB 🔴 +47.2 kB 🔴 +8.8 kB 🔴 +7.62 kB
assets/SubscriptionRequiredDialogContentWorkspace-DKC2TTbE.js (removed) 47.2 kB 🟢 -47.2 kB 🟢 -8.8 kB 🟢 -7.63 kB
assets/WidgetPainter-BRl06DOz.js (removed) 33.2 kB 🟢 -33.2 kB 🟢 -8.06 kB 🟢 -7.14 kB
assets/WidgetPainter-D2JFew0x.js (new) 33.2 kB 🔴 +33.2 kB 🔴 +8.06 kB 🔴 +7.15 kB
assets/Load3DControls-BN2mlBpU.js (removed) 32.1 kB 🟢 -32.1 kB 🟢 -5.47 kB 🟢 -4.75 kB
assets/Load3DControls-DBh2xT9Q.js (new) 32.1 kB 🔴 +32.1 kB 🔴 +5.47 kB 🔴 +4.75 kB
assets/WorkspacePanelContent-BagV1ofY.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +6.28 kB 🔴 +5.51 kB
assets/WorkspacePanelContent-BXDNdJ4z.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -6.28 kB 🟢 -5.5 kB
assets/SubscriptionRequiredDialogContent-Bu2xRSAZ.js (removed) 26.2 kB 🟢 -26.2 kB 🟢 -6.68 kB 🟢 -5.88 kB
assets/SubscriptionRequiredDialogContent-C1VEMIOD.js (new) 26.2 kB 🔴 +26.2 kB 🔴 +6.68 kB 🔴 +5.88 kB
assets/Load3dViewerContent-CSdYDQeT.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -5.33 kB 🟢 -4.64 kB
assets/Load3dViewerContent-GTu4CclN.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +5.32 kB 🔴 +4.64 kB
assets/WidgetImageCrop-DPXvmxkd.js (removed) 23.2 kB 🟢 -23.2 kB 🟢 -5.77 kB 🟢 -5.09 kB
assets/WidgetImageCrop-WOlQfIB5.js (new) 23.2 kB 🔴 +23.2 kB 🔴 +5.77 kB 🔴 +5.08 kB
assets/SubscriptionPanelContentWorkspace-CJ-0BVTK.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.18 kB 🟢 -4.55 kB
assets/SubscriptionPanelContentWorkspace-DVqsl844.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.18 kB 🔴 +4.55 kB
assets/CurrentUserPopoverWorkspace-COXYhKsw.js (removed) 20.9 kB 🟢 -20.9 kB 🟢 -5.04 kB 🟢 -4.49 kB
assets/CurrentUserPopoverWorkspace-DoLQzRlj.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +5.04 kB 🔴 +4.5 kB
assets/SignInContent-BEd_f9Wb.js (new) 20.2 kB 🔴 +20.2 kB 🔴 +5.21 kB 🔴 +4.54 kB
assets/SignInContent-CxDlWQxW.js (removed) 20.2 kB 🟢 -20.2 kB 🟢 -5.21 kB 🟢 -4.54 kB
assets/WidgetInputNumber-BzIExryb.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.3 kB
assets/WidgetInputNumber-DYz6EwuC.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.3 kB
assets/WidgetRecordAudio-CM2UO7YX.js (removed) 18.1 kB 🟢 -18.1 kB 🟢 -5.15 kB 🟢 -4.62 kB
assets/WidgetRecordAudio-CPKQZl0J.js (new) 18.1 kB 🔴 +18.1 kB 🔴 +5.15 kB 🔴 +4.6 kB
assets/Load3D-bDCk8v_R.js (removed) 16.9 kB 🟢 -16.9 kB 🟢 -4.11 kB 🟢 -3.58 kB
assets/Load3D-CewzRLwC.js (new) 16.9 kB 🔴 +16.9 kB 🔴 +4.11 kB 🔴 +3.58 kB
assets/WidgetCurve-BjvbVDoU.js (new) 15.1 kB 🔴 +15.1 kB 🔴 +4.66 kB 🔴 +4.2 kB
assets/WidgetCurve-CY0KdR7T.js (removed) 15.1 kB 🟢 -15.1 kB 🟢 -4.67 kB 🟢 -4.2 kB
assets/load3d-Dn7YYrfa.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -4.27 kB 🟢 -3.69 kB
assets/load3d-Dqnu4Fib.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +4.27 kB 🔴 +3.68 kB
assets/AudioPreviewPlayer-CM8qD_XK.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.35 kB 🔴 +3.02 kB
assets/AudioPreviewPlayer-nasnH-1f.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.35 kB 🟢 -3.01 kB
assets/nodeTemplates-BDEb2TFS.js (new) 9.45 kB 🔴 +9.45 kB 🔴 +3.33 kB 🔴 +2.92 kB
assets/nodeTemplates-U1ZgRuJV.js (removed) 9.45 kB 🟢 -9.45 kB 🟢 -3.33 kB 🟢 -2.92 kB
assets/InviteMemberDialogContent-0BOOFGJB.js (new) 7.66 kB 🔴 +7.66 kB 🔴 +2.4 kB 🔴 +2.1 kB
assets/InviteMemberDialogContent-CiIhMbQV.js (removed) 7.66 kB 🟢 -7.66 kB 🟢 -2.4 kB 🟢 -2.1 kB
assets/Load3DConfiguration-BL7PvUmS.js (removed) 6.55 kB 🟢 -6.55 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/Load3DConfiguration-lXFAZjNa.js (new) 6.55 kB 🔴 +6.55 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/onboardingCloudRoutes-CgoLciLH.js (new) 6.31 kB 🔴 +6.31 kB 🔴 +1.96 kB 🔴 +1.72 kB
assets/onboardingCloudRoutes-CUO4qTpB.js (removed) 6.31 kB 🟢 -6.31 kB 🟢 -1.97 kB 🟢 -1.7 kB
assets/WidgetWithControl-CFqj5drc.js (removed) 5.87 kB 🟢 -5.87 kB 🟢 -2.31 kB 🟢 -2.06 kB
assets/WidgetWithControl-DZHGuKU-.js (new) 5.87 kB 🔴 +5.87 kB 🔴 +2.31 kB 🔴 +2.06 kB
assets/CreateWorkspaceDialogContent-2IWe8G6n.js (removed) 5.84 kB 🟢 -5.84 kB 🟢 -2.1 kB 🟢 -1.83 kB
assets/CreateWorkspaceDialogContent-B0xXPCjM.js (new) 5.84 kB 🔴 +5.84 kB 🔴 +2.1 kB 🔴 +1.83 kB
assets/FreeTierDialogContent-B8D2FzKy.js (removed) 5.7 kB 🟢 -5.7 kB 🟢 -1.99 kB 🟢 -1.76 kB
assets/FreeTierDialogContent-BRziTkRi.js (new) 5.7 kB 🔴 +5.7 kB 🔴 +1.99 kB 🔴 +1.77 kB
assets/EditWorkspaceDialogContent-BewwrdV1.js (removed) 5.63 kB 🟢 -5.63 kB 🟢 -2.06 kB 🟢 -1.79 kB
assets/EditWorkspaceDialogContent-TecTYrrS.js (new) 5.63 kB 🔴 +5.63 kB 🔴 +2.06 kB 🔴 +1.79 kB
assets/Preview3d-BiHwV6NX.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.74 kB 🔴 +1.51 kB
assets/Preview3d-UDKfRn6h.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.74 kB 🟢 -1.51 kB
assets/ValueControlPopover-BSihX6ms.js (new) 5.22 kB 🔴 +5.22 kB 🔴 +1.88 kB 🔴 +1.68 kB
assets/ValueControlPopover-mBu04DG1.js (removed) 5.22 kB 🟢 -5.22 kB 🟢 -1.88 kB 🟢 -1.69 kB
assets/WidgetTextarea-CyheTUuC.js (removed) 5.15 kB 🟢 -5.15 kB 🟢 -2.02 kB 🟢 -1.78 kB
assets/WidgetTextarea-D5kXpTbA.js (new) 5.15 kB 🔴 +5.15 kB 🔴 +2.02 kB 🔴 +1.8 kB
assets/CancelSubscriptionDialogContent-DBXMj2ZJ.js (removed) 5.11 kB 🟢 -5.11 kB 🟢 -1.89 kB 🟢 -1.66 kB
assets/CancelSubscriptionDialogContent-Dc95bXXa.js (new) 5.11 kB 🔴 +5.11 kB 🔴 +1.89 kB 🔴 +1.65 kB
assets/DeleteWorkspaceDialogContent-Bp3jV3-H.js (removed) 4.54 kB 🟢 -4.54 kB 🟢 -1.74 kB 🟢 -1.5 kB
assets/DeleteWorkspaceDialogContent-C7IRB3wY.js (new) 4.54 kB 🔴 +4.54 kB 🔴 +1.74 kB 🔴 +1.5 kB
assets/tierBenefits-D8w2BEGL.js (new) 4.47 kB 🔴 +4.47 kB 🔴 +1.58 kB 🔴 +1.37 kB
assets/tierBenefits-NCTL-dV0.js (removed) 4.47 kB 🟢 -4.47 kB 🟢 -1.58 kB 🟢 -1.37 kB
assets/LeaveWorkspaceDialogContent-BVn-a-L-.js (new) 4.37 kB 🔴 +4.37 kB 🔴 +1.68 kB 🔴 +1.45 kB
assets/LeaveWorkspaceDialogContent-SOljH1aH.js (removed) 4.37 kB 🟢 -4.37 kB 🟢 -1.68 kB 🟢 -1.46 kB
assets/RemoveMemberDialogContent-BWbY4ifQ.js (new) 4.35 kB 🔴 +4.35 kB 🔴 +1.64 kB 🔴 +1.42 kB
assets/RemoveMemberDialogContent-CcAbh8C8.js (removed) 4.35 kB 🟢 -4.35 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/RevokeInviteDialogContent-BGMeyS1T.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.65 kB 🟢 -1.44 kB
assets/RevokeInviteDialogContent-KYdxEDOW.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.65 kB 🔴 +1.44 kB
assets/InviteMemberUpsellDialogContent-34-JEZZ2.js (new) 4.16 kB 🔴 +4.16 kB 🔴 +1.51 kB 🔴 +1.32 kB
assets/InviteMemberUpsellDialogContent-QysCNWpb.js (removed) 4.16 kB 🟢 -4.16 kB 🟢 -1.51 kB 🟢 -1.32 kB
assets/cloudSessionCookie-1sClpdmx.js (new) 4.02 kB 🔴 +4.02 kB 🔴 +1.43 kB 🔴 +1.25 kB
assets/cloudSessionCookie-BxTlmSeI.js (removed) 4.02 kB 🟢 -4.02 kB 🟢 -1.43 kB 🟢 -1.24 kB
assets/saveMesh-BlvslO6E.js (removed) 3.8 kB 🟢 -3.8 kB 🟢 -1.63 kB 🟢 -1.43 kB
assets/saveMesh-CX9nk89J.js (new) 3.8 kB 🔴 +3.8 kB 🔴 +1.63 kB 🔴 +1.43 kB
assets/Media3DTop-C8yJG1u3.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/Media3DTop-GkkDk7ai.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/GlobalToast-C3_zpgn6.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/GlobalToast-zB2typoK.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.26 kB 🔴 +1.08 kB
assets/SubscribeToRun-2Iw34Px4.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +981 B 🔴 +857 B
assets/SubscribeToRun-DpMnkSYX.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -980 B 🟢 -875 B
assets/CloudRunButtonWrapper-94qfcBC4.js (removed) 1.88 kB 🟢 -1.88 kB 🟢 -860 B 🟢 -790 B
assets/CloudRunButtonWrapper-B05xYl6L.js (new) 1.88 kB 🔴 +1.88 kB 🔴 +861 B 🔴 +793 B
assets/cloudBadges-D-zMcXBC.js (new) 1.65 kB 🔴 +1.65 kB 🔴 +839 B 🔴 +719 B
assets/cloudBadges-D3TWHdqT.js (removed) 1.65 kB 🟢 -1.65 kB 🟢 -840 B 🟢 -737 B
assets/cloudSubscription-BHLYPJRU.js (removed) 1.56 kB 🟢 -1.56 kB 🟢 -762 B 🟢 -653 B
assets/cloudSubscription-DPbEXTq8.js (new) 1.56 kB 🔴 +1.56 kB 🔴 +762 B 🔴 +651 B
assets/previousFullPath-BGmS2axO.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +694 B 🔴 +598 B
assets/previousFullPath-BpBqUERa.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -693 B 🟢 -599 B
assets/Load3D-BLAV2fr8.js (removed) 1.23 kB 🟢 -1.23 kB 🟢 -564 B 🟢 -498 B
assets/Load3D-DrGMc7uB.js (new) 1.23 kB 🔴 +1.23 kB 🔴 +565 B 🔴 +503 B
assets/nightlyBadges-CN2e_1H-.js (removed) 1.18 kB 🟢 -1.18 kB 🟢 -607 B 🟢 -537 B
assets/nightlyBadges-Dvn4BfIk.js (new) 1.18 kB 🔴 +1.18 kB 🔴 +607 B 🔴 +540 B
assets/Load3dViewerContent-BSl_WWEZ.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +515 B 🔴 +453 B
assets/Load3dViewerContent-D7UHBdzL.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -516 B 🟢 -455 B
assets/SubscriptionPanelContentWorkspace-DblU1f6p.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -484 B 🟢 -418 B
assets/SubscriptionPanelContentWorkspace-yBbnX6Nn.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +486 B 🔴 +417 B
assets/WidgetLegacy-DyMRkrMr.js (removed) 864 B 🟢 -864 B 🟢 -433 B 🟢 -378 B
assets/WidgetLegacy-L03-aO7e.js (new) 864 B 🔴 +864 B 🔴 +434 B 🔴 +374 B
assets/changeTracker-BNxyA415.js (new) 839 B 🔴 +839 B 🔴 +423 B 🔴 +370 B
assets/changeTracker-BUKq-7Tp.js (removed) 839 B 🟢 -839 B 🟢 -422 B 🟢 -370 B
assets/graphHasMissingNodes-CrATRc_d.js (new) 822 B 🔴 +822 B 🔴 +414 B 🔴 +348 B
assets/graphHasMissingNodes-DZOzTzE_.js (removed) 822 B 🟢 -822 B 🟢 -414 B 🟢 -348 B

Status: 53 added / 53 removed / 79 unchanged

⚡ Performance Report

⚠️ 5 regressions detected

Metric Baseline PR (n=3) Δ Sig
dom-widget-clipping: DOM nodes 24 26 +7% ⚠️ z=2.5
large-graph-idle: style recalcs 12 12 +6% ⚠️ z=2.4
minimap-idle: style recalcs 10 11 +10% ⚠️ z=2.4
minimap-idle: DOM nodes 20 22 +10% ⚠️ z=2.4
subgraph-mouse-sweep: DOM nodes 70 74 +5% ⚠️ z=3.0
All metrics
Metric Baseline PR (n=3) Δ Sig
canvas-idle: style recalcs 11 11 +3% z=-0.1
canvas-idle: layouts 0 0 +0%
canvas-idle: task duration 367ms 347ms -5% z=-1.4
canvas-idle: DOM nodes 22 23 +1% z=0.3
canvas-idle: script duration 22ms 21ms -3% z=-1.9
canvas-idle: event listeners 14 14 +0% z=0.9
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: frame duration 17ms 17ms -0% z=-1.0
canvas-mouse-sweep: style recalcs 75 79 +5% z=0.0
canvas-mouse-sweep: layouts 12 12 +0%
canvas-mouse-sweep: task duration 783ms 797ms +2% z=-1.2
canvas-mouse-sweep: DOM nodes 59 61 +4% z=-0.4
canvas-mouse-sweep: script duration 134ms 128ms -4% z=-1.1
canvas-mouse-sweep: event listeners 5 5 -12% z=-1.1
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: frame duration 17ms 17ms -0% z=-0.3
canvas-zoom-sweep: style recalcs 31 32 +3% z=0.7
canvas-zoom-sweep: layouts 6 6 +0%
canvas-zoom-sweep: task duration 303ms 290ms -4% z=-1.7
canvas-zoom-sweep: DOM nodes 79 80 +1% z=0.7
canvas-zoom-sweep: script duration 25ms 23ms -10% z=-1.6
canvas-zoom-sweep: event listeners 20 28 +39% z=1.1
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: frame duration 17ms 17ms +0% z=1.2
dom-widget-clipping: style recalcs 14 14 +0% z=1.3
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 349ms 353ms +1% z=-0.8
dom-widget-clipping: DOM nodes 24 26 +7% ⚠️ z=2.5
dom-widget-clipping: script duration 67ms 65ms -3% z=-1.0
dom-widget-clipping: event listeners 18 26 +44% variance too high
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: frame duration 17ms 17ms +0% z=0.6
large-graph-idle: style recalcs 12 12 +6% ⚠️ z=2.4
large-graph-idle: layouts 0 0 +0%
large-graph-idle: task duration 487ms 482ms -1% z=-1.2
large-graph-idle: DOM nodes 25 26 +4% z=1.5
large-graph-idle: script duration 94ms 91ms -3% z=-1.1
large-graph-idle: event listeners 22 30 +36% z=0.8
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: frame duration 17ms 17ms -0% z=-1.3
large-graph-pan: style recalcs 70 69 -0% z=-0.3
large-graph-pan: layouts 0 0 +0%
large-graph-pan: task duration 1016ms 995ms -2% z=-1.8
large-graph-pan: DOM nodes 21 19 -12% z=-0.0
large-graph-pan: script duration 390ms 388ms -0% z=-0.7
large-graph-pan: event listeners 5 5 +0% z=0.6
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: frame duration 17ms 17ms -0% z=-0.7
minimap-idle: style recalcs 10 11 +10% ⚠️ z=2.4
minimap-idle: layouts 0 0 +0%
minimap-idle: task duration 472ms 470ms -1% z=-1.3
minimap-idle: DOM nodes 20 22 +10% ⚠️ z=2.4
minimap-idle: script duration 90ms 88ms -2% z=-1.0
minimap-idle: event listeners 5 6 +29% z=1.9
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: frame duration 17ms 17ms -0% z=-1.9
subgraph-dom-widget-clipping: style recalcs 48 48 -1% z=0.2
subgraph-dom-widget-clipping: layouts 0 0 +0%
subgraph-dom-widget-clipping: task duration 360ms 351ms -3% z=-1.4
subgraph-dom-widget-clipping: DOM nodes 23 22 -4% z=-0.1
subgraph-dom-widget-clipping: script duration 122ms 122ms +0% z=-0.9
subgraph-dom-widget-clipping: event listeners 16 8 -50% z=-1.3
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: frame duration 17ms 17ms +0% z=0.2
subgraph-idle: style recalcs 11 11 +3% z=0.5
subgraph-idle: layouts 0 0 +0%
subgraph-idle: task duration 341ms 338ms -1% z=-1.2
subgraph-idle: DOM nodes 22 24 +8% z=1.0
subgraph-idle: script duration 18ms 18ms +2% z=-1.0
subgraph-idle: event listeners 6 14 +133% variance too high
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: frame duration 17ms 17ms -0% z=0.5
subgraph-mouse-sweep: style recalcs 83 84 +1% z=2.0
subgraph-mouse-sweep: layouts 16 16 +0%
subgraph-mouse-sweep: task duration 818ms 861ms +5% z=1.1
subgraph-mouse-sweep: DOM nodes 70 74 +5% ⚠️ z=3.0
subgraph-mouse-sweep: script duration 99ms 94ms -5% z=-1.0
subgraph-mouse-sweep: event listeners 11 14 +31% variance too high
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: frame duration 17ms 17ms +0% z=1.0
vue-large-graph-idle: style recalcs 0 0 +0%
vue-large-graph-idle: layouts 0 0 +0%
vue-large-graph-idle: task duration 11988ms 11202ms -7%
vue-large-graph-idle: DOM nodes -6674 -3334 -50%
vue-large-graph-idle: script duration 592ms 549ms -7%
vue-large-graph-idle: event listeners -16485 -16488 +0%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: frame duration 18ms 17ms -6%
vue-large-graph-pan: style recalcs 66 66 +1%
vue-large-graph-pan: layouts 0 0 +0%
vue-large-graph-pan: task duration 14255ms 14071ms -1%
vue-large-graph-pan: DOM nodes -3334 -3339 +0%
vue-large-graph-pan: script duration 866ms 866ms +0%
vue-large-graph-pan: event listeners -16486 -16483 -0%
vue-large-graph-pan: TBT 9ms 10ms +7%
vue-large-graph-pan: frame duration 19ms 18ms -3%
workflow-execution: style recalcs 15 16 +7% z=-1.7
workflow-execution: layouts 5 4 -13% z=-2.1
workflow-execution: task duration 109ms 109ms -0% z=-1.3
workflow-execution: DOM nodes 160 154 -4% z=-1.1
workflow-execution: script duration 29ms 25ms -11% z=-1.2
workflow-execution: event listeners 54 60 +10% z=1.9
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: frame duration 17ms 17ms +0% z=0.7
Historical variance (last 10 runs)
Metric μ σ CV
canvas-idle: style recalcs 11 1 4.9%
canvas-idle: layouts 0 0 0.0%
canvas-idle: task duration 397ms 35ms 8.7%
canvas-idle: DOM nodes 22 1 5.9%
canvas-idle: script duration 26ms 2ms 8.9%
canvas-idle: event listeners 10 4 38.6%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: frame duration 17ms 0ms 0.0%
canvas-mouse-sweep: style recalcs 79 2 2.8%
canvas-mouse-sweep: layouts 12 0 0.0%
canvas-mouse-sweep: task duration 866ms 58ms 6.7%
canvas-mouse-sweep: DOM nodes 62 2 3.6%
canvas-mouse-sweep: script duration 136ms 7ms 5.5%
canvas-mouse-sweep: event listeners 9 4 46.3%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: frame duration 17ms 0ms 0.0%
canvas-zoom-sweep: style recalcs 31 0 1.5%
canvas-zoom-sweep: layouts 6 0 0.0%
canvas-zoom-sweep: task duration 330ms 23ms 7.1%
canvas-zoom-sweep: DOM nodes 79 1 0.8%
canvas-zoom-sweep: script duration 28ms 3ms 11.4%
canvas-zoom-sweep: event listeners 23 4 18.4%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: frame duration 17ms 0ms 0.0%
dom-widget-clipping: style recalcs 13 1 4.1%
dom-widget-clipping: layouts 0 0 0.0%
dom-widget-clipping: task duration 368ms 18ms 4.8%
dom-widget-clipping: DOM nodes 22 2 7.1%
dom-widget-clipping: script duration 68ms 4ms 5.6%
dom-widget-clipping: event listeners 8 8 99.9%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: frame duration 17ms 0ms 0.0%
large-graph-idle: style recalcs 12 0 2.7%
large-graph-idle: layouts 0 0 0.0%
large-graph-idle: task duration 554ms 59ms 10.6%
large-graph-idle: DOM nodes 24 1 3.3%
large-graph-idle: script duration 104ms 12ms 11.7%
large-graph-idle: event listeners 25 7 28.2%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: frame duration 17ms 0ms 0.0%
large-graph-pan: style recalcs 70 1 0.9%
large-graph-pan: layouts 0 0 0.0%
large-graph-pan: task duration 1084ms 50ms 4.7%
large-graph-pan: DOM nodes 19 2 9.7%
large-graph-pan: script duration 405ms 23ms 5.7%
large-graph-pan: event listeners 5 1 15.9%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: frame duration 17ms 0ms 0.0%
minimap-idle: style recalcs 9 1 6.9%
minimap-idle: layouts 0 0 0.0%
minimap-idle: task duration 535ms 51ms 9.5%
minimap-idle: DOM nodes 19 1 6.9%
minimap-idle: script duration 99ms 11ms 11.1%
minimap-idle: event listeners 5 1 15.9%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: frame duration 17ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalcs 48 1 1.4%
subgraph-dom-widget-clipping: layouts 0 0 0.0%
subgraph-dom-widget-clipping: task duration 380ms 21ms 5.5%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.7%
subgraph-dom-widget-clipping: script duration 129ms 8ms 5.8%
subgraph-dom-widget-clipping: event listeners 17 7 41.7%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: frame duration 17ms 0ms 0.0%
subgraph-idle: style recalcs 11 1 6.9%
subgraph-idle: layouts 0 0 0.0%
subgraph-idle: task duration 375ms 31ms 8.3%
subgraph-idle: DOM nodes 22 2 7.8%
subgraph-idle: script duration 21ms 3ms 12.7%
subgraph-idle: event listeners 12 8 63.4%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: frame duration 17ms 0ms 0.0%
subgraph-mouse-sweep: style recalcs 80 2 2.2%
subgraph-mouse-sweep: layouts 16 0 0.0%
subgraph-mouse-sweep: task duration 784ms 70ms 9.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.1%
subgraph-mouse-sweep: script duration 102ms 7ms 7.3%
subgraph-mouse-sweep: event listeners 8 4 51.6%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: frame duration 17ms 0ms 0.0%
workflow-execution: style recalcs 18 1 6.8%
workflow-execution: layouts 5 0 5.6%
workflow-execution: task duration 124ms 12ms 9.5%
workflow-execution: DOM nodes 161 6 3.8%
workflow-execution: script duration 30ms 4ms 11.8%
workflow-execution: event listeners 52 4 7.9%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: frame duration 17ms 0ms 0.0%
Trend (last 10 commits on main)
Metric Trend Dir Latest
canvas-idle: style recalcs █▅▁▃▁▃▆█▆█ ➡️ 12
canvas-idle: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: task duration ▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: DOM nodes █▄▁▂▂▅▆▆▇▇ ➡️ 24
canvas-idle: script duration ▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: event listeners █▂▁▂▇██▂█▆ 📈 11
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: frame duration ▁▆█▆▆▃▁▁▃▁ ➡️ 17ms
canvas-mouse-sweep: style recalcs ▂▁▄▄▆▇▆▃█▅ ➡️ 79
canvas-mouse-sweep: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: task duration ▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: DOM nodes ▁▁▄▂▅█▇▃▆▆ ➡️ 64
canvas-mouse-sweep: script duration ▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: event listeners ▁▇▁▁▁██▇▁█ 📈 13
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: frame duration ▄▁██▁▅██▅▄ ➡️ 17ms
canvas-zoom-sweep: style recalcs ▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: task duration ▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: DOM nodes ▁▄█▅▆▆▄▃▅▄ ➡️ 79
canvas-zoom-sweep: script duration ▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: event listeners ▂▂█▁██▇▁█▁ ➡️ 19
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: frame duration ▁▁▁█▁▁███▁ ➡️ 17ms
dom-widget-clipping: style recalcs ▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: task duration ▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: DOM nodes ▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: script duration ▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: event listeners ▅██▁▁▁▁█▁▁ 📉 2
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: frame duration ▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
large-graph-idle: style recalcs ▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: task duration ▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: DOM nodes ▃▁▂▃▆▆▇▂█▆ ➡️ 25
large-graph-idle: script duration ▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: event listeners █▄▁▄▇▇█▂█▇ 📈 29
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: frame duration ▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-pan: style recalcs ▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: task duration ▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: DOM nodes ▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: script duration ▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: event listeners ▆▁▁▃▆▁▃██▃ ➡️ 5
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: frame duration ▃▁█▆▆▆▆█▁▆ ➡️ 17ms
minimap-idle: style recalcs ▄█▁▂▇▂▁▇█▄ ➡️ 9
minimap-idle: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: task duration ▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: DOM nodes ▄█▁▂▇▂▁▇█▄ ➡️ 19
minimap-idle: script duration ▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: event listeners ▁▃▁▁▆▁▃█▆▁ ➡️ 4
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: frame duration ▁█▆▆▃▃▆█▆█ ➡️ 17ms
subgraph-dom-widget-clipping: style recalcs ▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: task duration ▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: DOM nodes ▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: script duration ▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: event listeners ▁▅██▁▁█▅█▅ 📈 16
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: frame duration ▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-idle: style recalcs ▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: task duration ▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: DOM nodes ▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: script duration ▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: event listeners ▁▁▁▁▅▄▁███ 📈 21
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: frame duration ▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-mouse-sweep: style recalcs ▄▂▄█▅▆▃▁▃▄ ➡️ 81
subgraph-mouse-sweep: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: task duration ▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: DOM nodes ▃▂▃█▄▅▃▁▄▃ ➡️ 66
subgraph-mouse-sweep: script duration ▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: event listeners ▁▁▁█▇▂▁▇▇▁ ➡️ 5
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: frame duration ▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
workflow-execution: style recalcs ▃▆█▇▆▆▇▃▄▁ ➡️ 15
workflow-execution: layouts ▆▆▁▆▆█▆▃▆▃ ➡️ 5
workflow-execution: task duration ▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: DOM nodes ▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: script duration ▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: event listeners ▄███▁██▄█▄ ➡️ 49
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: frame duration ▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
Raw data
{
  "timestamp": "2026-03-18T01:55:46.229Z",
  "gitSha": "f20f218700291cfd05e4955059e96b123a5fe23b",
  "branch": "austin/snap-ocd",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2038.4629999999788,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 9.081999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 363.41999999999996,
      "heapDeltaBytes": 1402500,
      "domNodes": 23,
      "jsHeapTotalBytes": 18087936,
      "scriptDurationMs": 19.944999999999997,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-idle",
      "durationMs": 2039.1079999999988,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 11.334999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 341.994,
      "heapDeltaBytes": 1505560,
      "domNodes": 25,
      "jsHeapTotalBytes": 17825792,
      "scriptDurationMs": 20.641,
      "eventListeners": 30,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "canvas-idle",
      "durationMs": 2048.59399999998,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.501,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 335.744,
      "heapDeltaBytes": -5160384,
      "domNodes": 20,
      "jsHeapTotalBytes": 24903680,
      "scriptDurationMs": 22.627999999999997,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2023.0070000000069,
      "styleRecalcs": 85,
      "styleRecalcDurationMs": 44.879000000000005,
      "layouts": 12,
      "layoutDurationMs": 3.756,
      "taskDurationMs": 952.2520000000001,
      "heapDeltaBytes": -1814876,
      "domNodes": 67,
      "jsHeapTotalBytes": 17301504,
      "scriptDurationMs": 132.11800000000002,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1815.129000000013,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 34.259,
      "layouts": 12,
      "layoutDurationMs": 3.4709999999999996,
      "taskDurationMs": 727.373,
      "heapDeltaBytes": -1865060,
      "domNodes": 58,
      "jsHeapTotalBytes": 17825792,
      "scriptDurationMs": 125.64200000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1809.020999999916,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 36.278,
      "layouts": 12,
      "layoutDurationMs": 3.817,
      "taskDurationMs": 712.569,
      "heapDeltaBytes": -2136940,
      "domNodes": 59,
      "jsHeapTotalBytes": 16252928,
      "scriptDurationMs": 126.33800000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1749.5379999999727,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 16.468000000000004,
      "layouts": 6,
      "layoutDurationMs": 0.7130000000000001,
      "taskDurationMs": 289.518,
      "heapDeltaBytes": 6146584,
      "domNodes": 78,
      "jsHeapTotalBytes": 14680064,
      "scriptDurationMs": 24.075,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1760.2259999999887,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 17.701,
      "layouts": 6,
      "layoutDurationMs": 0.5140000000000001,
      "taskDurationMs": 289.454,
      "heapDeltaBytes": 6631300,
      "domNodes": 82,
      "jsHeapTotalBytes": 15728640,
      "scriptDurationMs": 22.125999999999994,
      "eventListeners": 45,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1731.8769999999404,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 14.8,
      "layouts": 6,
      "layoutDurationMs": 0.533,
      "taskDurationMs": 292.305,
      "heapDeltaBytes": 6537196,
      "domNodes": 79,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 22.046999999999997,
      "eventListeners": 21,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 591.4679999999919,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 10.675999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 361.63499999999993,
      "heapDeltaBytes": 14324700,
      "domNodes": 25,
      "jsHeapTotalBytes": 13893632,
      "scriptDurationMs": 65.72600000000001,
      "eventListeners": 26,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 577.4499999999989,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 10.655,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 341.71299999999997,
      "heapDeltaBytes": 13649080,
      "domNodes": 25,
      "jsHeapTotalBytes": 15204352,
      "scriptDurationMs": 62.129000000000005,
      "eventListeners": 26,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 576.7559999999321,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 11.751000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 356.88,
      "heapDeltaBytes": 13164324,
      "domNodes": 27,
      "jsHeapTotalBytes": 16252928,
      "scriptDurationMs": 65.90499999999999,
      "eventListeners": 26,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2005.348999999967,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 12.369,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 477.163,
      "heapDeltaBytes": -10176240,
      "domNodes": 25,
      "jsHeapTotalBytes": 8245248,
      "scriptDurationMs": 88.08099999999999,
      "eventListeners": 30,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2016.820999999993,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 10.546999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 484.183,
      "heapDeltaBytes": -10207576,
      "domNodes": 27,
      "jsHeapTotalBytes": 6934528,
      "scriptDurationMs": 92.107,
      "eventListeners": 30,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2022.6669999999558,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 11.011999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 483.177,
      "heapDeltaBytes": -10191244,
      "domNodes": 25,
      "jsHeapTotalBytes": 8769536,
      "scriptDurationMs": 92.10700000000001,
      "eventListeners": 30,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2102.687000000003,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 16.699,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 980.4519999999999,
      "heapDeltaBytes": 22585204,
      "domNodes": 20,
      "jsHeapTotalBytes": 7778304,
      "scriptDurationMs": 381.20500000000004,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2104.377999999997,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 16.027,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1036.208,
      "heapDeltaBytes": 6257904,
      "domNodes": 20,
      "jsHeapTotalBytes": 9236480,
      "scriptDurationMs": 414.466,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2075.089999999932,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 13.959,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 969.2990000000001,
      "heapDeltaBytes": 1285496,
      "domNodes": 16,
      "jsHeapTotalBytes": 9760768,
      "scriptDurationMs": 369.11699999999996,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "minimap-idle",
      "durationMs": 1989.0369999999962,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.309000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 476.954,
      "heapDeltaBytes": -10383240,
      "domNodes": 22,
      "jsHeapTotalBytes": 8507392,
      "scriptDurationMs": 87.722,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "minimap-idle",
      "durationMs": 1987.1400000000108,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.705,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 465.285,
      "heapDeltaBytes": -10880900,
      "domNodes": 22,
      "jsHeapTotalBytes": 8507392,
      "scriptDurationMs": 87.949,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "minimap-idle",
      "durationMs": 2006.0019999999668,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.576,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 466.314,
      "heapDeltaBytes": -10542240,
      "domNodes": 22,
      "jsHeapTotalBytes": 8769536,
      "scriptDurationMs": 87.199,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 542.6820000000134,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 10.813,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 349.414,
      "heapDeltaBytes": 13620436,
      "domNodes": 22,
      "jsHeapTotalBytes": 13631488,
      "scriptDurationMs": 122.17900000000002,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 572.5780000000213,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 11.889999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 355.245,
      "heapDeltaBytes": 13045100,
      "domNodes": 22,
      "jsHeapTotalBytes": 14680064,
      "scriptDurationMs": 123.82799999999999,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 558.4059999999909,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 11.325,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 347.986,
      "heapDeltaBytes": 13464960,
      "domNodes": 22,
      "jsHeapTotalBytes": 13107200,
      "scriptDurationMs": 119.835,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2000.9560000000306,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 11.525,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 336.836,
      "heapDeltaBytes": 2830228,
      "domNodes": 27,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 16.260000000000005,
      "eventListeners": 30,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2021.2469999999598,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.658000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 331.82500000000005,
      "heapDeltaBytes": 1502904,
      "domNodes": 22,
      "jsHeapTotalBytes": 16777216,
      "scriptDurationMs": 16.898000000000003,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2038.0969999999934,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 12.217,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 345.478,
      "heapDeltaBytes": 1530956,
      "domNodes": 22,
      "jsHeapTotalBytes": 14155776,
      "scriptDurationMs": 21.647,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 2015.312999999992,
      "styleRecalcs": 86,
      "styleRecalcDurationMs": 45.063,
      "layouts": 16,
      "layoutDurationMs": 4.531000000000001,
      "taskDurationMs": 885.0169999999999,
      "heapDeltaBytes": -6691012,
      "domNodes": 77,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 99.256,
      "eventListeners": 30,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.680000000000017
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1990.115000000003,
      "styleRecalcs": 84,
      "styleRecalcDurationMs": 41.855999999999995,
      "layouts": 16,
      "layoutDurationMs": 4.059,
      "taskDurationMs": 865.642,
      "heapDeltaBytes": -6524128,
      "domNodes": 73,
      "jsHeapTotalBytes": 14680064,
      "scriptDurationMs": 92.423,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1905.5329999999913,
      "styleRecalcs": 82,
      "styleRecalcDurationMs": 42.471000000000004,
      "layouts": 16,
      "layoutDurationMs": 4.8500000000000005,
      "taskDurationMs": 831.96,
      "heapDeltaBytes": -6798824,
      "domNodes": 71,
      "jsHeapTotalBytes": 17301504,
      "scriptDurationMs": 90.696,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11239.269999999977,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11231.227,
      "heapDeltaBytes": -19025960,
      "domNodes": -3336,
      "jsHeapTotalBytes": 19660800,
      "scriptDurationMs": 542.432,
      "eventListeners": -16490,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.339999999999783
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11288.66800000003,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11276.443000000001,
      "heapDeltaBytes": -38652660,
      "domNodes": -3333,
      "jsHeapTotalBytes": 18874368,
      "scriptDurationMs": 577.325,
      "eventListeners": -16486,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000217
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11107.931000000008,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11098.29,
      "heapDeltaBytes": -28451104,
      "domNodes": -3333,
      "jsHeapTotalBytes": 19660800,
      "scriptDurationMs": 526.553,
      "eventListeners": -16488,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000217
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14084.146000000033,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 12.954999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14067.000999999998,
      "heapDeltaBytes": -1528624,
      "domNodes": -3338,
      "jsHeapTotalBytes": 18001920,
      "scriptDurationMs": 840.781,
      "eventListeners": -16484,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.339999999999783
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14021.53199999998,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 14.522000000000007,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14004.755,
      "heapDeltaBytes": -14360124,
      "domNodes": -3340,
      "jsHeapTotalBytes": 16166912,
      "scriptDurationMs": 844.519,
      "eventListeners": -16482,
      "totalBlockingTimeMs": 30,
      "frameDurationMs": 18.329999999999927
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14161.005999999928,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 12.764999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14141.372999999998,
      "heapDeltaBytes": -45034440,
      "domNodes": -3338,
      "jsHeapTotalBytes": 17825792,
      "scriptDurationMs": 913.838,
      "eventListeners": -16482,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.340000000000146
    },
    {
      "name": "workflow-execution",
      "durationMs": 449.6599999999944,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 24.872999999999998,
      "layouts": 5,
      "layoutDurationMs": 1.385,
      "taskDurationMs": 124.222,
      "heapDeltaBytes": 4766540,
      "domNodes": 163,
      "jsHeapTotalBytes": 4980736,
      "scriptDurationMs": 28.579,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "workflow-execution",
      "durationMs": 444.47999999999865,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 27.458999999999996,
      "layouts": 4,
      "layoutDurationMs": 1.0870000000000002,
      "taskDurationMs": 117.34800000000001,
      "heapDeltaBytes": 4404416,
      "domNodes": 157,
      "jsHeapTotalBytes": 4194304,
      "scriptDurationMs": 24.143,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "workflow-execution",
      "durationMs": 107.4029999999766,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 16.907000000000004,
      "layouts": 4,
      "layoutDurationMs": 1.2690000000000001,
      "taskDurationMs": 85.85000000000001,
      "heapDeltaBytes": 2755692,
      "domNodes": 141,
      "jsHeapTotalBytes": 3145728,
      "scriptDurationMs": 23.706,
      "eventListeners": 37,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    }
  ]
}

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
src/lib/litegraph/src/Reroute.ts (1)

428-437: Snapping logic is correct.

The offset-based snapping technique properly aligns reroutes with node slot positions. Consider adding a brief comment explaining the 0.7 multiplier's purpose for future maintainers—the PR description notes this as a "magic constant" that may need revisiting.

,

💡 Optional: Add clarifying comment
   snapToGrid(snapTo: number): boolean {
     if (!snapTo) return false

+    // Offset to align reroute center with slot vertical position
     const offsetY = LiteGraph.NODE_SLOT_HEIGHT * 0.7
     const { pos } = this
     pos[0] = snapTo * Math.round(pos[0] / snapTo)
     pos[1] = snapTo * Math.round((pos[1] - offsetY) / snapTo) + offsetY
     return true
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/lib/litegraph/src/Reroute.ts` around lines 428 - 437, The snapping math
in snapToGrid uses a "magic constant" multiplier LiteGraph.NODE_SLOT_HEIGHT *
0.7 without explanation; add a short clarifying comment above the computation in
the snapToGrid method describing why 0.7 is used (to offset the reroute to align
with node slot centers/visual anchor) and note that it may need tuning if
NODE_SLOT_HEIGHT changes; reference the snapToGrid function and the offsetY =
LiteGraph.NODE_SLOT_HEIGHT * 0.7 calculation so reviewers can find and update
the comment later.
src/lib/litegraph/src/LGraphCanvas.ts (1)

5805-5808: Replace the unnamed slot-offset multiplier with a named constant

Line 5805 introduces a hardcoded 0.7 multiplier. Please extract it into a named constant so this snap behavior is self-documenting and easier to keep consistent with other slot-snap paths.

♻️ Proposed refactor
+const SLOT_SNAP_OFFSET_MULTIPLIER = 0.7
...
-    const offsetY =
-      pos[1] -
-      snapGuide[1] -
-      (offsetToSlot ? LiteGraph.NODE_SLOT_HEIGHT * 0.7 : 0)
+    const slotOffsetY = offsetToSlot
+      ? LiteGraph.NODE_SLOT_HEIGHT * SLOT_SNAP_OFFSET_MULTIPLIER
+      : 0
+    const offsetY = pos[1] - snapGuide[1] - slotOffsetY

As per coding guidelines: "Write code that is expressive and self-documenting; avoid comments unless absolutely necessary."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/lib/litegraph/src/LGraphCanvas.ts` around lines 5805 - 5808, The
calculation for offsetY uses a magic number 0.7; replace it with a named
constant (e.g., NODE_SLOT_OFFSET_RATIO or SLOT_OFFSET_MULTIPLIER) to make the
snap behavior self-documenting. Introduce the constant near related graph/layout
constants or at the top of LGraphCanvas, then update the expression in the
offsetY calculation (which uses pos, snapGuide, offsetToSlot, and
LiteGraph.NODE_SLOT_HEIGHT) to multiply by that constant instead of 0.7 so all
slot-snap logic refers to a single, descriptive symbol.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/lib/litegraph/src/LGraphCanvas.ts`:
- Around line 5805-5808: The calculation for offsetY uses a magic number 0.7;
replace it with a named constant (e.g., NODE_SLOT_OFFSET_RATIO or
SLOT_OFFSET_MULTIPLIER) to make the snap behavior self-documenting. Introduce
the constant near related graph/layout constants or at the top of LGraphCanvas,
then update the expression in the offsetY calculation (which uses pos,
snapGuide, offsetToSlot, and LiteGraph.NODE_SLOT_HEIGHT) to multiply by that
constant instead of 0.7 so all slot-snap logic refers to a single, descriptive
symbol.

In `@src/lib/litegraph/src/Reroute.ts`:
- Around line 428-437: The snapping math in snapToGrid uses a "magic constant"
multiplier LiteGraph.NODE_SLOT_HEIGHT * 0.7 without explanation; add a short
clarifying comment above the computation in the snapToGrid method describing why
0.7 is used (to offset the reroute to align with node slot centers/visual
anchor) and note that it may need tuning if NODE_SLOT_HEIGHT changes; reference
the snapToGrid function and the offsetY = LiteGraph.NODE_SLOT_HEIGHT * 0.7
calculation so reviewers can find and update the comment later.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e1d4223b-1236-469e-b891-c63832205f1e

📥 Commits

Reviewing files that changed from the base of the PR and between c2cf8e4 and 01dc6d9.

📒 Files selected for processing (3)
  • src/lib/litegraph/src/LGraphCanvas.ts
  • src/lib/litegraph/src/Reroute.ts
  • src/lib/litegraph/src/subgraph/SubgraphIONodeBase.ts

Should be safer for tests and is technically the smaller delta
@dosubot dosubot bot added the size:S This PR changes 10-29 lines, ignoring generated files. label Mar 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S This PR changes 10-29 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant