Skip to content

feat: accept bboxes input and add grid snapping to Create Bounding Boxes#13376

Open
jtydhr88 wants to merge 1 commit into
mainfrom
feat/create-bounding-boxes-input-grid
Open

feat: accept bboxes input and add grid snapping to Create Bounding Boxes#13376
jtydhr88 wants to merge 1 commit into
mainfrom
feat/create-bounding-boxes-input-grid

Conversation

@jtydhr88

@jtydhr88 jtydhr88 commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Seed/override the canvas from an upstream bboxes input
  • Add dotted grid background and magnetic snap-to-grid controls
  • Darken the canvas well for contrast

BE is Comfy-Org/ComfyUI#14724

Screenshots (if applicable)

2026-07-01.15-40-17.mp4

@jtydhr88 jtydhr88 requested a review from a team July 2, 2026 02:21
@dosubot dosubot Bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jul 2, 2026
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR adds grid snapping and overlay rendering to the bounding boxes editor, syncs grid state with node properties, applies incoming bbox inputs from connected node outputs, and refactors palette swatches to use a slot-based color picker trigger.

Changes

Bounding boxes grid and incoming input handling

Layer / File(s) Summary
Grid state and snapping
src/composables/boundingBoxes/useBoundingBoxes.ts
Introduces grid constants and reactive state, implements snapping and dotted overlay rendering, applies snapped regions during drag, synchronizes grid state with node properties, and returns the grid control from the composable.
Incoming bboxes handling
src/composables/boundingBoxes/useBoundingBoxes.ts
Reads incoming bboxes from node outputs, caches the last payload, rebuilds regions from the incoming data, updates the active region, and syncs state during initialization and output changes.
Toolbar and labels
src/components/boundingBoxes/WidgetBoundingBoxes.vue, src/locales/en/main.json
Adds the top toolbar with grid and clear-all actions, updates the canvas container styling, introduces shared button styling, extends the composable bindings in the widget, and adds the grid locale string.
Incoming-bboxes tests
src/composables/boundingBoxes/useBoundingBoxes.test.ts
Updates the test harness for mocked node outputs and canvas context methods, adds connected-input fixtures, and adds coverage for connected, disconnected, changed, and late-arriving incoming bboxes.

Palette swatch color picker flow

Layer / File(s) Summary
Color picker trigger slot
src/components/ui/color-picker/ColorPicker.vue
Replaces the internal trigger button with a named trigger slot that exposes open state and preview color while preserving the existing display content.
Swatch row update flow
src/components/palette/PaletteSwatchRow.vue, src/composables/palette/usePaletteSwatchRow.ts
Swatch rendering now uses ColorPicker trigger content with direct update:model-value handling, and the composable drops picker ref wiring in favor of updateAt.
Swatch row tests
src/components/palette/PaletteSwatchRow.test.ts, src/composables/palette/usePaletteSwatchRow.test.ts
Adjusts the swatch-row test harness for the new composable shape and replaces the picker-input assertion with open-state and updateAt coverage.

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

Suggested reviewers: CodeJuggernaut

🚥 Pre-merge checks | ✅ 6
✅ Passed checks (6 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly names the main functional changes: bboxes input support and grid snapping for Create Bounding Boxes.
Description check ✅ Passed The description covers the main changes and includes a screenshot, but it skips the template’s explicit Changes and Review Focus sections.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
End-To-End Regression Coverage For Fixes ✅ Passed PR title is feature-oriented, not bug-fix language, so the regression-test requirement does not trigger.
Adr Compliance For Entity/Litegraph Changes ✅ Passed No changed files are under src/lib/litegraph/, src/ecs/, or graph-entity paths; ADR 0003/0008 checks are not applicable.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/create-bounding-boxes-input-grid

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.

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

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

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

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 07/07/2026, 03:03:00 AM UTC

Links

📦 Bundle: 7.77 MB gzip 🔴 +1.11 kB

Details

Summary

  • Raw size: 32.8 MB baseline 32.8 MB — 🔴 +4.19 kB
  • Gzip: 7.77 MB baseline 7.77 MB — 🔴 +1.11 kB
  • Brotli: 5.35 MB baseline 5.35 MB — 🔴 +1 kB
  • Bundles: 299 current • 299 baseline • 149 added / 149 removed

Category Glance
Other 🔴 +4.17 kB (11.7 MB) · Utilities & Hooks 🔴 +25 B (3.37 MB) · Vendor & Third-Party ⚪ 0 B (15.3 MB) · Graph Workspace ⚪ 0 B (1.26 MB) · Panels & Settings ⚪ 0 B (546 kB) · Data & Services ⚪ 0 B (270 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-KyJNfige.js (removed) 47.4 kB 🟢 -47.4 kB 🟢 -13.9 kB 🟢 -12 kB
assets/index-s-mYegcK.js (new) 47.4 kB 🔴 +47.4 kB 🔴 +13.9 kB 🔴 +12 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BREQInLY.js (new) 1.26 MB 🔴 +1.26 MB 🔴 +269 kB 🔴 +202 kB
assets/GraphView-DH5ext3H.js (removed) 1.26 MB 🟢 -1.26 MB 🟢 -269 kB 🟢 -202 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BirNzpa4.js (new) 19.4 kB 🔴 +19.4 kB 🔴 +5.04 kB 🔴 +4.46 kB
assets/CloudSurveyView-DaTFvaHJ.js (removed) 19.4 kB 🟢 -19.4 kB 🟢 -5.04 kB 🟢 -4.47 kB
assets/CloudLoginView-B2AtcVZl.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.07 kB 🔴 +2.69 kB
assets/CloudLoginView-Cx65JLqJ.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.07 kB 🟢 -2.68 kB
assets/CloudSignupView-DVVKunTL.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.74 kB 🟢 -2.41 kB
assets/CloudSignupView-J2e3PGjM.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.74 kB 🔴 +2.41 kB
assets/CloudLayoutView-B916o1Xb.js (new) 9.36 kB 🔴 +9.36 kB 🔴 +2.34 kB 🔴 +2.03 kB
assets/CloudLayoutView-Cqwvwvyh.js (removed) 9.36 kB 🟢 -9.36 kB 🟢 -2.34 kB 🟢 -2.03 kB
assets/UserCheckView-B3Bmw_ss.js (removed) 8.8 kB 🟢 -8.8 kB 🟢 -2.22 kB 🟢 -1.94 kB
assets/UserCheckView-IKnHQFzu.js (new) 8.8 kB 🔴 +8.8 kB 🔴 +2.22 kB 🔴 +1.93 kB
assets/CloudSubscriptionRedirectView-BIOpfwGn.js (new) 6.98 kB 🔴 +6.98 kB 🔴 +2.58 kB 🔴 +2.27 kB
assets/CloudSubscriptionRedirectView-CbL5PlWI.js (removed) 6.98 kB 🟢 -6.98 kB 🟢 -2.58 kB 🟢 -2.29 kB
assets/UserSelectView-BOCBptak.js (new) 6 kB 🔴 +6 kB 🔴 +2.15 kB 🔴 +1.89 kB
assets/UserSelectView-OHOuh67B.js (removed) 6 kB 🟢 -6 kB 🟢 -2.15 kB 🟢 -1.89 kB
assets/CloudForgotPasswordView-CjckMKVx.js (removed) 5.15 kB 🟢 -5.15 kB 🟢 -1.76 kB 🟢 -1.54 kB
assets/CloudForgotPasswordView-MnYQKJrO.js (new) 5.15 kB 🔴 +5.15 kB 🔴 +1.76 kB 🔴 +1.54 kB
assets/CloudAuthTimeoutView-GZVjNlTr.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.58 kB 🔴 +1.37 kB
assets/CloudAuthTimeoutView-yacuhTTf.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.57 kB 🟢 -1.37 kB

Status: 9 added / 9 removed / 3 unchanged

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-eX4QOOHB.js (new) 49.4 kB 🔴 +49.4 kB 🔴 +9.97 kB 🔴 +8.83 kB
assets/KeybindingPanel-vkgfKccl.js (removed) 49.4 kB 🟢 -49.4 kB 🟢 -9.97 kB 🟢 -8.82 kB
assets/SecretsPanel-BxcIS2L3.js (removed) 24.2 kB 🟢 -24.2 kB 🟢 -5.77 kB 🟢 -5.07 kB
assets/SecretsPanel-C3DsdL1-.js (new) 24.2 kB 🔴 +24.2 kB 🔴 +5.77 kB 🔴 +5.07 kB
assets/CreditsPanel-D91FCD1p.js (new) 15.9 kB 🔴 +15.9 kB 🔴 +4.66 kB 🔴 +4.09 kB
assets/CreditsPanel-ZqLCdRB5.js (removed) 15.9 kB 🟢 -15.9 kB 🟢 -4.66 kB 🟢 -4.09 kB
assets/AboutPanel-B6oRUWoq.js (new) 12 kB 🔴 +12 kB 🔴 +3.29 kB 🔴 +2.94 kB
assets/AboutPanel-MlHj5dNy.js (removed) 12 kB 🟢 -12 kB 🟢 -3.29 kB 🟢 -2.95 kB
assets/SubscriptionPanel-BesipCWd.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.62 kB 🔴 +3.15 kB
assets/SubscriptionPanel-CA-3aDnO.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.62 kB 🟢 -3.16 kB
assets/ExtensionPanel-DlFDGonH.js (removed) 9.03 kB 🟢 -9.03 kB 🟢 -2.5 kB 🟢 -2.2 kB
assets/ExtensionPanel-hlZCugF0.js (new) 9.03 kB 🔴 +9.03 kB 🔴 +2.5 kB 🔴 +2.2 kB
assets/ServerConfigPanel-BC8sAxif.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +1.98 kB 🔴 +1.76 kB
assets/ServerConfigPanel-CA9ILSIW.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -1.98 kB 🟢 -1.76 kB
assets/UserPanel-BFq1pxJs.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.82 kB 🟢 -1.58 kB
assets/UserPanel-D6PW2LEv.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.82 kB 🔴 +1.58 kB
assets/refreshRemoteConfig-7uyNup-J.js (new) 2.88 kB 🔴 +2.88 kB 🔴 +1.26 kB 🔴 +1.11 kB
assets/refreshRemoteConfig-9h4rkg8O.js (removed) 2.88 kB 🟢 -2.88 kB 🟢 -1.26 kB 🟢 -1.11 kB
assets/cloudRemoteConfig-CoCS1ANl.js (removed) 990 B 🟢 -990 B 🟢 -543 B 🟢 -466 B
assets/cloudRemoteConfig-L_n7bkQZ.js (new) 990 B 🔴 +990 B 🔴 +544 B 🔴 +469 B
assets/refreshRemoteConfig-BJoHNAvk.js (removed) 110 B 🟢 -110 B 🟢 -89 B 🟢 -82 B
assets/refreshRemoteConfig-CN30yBB3.js (new) 110 B 🔴 +110 B 🔴 +89 B 🔴 +85 B

Status: 11 added / 11 removed / 16 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SignUpForm-0FssjHRM.js (removed) 10 kB 🟢 -10 kB 🟢 -3.46 kB 🟢 -3.04 kB
assets/SignUpForm-CddM4yj5.js (new) 10 kB 🔴 +10 kB 🔴 +3.46 kB 🔴 +3.04 kB
assets/auth-C4ROH8Hy.js (removed) 3.69 kB 🟢 -3.69 kB 🟢 -1.3 kB 🟢 -1.12 kB
assets/auth-DCElJRnc.js (new) 3.69 kB 🔴 +3.69 kB 🔴 +1.3 kB 🔴 +1.14 kB
assets/usePostAuthRedirect-B4WV0tR0.js (removed) 3.33 kB 🟢 -3.33 kB 🟢 -1.27 kB 🟢 -1.11 kB
assets/usePostAuthRedirect-CD1sU0m1.js (new) 3.33 kB 🔴 +3.33 kB 🔴 +1.27 kB 🔴 +1.11 kB
assets/UpdatePasswordContent-C6hJllEu.js (removed) 1.92 kB 🟢 -1.92 kB 🟢 -877 B 🟢 -764 B
assets/UpdatePasswordContent-DSXyFUB_.js (new) 1.92 kB 🔴 +1.92 kB 🔴 +877 B 🔴 +766 B
assets/authStore-D1Ch8-bP.js (new) 130 B 🔴 +130 B 🔴 +109 B 🔴 +113 B
assets/authStore-Dnj78xNv.js (removed) 130 B 🟢 -130 B 🟢 -109 B 🟢 -107 B
assets/workspaceAuthStore-CDmxIN2a.js (removed) 110 B 🟢 -110 B 🟢 -104 B 🟢 -114 B
assets/workspaceAuthStore-DRKK10wV.js (new) 110 B 🔴 +110 B 🔴 +104 B 🔴 +114 B
assets/auth-CxtRt0gP.js (removed) 105 B 🟢 -105 B 🟢 -96 B 🟢 -94 B
assets/auth-DqemspXw.js (new) 105 B 🔴 +105 B 🔴 +96 B 🔴 +89 B

Status: 7 added / 7 removed / 3 unchanged

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-BjnNCxLN.js (removed) 90.5 kB 🟢 -90.5 kB 🟢 -19.3 kB 🟢 -16.5 kB
assets/ComfyHubPublishDialog-DwbJvYqU.js (new) 90.5 kB 🔴 +90.5 kB 🔴 +19.3 kB 🔴 +16.5 kB
assets/useShareDialog-BWwdsI_Q.js (removed) 23.7 kB 🟢 -23.7 kB 🟢 -5.59 kB 🟢 -4.96 kB
assets/useShareDialog-DlzLUz_F.js (new) 23.7 kB 🔴 +23.7 kB 🔴 +5.59 kB 🔴 +4.97 kB
assets/ComfyHubPublishDialog-5lNBtPkC.js (new) 143 B 🔴 +143 B 🔴 +105 B 🔴 +89 B
assets/ComfyHubPublishDialog-Id90fGQe.js (removed) 143 B 🟢 -143 B 🟢 -105 B 🟢 -94 B
assets/useSubscriptionDialog-CsEXNC4f.js (removed) 110 B 🟢 -110 B 🟢 -102 B 🟢 -94 B
assets/useSubscriptionDialog-OUeFlzeS.js (new) 110 B 🔴 +110 B 🔴 +102 B 🔴 +91 B

Status: 4 added / 4 removed / 1 unchanged

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-CtIhYJZ0.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -3.82 kB 🟢 -3.41 kB
assets/ComfyQueueButton-DltY2Kb8.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +3.82 kB 🔴 +3.41 kB
assets/useTerminalTabs--4zj5s9H.js (removed) 12.1 kB 🟢 -12.1 kB 🟢 -3.83 kB 🟢 -3.38 kB
assets/useTerminalTabs-DH8kcR7A.js (new) 12.1 kB 🔴 +12.1 kB 🔴 +3.84 kB 🔴 +3.39 kB
assets/SubscribeButton-BskMGN4A.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -1.05 kB 🟢 -951 B
assets/SubscribeButton-TasN-ZbQ.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +1.05 kB 🔴 +943 B
assets/cloudFeedbackTopbarButton-Bp_s8QVH.js (removed) 829 B 🟢 -829 B 🟢 -496 B 🟢 -421 B
assets/cloudFeedbackTopbarButton-CfwDW0V7.js (new) 829 B 🔴 +829 B 🔴 +500 B 🔴 +463 B
assets/ComfyQueueButton-CJcU7VQm.js (new) 128 B 🔴 +128 B 🔴 +99 B 🔴 +89 B
assets/ComfyQueueButton-DrwapOc_.js (removed) 128 B 🟢 -128 B 🟢 -99 B 🟢 -92 B

Status: 5 added / 5 removed / 8 unchanged

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

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/load3dService-CZZtJpJo.js (removed) 126 kB 🟢 -126 kB 🟢 -27.8 kB 🟢 -23.5 kB
assets/load3dService-DTzfjFTQ.js (new) 126 kB 🔴 +126 kB 🔴 +27.8 kB 🔴 +23.5 kB
assets/api-757TKruO.js (removed) 91.8 kB 🟢 -91.8 kB 🟢 -25.3 kB 🟢 -21.6 kB
assets/api-Uqs6KUTH.js (new) 91.8 kB 🔴 +91.8 kB 🔴 +25.3 kB 🔴 +21.6 kB
assets/workflowShareService-DOrnMpAD.js (new) 17 kB 🔴 +17 kB 🔴 +5.01 kB 🔴 +4.44 kB
assets/workflowShareService-ySBb3XCs.js (removed) 17 kB 🟢 -17 kB 🟢 -5.01 kB 🟢 -4.44 kB
assets/releaseStore-BbfJ4_a5.js (new) 8.29 kB 🔴 +8.29 kB 🔴 +2.34 kB 🔴 +2.04 kB
assets/releaseStore-DYModzr4.js (removed) 8.29 kB 🟢 -8.29 kB 🟢 -2.34 kB 🟢 -2.04 kB
assets/keybindingService-CKPdaT9O.js (removed) 7.46 kB 🟢 -7.46 kB 🟢 -1.91 kB 🟢 -1.64 kB
assets/keybindingService-CtDB1cdX.js (new) 7.46 kB 🔴 +7.46 kB 🔴 +1.92 kB 🔴 +1.64 kB
assets/extensionStore-B8Xq98jr.js (new) 5.29 kB 🔴 +5.29 kB 🔴 +1.86 kB 🔴 +1.57 kB
assets/extensionStore-DfUzTbmS.js (removed) 5.29 kB 🟢 -5.29 kB 🟢 -1.86 kB 🟢 -1.57 kB
assets/userStore-DCs3yptF.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -931 B 🟢 -821 B
assets/userStore-DDQgVD1J.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +934 B 🔴 +823 B
assets/audioService-IZl8wdaW.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +861 B 🔴 +754 B
assets/audioService-u4h2KtJB.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -863 B 🟢 -752 B
assets/dialogService-AqaPtBpg.js (new) 100 B 🔴 +100 B 🔴 +99 B 🔴 +97 B
assets/dialogService-Dr3Py4IF.js (removed) 100 B 🟢 -100 B 🟢 -99 B 🟢 -89 B
assets/settingStore-B7XLEhBk.js (new) 98 B 🔴 +98 B 🔴 +98 B 🔴 +91 B
assets/settingStore-CCKMTLC9.js (removed) 98 B 🟢 -98 B 🟢 -98 B 🟢 -99 B
assets/assetsStore-CPVE9A5a.js (removed) 96 B 🟢 -96 B 🟢 -97 B 🟢 -88 B
assets/assetsStore-PcwAhQho.js (new) 96 B 🔴 +96 B 🔴 +97 B 🔴 +100 B
assets/releaseStore-CN62VBEA.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -88 B
assets/releaseStore-CshRDuCV.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +91 B
assets/api-CklGlYh_.js (removed) 62 B 🟢 -62 B 🟢 -74 B 🟢 -66 B
assets/api-DLZw03N-.js (new) 62 B 🔴 +62 B 🔴 +74 B 🔴 +66 B

Status: 13 added / 13 removed / 3 unchanged

Utilities & Hooks — 3.37 MB (baseline 3.37 MB) • 🔴 +25 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/promotionUtils-B7S_SIZF.js (new) 3.01 MB 🔴 +3.01 MB 🔴 +696 kB 🔴 +525 kB
assets/promotionUtils-BjTjzney.js (removed) 3.01 MB 🟢 -3.01 MB 🟢 -696 kB 🟢 -525 kB
assets/useConflictDetection-B9hDecjD.js (new) 234 kB 🔴 +234 kB 🔴 +52.3 kB 🔴 +42.6 kB
assets/useConflictDetection-Ds0nkXBY.js (removed) 234 kB 🟢 -234 kB 🟢 -52.3 kB 🟢 -42.6 kB
assets/useLoad3d-B1uKho2S.js (removed) 25.5 kB 🟢 -25.5 kB 🟢 -5.75 kB 🟢 -5.09 kB
assets/useLoad3d-FzmV6F_r.js (new) 25.5 kB 🔴 +25.5 kB 🔴 +5.75 kB 🔴 +5.09 kB
assets/useLoad3dViewer-BXYrNpJK.js (new) 21.1 kB 🔴 +21.1 kB 🔴 +4.98 kB 🔴 +4.38 kB
assets/useLoad3dViewer-DQRLyD0N.js (removed) 21.1 kB 🟢 -21.1 kB 🟢 -4.98 kB 🟢 -4.37 kB
assets/useFeatureFlags-BG3kwqP-.js (new) 6.51 kB 🔴 +6.51 kB 🔴 +2.02 kB 🔴 +1.7 kB
assets/useFeatureFlags-THXYjTkH.js (removed) 6.51 kB 🟢 -6.51 kB 🟢 -2.02 kB 🟢 -1.7 kB
assets/downloadUtil-4CJ8n4_r.js (new) 4.68 kB 🔴 +4.68 kB 🔴 +1.85 kB 🔴 +1.54 kB
assets/downloadUtil-eA2bTAo_.js (removed) 4.68 kB 🟢 -4.68 kB 🟢 -1.85 kB 🟢 -1.54 kB
assets/subscriptionCheckoutUtil-DWvXpzJO.js (new) 3.85 kB 🔴 +3.85 kB 🔴 +1.54 kB 🔴 +1.36 kB
assets/subscriptionCheckoutUtil-WPMSczx0.js (removed) 3.85 kB 🟢 -3.85 kB 🟢 -1.54 kB 🟢 -1.35 kB
assets/useSessionCookie-cSL7msBW.js (removed) 3.33 kB 🟢 -3.33 kB 🟢 -1.15 kB 🟢 -980 B
assets/useSessionCookie-D0tR8eDm.js (new) 3.33 kB 🔴 +3.33 kB 🔴 +1.15 kB 🔴 +979 B
assets/useExternalLink-DbyfcocT.js (removed) 3.03 kB 🟢 -3.03 kB 🟢 -1.16 kB 🟢 -1.03 kB
assets/useExternalLink-vTK8txNe.js (new) 3.03 kB 🔴 +3.03 kB 🔴 +1.16 kB 🔴 +1.03 kB
assets/useDowngradeToPersonal-BOgiCSJ9.js (removed) 3 kB 🟢 -3 kB 🟢 -1.19 kB 🟢 -1.05 kB
assets/useDowngradeToPersonal-ubLoT8t2.js (new) 3 kB 🔴 +3 kB 🔴 +1.19 kB 🔴 +1.05 kB
assets/assetPreviewUtil-B6QCf4Ou.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1.01 kB 🔴 +875 B
assets/assetPreviewUtil-iyUZViB7.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1 kB 🟢 -879 B
assets/useUpstreamValue-95YZlN1c.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +795 B 🔴 +699 B
assets/useUpstreamValue-BWsql1__.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -793 B 🟢 -698 B
assets/useWorkspaceTierLabel-DYcPuVzm.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +854 B 🔴 +735 B
assets/useWorkspaceTierLabel-sslRKFjw.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -852 B 🟢 -730 B
assets/useErrorHandling-DsVuAARW.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +646 B 🔴 +556 B
assets/useErrorHandling-xPjhY7-T.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -646 B 🟢 -549 B
assets/useLoad3d-BfeXt4OO.js (new) 311 B 🔴 +311 B 🔴 +165 B 🔴 +154 B
assets/useLoad3d-KuDWwFnw.js (removed) 311 B 🟢 -311 B 🟢 -163 B 🟢 -147 B
assets/useSessionCookie-CMCudgYw.js (new) 101 B 🔴 +101 B 🔴 +86 B 🔴 +83 B
assets/useSessionCookie-nJ6pc-v_.js (removed) 101 B 🟢 -101 B 🟢 -86 B 🟢 -78 B
assets/useFeatureFlags-DWAHRnIK.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -85 B
assets/useFeatureFlags-z8sP-Tch.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +81 B
assets/useLoad3dViewer-C8aa-QTd.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -85 B
assets/useLoad3dViewer-DLtqKLq9.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +82 B
assets/useCurrentUser-BZZo0dB8.js (new) 96 B 🔴 +96 B 🔴 +97 B 🔴 +78 B
assets/useCurrentUser-D5QqZ4jH.js (removed) 96 B 🟢 -96 B 🟢 -97 B 🟢 -86 B

Status: 19 added / 19 removed / 14 unchanged

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

External libraries and shared vendor chunks

Status: 16 unchanged

Other — 11.7 MB (baseline 11.7 MB) • 🔴 +4.17 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/main-Dt0Wpmj-.js (new) 185 kB 🔴 +185 kB 🔴 +54.2 kB 🔴 +45.5 kB
assets/main-asAdJ5Qd.js (removed) 185 kB 🟢 -185 kB 🟢 -54.2 kB 🟢 -45.5 kB
assets/core-BcDeFvEA.js (removed) 119 kB 🟢 -119 kB 🟢 -30.7 kB 🟢 -25.9 kB
assets/core-maR7Tlrm.js (new) 119 kB 🔴 +119 kB 🔴 +30.7 kB 🔴 +25.9 kB
assets/WidgetSelect-Dc4r0lfC.js (new) 89.3 kB 🔴 +89.3 kB 🔴 +20.1 kB 🔴 +17.3 kB
assets/WidgetSelect-ZRNI8DJ6.js (removed) 89.3 kB 🟢 -89.3 kB 🟢 -20.1 kB 🟢 -17.2 kB
assets/Load3DControls-BdcY6QtF.js (new) 46.8 kB 🔴 +46.8 kB 🔴 +7.56 kB 🔴 +6.62 kB
assets/Load3DControls-CRG-2Vzo.js (removed) 46.8 kB 🟢 -46.8 kB 🟢 -7.56 kB 🟢 -6.61 kB
assets/SubscriptionTransitionPreviewWorkspace-BLmGLHIP.js (new) 46.8 kB 🔴 +46.8 kB 🔴 +9.65 kB 🔴 +8.53 kB
assets/SubscriptionTransitionPreviewWorkspace-DvDwnuT_.js (removed) 46.8 kB 🟢 -46.8 kB 🟢 -9.65 kB 🟢 -8.54 kB
assets/SubscriptionRequiredDialogContentUnified-DdddDoW1.js (removed) 41.2 kB 🟢 -41.2 kB 🟢 -9.16 kB 🟢 -7.97 kB
assets/SubscriptionRequiredDialogContentUnified-Dibf6fIT.js (new) 41.2 kB 🔴 +41.2 kB 🔴 +9.16 kB 🔴 +7.98 kB
assets/WorkspacePanelContent-CH-SbWO9.js (new) 34.5 kB 🔴 +34.5 kB 🔴 +7.49 kB 🔴 +6.61 kB
assets/WorkspacePanelContent-CZUerf4i.js (removed) 34.5 kB 🟢 -34.5 kB 🟢 -7.49 kB 🟢 -6.61 kB
assets/WidgetBoundingBoxes-DAZyuoqa.js (new) 33 kB 🔴 +33 kB 🔴 +8.94 kB 🔴 +7.93 kB
assets/WidgetPainter-CsxErOBr.js (removed) 32.7 kB 🟢 -32.7 kB 🟢 -7.9 kB 🟢 -6.99 kB
assets/WidgetPainter-DJxG3MUL.js (new) 32.7 kB 🔴 +32.7 kB 🔴 +7.91 kB 🔴 +7.02 kB
assets/Load3dViewerContent-4I995_Yt.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -6.3 kB 🟢 -5.46 kB
assets/Load3dViewerContent-BxuMqZfm.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +6.3 kB 🔴 +5.47 kB
assets/HdrViewerContent-BEu6sapw.js (removed) 29.2 kB 🟢 -29.2 kB 🟢 -8.09 kB 🟢 -7.14 kB
assets/HdrViewerContent-DOYRGY82.js (new) 29.2 kB 🔴 +29.2 kB 🔴 +8.09 kB 🔴 +7.14 kB
assets/WidgetBoundingBoxes-CK9Sog2l.js (removed) 28.6 kB 🟢 -28.6 kB 🟢 -7.9 kB 🟢 -7.01 kB
assets/SubscriptionRequiredDialogContent-2Bw5eRSL.js (removed) 27.4 kB 🟢 -27.4 kB 🟢 -6.75 kB 🟢 -5.96 kB
assets/SubscriptionRequiredDialogContent-DLCkb9-J.js (new) 27.4 kB 🔴 +27.4 kB 🔴 +6.75 kB 🔴 +5.96 kB
assets/SubscriptionPanelContentWorkspace-DXouvRly.js (new) 25 kB 🔴 +25 kB 🔴 +5.84 kB 🔴 +5.13 kB
assets/SubscriptionPanelContentWorkspace-x3JUYQqT.js (removed) 25 kB 🟢 -25 kB 🟢 -5.84 kB 🟢 -5.13 kB
assets/SubscriptionRequiredDialogContentWorkspace-BLQvdCN5.js (removed) 24.6 kB 🟢 -24.6 kB 🟢 -5.66 kB 🟢 -4.98 kB
assets/SubscriptionRequiredDialogContentWorkspace-QPIgVfim.js (new) 24.6 kB 🔴 +24.6 kB 🔴 +5.66 kB 🔴 +4.98 kB
assets/ColorPicker-DkY7ixf0.js (new) 24.4 kB 🔴 +24.4 kB 🔴 +6.37 kB 🔴 +5.62 kB
assets/ColorPicker-DRUgvfFz.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -6.34 kB 🟢 -5.59 kB
assets/WidgetImageCrop-BFK3dIzc.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.75 kB 🟢 -5.05 kB
assets/WidgetImageCrop-BrEvEQWk.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +5.75 kB 🔴 +5.05 kB
assets/load3d-Ca8Gxi8T.js (new) 21.3 kB 🔴 +21.3 kB 🔴 +5.2 kB 🔴 +4.51 kB
assets/load3d-zoiqI4GH.js (removed) 21.3 kB 🟢 -21.3 kB 🟢 -5.19 kB 🟢 -4.5 kB
assets/CurrentUserPopoverWorkspace-Cxf2hufy.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +4.75 kB 🔴 +4.22 kB
assets/CurrentUserPopoverWorkspace-VjYNThvM.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -4.75 kB 🟢 -4.23 kB
assets/SignInContent-CApb4cDS.js (new) 20.1 kB 🔴 +20.1 kB 🔴 +5.07 kB 🔴 +4.44 kB
assets/SignInContent-Ctaxj8nu.js (removed) 20.1 kB 🟢 -20.1 kB 🟢 -5.07 kB 🟢 -4.43 kB
assets/WidgetInputNumber-BciKzQ7w.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.82 kB 🔴 +4.28 kB
assets/WidgetInputNumber-e6zVIjMP.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.82 kB 🟢 -4.28 kB
assets/Load3D-BdeqxbJW.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.52 kB 🔴 +3.93 kB
assets/Load3D-ClbJsMfP.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.52 kB 🟢 -3.93 kB
assets/CreditsTile-CT6_egCL.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.54 kB 🔴 +4 kB
assets/CreditsTile-DSmGZiOM.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.54 kB 🟢 -4.01 kB
assets/WidgetRecordAudio-DLaicXwf.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.63 kB 🟢 -4.14 kB
assets/WidgetRecordAudio-DlCWkH9V.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.63 kB 🔴 +4.15 kB
assets/WidgetRange-B-HPH2p1.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.17 kB 🔴 +3.72 kB
assets/WidgetRange-BNcb4Pa4.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.17 kB 🟢 -3.73 kB
assets/WaveAudioPlayer-DC8RtriM.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.48 kB 🟢 -3.08 kB
assets/WaveAudioPlayer-NI66CJ3-.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.49 kB 🔴 +3.06 kB
assets/i18n-CSuJYcTe.js (removed) 12.2 kB 🟢 -12.2 kB 🟢 -3.25 kB 🟢 -2.72 kB
assets/i18n-DmH4g3As.js (new) 12.2 kB 🔴 +12.2 kB 🔴 +3.24 kB 🔴 +2.76 kB
assets/WidgetCurve-DeuiQo2a.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.51 kB 🔴 +3.17 kB
assets/WidgetCurve-DO-yNNu5.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.5 kB 🟢 -3.17 kB
assets/AudioPreviewPlayer-BvmRU73F.js (removed) 10.6 kB 🟢 -10.6 kB 🟢 -3.06 kB 🟢 -2.73 kB
assets/AudioPreviewPlayer-CnPfBJ0l.js (new) 10.6 kB 🔴 +10.6 kB 🔴 +3.06 kB 🔴 +2.74 kB
assets/TeamWorkspacesDialogContent-CLjqG6_b.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -3 kB 🟢 -2.66 kB
assets/TeamWorkspacesDialogContent-CVYadYk4.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +3 kB 🔴 +2.66 kB
assets/Load3DConfiguration-BCoBpTkI.js (removed) 9.02 kB 🟢 -9.02 kB 🟢 -2.67 kB 🟢 -2.35 kB
assets/Load3DConfiguration-CyjGz5R8.js (new) 9.02 kB 🔴 +9.02 kB 🔴 +2.67 kB 🔴 +2.35 kB
assets/nodeTemplates-CRPC8e68.js (removed) 8.33 kB 🟢 -8.33 kB 🟢 -2.88 kB 🟢 -2.54 kB
assets/nodeTemplates-ls-Dt5k0.js (new) 8.33 kB 🔴 +8.33 kB 🔴 +2.88 kB 🔴 +2.54 kB
assets/onboardingCloudRoutes-BG4W5_0Q.js (removed) 8.28 kB 🟢 -8.28 kB 🟢 -2.59 kB 🟢 -2.23 kB
assets/onboardingCloudRoutes-DgQuHQFe.js (new) 8.28 kB 🔴 +8.28 kB 🔴 +2.59 kB 🔴 +2.2 kB
assets/NightlySurveyController-B11M4vqk.js (new) 7.95 kB 🔴 +7.95 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/NightlySurveyController-EusCELXk.js (removed) 7.95 kB 🟢 -7.95 kB 🟢 -2.7 kB 🟢 -2.39 kB
assets/InviteMemberDialogContent-CNpudPFJ.js (removed) 6.76 kB 🟢 -6.76 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/InviteMemberDialogContent-UO85hfvK.js (new) 6.76 kB 🔴 +6.76 kB 🔴 +2.22 kB 🔴 +1.96 kB
assets/WidgetWithControl-BpxcP2K2.js (removed) 6.3 kB 🟢 -6.3 kB 🟢 -2.55 kB 🟢 -2.25 kB
assets/WidgetWithControl-ClBhWKTa.js (new) 6.3 kB 🔴 +6.3 kB 🔴 +2.55 kB 🔴 +2.26 kB
assets/tierBenefits-CAZzaFrg.js (removed) 6.02 kB 🟢 -6.02 kB 🟢 -1.93 kB 🟢 -1.67 kB
assets/tierBenefits-CKoM7i6D.js (new) 6.02 kB 🔴 +6.02 kB 🔴 +1.93 kB 🔴 +1.67 kB
assets/CancelSubscriptionDialogContent-bPkqOkaU.js (new) 5.76 kB 🔴 +5.76 kB 🔴 +1.97 kB 🔴 +1.73 kB
assets/CancelSubscriptionDialogContent-CC3HmG79.js (removed) 5.76 kB 🟢 -5.76 kB 🟢 -1.97 kB 🟢 -1.73 kB
assets/main-CMX6OGon.js (removed) 5.68 kB 🟢 -5.68 kB 🟢 -1.83 kB 🟢 -1.53 kB
assets/main-DDZiN2UM.js (new) 5.68 kB 🔴 +5.68 kB 🔴 +1.83 kB 🔴 +1.53 kB
assets/load3dPreviewExtensions-B-AkROOB.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.75 kB 🔴 +1.55 kB
assets/load3dPreviewExtensions-BXU-OPPZ.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.75 kB 🟢 -1.54 kB
assets/PaletteSwatchRow-D0z2ucPi.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.99 kB 🟢 -1.75 kB
assets/FreeTierDialogContent-DhMePeYs.js (removed) 5.25 kB 🟢 -5.25 kB 🟢 -1.76 kB 🟢 -1.55 kB
assets/FreeTierDialogContent-DTMKukRW.js (new) 5.25 kB 🔴 +5.25 kB 🔴 +1.76 kB 🔴 +1.55 kB
assets/CreateWorkspaceDialogContent-DGGsiZGZ.js (new) 5.19 kB 🔴 +5.19 kB 🔴 +1.83 kB 🔴 +1.58 kB
assets/CreateWorkspaceDialogContent-DqtvdAaZ.js (removed) 5.19 kB 🟢 -5.19 kB 🟢 -1.82 kB 🟢 -1.58 kB
assets/missingModelDownload-6rvWake_.js (new) 5.07 kB 🔴 +5.07 kB 🔴 +1.98 kB 🔴 +1.72 kB
assets/missingModelDownload-LxzLGiBV.js (removed) 5.07 kB 🟢 -5.07 kB 🟢 -1.98 kB 🟢 -1.73 kB
assets/ChangeMemberRoleDialogContent-BMAp7iJZ.js (removed) 5.04 kB 🟢 -5.04 kB 🟢 -1.66 kB 🟢 -1.46 kB
assets/ChangeMemberRoleDialogContent-DQ5ntghq.js (new) 5.04 kB 🔴 +5.04 kB 🔴 +1.66 kB 🔴 +1.46 kB
assets/EditWorkspaceDialogContent-BM8jLPGQ.js (new) 5 kB 🔴 +5 kB 🔴 +1.79 kB 🔴 +1.56 kB
assets/EditWorkspaceDialogContent-OGbBz3Oz.js (removed) 5 kB 🟢 -5 kB 🟢 -1.79 kB 🟢 -1.56 kB
assets/PaletteSwatchRow-BcIBBjbI.js (new) 4.89 kB 🔴 +4.89 kB 🔴 +1.89 kB 🔴 +1.69 kB
assets/WidgetTextarea-BJSQHGfj.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.9 kB 🟢 -1.66 kB
assets/WidgetTextarea-DMraYPNF.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.9 kB 🔴 +1.67 kB
assets/saveMesh-C-paS_g0.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.56 kB 🔴 +1.38 kB
assets/saveMesh-D4c3P_Dg.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.55 kB 🟢 -1.38 kB
assets/Preview3d-CTArquYo.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.43 kB 🔴 +1.23 kB
assets/Preview3d-DwCWtDwP.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.43 kB 🟢 -1.24 kB
assets/ValueControlPopover-Cyb2H2eA.js (removed) 4.55 kB 🟢 -4.55 kB 🟢 -1.59 kB 🟢 -1.42 kB
assets/ValueControlPopover-rcfiiKv4.js (new) 4.55 kB 🔴 +4.55 kB 🔴 +1.59 kB 🔴 +1.42 kB
assets/ApiNodesSignInContent-DlYuROfx.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.34 kB 🟢 -1.18 kB
assets/ApiNodesSignInContent-DpD6wD6U.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.34 kB 🔴 +1.18 kB
assets/DeleteWorkspaceDialogContent-B_uli-b4.js (new) 3.91 kB 🔴 +3.91 kB 🔴 +1.47 kB 🔴 +1.27 kB
assets/DeleteWorkspaceDialogContent-DwdJO49U.js (removed) 3.91 kB 🟢 -3.91 kB 🟢 -1.47 kB 🟢 -1.27 kB
assets/LeaveWorkspaceDialogContent-DB51n-JX.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.41 kB 🟢 -1.22 kB
assets/LeaveWorkspaceDialogContent-DSwFT1nQ.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.42 kB 🔴 +1.22 kB
assets/RemoveMemberDialogContent-CY_Rw-QU.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.37 kB 🔴 +1.19 kB
assets/RemoveMemberDialogContent-X71bgsE9.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.37 kB 🟢 -1.19 kB
assets/RevokeInviteDialogContent-BubsLCNX.js (new) 3.63 kB 🔴 +3.63 kB 🔴 +1.38 kB 🔴 +1.21 kB
assets/RevokeInviteDialogContent-DL1YV8yl.js (removed) 3.63 kB 🟢 -3.63 kB 🟢 -1.38 kB 🟢 -1.21 kB
assets/InviteMemberUpsellDialogContent-CJ82iuab.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.26 kB 🟢 -1.1 kB
assets/InviteMemberUpsellDialogContent-DVrBJNCF.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.27 kB 🔴 +1.12 kB
assets/workspaceCheckoutTelemetry-CFPCu-MB.js (new) 3.47 kB 🔴 +3.47 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/workspaceCheckoutTelemetry-CyCek2wT.js (removed) 3.47 kB 🟢 -3.47 kB 🟢 -1.56 kB 🟢 -1.36 kB
assets/Media3DTop-1xgfXk9g.js (removed) 3.26 kB 🟢 -3.26 kB 🟢 -1.3 kB 🟢 -1.13 kB
assets/Media3DTop-DByQzT99.js (new) 3.26 kB 🔴 +3.26 kB 🔴 +1.3 kB 🔴 +1.13 kB
assets/GlobalToast-BL-0Zi-X.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/GlobalToast-yStHipE6.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.26 kB 🔴 +1.08 kB
assets/load3dAdvanced-BTcLKtVI.js (new) 2.87 kB 🔴 +2.87 kB 🔴 +1.13 kB 🔴 +994 B
assets/load3dAdvanced-CmUvKAjk.js (removed) 2.87 kB 🟢 -2.87 kB 🟢 -1.13 kB 🟢 -990 B
assets/SubscribeToRun-n9na5ojf.js (new) 2.56 kB 🔴 +2.56 kB 🔴 +1.11 kB 🔴 +977 B
assets/SubscribeToRun-qlkibdYQ.js (removed) 2.56 kB 🟢 -2.56 kB 🟢 -1.11 kB 🟢 -976 B
assets/graphHasMissingNodes-Ba_O9J99.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +908 B 🔴 +804 B
assets/graphHasMissingNodes-uPg4UDrC.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -906 B 🟢 -807 B
assets/WidgetColorPicker-DBbDivf1.js (removed) 1.74 kB 🟢 -1.74 kB 🟢 -783 B 🟢 -691 B
assets/WidgetColorPicker-DERaDMhy.js (new) 1.74 kB 🔴 +1.74 kB 🔴 +782 B 🔴 +694 B
assets/WidgetColors-B6lGm2oV.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -832 B 🟢 -738 B
assets/WidgetColors-DQWjkR7Q.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +835 B 🔴 +739 B
assets/MediaAudioTop-DkQLG79K.js (removed) 1.67 kB 🟢 -1.67 kB 🟢 -838 B 🟢 -700 B
assets/MediaAudioTop-syVY3lF-.js (new) 1.67 kB 🔴 +1.67 kB 🔴 +836 B 🔴 +697 B
assets/signInSchema-C5TYtwvi.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +586 B 🔴 +512 B
assets/signInSchema-LKjqsw53.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -586 B 🟢 -515 B
assets/CloudRunButtonWrapper-CyluDGIE.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -550 B 🟢 -486 B
assets/CloudRunButtonWrapper-Dg_eR9wI.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +552 B 🔴 +526 B
assets/cloudSessionCookie-D8Q9mGih.js (removed) 991 B 🟢 -991 B 🟢 -466 B 🟢 -418 B
assets/cloudSessionCookie-DT85yYf0.js (new) 991 B 🔴 +991 B 🔴 +469 B 🔴 +401 B
assets/cloudBadges-BpGvYY43.js (new) 973 B 🔴 +973 B 🔴 +553 B 🔴 +502 B
assets/cloudBadges-CUeOzQOO.js (removed) 973 B 🟢 -973 B 🟢 -551 B 🟢 -499 B
assets/Load3DAdvanced-CWGtIQIL.js (removed) 813 B 🟢 -813 B 🟢 -455 B 🟢 -414 B
assets/Load3DAdvanced-lj-FMJIJ.js (new) 813 B 🔴 +813 B 🔴 +455 B 🔴 +409 B
assets/nightlyBadges-CVOlxTYw.js (removed) 464 B 🟢 -464 B 🟢 -304 B 🟢 -255 B
assets/nightlyBadges-sTSs12aR.js (new) 464 B 🔴 +464 B 🔴 +307 B 🔴 +254 B
assets/missingModelDownload-DOXie4CX.js (new) 228 B 🔴 +228 B 🔴 +148 B 🔴 +129 B
assets/missingModelDownload-DqIE6M1N.js (removed) 228 B 🟢 -228 B 🟢 -149 B 🟢 -129 B
assets/SubscriptionPanelContentWorkspace-CP2NV6fi.js (removed) 179 B 🟢 -179 B 🟢 -117 B 🟢 -90 B
assets/SubscriptionPanelContentWorkspace-IgQ4NINq.js (new) 179 B 🔴 +179 B 🔴 +117 B 🔴 +92 B
assets/Load3dViewerContent-Bc0_Gvtg.js (removed) 137 B 🟢 -137 B 🟢 -103 B 🟢 -110 B
assets/Load3dViewerContent-CeFI8tvS.js (new) 137 B 🔴 +137 B 🔴 +103 B 🔴 +92 B
assets/Load3DAdvanced-BNeTi0au.js (new) 122 B 🔴 +122 B 🔴 +97 B 🔴 +87 B
assets/Load3DAdvanced-CUVrOdmn.js (removed) 122 B 🟢 -122 B 🟢 -97 B 🟢 -88 B
assets/WidgetLegacy-CgSqo4Pb.js (new) 119 B 🔴 +119 B 🔴 +108 B 🔴 +95 B
assets/WidgetLegacy-CJAtf6n8.js (removed) 119 B 🟢 -119 B 🟢 -108 B 🟢 -95 B
assets/workflowDraftStoreV2-Cb4AXkpN.js (new) 113 B 🔴 +113 B 🔴 +105 B 🔴 +114 B
assets/workflowDraftStoreV2-F6wt8JUq.js (removed) 113 B 🟢 -113 B 🟢 -105 B 🟢 -116 B
assets/Load3D-BD6U66Wq.js (removed) 98 B 🟢 -98 B 🟢 -89 B 🟢 -88 B
assets/Load3D-BobnlR05.js (new) 98 B 🔴 +98 B 🔴 +89 B 🔴 +78 B
assets/i18n-BRVlc-e5.js (new) 97 B 🔴 +97 B 🔴 +92 B 🔴 +88 B
assets/i18n-X9W7xs8s.js (removed) 97 B 🟢 -97 B 🟢 -92 B 🟢 -86 B
assets/changeTracker-CEMUjDlz.js (removed) 93 B 🟢 -93 B 🟢 -95 B 🟢 -83 B
assets/changeTracker-CwBwwyj-.js (new) 93 B 🔴 +93 B 🔴 +95 B 🔴 +82 B

Status: 79 added / 79 removed / 86 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 59.0 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.0 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.4 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 46.0 MB heap
large-graph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.7 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 66.2 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.9 MB heap
minimap-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.1 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.1 MB heap
subgraph-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 50.4 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 58.0 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 161ms TBT · 73.1 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.3 MB heap
vue-large-graph-idle: · 58.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 160.1 MB heap
vue-large-graph-pan: · 58.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 26ms TBT · 161.4 MB heap
workflow-execution: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 45.2 MB heap

⚠️ 12 regressions detected

Show regressions
Metric Baseline PR (median) Δ Sig
canvas-idle: task duration 452ms 503ms +11% ⚠️ z=3.5
canvas-zoom-sweep: layout duration 1ms 1ms +26% ⚠️ z=4.6
canvas-zoom-sweep: task duration 384ms 420ms +9% ⚠️ z=4.1
dom-widget-clipping: style recalc duration 9ms 13ms +42% ⚠️ z=3.6
dom-widget-clipping: task duration 398ms 454ms +14% ⚠️ z=5.5
large-graph-pan: style recalc duration 18ms 20ms +11% ⚠️ z=3.3
large-graph-pan: task duration 1120ms 1264ms +13% ⚠️ z=4.2
large-graph-pan: script duration 407ms 448ms +10% ⚠️ z=2.0
minimap-idle: task duration 614ms 637ms +4% ⚠️ z=2.3
subgraph-dom-widget-clipping: task duration 364ms 435ms +20% ⚠️ z=3.1
workflow-execution: style recalc duration 21ms 32ms +52% ⚠️ z=3.6
workflow-execution: task duration 124ms 217ms +75% ⚠️ z=8.7
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms +0% z=-0.1
canvas-idle: p95 frame time 17ms 17ms -1%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 9ms 10ms +12% z=-0.7
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 8 9 +6% z=-4.7
canvas-idle: task duration 452ms 503ms +11% ⚠️ z=3.5
canvas-idle: script duration 22ms 24ms +7% z=-0.6
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 54.8 MB 59.0 MB +8%
canvas-idle: DOM nodes -281 -284 +1% z=-240.4
canvas-idle: event listeners -197 -198 +1% z=-44.3
canvas-mouse-sweep: avg frame time 17ms 17ms +0% z=-0.4
canvas-mouse-sweep: p95 frame time 17ms 17ms +0%
canvas-mouse-sweep: layout duration 4ms 4ms +5% z=1.5
canvas-mouse-sweep: style recalc duration 41ms 46ms +13% z=1.0
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 75 77 +2% z=-0.9
canvas-mouse-sweep: task duration 820ms 981ms +20% z=2.0
canvas-mouse-sweep: script duration 129ms 140ms +8% z=0.7
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 59.2 MB 54.0 MB -9%
canvas-mouse-sweep: DOM nodes 55 -242 -540% z=-117.7
canvas-mouse-sweep: event listeners 4 -198 -5050% z=-49.5
canvas-zoom-sweep: avg frame time 17ms 17ms +0% z=0.5
canvas-zoom-sweep: p95 frame time 17ms 17ms +0%
canvas-zoom-sweep: layout duration 1ms 1ms +26% ⚠️ z=4.6
canvas-zoom-sweep: style recalc duration 20ms 20ms -1% z=0.7
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 30 32 +7% z=1.6
canvas-zoom-sweep: task duration 384ms 420ms +9% ⚠️ z=4.1
canvas-zoom-sweep: script duration 25ms 26ms +3% z=-0.5
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 55.7 MB 56.4 MB +1%
canvas-zoom-sweep: DOM nodes -240 -233 -3% z=-394.5
canvas-zoom-sweep: event listeners -186 -185 -1% z=-40.3
dom-widget-clipping: avg frame time 17ms 17ms -0% z=-0.2
dom-widget-clipping: p95 frame time 17ms 17ms +0%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 9ms 13ms +42% ⚠️ z=3.6
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 12 10 -17% z=-6.2
dom-widget-clipping: task duration 398ms 454ms +14% ⚠️ z=5.5
dom-widget-clipping: script duration 60ms 65ms +9% z=-0.7
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 49.2 MB 46.0 MB -6%
dom-widget-clipping: DOM nodes -271 -279 +3% z=-212.3
dom-widget-clipping: event listeners -203 -201 -1% variance too high
large-graph-idle: avg frame time 17ms 17ms +0% z=-0.2
large-graph-idle: p95 frame time 17ms 17ms +0%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 9ms 10ms +23% z=-1.7
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 9 10 +11% z=-5.1
large-graph-idle: task duration 580ms 617ms +6% z=1.4
large-graph-idle: script duration 107ms 102ms -4% z=-0.0
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 55.8 MB 57.7 MB +3%
large-graph-idle: DOM nodes -270 -125 -54% z=-165.6
large-graph-idle: event listeners -197 -96 -52% z=-20.0
large-graph-pan: avg frame time 17ms 17ms +0% z=0.8
large-graph-pan: p95 frame time 17ms 17ms +0%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 18ms 20ms +11% ⚠️ z=3.3
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 68 69 +1% z=-0.9
large-graph-pan: task duration 1120ms 1264ms +13% ⚠️ z=4.2
large-graph-pan: script duration 407ms 448ms +10% ⚠️ z=2.0
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 78.2 MB 66.2 MB -15%
large-graph-pan: DOM nodes -275 -273 -1% z=-177.0
large-graph-pan: event listeners -197 -197 +0% z=-243.9
large-graph-zoom: avg frame time 17ms 17ms -0%
large-graph-zoom: p95 frame time 17ms 17ms +0%
large-graph-zoom: layout duration 8ms 10ms +21%
large-graph-zoom: style recalc duration 16ms 20ms +23%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 63 63 +0%
large-graph-zoom: task duration 1398ms 1506ms +8%
large-graph-zoom: script duration 525ms 577ms +10%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 65.5 MB 69.9 MB +7%
large-graph-zoom: DOM nodes 2 7 +250%
large-graph-zoom: event listeners 8 9 +13%
minimap-idle: avg frame time 17ms 17ms +0% z=0.1
minimap-idle: p95 frame time 17ms 17ms +0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 9ms 5ms -38% z=-5.1
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 8 5 -38% z=-6.7
minimap-idle: task duration 614ms 637ms +4% ⚠️ z=2.3
minimap-idle: script duration 110ms 113ms +3% z=1.5
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 56.8 MB 57.1 MB +1%
minimap-idle: DOM nodes -268 -278 +4% z=-217.2
minimap-idle: event listeners -197 -197 +0% z=-305.3
subgraph-dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
subgraph-dom-widget-clipping: p95 frame time 17ms 17ms +0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 11ms 14ms +27% z=1.2
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 47 48 +1% z=-0.8
subgraph-dom-widget-clipping: task duration 364ms 435ms +20% ⚠️ z=3.1
subgraph-dom-widget-clipping: script duration 118ms 132ms +11% z=0.5
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 64.4 MB 54.1 MB -16%
subgraph-dom-widget-clipping: DOM nodes 20 -130 -750% z=-136.0
subgraph-dom-widget-clipping: event listeners 6 -94 -1658% z=-18.8
subgraph-idle: avg frame time 17ms 17ms -0% z=-0.2
subgraph-idle: p95 frame time 17ms 17ms +1%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 10ms 10ms -3% z=-0.9
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 10 10 +0% z=-1.4
subgraph-idle: task duration 409ms 415ms +1% z=1.5
subgraph-idle: script duration 20ms 16ms -21% z=-1.5
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 54.3 MB 50.4 MB -7%
subgraph-idle: DOM nodes 20 -135 -773% z=-104.6
subgraph-idle: event listeners 4 -98 -2538% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms +0% z=0.4
subgraph-mouse-sweep: p95 frame time 17ms 17ms -0%
subgraph-mouse-sweep: layout duration 4ms 5ms +12% z=0.6
subgraph-mouse-sweep: style recalc duration 40ms 46ms +13% z=1.0
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 77 77 +0% z=-1.6
subgraph-mouse-sweep: task duration 746ms 783ms +5% z=0.2
subgraph-mouse-sweep: script duration 97ms 106ms +10% z=0.8
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 53.2 MB 58.0 MB +9%
subgraph-mouse-sweep: DOM nodes -225 -254 +13% z=-143.4
subgraph-mouse-sweep: event listeners -199 -199 +0% variance too high
subgraph-transition-enter: avg frame time 17ms 17ms -0%
subgraph-transition-enter: p95 frame time 17ms 17ms +0%
subgraph-transition-enter: layout duration 17ms 14ms -16%
subgraph-transition-enter: style recalc duration 34ms 32ms -5%
subgraph-transition-enter: layout count 14 13 -7%
subgraph-transition-enter: style recalc count 18 17 -6%
subgraph-transition-enter: task duration 880ms 930ms +6%
subgraph-transition-enter: script duration 41ms 43ms +3%
subgraph-transition-enter: TBT 169ms 161ms -5%
subgraph-transition-enter: heap used 97.1 MB 73.1 MB -25%
subgraph-transition-enter: DOM nodes 13673 13673 +0%
subgraph-transition-enter: event listeners 2533 2533 +0%
viewport-pan-sweep: avg frame time 17ms 17ms +0%
viewport-pan-sweep: p95 frame time 17ms 17ms +0%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 56ms 67ms +19%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 251 251 +0%
viewport-pan-sweep: task duration 3928ms 4421ms +13%
viewport-pan-sweep: script duration 1279ms 1397ms +9%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 66.4 MB 68.3 MB +3%
viewport-pan-sweep: DOM nodes -263 -268 +2%
viewport-pan-sweep: event listeners -120 -155 +29%
vue-large-graph-idle: avg frame time 17ms 17ms -0%
vue-large-graph-idle: p95 frame time 17ms 17ms -0%
vue-large-graph-idle: layout duration 0ms 0ms +0%
vue-large-graph-idle: style recalc duration 0ms 0ms +0%
vue-large-graph-idle: layout count 0 0 +0%
vue-large-graph-idle: style recalc count 0 0 +0%
vue-large-graph-idle: task duration 12654ms 13342ms +5%
vue-large-graph-idle: script duration 530ms 571ms +8%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 162.0 MB 160.1 MB -1%
vue-large-graph-idle: DOM nodes -3300 -3300 +0%
vue-large-graph-idle: event listeners -16374 -16375 +0%
vue-large-graph-pan: avg frame time 17ms 17ms +0%
vue-large-graph-pan: p95 frame time 17ms 17ms +0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 22ms 22ms +2%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 80 98 +23%
vue-large-graph-pan: task duration 15422ms 16573ms +7%
vue-large-graph-pan: script duration 800ms 846ms +6%
vue-large-graph-pan: TBT 11ms 26ms +136%
vue-large-graph-pan: heap used 160.4 MB 161.4 MB +1%
vue-large-graph-pan: DOM nodes -3300 -3300 +0%
vue-large-graph-pan: event listeners -16376 -16372 -0%
workflow-execution: avg frame time 17ms 17ms -0% z=0.1
workflow-execution: p95 frame time 17ms 17ms +0%
workflow-execution: layout duration 2ms 2ms -11% z=0.3
workflow-execution: style recalc duration 21ms 32ms +52% ⚠️ z=3.6
workflow-execution: layout count 6 5 -17% z=0.1
workflow-execution: style recalc count 17 17 -3% z=-0.6
workflow-execution: task duration 124ms 217ms +75% ⚠️ z=8.7
workflow-execution: script duration 20ms 19ms -7% z=-3.4
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 62.0 MB 45.2 MB -27%
workflow-execution: DOM nodes 153 -220 -244% z=-53.6
workflow-execution: event listeners 71 -156 -319% z=-47.5
Historical variance (last 15 runs)
Metric μ σ CV
canvas-idle: avg frame time 17ms 0ms 0.0%
canvas-idle: layout duration 0ms 0ms 0.0%
canvas-idle: style recalc duration 11ms 1ms 8.2%
canvas-idle: layout count 0 0 0.0%
canvas-idle: style recalc count 11 1 5.0%
canvas-idle: task duration 395ms 31ms 7.9%
canvas-idle: script duration 25ms 2ms 8.8%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
canvas-mouse-sweep: avg frame time 17ms 0ms 0.0%
canvas-mouse-sweep: layout duration 4ms 0ms 5.4%
canvas-mouse-sweep: style recalc duration 43ms 3ms 7.4%
canvas-mouse-sweep: layout count 12 0 0.0%
canvas-mouse-sweep: style recalc count 79 2 3.0%
canvas-mouse-sweep: task duration 865ms 58ms 6.7%
canvas-mouse-sweep: script duration 136ms 6ms 4.8%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
canvas-zoom-sweep: avg frame time 17ms 0ms 0.0%
canvas-zoom-sweep: layout duration 1ms 0ms 7.0%
canvas-zoom-sweep: style recalc duration 19ms 2ms 8.0%
canvas-zoom-sweep: layout count 6 0 0.0%
canvas-zoom-sweep: style recalc count 31 0 1.5%
canvas-zoom-sweep: task duration 327ms 23ms 7.1%
canvas-zoom-sweep: script duration 27ms 3ms 11.1%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
dom-widget-clipping: avg frame time 17ms 0ms 0.0%
dom-widget-clipping: layout duration 0ms 0ms 0.0%
dom-widget-clipping: style recalc duration 10ms 1ms 8.0%
dom-widget-clipping: layout count 0 0 0.0%
dom-widget-clipping: style recalc count 13 0 3.8%
dom-widget-clipping: task duration 365ms 16ms 4.5%
dom-widget-clipping: script duration 68ms 3ms 4.8%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
large-graph-idle: avg frame time 17ms 0ms 0.0%
large-graph-idle: layout duration 0ms 0ms 0.0%
large-graph-idle: style recalc duration 12ms 1ms 8.6%
large-graph-idle: layout count 0 0 0.0%
large-graph-idle: style recalc count 12 0 2.7%
large-graph-idle: task duration 542ms 54ms 10.0%
large-graph-idle: script duration 102ms 11ms 10.3%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
large-graph-pan: avg frame time 17ms 0ms 0.0%
large-graph-pan: layout duration 0ms 0ms 0.0%
large-graph-pan: style recalc duration 17ms 1ms 4.6%
large-graph-pan: layout count 0 0 0.0%
large-graph-pan: style recalc count 70 1 0.9%
large-graph-pan: task duration 1082ms 43ms 4.0%
large-graph-pan: script duration 408ms 20ms 4.8%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
minimap-idle: avg frame time 17ms 0ms 0.0%
minimap-idle: layout duration 0ms 0ms 0.0%
minimap-idle: style recalc duration 10ms 1ms 8.6%
minimap-idle: layout count 0 0 0.0%
minimap-idle: style recalc count 10 1 7.1%
minimap-idle: task duration 527ms 47ms 9.0%
minimap-idle: script duration 98ms 10ms 10.1%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
subgraph-dom-widget-clipping: avg frame time 17ms 0ms 0.0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalc duration 13ms 1ms 7.4%
subgraph-dom-widget-clipping: layout count 0 0 0.0%
subgraph-dom-widget-clipping: style recalc count 48 1 1.2%
subgraph-dom-widget-clipping: task duration 378ms 18ms 4.9%
subgraph-dom-widget-clipping: script duration 128ms 6ms 4.9%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.0%
subgraph-dom-widget-clipping: event listeners 16 6 36.0%
subgraph-idle: avg frame time 17ms 0ms 0.0%
subgraph-idle: layout duration 0ms 0ms 0.0%
subgraph-idle: style recalc duration 10ms 1ms 7.5%
subgraph-idle: layout count 0 0 0.0%
subgraph-idle: style recalc count 11 1 6.0%
subgraph-idle: task duration 370ms 31ms 8.5%
subgraph-idle: script duration 20ms 3ms 13.2%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
subgraph-mouse-sweep: avg frame time 17ms 0ms 0.0%
subgraph-mouse-sweep: layout duration 5ms 0ms 6.8%
subgraph-mouse-sweep: style recalc duration 42ms 3ms 7.8%
subgraph-mouse-sweep: layout count 16 0 0.0%
subgraph-mouse-sweep: style recalc count 80 2 2.4%
subgraph-mouse-sweep: task duration 766ms 69ms 9.0%
subgraph-mouse-sweep: script duration 101ms 7ms 6.5%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
workflow-execution: avg frame time 17ms 0ms 0.0%
workflow-execution: layout duration 2ms 0ms 9.4%
workflow-execution: style recalc duration 24ms 2ms 9.1%
workflow-execution: layout count 5 1 11.0%
workflow-execution: style recalc count 18 2 11.5%
workflow-execution: task duration 123ms 11ms 8.8%
workflow-execution: script duration 29ms 3ms 10.2%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: DOM nodes 161 7 4.4%
workflow-execution: event listeners 52 4 8.4%
Trend (last 15 commits on main)
Metric Trend Dir Latest
canvas-idle: avg frame time ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: p95 frame time ➡️ NaNms
canvas-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: style recalc duration ▇▇▆▆▃█▄▃▄▃▇▄▁▆▇ ➡️ 11ms
canvas-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: style recalc count █▃▅▂▅▆▃▁▂▁▂▅▆▅▆ ➡️ 12
canvas-idle: task duration ▃▃▃▆▂▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: script duration ▄▃▅▇▂▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
canvas-mouse-sweep: avg frame time ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: p95 frame time ➡️ NaNms
canvas-mouse-sweep: layout duration ▁▃▂▄▁▂▁▃▆▂█▇▆▄▃ ➡️ 4ms
canvas-mouse-sweep: style recalc duration ▄▄▂▄▁▂▃▃▅▄█▆▂▄▄ ➡️ 43ms
canvas-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: style recalc count █▅▄▃▂▂▁▄▄▅▆▅▂▇▄ ➡️ 79
canvas-mouse-sweep: task duration █▆▄▂▂▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: script duration ▄▅▄▆▄▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
canvas-zoom-sweep: avg frame time ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: p95 frame time ➡️ NaNms
canvas-zoom-sweep: layout duration ▆▅▅▄▁▁█▅▃▅▇▆▁▂▆ ➡️ 1ms
canvas-zoom-sweep: style recalc duration ▆▅▄▆▅▃█▆▇▅▇▄▁▃▅ ➡️ 20ms
canvas-zoom-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: style recalc count ▁▁▃▄▆▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: task duration ▄▂▁▇▂▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: script duration ▃▃▂▇▂▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
dom-widget-clipping: avg frame time ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: p95 frame time ➡️ NaNms
dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: style recalc duration ▆▆▂▆▄▃██▄▁▆▇▆▃▅ ➡️ 10ms
dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: style recalc count ▇█▅█▅▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: task duration ▃▃▁▅▄▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: script duration ▅▄▄▆▆▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
large-graph-idle: avg frame time ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: p95 frame time ➡️ NaNms
large-graph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: style recalc duration ▅▅▅▆▄▅▃▄▅▅▆█▁▄▆ ➡️ 13ms
large-graph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: style recalc count █▆█▃▃▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: task duration ▂▃▂▆▂▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: script duration ▄▅▄▆▄▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
large-graph-pan: avg frame time ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: p95 frame time ➡️ NaNms
large-graph-pan: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: style recalc duration ▃▂▄▄▁▅▂▂▁▄▄█▃▁▂ ➡️ 17ms
large-graph-pan: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: style recalc count ▆▃█▂▃▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: task duration ▄▃▄▆▄▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: script duration ▅▄▅▆▆▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
minimap-idle: avg frame time ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: p95 frame time ➡️ NaNms
minimap-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: style recalc duration ▄█▁█▅▅█▅▅▃▅▁▁▄▆ ➡️ 10ms
minimap-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: style recalc count ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 9
minimap-idle: task duration ▃▄▁▅▁▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: script duration ▄▆▃▇▃▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
subgraph-dom-widget-clipping: avg frame time ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: p95 frame time ➡️ NaNms
subgraph-dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: style recalc duration ▂▄▃▅▅▃▂▅▇▃▄█▁▄▆ ➡️ 14ms
subgraph-dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: style recalc count ▇█▆▃▆▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: task duration ▂▃▃▆▅▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: script duration ▃▃▃▄▅▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
subgraph-idle: avg frame time ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: p95 frame time ➡️ NaNms
subgraph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: style recalc duration ▁▇▃▆▂▄▂▃▃▆▆▄▃▇█ ➡️ 12ms
subgraph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: style recalc count ▃▆▃▃▂▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: task duration ▁▃▁▇▁▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: script duration ▁▃▂▇▁▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
subgraph-mouse-sweep: avg frame time ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: p95 frame time ➡️ NaNms
subgraph-mouse-sweep: layout duration ▁▄▄▄▃▃▅▅▅▂█▇▂▃▆ ➡️ 5ms
subgraph-mouse-sweep: style recalc duration ▃▂▄▅▂▃▄▅█▃█▆▁▂▅ ➡️ 43ms
subgraph-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: style recalc count ▅▂▅▅▁▄▃▅█▅▆▄▂▄▅ ➡️ 81
subgraph-mouse-sweep: task duration ▃▂▄▅▂▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: script duration ▄▅▄▇▅▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
workflow-execution: avg frame time ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: p95 frame time ➡️ NaNms
workflow-execution: layout duration ▁▆▁▃▂▄▃▂▃▃▅█▄▂▅ ➡️ 2ms
workflow-execution: style recalc duration ▃▇▅▇▁▅▆▇█▁██▂▄▆ ➡️ 25ms
workflow-execution: layout count ▁█▂▃▂▃▃▁▃▃▄▃▂▃▂ ➡️ 5
workflow-execution: style recalc count ▃█▅▇▁▄▅▆▅▅▅▅▄▄▂ ➡️ 15
workflow-execution: task duration ▂▅▄▅▁▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: script duration ▄▃▄▄▃▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-07-07T03:13:08.467Z",
  "gitSha": "98b25d0f340ab93f6971f01e76e5a2f3a4537d93",
  "branch": "feat/create-bounding-boxes-input-grid",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2038.1759999999645,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 10.200000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 511.954,
      "heapDeltaBytes": -7249432,
      "heapUsedBytes": 62140224,
      "domNodes": -283,
      "jsHeapTotalBytes": 20074496,
      "scriptDurationMs": 26.028999999999996,
      "eventListeners": -197,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 2082.883000000038,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 10.134,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 494.1070000000001,
      "heapDeltaBytes": -7907336,
      "heapUsedBytes": 61581516,
      "domNodes": -285,
      "jsHeapTotalBytes": 19288064,
      "scriptDurationMs": 21.884000000000004,
      "eventListeners": -199,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2141.9219999999655,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 46.029,
      "layouts": 12,
      "layoutDurationMs": 4.111999999999999,
      "taskDurationMs": 1070.179,
      "heapDeltaBytes": -12794104,
      "heapUsedBytes": 56458876,
      "domNodes": -246,
      "jsHeapTotalBytes": 20074496,
      "scriptDurationMs": 150.598,
      "eventListeners": -197,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1924.8220000000629,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 45.826,
      "layouts": 12,
      "layoutDurationMs": 3.685,
      "taskDurationMs": 892.671,
      "heapDeltaBytes": -12649088,
      "heapUsedBytes": 56878088,
      "domNodes": -238,
      "jsHeapTotalBytes": 19025920,
      "scriptDurationMs": 129.14100000000002,
      "eventListeners": -199,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1773.3739999999898,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 19.71,
      "layouts": 6,
      "layoutDurationMs": 0.7869999999999999,
      "taskDurationMs": 396.529,
      "heapDeltaBytes": 62576,
      "heapUsedBytes": 52371504,
      "domNodes": -242,
      "jsHeapTotalBytes": 7991296,
      "scriptDurationMs": 21.842999999999996,
      "eventListeners": -186,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1774.505999999974,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 20.589,
      "layouts": 6,
      "layoutDurationMs": 0.9110000000000001,
      "taskDurationMs": 444.346,
      "heapDeltaBytes": -3560656,
      "heapUsedBytes": 65868916,
      "domNodes": -224,
      "jsHeapTotalBytes": 13258752,
      "scriptDurationMs": 29.411999999999995,
      "eventListeners": -184,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 716.8619999999919,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 11.402999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 440.31,
      "heapDeltaBytes": -1302648,
      "heapUsedBytes": 50413504,
      "domNodes": -279,
      "jsHeapTotalBytes": -135168,
      "scriptDurationMs": 64.638,
      "eventListeners": -201,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 743.2199999999511,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 14.008,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 468.635,
      "heapDeltaBytes": -23408244,
      "heapUsedBytes": 46107968,
      "domNodes": -279,
      "jsHeapTotalBytes": 6705152,
      "scriptDurationMs": 66.25200000000001,
      "eventListeners": -201,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2071.228000000019,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 9.546,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 575.25,
      "heapDeltaBytes": -25150348,
      "heapUsedBytes": 58933468,
      "domNodes": -272,
      "jsHeapTotalBytes": 1650688,
      "scriptDurationMs": 92.533,
      "eventListeners": -197,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2024.8900000000276,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 11.440000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 659.5439999999999,
      "heapDeltaBytes": -9724940,
      "heapUsedBytes": 62027604,
      "domNodes": 22,
      "jsHeapTotalBytes": 11153408,
      "scriptDurationMs": 111.53000000000002,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2325.5060000000185,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 18.865000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1259.1029999999998,
      "heapDeltaBytes": 3007172,
      "heapUsedBytes": 56332280,
      "domNodes": -274,
      "jsHeapTotalBytes": 1310720,
      "scriptDurationMs": 464.888,
      "eventListeners": -197,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2205.8620000000246,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 20.919,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1267.97,
      "heapDeltaBytes": 14372620,
      "heapUsedBytes": 82415180,
      "domNodes": -272,
      "jsHeapTotalBytes": -1114112,
      "scriptDurationMs": 431.675,
      "eventListeners": -197,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3597.0080000000166,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 24.099,
      "layouts": 60,
      "layoutDurationMs": 10.860000000000001,
      "taskDurationMs": 1569.9830000000002,
      "heapDeltaBytes": 20848280,
      "heapUsedBytes": 75965400,
      "domNodes": 12,
      "jsHeapTotalBytes": 6815744,
      "scriptDurationMs": 600.479,
      "eventListeners": 10,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3368.445000000065,
      "styleRecalcs": 61,
      "styleRecalcDurationMs": 16.151000000000003,
      "layouts": 60,
      "layoutDurationMs": 8.435,
      "taskDurationMs": 1442.815,
      "heapDeltaBytes": 15623644,
      "heapUsedBytes": 70577200,
      "domNodes": 2,
      "jsHeapTotalBytes": 2621440,
      "scriptDurationMs": 552.851,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2037.5080000000025,
      "styleRecalcs": 5,
      "styleRecalcDurationMs": 5.822000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 595.039,
      "heapDeltaBytes": -9742996,
      "heapUsedBytes": 59843020,
      "domNodes": -277,
      "jsHeapTotalBytes": -2105344,
      "scriptDurationMs": 106.17599999999999,
      "eventListeners": -197,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "minimap-idle",
      "durationMs": 2004.417999999987,
      "styleRecalcs": 5,
      "styleRecalcDurationMs": 4.915000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 678.814,
      "heapDeltaBytes": 7572944,
      "heapUsedBytes": 59959160,
      "domNodes": -279,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 120.167,
      "eventListeners": -197,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 670.771000000002,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 12.881,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 453.32599999999996,
      "heapDeltaBytes": -23167532,
      "heapUsedBytes": 46330208,
      "domNodes": -282,
      "jsHeapTotalBytes": 6443008,
      "scriptDurationMs": 129.98499999999999,
      "eventListeners": -195,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 660.3550000000951,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 14.759000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 417.53499999999997,
      "heapDeltaBytes": 8120056,
      "heapUsedBytes": 67051808,
      "domNodes": 22,
      "jsHeapTotalBytes": 19660800,
      "scriptDurationMs": 133.31199999999998,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2021.523000000002,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 10.417,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 419.52799999999996,
      "heapDeltaBytes": -5258052,
      "heapUsedBytes": 47055936,
      "domNodes": -289,
      "jsHeapTotalBytes": 16904192,
      "scriptDurationMs": 15.110000000000001,
      "eventListeners": -199,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2000.423000000069,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.057999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 411.432,
      "heapDeltaBytes": 978112,
      "heapUsedBytes": 58544212,
      "domNodes": 20,
      "jsHeapTotalBytes": 18612224,
      "scriptDurationMs": 17.352,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1748.3870000000366,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 47.382,
      "layouts": 16,
      "layoutDurationMs": 4.957000000000001,
      "taskDurationMs": 761.9990000000001,
      "heapDeltaBytes": -16372372,
      "heapUsedBytes": 53163068,
      "domNodes": -233,
      "jsHeapTotalBytes": 20074496,
      "scriptDurationMs": 99.91299999999998,
      "eventListeners": -199,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1754.7029999999495,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 44.202000000000005,
      "layouts": 16,
      "layoutDurationMs": 4.8260000000000005,
      "taskDurationMs": 803.307,
      "heapDeltaBytes": 15766952,
      "heapUsedBytes": 68441468,
      "domNodes": -274,
      "jsHeapTotalBytes": 13758464,
      "scriptDurationMs": 112.076,
      "eventListeners": -199,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1413.9999999999873,
      "styleRecalcs": 17,
      "styleRecalcDurationMs": 32.175999999999995,
      "layouts": 13,
      "layoutDurationMs": 14.447999999999999,
      "taskDurationMs": 929.6669999999998,
      "heapDeltaBytes": 4494564,
      "heapUsedBytes": 76637464,
      "domNodes": 13673,
      "jsHeapTotalBytes": 15990784,
      "scriptDurationMs": 42.623000000000005,
      "eventListeners": 2533,
      "totalBlockingTimeMs": 161,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8647.199,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 70.809,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4409.976000000001,
      "heapDeltaBytes": 13361268,
      "heapUsedBytes": 73705580,
      "domNodes": -264,
      "jsHeapTotalBytes": 4386816,
      "scriptDurationMs": 1395.411,
      "eventListeners": -128,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8502.884999999991,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 62.92100000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4431.941,
      "heapDeltaBytes": 1884056,
      "heapUsedBytes": 69551620,
      "domNodes": -271,
      "jsHeapTotalBytes": 458752,
      "scriptDurationMs": 1399.452,
      "eventListeners": -181,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 13144.108000000017,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13128.617000000002,
      "heapDeltaBytes": -33911312,
      "heapUsedBytes": 169386504,
      "domNodes": -3300,
      "jsHeapTotalBytes": -3436544,
      "scriptDurationMs": 564.0010000000001,
      "eventListeners": -16382,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 13586.30800000003,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13554.484,
      "heapDeltaBytes": -27837596,
      "heapUsedBytes": 166420568,
      "domNodes": -3300,
      "jsHeapTotalBytes": 4194304,
      "scriptDurationMs": 577.339,
      "eventListeners": -16368,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 16668.127000000026,
      "styleRecalcs": 92,
      "styleRecalcDurationMs": 21.364999999999966,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16625.791,
      "heapDeltaBytes": -38800332,
      "heapUsedBytes": 170465628,
      "domNodes": -3300,
      "jsHeapTotalBytes": -7454720,
      "scriptDurationMs": 847.484,
      "eventListeners": -16372,
      "totalBlockingTimeMs": 43,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 16567.886000000042,
      "styleRecalcs": 104,
      "styleRecalcDurationMs": 23.002000000000024,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16519.742000000002,
      "heapDeltaBytes": -53316540,
      "heapUsedBytes": 167920592,
      "domNodes": -3300,
      "jsHeapTotalBytes": 6815744,
      "scriptDurationMs": 845.195,
      "eventListeners": -16372,
      "totalBlockingTimeMs": 9,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 466.5059999999812,
      "styleRecalcs": 17,
      "styleRecalcDurationMs": 36.997,
      "layouts": 5,
      "layoutDurationMs": 1.597,
      "taskDurationMs": 238.99200000000002,
      "heapDeltaBytes": -22267984,
      "heapUsedBytes": 48403792,
      "domNodes": -160,
      "jsHeapTotalBytes": 4345856,
      "scriptDurationMs": 18.073000000000004,
      "eventListeners": -134,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66666666666665,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 510.00999999996566,
      "styleRecalcs": 16,
      "styleRecalcDurationMs": 27.398999999999997,
      "layouts": 5,
      "layoutDurationMs": 1.5799999999999998,
      "taskDurationMs": 194.80299999999997,
      "heapDeltaBytes": -6686744,
      "heapUsedBytes": 46453608,
      "domNodes": -280,
      "jsHeapTotalBytes": 651264,
      "scriptDurationMs": 19.760999999999996,
      "eventListeners": -177,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 4

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

Inline comments:
In `@src/components/boundingBoxes/WidgetBoundingBoxes.vue`:
- Line 175: The Vue UI code is importing PrimeVue’s ToggleSwitch directly
instead of using an internal wrapper. Update WidgetBoundingBoxes.vue to use an
existing toggle-switch wrapper from the local UI components if one already
exists, or create one under the UI components layer and import that instead of
primevue/toggleswitch. Keep the change aligned with the existing wrapper pattern
used by ToggleGroup and ToggleGroupItem so the component reference stays within
the app’s UI abstraction.

In `@src/composables/boundingBoxes/useBoundingBoxes.test.ts`:
- Around line 20-30: The incoming-bboxes tests only verify the initial mount
path and miss the reactive watch flow in useBoundingBoxes. Update the
`@/stores/nodeOutputStore` mock so nodeOutputs is a real ref that can change when
outputState.outputs changes, and ensure nodePreviewImages stays wired similarly
if needed. Add or adjust a test around useBoundingBoxes/applyIncomingBoxes that
mounts first, then updates outputs afterward, and asserts the incoming boxes UI
reacts to the later change instead of only the synchronous setup state.

In `@src/composables/boundingBoxes/useBoundingBoxes.ts`:
- Around line 162-173: In drawDots, the canvas state is being mutated by setting
fillStyle without restoring it, which can leak grid-specific state into later
drawing operations. Update drawDots in useBoundingBoxes.ts to bracket the
drawing logic with ctx.save() and ctx.restore(), keeping the existing grid
drawing and arc loop inside that scoped block so any canvas state changes remain
local to drawDots.
- Around line 701-704: The `fromBoundingBoxes()` update path in
`useBoundingBoxes` is skipping valid empty `input_bboxes` payloads and deduping
only on the raw boxes, so stale regions can remain and changes in
`widthValue`/`heightValue` can be ignored. Update the guard around `incoming` so
an empty array is still processed/clears state, expand the `lastIncoming` cache
key to include the current dimensions, and make the width/height watcher
retrigger the same bbox sync path when the inputs are connected.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 756fb64b-3115-4a1e-bb3c-64713036d438

📥 Commits

Reviewing files that changed from the base of the PR and between 9cf5c9a and 2622669.

📒 Files selected for processing (4)
  • src/components/boundingBoxes/WidgetBoundingBoxes.vue
  • src/composables/boundingBoxes/useBoundingBoxes.test.ts
  • src/composables/boundingBoxes/useBoundingBoxes.ts
  • src/locales/en/main.json

Comment thread src/components/boundingBoxes/WidgetBoundingBoxes.vue Outdated
Comment thread src/composables/boundingBoxes/useBoundingBoxes.test.ts
Comment thread src/composables/boundingBoxes/useBoundingBoxes.ts
@codecov

codecov Bot commented Jul 2, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 94.48819% with 7 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/composables/boundingBoxes/useBoundingBoxes.ts 94.38% 5 Missing ⚠️
src/components/palette/PaletteSwatchRow.vue 83.33% 1 Missing ⚠️
src/components/ui/color-picker/ColorPicker.vue 85.71% 1 Missing ⚠️
@@            Coverage Diff             @@
##             main   #13376      +/-   ##
==========================================
+ Coverage   78.75%   78.78%   +0.03%     
==========================================
  Files        1648     1648              
  Lines      111917   112000      +83     
  Branches    40503    41178     +675     
==========================================
+ Hits        88140    88239      +99     
+ Misses      22906    22891      -15     
+ Partials      871      870       -1     
Flag Coverage Δ
unit 65.66% <94.48%> (+0.08%) ⬆️

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

Files with missing lines Coverage Δ
...c/components/boundingBoxes/WidgetBoundingBoxes.vue 100.00% <100.00%> (ø)
src/composables/palette/usePaletteSwatchRow.ts 96.00% <100.00%> (-0.62%) ⬇️
src/components/palette/PaletteSwatchRow.vue 92.85% <83.33%> (-7.15%) ⬇️
src/components/ui/color-picker/ColorPicker.vue 91.89% <85.71%> (+8.10%) ⬆️
src/composables/boundingBoxes/useBoundingBoxes.ts 89.47% <94.38%> (+1.12%) ⬆️

... and 6 files with indirect coverage changes

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

@jtydhr88 jtydhr88 marked this pull request as draft July 2, 2026 03:01
@jtydhr88 jtydhr88 force-pushed the feat/create-bounding-boxes-input-grid branch from 2622669 to 4225f9b Compare July 2, 2026 19:03

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

♻️ Duplicate comments (1)
src/composables/boundingBoxes/useBoundingBoxes.ts (1)

665-696: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Empty incoming payload is silently dropped, and cache key ignores canvas dimensions.

This is the same unresolved issue flagged in a prior review (Data Integrity & Integration, Major): if (!incoming?.length) return means an upstream [] (e.g., all boxes deleted upstream) never clears stale local regions. Also key = JSON.stringify(incoming) dedupes only on the raw boxes, so when widthValue/heightValue change (which fromBoundingBoxes depends on to compute normalized coordinates), the identical incoming array is skipped as a "duplicate" and regions aren't rebuilt with the new dimensions. Additionally, watch([widthValue, heightValue], () => syncState()) at line 596 never re-invokes applyIncomingBoxes(), so a dimension change while bboxes is connected won't resync from the source of truth.

🐛 Proposed fix
     const incoming = outputs?.input_bboxes
-    if (!incoming?.length) return
-    const key = JSON.stringify(incoming)
+    if (!Array.isArray(incoming)) return
+    const key = JSON.stringify({
+      incoming,
+      width: widthValue.value,
+      height: heightValue.value
+    })
     if (key === lastIncoming) return

Also consider re-running applyIncomingBoxes() from the width/height watcher when the bboxes input is connected.

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

In `@src/composables/boundingBoxes/useBoundingBoxes.ts` around lines 665 - 696,
`applyIncomingBoxes` is incorrectly treating an empty upstream `input_bboxes`
array as “no update” and its dedupe key ignores `widthValue`/`heightValue`, so
stale regions can persist and dimension changes won’t rebuild boxes. Update the
logic in `applyIncomingBoxes` to clear `state.value.regions` (and sync) when the
connected incoming payload is an empty array, and include the canvas dimensions
in the cache key so `fromBoundingBoxes` reruns when size changes. Also make the
width/height watcher in this composable re-invoke `applyIncomingBoxes` when the
`bboxes` input is connected so the local state stays aligned with the source of
truth.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/components/boundingBoxes/WidgetBoundingBoxes.vue`:
- Around line 11-41: The Grid and Clear All buttons in WidgetBoundingBoxes.vue
already have visible text content, so their aria-label attributes are redundant
and can cause duplicate announcements for assistive tech. Remove the aria-label
from both Button elements in this component and keep the existing visible <span>
text as the accessible name, using the Button markup around the grid toggle and
clearAll action as the place to update.

In `@src/composables/boundingBoxes/useBoundingBoxes.ts`:
- Around line 147-160: In drawDots, avoid calling beginPath(), arc(), and fill()
for each dot individually; this hot path runs from drawCanvas during
requestAnimationFrame while dragging. Build one combined path for all dots
inside the nested loops, then call fill() once after the loops, keeping the
existing ctx.save()/restore() and gridSpec() checks intact.
- Around line 691-693: Consolidate the duplicate deep watches on
nodeOutputStore.nodeOutputs in useBoundingBoxes so the store is traversed only
once per update. Replace the separate watches that call updateBgImage and
applyIncomingBoxes with a single watcher callback that invokes both handlers,
while keeping the existing nodePreviewImages watch unchanged. Use the existing
symbols updateBgImage, applyIncomingBoxes, and nodeOutputStore.nodeOutputs to
locate the watcher block.

---

Duplicate comments:
In `@src/composables/boundingBoxes/useBoundingBoxes.ts`:
- Around line 665-696: `applyIncomingBoxes` is incorrectly treating an empty
upstream `input_bboxes` array as “no update” and its dedupe key ignores
`widthValue`/`heightValue`, so stale regions can persist and dimension changes
won’t rebuild boxes. Update the logic in `applyIncomingBoxes` to clear
`state.value.regions` (and sync) when the connected incoming payload is an empty
array, and include the canvas dimensions in the cache key so `fromBoundingBoxes`
reruns when size changes. Also make the width/height watcher in this composable
re-invoke `applyIncomingBoxes` when the `bboxes` input is connected so the local
state stays aligned with the source of truth.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f1743d52-0583-4879-8dd7-a8ef64d077b3

📥 Commits

Reviewing files that changed from the base of the PR and between 2622669 and 4225f9b.

📒 Files selected for processing (4)
  • src/components/boundingBoxes/WidgetBoundingBoxes.vue
  • src/composables/boundingBoxes/useBoundingBoxes.test.ts
  • src/composables/boundingBoxes/useBoundingBoxes.ts
  • src/locales/en/main.json

Comment thread src/components/boundingBoxes/WidgetBoundingBoxes.vue
Comment thread src/composables/boundingBoxes/useBoundingBoxes.ts
Comment thread src/composables/boundingBoxes/useBoundingBoxes.ts Outdated
@jtydhr88 jtydhr88 force-pushed the feat/create-bounding-boxes-input-grid branch from 4225f9b to 0c4b9de Compare July 4, 2026 02:45
@jtydhr88 jtydhr88 marked this pull request as ready for review July 4, 2026 02:46

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

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

Inline comments:
In `@src/composables/boundingBoxes/useBoundingBoxes.test.ts`:
- Around line 164-167: The shared nodeOutputs ref in the
useBoundingBoxes.test.ts setup is not being cleared between tests, so later
cases can inherit state from the “applies incoming boxes when outputs stream in
after mount” test. Update the beforeEach block in the useBoundingBoxes test
suite to also reset outputState.nodeOutputs.value alongside appState.node and
outputState.outputs, using the same outputState mock reference created by the
vi.mock factory so each test starts from a clean state.

In `@src/composables/boundingBoxes/useBoundingBoxes.ts`:
- Around line 124-145: Resize snapping in snapRegion() is re-snapping both
corners for every non-move HitMode, which can move the anchored edge during
single-edge resizes. Update snapRegion() so resize-t/b/l/r preserves the
opposite edge fixed as applyDrag() intends, only snapping the actively dragged
edge and recomputing size from that fixed side. Use the existing HitMode checks
in useBoundingBoxes.ts to keep the resize handle behavior consistent with the
drag logic.

In `@src/locales/en/main.json`:
- Around line 2169-2170: The toolbar label for the grid action is lowercased in
the locale entry, which makes it inconsistent with adjacent labels like “Clear
all.” Update the translation value for the grid key in the en locale JSON so the
rendered label uses the same capitalization style as the surrounding toolbar
items, and verify WidgetBoundingBoxes uses that key consistently.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3fd40cdd-9b45-4ac6-9722-218bba931505

📥 Commits

Reviewing files that changed from the base of the PR and between 4225f9b and 0c4b9de.

📒 Files selected for processing (4)
  • src/components/boundingBoxes/WidgetBoundingBoxes.vue
  • src/composables/boundingBoxes/useBoundingBoxes.test.ts
  • src/composables/boundingBoxes/useBoundingBoxes.ts
  • src/locales/en/main.json

Comment thread src/composables/boundingBoxes/useBoundingBoxes.test.ts
Comment thread src/composables/boundingBoxes/useBoundingBoxes.ts
Comment thread src/locales/en/main.json Outdated
@jtydhr88 jtydhr88 force-pushed the feat/create-bounding-boxes-input-grid branch from 0c4b9de to 0c807d2 Compare July 4, 2026 03:14

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

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

Inline comments:
In `@src/composables/boundingBoxes/useBoundingBoxes.test.ts`:
- Around line 316-346: Add test coverage for the `grid` and
`node.properties.bboxGrid` synchronization in `useBoundingBoxes`: the current
suite only checks snapping behavior, but it does not verify that `grid` is
initialized from `node.properties.bboxGrid` or that toggling `c.grid.value`
writes back to `properties.bboxGrid`. Extend `useBoundingBoxes.test.ts` with
cases using `setup()` (or a node fixture) that start with `bboxGrid: false` and
assert `grid.value` reflects it, then mutate `c.grid.value` and confirm the node
property updates accordingly.

In `@src/composables/boundingBoxes/useBoundingBoxes.ts`:
- Around line 704-706: The dedupe logic in useBoundingBoxes currently relies on
JSON.stringify(incoming), which is order-sensitive and unnecessarily
re-serializes the full payload on each change. Update the comparison around the
lastIncoming check to use es-toolkit’s isEqual against the previously stored
incoming value instead, and store the prior object/value rather than a string
key. Keep the behavior in useBoundingBoxes consistent while removing the
stringify-based dedupe path.
- Around line 623-639: The bboxGrid sync currently writes directly to
litegraphNode.value.properties inside the grid watcher, which bypasses
LiteGraph’s property lifecycle. Update the watch(grid, ...) logic in
useBoundingBoxes to use the node’s property API by calling
litegraphNode.value?.setProperty('bboxGrid', enabled) instead of assigning
props.bboxGrid directly, and if this change must mark the graph as changed, also
trigger litegraphNode.value?.graph?.incrementVersion() after the property
update.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 46aa848a-27ed-4571-b0dd-0ee8e9b608b1

📥 Commits

Reviewing files that changed from the base of the PR and between 0c4b9de and 0c807d2.

📒 Files selected for processing (4)
  • src/components/boundingBoxes/WidgetBoundingBoxes.vue
  • src/composables/boundingBoxes/useBoundingBoxes.test.ts
  • src/composables/boundingBoxes/useBoundingBoxes.ts
  • src/locales/en/main.json

Comment on lines +316 to +346
describe('useBoundingBoxes grid snapping', () => {
it('snaps a drawn box to the grid when grid is enabled (default)', async () => {
const c = setup()
c.onPointerDown(pe(10, 10))
c.onCanvasPointerMove(pe(60, 60))
c.onDocPointerUp(pe(60, 60))
await flush()
expect(c.modelValue.value).toHaveLength(1)
expect(c.modelValue.value[0].x).toBe(64)
expect(c.modelValue.value[0].width).toBe(256)
})

it('does not snap when grid is disabled', async () => {
const c = setup()
c.grid.value = false
c.onPointerDown(pe(10, 10))
c.onCanvasPointerMove(pe(55, 55))
c.onDocPointerUp(pe(55, 55))
await flush()
expect(c.modelValue.value[0].width).toBe(230)
})

it('keeps the anchored edge fixed when resizing a single edge', async () => {
const c = setup([box({ x: 51, y: 51, width: 256, height: 256 })])
c.onPointerDown(pe(60, 30))
c.onCanvasPointerMove(pe(80, 30))
c.onDocPointerUp(pe(80, 30))
await flush()
expect(c.modelValue.value[0].x).toBe(51)
})
})

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

No coverage for the gridnode.properties.bboxGrid sync watchers.

useBoundingBoxes.ts (lines 623-639) initializes grid from node.properties.bboxGrid and writes back on toggle, but no test in this suite exercises that path (init from a node with bboxGrid: false, or asserting properties.bboxGrid updates after c.grid.value = ...). Since this is new, user-facing persistence behavior, consider adding coverage.

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

In `@src/composables/boundingBoxes/useBoundingBoxes.test.ts` around lines 316 -
346, Add test coverage for the `grid` and `node.properties.bboxGrid`
synchronization in `useBoundingBoxes`: the current suite only checks snapping
behavior, but it does not verify that `grid` is initialized from
`node.properties.bboxGrid` or that toggling `c.grid.value` writes back to
`properties.bboxGrid`. Extend `useBoundingBoxes.test.ts` with cases using
`setup()` (or a node fixture) that start with `bboxGrid: false` and assert
`grid.value` reflects it, then mutate `c.grid.value` and confirm the node
property updates accordingly.

Source: Coding guidelines

Comment on lines +623 to +639
watch(
litegraphNode,
(node) => {
const props = node?.properties as { bboxGrid?: unknown } | undefined
if (props && typeof props.bboxGrid === 'boolean')
grid.value = props.bboxGrid
},
{ immediate: true }
)
watch(grid, (enabled) => {
const props = litegraphNode.value?.properties as
| Record<string, unknown>
| undefined
if (props) props.bboxGrid = enabled
requestDraw()
})

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n "setProperty\s*\(" src/lib/litegraph -S | head -30
echo "---"
rg -n "\.properties\.[a-zA-Z_]+\s*=" src -S -g '!**/*.test.ts' | head -30

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2298


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== useBoundingBoxes context =="
sed -n '600,660p' src/composables/boundingBoxes/useBoundingBoxes.ts

echo
echo "== LGraphNode.setProperty implementation =="
sed -n '1040,1105p' src/lib/litegraph/src/LGraphNode.ts

echo
echo "== any graph/version or onPropertyChanged references near setProperty =="
rg -n "onPropertyChanged|_version|setProperty" src/lib/litegraph/src/LGraphNode.ts src/lib/litegraph/src/LGraphCanvas.ts src/lib/litegraph/src/widgets/BaseWidget.ts -n -S

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 4704


🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n "properties\.[A-Za-z_][A-Za-z0-9_]*\s*=" src/composables src/extensions -S

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2218


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '60,100p' src/lib/litegraph/README.md

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1103


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '180,230p' src/lib/litegraph/src/LGraphNode.ts
sed -n '820,860p' src/lib/litegraph/src/LGraphNode.ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 3866


🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n "bboxGrid|grid" src/composables/boundingBoxes/useBoundingBoxes.ts src -S

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 50382


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '7958,7990p' src/lib/litegraph/src/LGraphCanvas.ts
echo
rg -n "incrementVersion\(|_version\s*\+\+|setProperty\(" src/lib/litegraph/src -S

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 3116


Use the LiteGraph property API for bboxGrid
node.properties.bboxGrid = enabled bypasses onPropertyChanged; if this setting should behave like other node properties, call node.setProperty('bboxGrid', enabled) and, if dirty tracking matters here, also bump node.graph?.incrementVersion().

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

In `@src/composables/boundingBoxes/useBoundingBoxes.ts` around lines 623 - 639,
The bboxGrid sync currently writes directly to litegraphNode.value.properties
inside the grid watcher, which bypasses LiteGraph’s property lifecycle. Update
the watch(grid, ...) logic in useBoundingBoxes to use the node’s property API by
calling litegraphNode.value?.setProperty('bboxGrid', enabled) instead of
assigning props.bboxGrid directly, and if this change must mark the graph as
changed, also trigger litegraphNode.value?.graph?.incrementVersion() after the
property update.

Source: Coding guidelines

Comment on lines +704 to +706
const key = JSON.stringify(incoming)
if (key === lastIncoming) return
lastIncoming = key

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider isEqual from es-toolkit instead of JSON.stringify for the dedupe key.

JSON.stringify(incoming) is order-sensitive and re-serializes the whole payload on every output change. es-toolkit's isEqual (deep equality) against the previously-stored value avoids both the property-order fragility and the stringify cost.

♻️ Proposed refactor
-  let lastIncoming = ''
+  let lastIncoming: BoundingBox[] | null = null
   function applyIncomingBoxes() {
     ...
     const incoming = outputs?.input_bboxes
     if (!incoming?.length) return
-    const key = JSON.stringify(incoming)
-    if (key === lastIncoming) return
-    lastIncoming = key
+    if (lastIncoming && isEqual(incoming, lastIncoming)) return
+    lastIncoming = incoming

As per coding guidelines: "Use es-toolkit for utility functions."

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

In `@src/composables/boundingBoxes/useBoundingBoxes.ts` around lines 704 - 706,
The dedupe logic in useBoundingBoxes currently relies on
JSON.stringify(incoming), which is order-sensitive and unnecessarily
re-serializes the full payload on each change. Update the comparison around the
lastIncoming check to use es-toolkit’s isEqual against the previously stored
incoming value instead, and store the prior object/value rather than a string
key. Keep the behavior in useBoundingBoxes consistent while removing the
stringify-based dedupe path.

Source: Coding guidelines

@jtydhr88 jtydhr88 force-pushed the feat/create-bounding-boxes-input-grid branch from 0c807d2 to 2d90adf Compare July 7, 2026 02:02

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

♻️ Duplicate comments (2)
src/composables/boundingBoxes/useBoundingBoxes.test.ts (1)

316-346: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Still missing coverage for gridnode.properties.bboxGrid persistence.

The new suite covers snap-enabled/disabled/anchored-resize behavior, but no test initializes grid from a node with properties.bboxGrid set, nor asserts that toggling grid.value writes back to properties.bboxGrid. This is new, user-facing persistence behavior introduced in this PR.

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

In `@src/composables/boundingBoxes/useBoundingBoxes.test.ts` around lines 316 -
346, Add coverage for the persistence bridge between useBoundingBoxes grid and
node.properties.bboxGrid. In useBoundingBoxes.test.ts, extend the existing grid
snapping suite to initialize the composable from a node whose
properties.bboxGrid is set and assert grid.value starts in sync, then toggle
grid.value and verify the underlying node.properties.bboxGrid is updated. Use
the existing setup helper and the grid/modelValue refs in useBoundingBoxes to
keep the test aligned with the new user-facing behavior.
src/composables/boundingBoxes/useBoundingBoxes.ts (1)

623-639: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Bypasses LiteGraph's property API for bboxGrid.

node.properties.bboxGrid = enabled mutates the property object directly instead of calling node.setProperty('bboxGrid', enabled), which skips onPropertyChanged and any dirty/version tracking that extensions may rely on.

🔧 Proposed fix
   watch(grid, (enabled) => {
-    const props = litegraphNode.value?.properties as
-      | Record<string, unknown>
-      | undefined
-    if (props) props.bboxGrid = enabled
+    litegraphNode.value?.setProperty('bboxGrid', enabled)
     requestDraw()
   })

As per coding guidelines: "Follow ADR constraints for entity architecture: use commands for mutations, keep entity data in dedicated stores... Changes to entity callbacks, node.widgets, node.serialize, or graph._version++ require migration guidance."

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

In `@src/composables/boundingBoxes/useBoundingBoxes.ts` around lines 623 - 639,
The `watch(grid, ...)` handler in `useBoundingBoxes` is mutating
`litegraphNode.value.properties.bboxGrid` directly, which bypasses LiteGraph’s
property lifecycle. Update the `bboxGrid` change flow to call the node’s
property API via `litegraphNode.value.setProperty('bboxGrid', enabled)` instead
of writing into `properties`, while keeping the existing `watch(litegraphNode,
...)` sync and `requestDraw()` behavior intact.

Source: Coding guidelines

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

Inline comments:
In `@src/components/palette/PaletteSwatchRow.vue`:
- Around line 10-18: The swatch trigger in PaletteSwatchRow.vue is currently a
non-focusable div, so it cannot be reached or activated via keyboard when
replacing ColorPicker’s default button. Update the swatch element in the
PaletteSwatchRow template to use a button (preferred) or add equivalent
focusability plus Enter/Space keyboard handling, while keeping the existing
remove(i), onPointerDown(i, $event), and data attributes behavior intact.

In `@src/components/ui/color-picker/ColorPicker.vue`:
- Line 68: The trigger slot in ColorPicker.vue is using an explicit slot prop
binding for previewColor even though the local variable name matches the prop
name, so update the <slot name="trigger"> binding to use same-name shorthand for
that prop. Keep the existing isOpen binding as-is, and change the previewColor
slot prop in the ColorPicker component to the shorthand form to match the
project’s slot binding convention.

---

Duplicate comments:
In `@src/composables/boundingBoxes/useBoundingBoxes.test.ts`:
- Around line 316-346: Add coverage for the persistence bridge between
useBoundingBoxes grid and node.properties.bboxGrid. In useBoundingBoxes.test.ts,
extend the existing grid snapping suite to initialize the composable from a node
whose properties.bboxGrid is set and assert grid.value starts in sync, then
toggle grid.value and verify the underlying node.properties.bboxGrid is updated.
Use the existing setup helper and the grid/modelValue refs in useBoundingBoxes
to keep the test aligned with the new user-facing behavior.

In `@src/composables/boundingBoxes/useBoundingBoxes.ts`:
- Around line 623-639: The `watch(grid, ...)` handler in `useBoundingBoxes` is
mutating `litegraphNode.value.properties.bboxGrid` directly, which bypasses
LiteGraph’s property lifecycle. Update the `bboxGrid` change flow to call the
node’s property API via `litegraphNode.value.setProperty('bboxGrid', enabled)`
instead of writing into `properties`, while keeping the existing
`watch(litegraphNode, ...)` sync and `requestDraw()` behavior intact.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 4bb68ee8-250a-43f7-8171-ef33e33d1c51

📥 Commits

Reviewing files that changed from the base of the PR and between 0c807d2 and 2d90adf.

📒 Files selected for processing (9)
  • src/components/boundingBoxes/WidgetBoundingBoxes.vue
  • src/components/palette/PaletteSwatchRow.test.ts
  • src/components/palette/PaletteSwatchRow.vue
  • src/components/ui/color-picker/ColorPicker.vue
  • src/composables/boundingBoxes/useBoundingBoxes.test.ts
  • src/composables/boundingBoxes/useBoundingBoxes.ts
  • src/composables/palette/usePaletteSwatchRow.test.ts
  • src/composables/palette/usePaletteSwatchRow.ts
  • src/locales/en/main.json

Comment thread src/components/palette/PaletteSwatchRow.vue Outdated
</div>
<div
class="flex flex-1 items-center justify-between pl-1 text-xs text-component-node-foreground"
<slot name="trigger" :open="isOpen" :preview-color="previewColor">

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use shorthand for same-name slot prop binding.

previewColor (the local variable) matches the intended prop name, so this should use the shorthand form rather than the kebab-case explicit binding.

♻️ Proposed fix
-      <slot name="trigger" :open="isOpen" :preview-color="previewColor">
+      <slot name="trigger" :open="isOpen" :previewColor>

As per coding guidelines, "Use same-name shorthand for slot prop bindings, such as :isExpanded instead of :is-expanded="isExpanded"."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<slot name="trigger" :open="isOpen" :preview-color="previewColor">
<slot name="trigger" :open="isOpen" :previewColor>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/ui/color-picker/ColorPicker.vue` at line 68, The trigger slot
in ColorPicker.vue is using an explicit slot prop binding for previewColor even
though the local variable name matches the prop name, so update the <slot
name="trigger"> binding to use same-name shorthand for that prop. Keep the
existing isOpen binding as-is, and change the previewColor slot prop in the
ColorPicker component to the shorthand form to match the project’s slot binding
convention.

Source: Coding guidelines

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants