Skip to content

fix: avoid forced layout in renderInfo by using canvas.height#9304

Merged
christian-byrne merged 3 commits intomainfrom
perf/fix-render-info
Mar 13, 2026
Merged

fix: avoid forced layout in renderInfo by using canvas.height#9304
christian-byrne merged 3 commits intomainfrom
perf/fix-render-info

Conversation

@christian-byrne
Copy link
Copy Markdown
Contributor

@christian-byrne christian-byrne commented Feb 28, 2026

What

Replace canvas.offsetHeight with canvas.height / devicePixelRatio in renderInfo to avoid forced synchronous layout.

Why

renderInfo is called ~2,631 times in a typical session. Each call reads this.canvas.offsetHeight, which forces the browser to flush pending style/layout changes synchronously. With PrimeVue injecting styles dynamically and Vue patching the DOM, there are almost always pending mutations — converting every canvas-only renderInfo call into a forced layout.

How

canvas.height is the DPR-scaled internal resolution (set in resizeCanvas as cssHeight * devicePixelRatio). Dividing by devicePixelRatio yields the same CSS pixel value as offsetHeight without triggering layout.

Verification

  • Unit test: verifies offsetHeight is not accessed when y is provided
  • Unit test: verifies fallback uses canvas.height / devicePixelRatio
  • pnpm typecheck passes
  • pnpm lint passes
  • All litegraph tests pass (538 passed)

Perf Impact

Eliminates ~2,631 forced synchronous layouts per session from the canvas info panel.

┆Issue is synchronized with this Notion page by Unito

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Feb 28, 2026

🎭 Playwright: ✅ 561 passed, 0 failed · 3 flaky

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

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Feb 28, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/13/2026, 03:14:05 PM UTC

Links

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 28, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 836afe0c-781c-40d1-b2c9-9d68d140f63d

📥 Commits

Reviewing files that changed from the base of the PR and between e933440 and a9ea00b.

📒 Files selected for processing (2)
  • src/lib/litegraph/src/LGraphCanvas.renderInfo.test.ts
  • src/lib/litegraph/src/LGraphCanvas.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/lib/litegraph/src/LGraphCanvas.ts
  • src/lib/litegraph/src/LGraphCanvas.renderInfo.test.ts

📝 Walkthrough

Walkthrough

renderInfo now defaults its y coordinate to the canvas height divided by devicePixelRatio instead of using offsetHeight. A new unit test file was added that mocks CanvasRenderingContext2D and a canvas to verify renderInfo's coordinate computation and context calls.

Changes

Cohort / File(s) Summary
HiDPI Canvas Rendering
src/lib/litegraph/src/LGraphCanvas.ts
renderInfo defaults y to canvas.height / devicePixelRatio (replaces use of offsetHeight) to compute vertical placement for HiDPI canvases.
Test Coverage Addition
src/lib/litegraph/src/LGraphCanvas.renderInfo.test.ts
Adds unit tests that mock CanvasRenderingContext2D and a canvas to assert translate/fillText calls and verify y-coordinate calculation with DPR.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 I nibble pixels late at night,
DPR guides my gentle sight,
Offsets gone — I hop with glee,
Tests ensure my place to be.
Hop, hop — the canvas sings to me!

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: replacing canvas.offsetHeight with canvas.height to avoid forced layout in renderInfo.
Description check ✅ Passed The description includes all required sections: summary, changes (What/Why/How), verification steps, and performance impact details.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch perf/fix-render-info

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

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Feb 28, 2026

📦 Bundle: 4.62 MB gzip 🔴 +36 B

Details

Summary

  • Raw size: 21.6 MB baseline 21.6 MB — 🔴 +70 B
  • Gzip: 4.62 MB baseline 4.62 MB — 🔴 +36 B
  • Brotli: 3.56 MB baseline 3.56 MB — 🔴 +165 B
  • Bundles: 234 current • 234 baseline • 110 added / 110 removed

Category Glance
Data & Services 🔴 +70 B (2.8 MB) · Vendor & Third-Party ⚪ 0 B (8.9 MB) · Other ⚪ 0 B (8.16 MB) · Graph Workspace ⚪ 0 B (1.02 MB) · Panels & Settings ⚪ 0 B (453 kB) · Editors & Dialogs ⚪ 0 B (78.2 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BwVyjbj0.js (removed) 17.7 kB 🟢 -17.7 kB 🟢 -6.25 kB 🟢 -5.41 kB
assets/index-FXt8Wrtm.js (new) 17.7 kB 🔴 +17.7 kB 🔴 +6.25 kB 🔴 +5.4 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BcAS2hvg.js (new) 1.02 MB 🔴 +1.02 MB 🔴 +213 kB 🔴 +161 kB
assets/GraphView-X6ebc7bv.js (removed) 1.02 MB 🟢 -1.02 MB 🟢 -213 kB 🟢 -161 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-Czewvw0C.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.82 kB
assets/CloudSurveyView-QKqFHqTJ.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.82 kB
assets/CloudLoginView-BYsEsU3i.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.19 kB 🔴 +2.82 kB
assets/CloudLoginView-mxS90i-p.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.19 kB 🟢 -2.82 kB
assets/CloudSignupView-CYCZozjm.js (new) 9.36 kB 🔴 +9.36 kB 🔴 +2.69 kB 🔴 +2.36 kB
assets/CloudSignupView-CzN4MbQV.js (removed) 9.36 kB 🟢 -9.36 kB 🟢 -2.69 kB 🟢 -2.36 kB
assets/UserCheckView-Dh2oUp2o.js (new) 8.42 kB 🔴 +8.42 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/UserCheckView-UeOnCqBU.js (removed) 8.42 kB 🟢 -8.42 kB 🟢 -2.23 kB 🟢 -1.95 kB
assets/CloudLayoutView-DG3NsSe8.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -2.15 kB 🟢 -1.86 kB
assets/CloudLayoutView-eirEGSj4.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +2.15 kB 🔴 +1.86 kB
assets/CloudForgotPasswordView-BYuksKf1.js (new) 5.55 kB 🔴 +5.55 kB 🔴 +1.93 kB 🔴 +1.7 kB
assets/CloudForgotPasswordView-CrB1ubN-.js (removed) 5.55 kB 🟢 -5.55 kB 🟢 -1.93 kB 🟢 -1.7 kB
assets/CloudAuthTimeoutView-C1M9IGfl.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.77 kB 🔴 +1.56 kB
assets/CloudAuthTimeoutView-DnR66L0D.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CloudSubscriptionRedirectView-DMblZfh6.js (removed) 4.74 kB 🟢 -4.74 kB 🟢 -1.78 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-fKQECIem.js (new) 4.74 kB 🔴 +4.74 kB 🔴 +1.78 kB 🔴 +1.58 kB
assets/UserSelectView-D4yh2p09.js (removed) 4.55 kB 🟢 -4.55 kB 🟢 -1.67 kB 🟢 -1.48 kB
assets/UserSelectView-kkimZWy-.js (new) 4.55 kB 🔴 +4.55 kB 🔴 +1.67 kB 🔴 +1.48 kB
assets/CloudSorryContactSupportView-O5MrD5Yk.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-Bj6_U0-O.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-BuhJMK1M.js (removed) 27.8 kB 🟢 -27.8 kB 🟢 -6.02 kB 🟢 -5.36 kB
assets/KeybindingPanel-CPNTPYKI.js (new) 27.8 kB 🔴 +27.8 kB 🔴 +6.02 kB 🔴 +5.36 kB
assets/SecretsPanel-B098BDGp.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.65 kB
assets/SecretsPanel-Cr1hzmv8.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.29 kB 🔴 +4.66 kB
assets/LegacyCreditsPanel-_EUojJLI.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.57 kB 🟢 -4.9 kB
assets/LegacyCreditsPanel-S70BcUcY.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.57 kB 🔴 +4.91 kB
assets/SubscriptionPanel-BJGtMCOM.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.77 kB 🔴 +4.2 kB
assets/SubscriptionPanel-CNLGxGhB.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.77 kB 🟢 -4.2 kB
assets/AboutPanel-DuKWdIcU.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.18 kB 🟢 -2.86 kB
assets/AboutPanel-DVwtwDCT.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.18 kB 🔴 +2.86 kB
assets/ExtensionPanel-BsmrZJqR.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.65 kB 🟢 -2.36 kB
assets/ExtensionPanel-CG10sZDj.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.64 kB 🔴 +2.36 kB
assets/ServerConfigPanel-BMXGFwta.js (new) 6.45 kB 🔴 +6.45 kB 🔴 +2.12 kB 🔴 +1.9 kB
assets/ServerConfigPanel-CkTN7TQw.js (removed) 6.45 kB 🟢 -6.45 kB 🟢 -2.12 kB 🟢 -1.91 kB
assets/UserPanel-B-W5QSRg.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -1.99 kB 🟢 -1.75 kB
assets/UserPanel-BQ7HsRih.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +1.99 kB 🔴 +1.76 kB
assets/cloudRemoteConfig-DB8I0OPN.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +706 B 🔴 +616 B
assets/cloudRemoteConfig-lsRc2BD3.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -706 B 🟢 -614 B
assets/refreshRemoteConfig-BKuyTzvT.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -519 B 🟢 -454 B
assets/refreshRemoteConfig-CD2QydbT.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +520 B 🔴 +457 B
assets/config-p2eCRj7g.js 1.22 kB 1.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B3Lo1XmI.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BhljmVLI.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BMZqZMWV.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-bRtLtC70.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-bThwkOsC.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C1uM8WjX.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DvY3JpnZ.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-OPXE36wg.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Qe3udZkm.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-x4lDOTHy.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-yz0uqs_Z.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-DCZMaG7c.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +992 B
assets/auth-DPhqX7dl.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -990 B
assets/SignUpForm-BbafXOPz.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/SignUpForm-CFB-Tc63.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.1 kB
assets/UpdatePasswordContent-BdHJsTzW.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +946 B
assets/UpdatePasswordContent-DLIK4-m7.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.06 kB 🟢 -940 B
assets/firebaseAuthStore-C9Jo59X8.js (removed) 788 B 🟢 -788 B 🟢 -384 B 🟢 -342 B
assets/firebaseAuthStore-DbQvRdwn.js (new) 788 B 🔴 +788 B 🔴 +383 B 🔴 +342 B
assets/auth-C0ruJtSM.js (removed) 357 B 🟢 -357 B 🟢 -227 B 🟢 -196 B
assets/auth-CWmj9CJB.js (new) 357 B 🔴 +357 B 🔴 +225 B 🔴 +192 B
assets/PasswordFields-qoMlUe6p.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-CgUZo4DJ.js 1.59 kB 1.59 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-B87hq7ux.js (removed) 77.5 kB 🟢 -77.5 kB 🟢 -16.6 kB 🟢 -14.2 kB
assets/useShareDialog-Bo8m0ZlY.js (new) 77.5 kB 🔴 +77.5 kB 🔴 +16.6 kB 🔴 +14.2 kB
assets/useSubscriptionDialog-7Uo4y1m8.js (new) 736 B 🔴 +736 B 🔴 +378 B 🔴 +327 B
assets/useSubscriptionDialog-DutK8ofX.js (removed) 736 B 🟢 -736 B 🟢 -378 B 🟢 -324 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-BpVwgwn2.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.9 kB 🔴 +3.48 kB
assets/ComfyQueueButton-DOZFP98e.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.91 kB 🟢 -3.48 kB
assets/useTerminalTabs-DJUgWstu.js (new) 9.83 kB 🔴 +9.83 kB 🔴 +3.39 kB 🔴 +2.99 kB
assets/useTerminalTabs-dmdcICO0.js (removed) 9.83 kB 🟢 -9.83 kB 🟢 -3.39 kB 🟢 -2.99 kB
assets/SubscribeButton-C35caoB_.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.01 kB 🔴 +887 B
assets/SubscribeButton-dxdm9PaP.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1.01 kB 🟢 -884 B
assets/cloudFeedbackTopbarButton-85FSTqtJ.js (removed) 1.38 kB 🟢 -1.38 kB 🟢 -727 B 🟢 -632 B
assets/cloudFeedbackTopbarButton-BEedxnlt.js (new) 1.38 kB 🔴 +1.38 kB 🔴 +724 B 🔴 +632 B
assets/ComfyQueueButton-BY6DxN3_.js (removed) 793 B 🟢 -793 B 🟢 -390 B 🟢 -351 B
assets/ComfyQueueButton-BzRZA94f.js (new) 793 B 🔴 +793 B 🔴 +393 B 🔴 +354 B
assets/Button-BIoUeovV.js 3.22 kB 3.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-KKDIsNYK.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-CQqg_haP.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-DCI1UgNr.js 6.11 kB 6.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/toggle-group-Cgt7zJqu.js 3.83 kB 3.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-CDV8z5F5.js 7.39 kB 7.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-rA7elnKS.js 1.19 kB 1.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-JuBR2s7Q.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.8 MB (baseline 2.8 MB) • 🔴 +70 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-BuGTburD.js (removed) 1.96 MB 🟢 -1.96 MB 🟢 -440 kB 🟢 -329 kB
assets/dialogService-VJFEzLpK.js (new) 1.96 MB 🔴 +1.96 MB 🔴 +440 kB 🔴 +329 kB
assets/api-Dv6wabAB.js (new) 697 kB 🔴 +697 kB 🔴 +157 kB 🔴 +125 kB
assets/api-F9aUEOUL.js (removed) 697 kB 🟢 -697 kB 🟢 -157 kB 🟢 -125 kB
assets/load3dService-CFg0t5VH.js (removed) 91.1 kB 🟢 -91.1 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/load3dService-GQrr3Kd7.js (new) 91.1 kB 🔴 +91.1 kB 🔴 +19.1 kB 🔴 +16.5 kB
assets/extensionStore-Bntsexak.js (new) 14.4 kB 🔴 +14.4 kB 🔴 +4.87 kB 🔴 +4.3 kB
assets/extensionStore-DQEI4QW_.js (removed) 14.4 kB 🟢 -14.4 kB 🟢 -4.87 kB 🟢 -4.31 kB
assets/workflowShareService-BqAJsafE.js (new) 13.3 kB 🔴 +13.3 kB 🔴 +4.11 kB 🔴 +3.63 kB
assets/workflowShareService-CBqvnTci.js (removed) 13.3 kB 🟢 -13.3 kB 🟢 -4.11 kB 🟢 -3.63 kB
assets/releaseStore-B_Xr17bQ.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/releaseStore-CndbVB6F.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.97 kB
assets/keybindingService-Ct3dB5qF.js (new) 7.16 kB 🔴 +7.16 kB 🔴 +1.72 kB 🔴 +1.48 kB
assets/keybindingService-DfCb_0Hg.js (removed) 7.16 kB 🟢 -7.16 kB 🟢 -1.72 kB 🟢 -1.49 kB
assets/bootstrapStore-AU3IVkcf.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +873 B 🔴 +793 B
assets/bootstrapStore-BY1YrgL4.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -875 B 🟢 -795 B
assets/userStore-9ySVTwG4.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -721 B 🟢 -634 B
assets/userStore-DtHQV5GJ.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +722 B 🔴 +634 B
assets/audioService-CnS-6jTh.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +846 B 🔴 +723 B
assets/audioService-CWpZ6xMx.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -848 B 🟢 -726 B
assets/releaseStore-hbfKLdTa.js (removed) 760 B 🟢 -760 B 🟢 -383 B 🟢 -340 B
assets/releaseStore-Vx_0wQPB.js (new) 760 B 🔴 +760 B 🔴 +379 B 🔴 +344 B
assets/settingStore-fEnYTVi2.js (new) 744 B 🔴 +744 B 🔴 +385 B 🔴 +340 B
assets/settingStore-VTlW4DeR.js (removed) 744 B 🟢 -744 B 🟢 -383 B 🟢 -336 B
assets/workflowDraftStore-DaG_W71D.js (new) 736 B 🔴 +736 B 🔴 +374 B 🔴 +333 B
assets/workflowDraftStore-pTvcKThW.js (removed) 736 B 🟢 -736 B 🟢 -378 B 🟢 -332 B
assets/dialogService-DQDpGmKS.js (new) 725 B 🔴 +725 B 🔴 +366 B 🔴 +325 B
assets/dialogService-DY9GPKJ0.js (removed) 725 B 🟢 -725 B 🟢 -367 B 🟢 -326 B
assets/assetsStore-BV8WtbLT.js (removed) 722 B 🟢 -722 B 🟢 -370 B 🟢 -325 B
assets/assetsStore-DUe6Pqhg.js (new) 722 B 🔴 +722 B 🔴 +369 B 🔴 +325 B
assets/serverConfigStore-Va3_Wl8r.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 15 added / 15 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-BuR8kLof.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-Ccb5dVxF.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3dViewer-B4pFzU6V.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.19 kB 🟢 -2.83 kB
assets/useLoad3dViewer-CT0fwoMK.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.19 kB 🔴 +2.83 kB
assets/useFeatureFlags--81bVVPA.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.37 kB 🔴 +1.17 kB
assets/useFeatureFlags-DLMQGrGz.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.37 kB 🟢 -1.17 kB
assets/useWorkspaceUI-h8xJZcw4.js (removed) 3 kB 🟢 -3 kB 🟢 -823 B 🟢 -741 B
assets/useWorkspaceUI-lHfwq20d.js (new) 3 kB 🔴 +3 kB 🔴 +825 B 🔴 +705 B
assets/subscriptionCheckoutUtil-BTXEaTRj.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +960 B
assets/subscriptionCheckoutUtil-CEUDIiN_.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -947 B
assets/useErrorHandling-CNLhSks8.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +629 B 🔴 +533 B
assets/useErrorHandling-DQEf-Q9x.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -630 B 🟢 -534 B
assets/useLoad3d-CDPBGicB.js (removed) 859 B 🟢 -859 B 🟢 -423 B 🟢 -380 B
assets/useLoad3d-CqO0Mq8p.js (new) 859 B 🔴 +859 B 🔴 +425 B 🔴 +379 B
assets/audioUtils-CVqvr8IU.js (removed) 858 B 🟢 -858 B 🟢 -500 B 🟢 -402 B
assets/audioUtils-N84yLHKf.js (new) 858 B 🔴 +858 B 🔴 +502 B 🔴 +404 B
assets/useLoad3dViewer-CEgqkFC8.js (new) 838 B 🔴 +838 B 🔴 +409 B 🔴 +368 B
assets/useLoad3dViewer-DhlXXpEy.js (removed) 838 B 🟢 -838 B 🟢 -408 B 🟢 -370 B
assets/useCurrentUser-BnfI2EKU.js (removed) 722 B 🟢 -722 B 🟢 -370 B 🟢 -326 B
assets/useCurrentUser-C4LNfbrJ.js (new) 722 B 🔴 +722 B 🔴 +370 B 🔴 +328 B
assets/useWorkspaceSwitch-B4xRLWkV.js (new) 688 B 🔴 +688 B 🔴 +353 B 🔴 +296 B
assets/useWorkspaceSwitch-D_YDV86-.js (removed) 688 B 🟢 -688 B 🟢 -351 B 🟢 -297 B
assets/_plugin-vue_export-helper-BouI3hUt.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/assetMetadataUtils-fNVJvEzP.js 2.61 kB 2.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-CYP8-8fk.js 8.72 kB 8.72 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-BvHBiGDh.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-BllOn75O.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-CXsVEgWz.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-CZfOudDN.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-05GtjRkv.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DNX73mqE.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-Dj9lOsnu.js 1.54 MB 1.54 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-gPZICJA3.js 1.72 MB 1.72 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-BmUSshXB.js 426 kB 426 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-C_3GtM2H.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-CXbu7Mch.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-DtiQ1dr9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-7Q5M-X2w.js 125 kB 125 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-DPkCdaAS.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 8.16 MB (baseline 8.16 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-CC1vKGlO.js (new) 73.7 kB 🔴 +73.7 kB 🔴 +19 kB 🔴 +16.3 kB
assets/core-D3vHgaBi.js (removed) 73.7 kB 🟢 -73.7 kB 🟢 -19 kB 🟢 -16.3 kB
assets/groupNode-CqwX5fmo.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.6 kB
assets/groupNode-CT3BEKA1.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.6 kB
assets/WidgetSelect-CUCJjEu2.js (new) 58.2 kB 🔴 +58.2 kB 🔴 +12.5 kB 🔴 +10.8 kB
assets/WidgetSelect-DXS1PSry.js (removed) 58.2 kB 🟢 -58.2 kB 🟢 -12.5 kB 🟢 -10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-B15FmeGd.js (removed) 46.2 kB 🟢 -46.2 kB 🟢 -8.63 kB 🟢 -7.5 kB
assets/SubscriptionRequiredDialogContentWorkspace-CzrCddvr.js (new) 46.2 kB 🔴 +46.2 kB 🔴 +8.63 kB 🔴 +7.49 kB
assets/WidgetPainter-n5yvb4TI.js (new) 32.9 kB 🔴 +32.9 kB 🔴 +7.95 kB 🔴 +7.05 kB
assets/WidgetPainter-tRDPhO3Q.js (removed) 32.9 kB 🟢 -32.9 kB 🟢 -7.95 kB 🟢 -7.04 kB
assets/Load3DControls-_W4nNbhh.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/Load3DControls-BxVgllyu.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/WorkspacePanelContent-bUWOdMd9.js (removed) 29.2 kB 🟢 -29.2 kB 🟢 -6.14 kB 🟢 -5.41 kB
assets/WorkspacePanelContent-CxroF5Ea.js (new) 29.2 kB 🔴 +29.2 kB 🔴 +6.14 kB 🔴 +5.39 kB
assets/SubscriptionRequiredDialogContent-BJwTp0eN.js (new) 25.6 kB 🔴 +25.6 kB 🔴 +6.54 kB 🔴 +5.76 kB
assets/SubscriptionRequiredDialogContent-DeTUd8i3.js (removed) 25.6 kB 🟢 -25.6 kB 🟢 -6.54 kB 🟢 -5.75 kB
assets/Load3dViewerContent-DCYB39Iw.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.5 kB
assets/Load3dViewerContent-XSTH6-tt.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.51 kB
assets/WidgetImageCrop-DV1FBISm.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.5 kB 🔴 +4.84 kB
assets/WidgetImageCrop-V8gd7yNr.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.5 kB 🟢 -4.85 kB
assets/SubscriptionPanelContentWorkspace-DtcCLYx6.js (new) 22 kB 🔴 +22 kB 🔴 +5.12 kB 🔴 +4.49 kB
assets/SubscriptionPanelContentWorkspace-SDoFbxNn.js (removed) 22 kB 🟢 -22 kB 🟢 -5.11 kB 🟢 -4.5 kB
assets/CurrentUserPopoverWorkspace-BdZ59QWf.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -4.92 kB 🟢 -4.4 kB
assets/CurrentUserPopoverWorkspace-BtBcN9eH.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +4.92 kB 🔴 +4.39 kB
assets/SignInContent-_x9y8Mv6.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.75 kB 🟢 -4.16 kB
assets/SignInContent-LzfUmzoK.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.75 kB 🔴 +4.16 kB
assets/WidgetInputNumber-CCjFvC5Y.js (new) 18.1 kB 🔴 +18.1 kB 🔴 +4.64 kB 🔴 +4.12 kB
assets/WidgetInputNumber-DFQHJLuC.js (removed) 18.1 kB 🟢 -18.1 kB 🟢 -4.64 kB 🟢 -4.13 kB
assets/WidgetRecordAudio-9TglFg86.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -4.99 kB 🟢 -4.47 kB
assets/WidgetRecordAudio-DpTCCsxD.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +4.99 kB 🔴 +4.46 kB
assets/Load3D-D1cvvkh0.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.02 kB 🟢 -3.51 kB
assets/Load3D-D4muMsVi.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.02 kB 🔴 +3.51 kB
assets/load3d-BjwDxc0N.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.19 kB 🟢 -3.63 kB
assets/load3d-tbdpMWik.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.19 kB 🔴 +3.64 kB
assets/AudioPreviewPlayer-CPJGdMTd.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.23 kB 🟢 -2.9 kB
assets/AudioPreviewPlayer-Czul5IJM.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.23 kB 🔴 +2.9 kB
assets/nodeTemplates-CRv-8_CD.js (removed) 9.29 kB 🟢 -9.29 kB 🟢 -3.26 kB 🟢 -2.87 kB
assets/nodeTemplates-DVJCq3va.js (new) 9.29 kB 🔴 +9.29 kB 🔴 +3.26 kB 🔴 +2.86 kB
assets/InviteMemberDialogContent-BuMDKIoR.js (removed) 7.33 kB 🟢 -7.33 kB 🟢 -2.29 kB 🟢 -1.99 kB
assets/InviteMemberDialogContent-Df3N8_Yh.js (new) 7.33 kB 🔴 +7.33 kB 🔴 +2.29 kB 🔴 +2 kB
assets/Load3DConfiguration-BepF_egq.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/Load3DConfiguration-Bn8lFmOY.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/onboardingCloudRoutes-DAAyUigF.js (removed) 6.09 kB 🟢 -6.09 kB 🟢 -1.89 kB 🟢 -1.63 kB
assets/onboardingCloudRoutes-DwjBvGDM.js (new) 6.09 kB 🔴 +6.09 kB 🔴 +1.89 kB 🔴 +1.64 kB
assets/CreateWorkspaceDialogContent-BVw_-OCP.js (new) 5.5 kB 🔴 +5.5 kB 🔴 +1.98 kB 🔴 +1.73 kB
assets/CreateWorkspaceDialogContent-CUm4sB0x.js (removed) 5.5 kB 🟢 -5.5 kB 🟢 -1.98 kB 🟢 -1.73 kB
assets/FreeTierDialogContent-BSsICh2G.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.89 kB 🔴 +1.68 kB
assets/FreeTierDialogContent-BYrY53tW.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.89 kB 🟢 -1.68 kB
assets/WidgetWithControl-2QHpgCAG.js (removed) 5.32 kB 🟢 -5.32 kB 🟢 -2.17 kB 🟢 -1.96 kB
assets/WidgetWithControl-CzilhmXj.js (new) 5.32 kB 🔴 +5.32 kB 🔴 +2.17 kB 🔴 +1.95 kB
assets/EditWorkspaceDialogContent-Biwif6S7.js (removed) 5.3 kB 🟢 -5.3 kB 🟢 -1.94 kB 🟢 -1.7 kB
assets/EditWorkspaceDialogContent-DewHhBZY.js (new) 5.3 kB 🔴 +5.3 kB 🔴 +1.94 kB 🔴 +1.72 kB
assets/Preview3d-DxCD7CGc.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.61 kB 🟢 -1.41 kB
assets/Preview3d-tkOuShDp.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.61 kB 🔴 +1.42 kB
assets/ValueControlPopover-BEBNB_JA.js (removed) 4.89 kB 🟢 -4.89 kB 🟢 -1.75 kB 🟢 -1.57 kB
assets/ValueControlPopover-DfamSPuA.js (new) 4.89 kB 🔴 +4.89 kB 🔴 +1.75 kB 🔴 +1.57 kB
assets/WidgetTextarea-DMDY2ZVF.js (removed) 4.83 kB 🟢 -4.83 kB 🟢 -1.9 kB 🟢 -1.68 kB
assets/WidgetTextarea-Dn7eYD_P.js (new) 4.83 kB 🔴 +4.83 kB 🔴 +1.9 kB 🔴 +1.68 kB
assets/CancelSubscriptionDialogContent-B7QhXM57.js (removed) 4.77 kB 🟢 -4.77 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/CancelSubscriptionDialogContent-BoY0wQGf.js (new) 4.77 kB 🔴 +4.77 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/DeleteWorkspaceDialogContent-Cf5LNN5J.js (removed) 4.2 kB 🟢 -4.2 kB 🟢 -1.62 kB 🟢 -1.41 kB
assets/DeleteWorkspaceDialogContent-DPWx9Z1L.js (new) 4.2 kB 🔴 +4.2 kB 🔴 +1.62 kB 🔴 +1.42 kB
assets/LeaveWorkspaceDialogContent-DcRX5O6u.js (removed) 4.03 kB 🟢 -4.03 kB 🟢 -1.56 kB 🟢 -1.36 kB
assets/LeaveWorkspaceDialogContent-QBnmUt-x.js (new) 4.03 kB 🔴 +4.03 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/RemoveMemberDialogContent-BUKDpKF4.js (new) 4.02 kB 🔴 +4.02 kB 🔴 +1.52 kB 🔴 +1.33 kB
assets/RemoveMemberDialogContent-D20dNHQl.js (removed) 4.02 kB 🟢 -4.02 kB 🟢 -1.52 kB 🟢 -1.33 kB
assets/RevokeInviteDialogContent-CWifSn17.js (removed) 3.93 kB 🟢 -3.93 kB 🟢 -1.53 kB 🟢 -1.34 kB
assets/RevokeInviteDialogContent-Dc6huiUj.js (new) 3.93 kB 🔴 +3.93 kB 🔴 +1.53 kB 🔴 +1.34 kB
assets/InviteMemberUpsellDialogContent-aXYxjdhs.js (new) 3.81 kB 🔴 +3.81 kB 🔴 +1.4 kB 🔴 +1.24 kB
assets/InviteMemberUpsellDialogContent-vWXtgC_M.js (removed) 3.81 kB 🟢 -3.81 kB 🟢 -1.4 kB 🟢 -1.23 kB
assets/tierBenefits-c4fuM--w.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.3 kB 🟢 -1.15 kB
assets/tierBenefits-CSWxRESU.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.31 kB 🔴 +1.16 kB
assets/saveMesh-DC8mfBv2.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.45 kB 🔴 +1.29 kB
assets/saveMesh-Dp-S-Mw8.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.29 kB
assets/cloudSessionCookie-Drh3bwVX.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.08 kB 🟢 -967 B
assets/cloudSessionCookie-DyFP0olU.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.08 kB 🔴 +974 B
assets/GlobalToast-CS7k0erU.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/GlobalToast-D24hlQZC.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.06 kB
assets/SubscribeToRun-BtQ43sP-.js (removed) 2.06 kB 🟢 -2.06 kB 🟢 -948 B 🟢 -842 B
assets/SubscribeToRun-xKgr_nma.js (new) 2.06 kB 🔴 +2.06 kB 🔴 +949 B 🔴 +836 B
assets/CloudRunButtonWrapper-CbcCuDjA.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -782 B 🟢 -717 B
assets/CloudRunButtonWrapper-CFp0qKL3.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +784 B 🔴 +716 B
assets/cloudBadges-CNsCuog6.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -769 B 🟢 -672 B
assets/cloudBadges-Cy9ZSm8m.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +771 B 🔴 +677 B
assets/previousFullPath-CfWXZrH7.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -650 B 🟢 -551 B
assets/previousFullPath-DeGweMmI.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +650 B 🔴 +579 B
assets/cloudSubscription-D6-k4OwG.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +655 B 🔴 +566 B
assets/cloudSubscription-OkGpQ1Mb.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -654 B 🟢 -566 B
assets/Load3D-CPTuPtRh.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +496 B 🔴 +444 B
assets/Load3D-DFK4ee9d.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -499 B 🟢 -444 B
assets/nightlyBadges-B1lln41a.js (removed) 1 kB 🟢 -1 kB 🟢 -528 B 🟢 -474 B
assets/nightlyBadges-CM6dZ5QZ.js (new) 1 kB 🔴 +1 kB 🔴 +527 B 🔴 +472 B
assets/Load3dViewerContent-B5dJ77gL.js (new) 993 B 🔴 +993 B 🔴 +467 B 🔴 +416 B
assets/Load3dViewerContent-DIOSzRKn.js (removed) 993 B 🟢 -993 B 🟢 -468 B 🟢 -415 B
assets/SubscriptionPanelContentWorkspace-qBuypPdN.js (removed) 920 B 🟢 -920 B 🟢 -436 B 🟢 -376 B
assets/SubscriptionPanelContentWorkspace-s1z0Rw_d.js (new) 920 B 🔴 +920 B 🔴 +438 B 🔴 +376 B
assets/graphHasMissingNodes-C0LDKuDp.js (new) 761 B 🔴 +761 B 🔴 +373 B 🔴 +316 B
assets/graphHasMissingNodes-Fx1fPuxO.js (removed) 761 B 🟢 -761 B 🟢 -374 B 🟢 -332 B
assets/WidgetLegacy-BkVsQ5IZ.js (removed) 744 B 🟢 -744 B 🟢 -382 B 🟢 -332 B
assets/WidgetLegacy-D8wa_34j.js (new) 744 B 🔴 +744 B 🔴 +382 B 🔴 +334 B
assets/changeTracker-CT5WtiVk.js (removed) 720 B 🟢 -720 B 🟢 -370 B 🟢 -323 B
assets/changeTracker-YuX1D8zF.js (new) 720 B 🔴 +720 B 🔴 +370 B 🔴 +325 B
assets/AnimationControls-Bw6Ffmgi.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-DOsa8kGL.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-CtFmjb6K.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-Cc_f1BA3.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-B810ZRS_.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-C68tXBVU.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-0V4s4r1K.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BL762dz-.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BnVLe_Bi.js 19.2 kB 19.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BXsNoiTn.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BZxSrlEH.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C23MOD89.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CdENTy7Q.js 17.3 kB 17.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cq73R4Wp.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CriyFW2y.js 15.6 kB 15.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CyFcxndj.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DReOpKnh.js 16.4 kB 16.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-KYihJEkp.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-BsPmdEIl.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-PZtRkMN6.js 552 kB 552 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Loader-Dxz91Dh1.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-2po_Bpnn.js 164 kB 164 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B7KMWDs8.js 162 kB 162 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BbmzWp5V.js 167 kB 167 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Biqdvk0b.js 186 kB 186 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BZHYDNo3.js 194 kB 194 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-COTHH2HJ.js 227 kB 227 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CquGE2aG.js 142 kB 142 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DeucRx6f.js 203 kB 203 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-EW3xS1lB.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Gx9eaQ6t.js 170 kB 170 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-u8LggU9R.js 144 kB 144 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-BiQkqzKM.js 1.83 kB 1.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-CRtIRcAY.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-VYyoqA7N.js 1.87 kB 1.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-BuLGrjPg.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-803eVvB-.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-BpARjupw.js 2.78 kB 2.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NightlySurveyController-NUXPW-3A.js 8.92 kB 8.92 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B3oUX5Xn.js 406 kB 406 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BCuogeXk.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BGX8y7tW.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BWrerRXB.js 500 kB 500 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BZeN9Zs5.js 411 kB 411 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CgpwBWt_.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CGrtSCWF.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CIQZyAxR.js 423 kB 423 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DcjxhMDx.js 459 kB 459 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-OCu68Ji6.js 370 kB 370 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-z_WNIX6f.js 458 kB 458 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-NiA7MfCG.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-CZ965pHw.js 9.34 kB 9.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-Dx_alSxy.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-QzmaYfi5.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-BSEsXra9.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-CXHqTaYn.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Textarea-MgaocOhg.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-b9xCyIM9.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DIRwAHBY.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BpeWi7eA.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-D1bKyt4x.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-BRgC8EZs.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-BecOCmyh.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-Dh_Oiqjm.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-DzPd9dCX.js 3.6 kB 3.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-Coy9QQHB.js 7.35 kB 7.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-5vs0ohcH.js 2.89 kB 2.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-BNX5o5Pq.js 2.15 kB 2.15 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-BjlLxPWJ.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-B5wjPu-5.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-B6hJNdss.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DzBxiY8I.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 51 added / 51 removed

Copy link
Copy Markdown
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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/lib/litegraph/src/LGraphCanvas.renderInfo.test.ts`:
- Around line 45-53: The test temporarily overwrites window.devicePixelRatio but
only restores it after assertions, which can leak state if the assertion fails;
wrap the change around lgCanvas.renderInfo(ctx, 10, 0) in a try/finally: save
originalDPR, set devicePixelRatio to 2 before calling lgCanvas.renderInfo(...)
in the try block, and always restore the originalDPR with
Object.defineProperty(window, 'devicePixelRatio', { value: originalDPR,
configurable: true }) in the finally block so DPR is reliably reset even on test
failures.

In `@src/lib/litegraph/src/LGraphCanvas.ts`:
- Line 5212: The code computes Y using window.devicePixelRatio which can be
wrong for canvases in other windows; replace the global window DPR lookup with
the canvas owner window DPR (use
this.canvas.ownerDocument.defaultView.devicePixelRatio with a fallback of 1)
when computing y (the expression around y = y || this.canvas.height /
(window.devicePixelRatio || 1) - 80). Ensure you null-check
ownerDocument/defaultView (or use optional chaining) and keep the same fallback
behavior so the info panel Y position uses the canvas's document window DPR.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 45f112e and d885aa8.

📒 Files selected for processing (2)
  • src/lib/litegraph/src/LGraphCanvas.renderInfo.test.ts
  • src/lib/litegraph/src/LGraphCanvas.ts

Comment thread src/lib/litegraph/src/LGraphCanvas.renderInfo.test.ts
Comment thread src/lib/litegraph/src/LGraphCanvas.ts Outdated
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Feb 28, 2026

⚡ Performance Report

ℹ️ Collecting baseline variance data (0/5 runs). Significance will appear after 2 main branch runs.

Metric Baseline PR Δ
canvas-idle: style recalcs 11 11 -3%
canvas-idle: layouts 0 0 +0%
canvas-idle: task duration 357ms 422ms +18%
canvas-mouse-sweep: style recalcs 77 78 +2%
canvas-mouse-sweep: layouts 12 12 +0%
canvas-mouse-sweep: task duration 826ms 852ms +3%
dom-widget-clipping: style recalcs 14 14 +0%
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 354ms 382ms +8%
subgraph-dom-widget-clipping: style recalcs 50 49 -1%
subgraph-dom-widget-clipping: layouts 0 0 +0%
subgraph-dom-widget-clipping: task duration 370ms 386ms +4%
subgraph-idle: style recalcs 12 12 +0%
subgraph-idle: layouts 0 0 +0%
subgraph-idle: task duration 357ms 433ms +21%
subgraph-mouse-sweep: style recalcs 78 80 +2%
subgraph-mouse-sweep: layouts 16 16 -2%
subgraph-mouse-sweep: task duration 677ms 797ms +18%
Raw data
{
  "timestamp": "2026-03-13T15:17:06.923Z",
  "gitSha": "2d383bb581e5e7b221f69cbc01d9872ba1fdba9a",
  "branch": "perf/fix-render-info",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2031.4359999999851,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.329999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 404.357,
      "heapDeltaBytes": 1579760
    },
    {
      "name": "canvas-idle",
      "durationMs": 2027.0000000000437,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 10.001000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 412.955,
      "heapDeltaBytes": -5076812
    },
    {
      "name": "canvas-idle",
      "durationMs": 2016.401999999971,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 12.812000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 449.25000000000006,
      "heapDeltaBytes": 1131804
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1873.4529999999836,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 42.251000000000005,
      "layouts": 12,
      "layoutDurationMs": 3.596,
      "taskDurationMs": 821.4870000000001,
      "heapDeltaBytes": -3458904
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1862.9130000000487,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 43.707,
      "layouts": 12,
      "layoutDurationMs": 4.023,
      "taskDurationMs": 792.7080000000001,
      "heapDeltaBytes": -4090636
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1956.9789999999898,
      "styleRecalcs": 81,
      "styleRecalcDurationMs": 53.507,
      "layouts": 12,
      "layoutDurationMs": 3.559,
      "taskDurationMs": 942.1089999999999,
      "heapDeltaBytes": -3731972
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 651.740000000018,
      "styleRecalcs": 16,
      "styleRecalcDurationMs": 14.5,
      "layouts": 1,
      "layoutDurationMs": 0.2979999999999999,
      "taskDurationMs": 404.327,
      "heapDeltaBytes": 13227388
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 601.3059999999655,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 9.819,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 376.20599999999996,
      "heapDeltaBytes": 12678336
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 599.2739999999799,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 10.341,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 366.44800000000004,
      "heapDeltaBytes": 11775652
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 599.3760000000066,
      "styleRecalcs": 52,
      "styleRecalcDurationMs": 18.133000000000003,
      "layouts": 1,
      "layoutDurationMs": 0.348,
      "taskDurationMs": 400.229,
      "heapDeltaBytes": 13532692
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 589.7679999999923,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 12.6,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 378.578,
      "heapDeltaBytes": 13020400
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 583.0080000000066,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 12.763000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 379.911,
      "heapDeltaBytes": 12975576
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2013.7850000000412,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 11.315000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 409.866,
      "heapDeltaBytes": 325596
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2004.1009999999915,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 12.518999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 443.9189999999999,
      "heapDeltaBytes": 974596
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2010.3129999999965,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 11.075000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 446.13000000000005,
      "heapDeltaBytes": 313492
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1990.6070000000113,
      "styleRecalcs": 87,
      "styleRecalcDurationMs": 51.95799999999999,
      "layouts": 16,
      "layoutDurationMs": 4.649,
      "taskDurationMs": 934.503,
      "heapDeltaBytes": -7108340
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1746.1140000000341,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 39.97,
      "layouts": 16,
      "layoutDurationMs": 4.896,
      "taskDurationMs": 739.6669999999999,
      "heapDeltaBytes": -7087552
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1730.8400000000006,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 40.519,
      "layouts": 16,
      "layoutDurationMs": 4.872999999999999,
      "taskDurationMs": 717.878,
      "heapDeltaBytes": -7696144
    }
  ]
}

@pythongosssss
Copy link
Copy Markdown
Member

lgtm

@christian-byrne christian-byrne marked this pull request as ready for review March 13, 2026 15:12
@christian-byrne christian-byrne requested a review from a team as a code owner March 13, 2026 15:12
@christian-byrne christian-byrne merged commit a9f9afd into main Mar 13, 2026
33 checks passed
@christian-byrne christian-byrne deleted the perf/fix-render-info branch March 13, 2026 15:35
@dosubot dosubot Bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Mar 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants