Skip to content

feat: support histogram display in curve widget#10365

Merged
jtydhr88 merged 1 commit intomainfrom
feat/curve-histogram-support
Mar 26, 2026
Merged

feat: support histogram display in curve widget#10365
jtydhr88 merged 1 commit intomainfrom
feat/curve-histogram-support

Conversation

@jtydhr88
Copy link
Copy Markdown
Collaborator

@jtydhr88 jtydhr88 commented Mar 21, 2026

Summary

  • WidgetCurve reads histogram data from nodeOutputStore (sent by backend CurveEditor node via ui output) and passes it to CurveEditor
  • histogramToPath now supports arbitrary-length bin arrays instead ofhardcoded 256

need BE changes

Screenshots (if applicable)

image image

┆Issue is synchronized with this Notion page by Unito

@dosubot dosubot bot added the size:S This PR changes 10-29 lines, ignoring generated files. label Mar 21, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 21, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/25/2026, 01:43:11 PM UTC

Links

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 21, 2026

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

Widgets now carry a nodeLocatorId so WidgetCurve.vue can read histogram data from nodeOutputStore and pass it to CurveEditor; histogram-to-path logic was updated to handle variable bin counts and a percentile-based normalization. WidgetCurve also watches upstreamValue to override modelValue when disabled.

Changes

Cohort / File(s) Summary
Type Definitions
src/types/simplifiedWidget.ts
Added optional nodeLocatorId?: string to SimplifiedWidget.
Widget Data Flow
src/renderer/extensions/vueNodes/components/NodeWidgets.vue, src/components/curve/WidgetCurve.vue
NodeWidgets.vue computes nodeLocatorId (from widget.nodeId or getLocatorIdFromNodeData) and sets it on simplified widgets. WidgetCurve.vue derives histogram from nodeOutputStore.nodeOutputs[nodeLocatorId], passes it to CurveEditor via :histogram, and watches upstreamValue to overwrite modelValue when disabled.
Histogram Utility
src/components/curve/curveUtils.ts
histogramToPath now supports arbitrary bin counts (uses len = histogram.length), returns empty string for zero-length, computes percentile from sqrt-scaled values, and maps x/y over len instead of assuming 256 bins.

Sequence Diagram

sequenceDiagram
    participant NW as NodeWidgets.vue
    participant WC as WidgetCurve.vue
    participant Store as nodeOutputStore
    participant CE as CurveEditor
    participant Utils as curveUtils

    NW->>NW: compute nodeLocatorId (widget.nodeId or getLocatorIdFromNodeData)
    NW->>WC: pass simplified widget (includes nodeLocatorId)
    WC->>Store: read nodeOutputs[nodeLocatorId]?.histogram
    Store-->>WC: histogram data (or null)
    WC->>CE: bind :histogram prop
    CE->>Utils: call histogramToPath(histogram)
    Utils-->>CE: return SVG path (uses actual bin count & percentile)
    CE->>CE: render histogram curve
    WC->>WC: watch upstreamValue
    WC-->>WC: override modelValue when widget disabled and upstreamValue present
Loading

Estimated Code Review Effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 I learned each bin can stretch and grow,
From node IDs the histograms flow,
I nudge the curve with gentle paws,
And paint the path without old laws,
Hoppity—bins sing data's show! 🎨

🚥 Pre-merge checks | ✅ 2 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is largely incomplete; it lacks proper formatting, detail, and follows the template poorly with missing 'Changes' section specifics and no 'Review Focus' content. Expand the description to include a detailed 'Changes' section with 'What' subsection explaining core functionality, add 'Review Focus' highlighting critical design decisions, and ensure all required template sections are substantively addressed.
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and concisely summarizes the main change: adding histogram display support to the curve widget.
End-To-End Regression Coverage For Fixes ✅ Passed PR title uses 'feat:' prefix indicating a feature addition, not a bugfix, so bug-fix language requirement does not apply.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/curve-histogram-support

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

❤️ Share

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

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 21, 2026

🎭 Playwright: ✅ 699 passed, 0 failed · 4 flaky

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

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 21, 2026

📦 Bundle: 5.08 MB gzip 🔴 +440 B

Details

Summary

  • Raw size: 23.4 MB baseline 23.4 MB — 🔴 +975 B
  • Gzip: 5.08 MB baseline 5.08 MB — 🔴 +440 B
  • Brotli: 3.93 MB baseline 3.93 MB — 🔴 +71 B
  • Bundles: 249 current • 249 baseline • 114 added / 114 removed

Category Glance
Other 🔴 +793 B (8.41 MB) · Data & Services 🔴 +182 B (2.95 MB) · Vendor & Third-Party ⚪ 0 B (9.8 MB) · Graph Workspace ⚪ 0 B (1.13 MB) · Panels & Settings ⚪ 0 B (484 kB) · Utilities & Hooks ⚪ 0 B (334 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BulWKO8B.js (new) 23 kB 🔴 +23 kB 🔴 +8.13 kB 🔴 +6.96 kB
assets/index-nh_Vsp29.js (removed) 23 kB 🟢 -23 kB 🟢 -8.12 kB 🟢 -6.95 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BSS6PWy2.js (new) 1.13 MB 🔴 +1.13 MB 🔴 +241 kB 🔴 +182 kB
assets/GraphView-D4e3CIck.js (removed) 1.13 MB 🟢 -1.13 MB 🟢 -241 kB 🟢 -182 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BtcAPfml.js (new) 15.7 kB 🔴 +15.7 kB 🔴 +3.4 kB 🔴 +2.9 kB
assets/CloudSurveyView-CoTDJKXQ.js (removed) 15.7 kB 🟢 -15.7 kB 🟢 -3.4 kB 🟢 -2.91 kB
assets/CloudLoginView-6Mf4zpYu.js (removed) 12 kB 🟢 -12 kB 🟢 -3.36 kB 🟢 -2.97 kB
assets/CloudLoginView-CCgUCDpY.js (new) 12 kB 🔴 +12 kB 🔴 +3.36 kB 🔴 +2.97 kB
assets/CloudSignupView-Cozj84RT.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.86 kB 🔴 +2.52 kB
assets/CloudSignupView-QTFrIJn8.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.86 kB 🟢 -2.5 kB
assets/UserCheckView-CDKnGBlj.js (removed) 9.04 kB 🟢 -9.04 kB 🟢 -2.33 kB 🟢 -2.03 kB
assets/UserCheckView-CXnQxAPj.js (new) 9.04 kB 🔴 +9.04 kB 🔴 +2.33 kB 🔴 +2.03 kB
assets/CloudLayoutView-DDDec8ii.js (new) 7.54 kB 🔴 +7.54 kB 🔴 +2.36 kB 🔴 +2.07 kB
assets/CloudLayoutView-YH-1EaOa.js (removed) 7.54 kB 🟢 -7.54 kB 🟢 -2.36 kB 🟢 -2.05 kB
assets/CloudForgotPasswordView-BaFtZK6y.js (new) 5.96 kB 🔴 +5.96 kB 🔴 +2.1 kB 🔴 +1.84 kB
assets/CloudForgotPasswordView-CzXVxjmH.js (removed) 5.96 kB 🟢 -5.96 kB 🟢 -2.1 kB 🟢 -1.84 kB
assets/CloudAuthTimeoutView-BHxyNKCg.js (new) 5.32 kB 🔴 +5.32 kB 🔴 +1.93 kB 🔴 +1.7 kB
assets/CloudAuthTimeoutView-BuYiPn-R.js (removed) 5.32 kB 🟢 -5.32 kB 🟢 -1.93 kB 🟢 -1.7 kB
assets/CloudSubscriptionRedirectView-CfQWjn3-.js (removed) 5.1 kB 🟢 -5.1 kB 🟢 -1.91 kB 🟢 -1.69 kB
assets/CloudSubscriptionRedirectView-DHOhR_4h.js (new) 5.1 kB 🔴 +5.1 kB 🔴 +1.91 kB 🔴 +1.69 kB
assets/UserSelectView-CLy9WvID.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.74 kB 🟢 -1.54 kB
assets/UserSelectView-COQtWuNM.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.74 kB 🔴 +1.54 kB

Status: 9 added / 9 removed / 2 unchanged

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-CZjHO-Dy.js (removed) 46.6 kB 🟢 -46.6 kB 🟢 -9.52 kB 🟢 -8.47 kB
assets/KeybindingPanel-DGTCIhkJ.js (new) 46.6 kB 🔴 +46.6 kB 🔴 +9.53 kB 🔴 +8.47 kB
assets/SecretsPanel-Bws7nAh4.js (new) 22.4 kB 🔴 +22.4 kB 🔴 +5.42 kB 🔴 +4.75 kB
assets/SecretsPanel-D2FDpdVF.js (removed) 22.4 kB 🟢 -22.4 kB 🟢 -5.42 kB 🟢 -4.76 kB
assets/LegacyCreditsPanel-BbZs4Ra_.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -5.82 kB 🟢 -5.14 kB
assets/LegacyCreditsPanel-DTVzFwGu.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +5.82 kB 🔴 +5.13 kB
assets/SubscriptionPanel-CTDf_Bjk.js (new) 19.6 kB 🔴 +19.6 kB 🔴 +4.99 kB 🔴 +4.38 kB
assets/SubscriptionPanel-S5YvVAkm.js (removed) 19.6 kB 🟢 -19.6 kB 🟢 -4.99 kB 🟢 -4.39 kB
assets/AboutPanel-C4X-ZyWn.js (new) 12 kB 🔴 +12 kB 🔴 +3.32 kB 🔴 +2.98 kB
assets/AboutPanel-CgqNh8ys.js (removed) 12 kB 🟢 -12 kB 🟢 -3.33 kB 🟢 -2.98 kB
assets/ExtensionPanel-BlQ7V5_z.js (new) 9.78 kB 🔴 +9.78 kB 🔴 +2.82 kB 🔴 +2.51 kB
assets/ExtensionPanel-BwQXVxI9.js (removed) 9.78 kB 🟢 -9.78 kB 🟢 -2.82 kB 🟢 -2.5 kB
assets/ServerConfigPanel-1Qw5L0WN.js (removed) 6.85 kB 🟢 -6.85 kB 🟢 -2.28 kB 🟢 -2.02 kB
assets/ServerConfigPanel-CK_nQEnn.js (new) 6.85 kB 🔴 +6.85 kB 🔴 +2.27 kB 🔴 +2.03 kB
assets/UserPanel-BN9S7P9J.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +2.15 kB 🔴 +1.88 kB
assets/UserPanel-CIRLK7cv.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -2.15 kB 🟢 -1.89 kB
assets/cloudRemoteConfig-BkomDEmR.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -902 B 🟢 -796 B
assets/cloudRemoteConfig-C-S3MVR8.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +903 B 🔴 +793 B
assets/refreshRemoteConfig-BdYGvg5s.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -648 B 🟢 -551 B
assets/refreshRemoteConfig-Bgu8ah6E.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +649 B 🔴 +551 B

Status: 10 added / 10 removed / 12 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-DLl5VPA1.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.26 kB 🔴 +1.08 kB
assets/auth-DR3HwrAb.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/SignUpForm-Bv5haEyh.js (removed) 3.18 kB 🟢 -3.18 kB 🟢 -1.29 kB 🟢 -1.15 kB
assets/SignUpForm-DB6BeiAR.js (new) 3.18 kB 🔴 +3.18 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/UpdatePasswordContent-DEdQFT6S.js (new) 2.67 kB 🔴 +2.67 kB 🔴 +1.2 kB 🔴 +1.06 kB
assets/UpdatePasswordContent-ea58e6q2.js (removed) 2.67 kB 🟢 -2.67 kB 🟢 -1.2 kB 🟢 -1.06 kB
assets/firebaseAuthStore-C6KdfBcc.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +486 B 🔴 +424 B
assets/firebaseAuthStore-fHsU1t7g.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -482 B 🟢 -430 B
assets/auth-BL6hseWI.js (removed) 348 B 🟢 -348 B 🟢 -217 B 🟢 -191 B
assets/auth-CMmSRTPJ.js (new) 348 B 🔴 +348 B 🔴 +218 B 🔴 +188 B

Status: 5 added / 5 removed / 2 unchanged

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-BpApgCqm.js (removed) 108 kB 🟢 -108 kB 🟢 -22.3 kB 🟢 -18.8 kB
assets/useShareDialog-MVXTV86l.js (new) 108 kB 🔴 +108 kB 🔴 +22.3 kB 🔴 +18.8 kB
assets/useSubscriptionDialog-Dh1D2J3N.js (new) 969 B 🔴 +969 B 🔴 +477 B 🔴 +410 B
assets/useSubscriptionDialog-Y4jJLHJ7.js (removed) 969 B 🟢 -969 B 🟢 -474 B 🟢 -414 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-BZT605N-.js (new) 14.3 kB 🔴 +14.3 kB 🔴 +4.01 kB 🔴 +3.58 kB
assets/ComfyQueueButton-DtVeXgdE.js (removed) 14.3 kB 🟢 -14.3 kB 🟢 -4.01 kB 🟢 -3.58 kB
assets/useTerminalTabs-6b0eYH77.js (new) 10.7 kB 🔴 +10.7 kB 🔴 +3.6 kB 🔴 +3.16 kB
assets/useTerminalTabs-DpfzJFbl.js (removed) 10.7 kB 🟢 -10.7 kB 🟢 -3.6 kB 🟢 -3.16 kB
assets/SubscribeButton-_9vEDRrC.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -914 B
assets/SubscribeButton-BXRnkhoj.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +915 B
assets/cloudFeedbackTopbarButton-CXDgcmGD.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -843 B 🟢 -744 B
assets/cloudFeedbackTopbarButton-VL0hbJft.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +847 B 🔴 +755 B
assets/ComfyQueueButton-Cx77CvB5.js (new) 1.03 kB 🔴 +1.03 kB 🔴 +492 B 🔴 +437 B
assets/ComfyQueueButton-Dpper0vp.js (removed) 1.03 kB 🟢 -1.03 kB 🟢 -489 B 🟢 -437 B

Status: 5 added / 5 removed / 8 unchanged

Data & Services — 2.95 MB (baseline 2.95 MB) • 🔴 +182 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-Csd90NuI.js (new) 1.92 MB 🔴 +1.92 MB 🔴 +442 kB 🔴 +335 kB
assets/dialogService-CGlOtRzR.js (removed) 1.92 MB 🟢 -1.92 MB 🟢 -442 kB 🟢 -335 kB
assets/api-Bfc7ZfGQ.js (new) 879 kB 🔴 +879 kB 🔴 +210 kB 🔴 +166 kB
assets/api-CRgvZTqR.js (removed) 879 kB 🟢 -879 kB 🟢 -210 kB 🟢 -165 kB
assets/load3dService-D3OGPD1k.js (new) 92.5 kB 🔴 +92.5 kB 🔴 +19.7 kB 🔴 +16.9 kB
assets/load3dService-D8DoHZiL.js (removed) 92.5 kB 🟢 -92.5 kB 🟢 -19.7 kB 🟢 -17 kB
assets/workflowShareService-DzoTnncX.js (new) 16.4 kB 🔴 +16.4 kB 🔴 +4.82 kB 🔴 +4.27 kB
assets/workflowShareService-N_dPv6tm.js (removed) 16.4 kB 🟢 -16.4 kB 🟢 -4.82 kB 🟢 -4.27 kB
assets/keybindingService-DwMVDjQe.js (new) 13.7 kB 🔴 +13.7 kB 🔴 +3.65 kB 🔴 +3.2 kB
assets/keybindingService-rsHpt4RB.js (removed) 13.7 kB 🟢 -13.7 kB 🟢 -3.65 kB 🟢 -3.21 kB
assets/releaseStore-BM9T0f-F.js (new) 8.12 kB 🔴 +8.12 kB 🔴 +2.28 kB 🔴 +2 kB
assets/releaseStore-BS3HBTge.js (removed) 8.12 kB 🟢 -8.12 kB 🟢 -2.28 kB 🟢 -2 kB
assets/userStore-BVwBFYPR.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +871 B 🔴 +760 B
assets/userStore-DXhMBOCy.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -869 B 🟢 -768 B
assets/audioService-BOdPzk0D.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +879 B 🔴 +762 B
assets/audioService-CBWZA7o0.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -878 B 🟢 -766 B
assets/releaseStore-ClkUAzvH.js (new) 993 B 🔴 +993 B 🔴 +483 B 🔴 +419 B
assets/releaseStore-DBJIlxgL.js (removed) 993 B 🟢 -993 B 🟢 -480 B 🟢 -425 B
assets/workflowDraftStore-CR5HlyXZ.js (removed) 969 B 🟢 -969 B 🟢 -473 B 🟢 -419 B
assets/workflowDraftStore-CT6Ur3Vw.js (new) 969 B 🔴 +969 B 🔴 +477 B 🔴 +416 B
assets/dialogService-BnfNFTA9.js (new) 958 B 🔴 +958 B 🔴 +469 B 🔴 +409 B
assets/dialogService-CLe8YgZf.js (removed) 958 B 🟢 -958 B 🟢 -467 B 🟢 -413 B
assets/settingStore-B8470Puo.js (removed) 956 B 🟢 -956 B 🟢 -469 B 🟢 -418 B
assets/settingStore-Cjfs6B8w.js (new) 956 B 🔴 +956 B 🔴 +474 B 🔴 +408 B
assets/assetsStore-3tjK2dNJ.js (removed) 955 B 🟢 -955 B 🟢 -469 B 🟢 -415 B
assets/assetsStore-CF0QxGRb.js (new) 955 B 🔴 +955 B 🔴 +474 B 🔴 +407 B

Status: 13 added / 13 removed / 4 unchanged

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-CgEQaHNb.js (removed) 232 kB 🟢 -232 kB 🟢 -51.3 kB 🟢 -41.8 kB
assets/useConflictDetection-DOzZEoRq.js (new) 232 kB 🔴 +232 kB 🔴 +51.3 kB 🔴 +41.7 kB
assets/useLoad3dViewer-BzU5qezy.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.44 kB 🔴 +3.91 kB
assets/useLoad3dViewer-f7xwZ2vP.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.43 kB 🟢 -3.9 kB
assets/useLoad3d-B11rel1I.js (removed) 15 kB 🟢 -15 kB 🟢 -3.79 kB 🟢 -3.36 kB
assets/useLoad3d-Dth25A-O.js (new) 15 kB 🔴 +15 kB 🔴 +3.79 kB 🔴 +3.35 kB
assets/useFeatureFlags-BZq1IUj7.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.75 kB 🔴 +1.48 kB
assets/useFeatureFlags-DleVu2yo.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.75 kB 🟢 -1.48 kB
assets/useCopyToClipboard-BCjGT25E.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.67 kB 🔴 +1.44 kB
assets/useCopyToClipboard-D_wfC9Qw.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.67 kB 🟢 -1.43 kB
assets/useWorkspaceUI-Bl0p21T3.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +980 B 🔴 +812 B
assets/useWorkspaceUI-TrDHY2l2.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -979 B 🟢 -812 B
assets/subscriptionCheckoutUtil-Be_gZ0Xa.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.31 kB 🔴 +1.15 kB
assets/subscriptionCheckoutUtil-DafLQOC-.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.31 kB 🟢 -1.15 kB
assets/assetPreviewUtil-DutrNEGW.js (removed) 2.27 kB 🟢 -2.27 kB 🟢 -957 B 🟢 -837 B
assets/assetPreviewUtil-e_OXorxY.js (new) 2.27 kB 🔴 +2.27 kB 🔴 +959 B 🔴 +838 B
assets/useUpstreamValue-CxedTUeW.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -801 B 🟢 -717 B
assets/useUpstreamValue-Cz1--Ilu.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +802 B 🔴 +704 B
assets/useLoad3d-BIRDPIh8.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -538 B 🟢 -481 B
assets/useLoad3d-D3sYhPRP.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +540 B 🔴 +476 B
assets/useLoad3dViewer-BAGs8pXd.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -506 B 🟢 -453 B
assets/useLoad3dViewer-DIqH4LEE.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +507 B 🔴 +448 B
assets/useCurrentUser-C9XCZTtg.js (new) 955 B 🔴 +955 B 🔴 +473 B 🔴 +409 B
assets/useCurrentUser-DUjlB80w.js (removed) 955 B 🟢 -955 B 🟢 -469 B 🟢 -414 B
assets/useWorkspaceSwitch-BLl4vKZo.js (new) 747 B 🔴 +747 B 🔴 +386 B 🔴 +327 B
assets/useWorkspaceSwitch-BMiomQEE.js (removed) 747 B 🟢 -747 B 🟢 -383 B 🟢 -333 B

Status: 13 added / 13 removed / 12 unchanged

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

External libraries and shared vendor chunks

Status: 16 unchanged

Other — 8.41 MB (baseline 8.41 MB) • 🔴 +793 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-B9b4XuXz.js (removed) 76.8 kB 🟢 -76.8 kB 🟢 -19.9 kB 🟢 -16.9 kB
assets/core-BpFRhlwe.js (new) 76.8 kB 🔴 +76.8 kB 🔴 +19.9 kB 🔴 +16.9 kB
assets/groupNode-CpklIN15.js (new) 74 kB 🔴 +74 kB 🔴 +18.5 kB 🔴 +16.3 kB
assets/groupNode-VXOj_5ST.js (removed) 74 kB 🟢 -74 kB 🟢 -18.5 kB 🟢 -16.3 kB
assets/WidgetSelect--zzwwp2m.js (new) 64.5 kB 🔴 +64.5 kB 🔴 +14.1 kB 🔴 +12.2 kB
assets/WidgetSelect-Bf4WvI62.js (removed) 64.5 kB 🟢 -64.5 kB 🟢 -14.1 kB 🟢 -12.2 kB
assets/SubscriptionRequiredDialogContentWorkspace-BymnLDnU.js (removed) 48.9 kB 🟢 -48.9 kB 🟢 -9.26 kB 🟢 -7.91 kB
assets/SubscriptionRequiredDialogContentWorkspace-UuDLWoUg.js (new) 48.9 kB 🔴 +48.9 kB 🔴 +9.26 kB 🔴 +7.93 kB
assets/WidgetPainter-BOGMFe_C.js (removed) 33.3 kB 🟢 -33.3 kB 🟢 -8.11 kB 🟢 -7.19 kB
assets/WidgetPainter-SSr_lfqX.js (new) 33.3 kB 🔴 +33.3 kB 🔴 +8.11 kB 🔴 +7.22 kB
assets/Load3DControls-BNjyhR60.js (new) 32.1 kB 🔴 +32.1 kB 🔴 +5.47 kB 🔴 +4.75 kB
assets/Load3DControls-DZ-7AuE9.js (removed) 32.1 kB 🟢 -32.1 kB 🟢 -5.47 kB 🟢 -4.76 kB
assets/WorkspacePanelContent-Ba5z_o14.js (removed) 29.9 kB 🟢 -29.9 kB 🟢 -6.33 kB 🟢 -5.58 kB
assets/WorkspacePanelContent-BK8Pughs.js (new) 29.9 kB 🔴 +29.9 kB 🔴 +6.33 kB 🔴 +5.58 kB
assets/SubscriptionRequiredDialogContent-DKl4f1Lo.js (removed) 28.2 kB 🟢 -28.2 kB 🟢 -7.17 kB 🟢 -6.3 kB
assets/SubscriptionRequiredDialogContent-naRfXudq.js (new) 28.2 kB 🔴 +28.2 kB 🔴 +7.17 kB 🔴 +6.3 kB
assets/Load3dViewerContent-BHn4WTHY.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +5.33 kB 🔴 +4.63 kB
assets/Load3dViewerContent-ClvKsb9-.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -5.33 kB 🟢 -4.63 kB
assets/WidgetImageCrop-CkYEXkaK.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.82 kB 🟢 -5.14 kB
assets/WidgetImageCrop-m8Fw--c4.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +5.82 kB 🔴 +5.13 kB
assets/SubscriptionPanelContentWorkspace-Clhlgp8s.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.18 kB 🟢 -4.56 kB
assets/SubscriptionPanelContentWorkspace-j1jwICN8.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.18 kB 🔴 +4.56 kB
assets/SignInContent-BbtJ9ggr.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -5.3 kB 🟢 -4.63 kB
assets/SignInContent-CReUyq5U.js (new) 20.5 kB 🔴 +20.5 kB 🔴 +5.3 kB 🔴 +4.64 kB
assets/CurrentUserPopoverWorkspace-DyoQgkbr.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +4.84 kB 🔴 +4.33 kB
assets/CurrentUserPopoverWorkspace-rNzpUzNn.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -4.84 kB 🟢 -4.33 kB
assets/WidgetInputNumber-DMd8uzNk.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.29 kB
assets/WidgetInputNumber-DzXT5_NE.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.29 kB
assets/WidgetRecordAudio-B9h46JTc.js (removed) 18.1 kB 🟢 -18.1 kB 🟢 -5.18 kB 🟢 -4.64 kB
assets/WidgetRecordAudio-CCYaL2nD.js (new) 18.1 kB 🔴 +18.1 kB 🔴 +5.18 kB 🔴 +4.65 kB
assets/Load3D-BDmNmIa2.js (removed) 16.9 kB 🟢 -16.9 kB 🟢 -4.12 kB 🟢 -3.59 kB
assets/Load3D-DjscZkXA.js (new) 16.9 kB 🔴 +16.9 kB 🔴 +4.12 kB 🔴 +3.59 kB
assets/WidgetCurve-DqPTzJFr.js (new) 16.1 kB 🔴 +16.1 kB 🔴 +4.97 kB 🔴 +4.46 kB
assets/WidgetCurve-DBY2mq1l.js (removed) 15.3 kB 🟢 -15.3 kB 🟢 -4.72 kB 🟢 -4.25 kB
assets/load3d-ChQLgkx8.js (removed) 15 kB 🟢 -15 kB 🟢 -4.32 kB 🟢 -3.74 kB
assets/load3d-CjIP6GXO.js (new) 15 kB 🔴 +15 kB 🔴 +4.32 kB 🔴 +3.73 kB
assets/WaveAudioPlayer-BkleycD5.js (new) 13.4 kB 🔴 +13.4 kB 🔴 +3.68 kB 🔴 +3.23 kB
assets/WaveAudioPlayer-CcMNgF6U.js (removed) 13.4 kB 🟢 -13.4 kB 🟢 -3.69 kB 🟢 -3.23 kB
assets/TeamWorkspacesDialogContent-BC596734.js (new) 11.1 kB 🔴 +11.1 kB 🔴 +3.32 kB 🔴 +2.96 kB
assets/TeamWorkspacesDialogContent-BqxGH7e3.js (removed) 11.1 kB 🟢 -11.1 kB 🟢 -3.32 kB 🟢 -2.97 kB
assets/nodeTemplates-BkhgeJxg.js (removed) 9.58 kB 🟢 -9.58 kB 🟢 -3.37 kB 🟢 -2.97 kB
assets/nodeTemplates-CTfXXdNc.js (new) 9.58 kB 🔴 +9.58 kB 🔴 +3.37 kB 🔴 +2.98 kB
assets/InviteMemberDialogContent-DVy6s2iR.js (removed) 7.77 kB 🟢 -7.77 kB 🟢 -2.44 kB 🟢 -2.13 kB
assets/InviteMemberDialogContent-DzbAmCGd.js (new) 7.77 kB 🔴 +7.77 kB 🔴 +2.45 kB 🔴 +2.15 kB
assets/Load3DConfiguration-bwlPyw5J.js (removed) 6.6 kB 🟢 -6.6 kB 🟢 -2.04 kB 🟢 -1.78 kB
assets/Load3DConfiguration-CjedcawX.js (new) 6.6 kB 🔴 +6.6 kB 🔴 +2.04 kB 🔴 +1.78 kB
assets/onboardingCloudRoutes-BGrBMQiU.js (removed) 6.53 kB 🟢 -6.53 kB 🟢 -2.04 kB 🟢 -1.75 kB
assets/onboardingCloudRoutes-Cp6ipM2-.js (new) 6.53 kB 🔴 +6.53 kB 🔴 +2.04 kB 🔴 +1.76 kB
assets/WidgetWithControl-BG3T8LUU.js (removed) 5.99 kB 🟢 -5.99 kB 🟢 -2.38 kB 🟢 -2.13 kB
assets/WidgetWithControl-C_QEbnh-.js (new) 5.99 kB 🔴 +5.99 kB 🔴 +2.38 kB 🔴 +2.12 kB
assets/CreateWorkspaceDialogContent-BdWkye9e.js (new) 5.95 kB 🔴 +5.95 kB 🔴 +2.15 kB 🔴 +1.88 kB
assets/CreateWorkspaceDialogContent-BjPsDKZ8.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -2.15 kB 🟢 -1.88 kB
assets/FreeTierDialogContent-A_M6S9C-.js (new) 5.82 kB 🔴 +5.82 kB 🔴 +2.05 kB 🔴 +1.8 kB
assets/FreeTierDialogContent-CXxc_PsK.js (removed) 5.82 kB 🟢 -5.82 kB 🟢 -2.04 kB 🟢 -1.81 kB
assets/EditWorkspaceDialogContent-CGatNYx1.js (new) 5.75 kB 🔴 +5.75 kB 🔴 +2.11 kB 🔴 +1.84 kB
assets/EditWorkspaceDialogContent-CGwrvFGs.js (removed) 5.75 kB 🟢 -5.75 kB 🟢 -2.11 kB 🟢 -1.84 kB
assets/WidgetTextarea-CHBzKj6l.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +2.17 kB 🔴 +1.91 kB
assets/WidgetTextarea-Ztt3cpHg.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -2.17 kB 🟢 -1.91 kB
assets/Preview3d-BvJ3j7Sn.js (removed) 5.36 kB 🟢 -5.36 kB 🟢 -1.79 kB 🟢 -1.57 kB
assets/Preview3d-DiZB3AIx.js (new) 5.36 kB 🔴 +5.36 kB 🔴 +1.79 kB 🔴 +1.56 kB
assets/ValueControlPopover-CAb7woLU.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.93 kB 🔴 +1.73 kB
assets/ValueControlPopover-OOZKBTq2.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.93 kB 🟢 -1.72 kB
assets/CancelSubscriptionDialogContent-CAS6_xOy.js (new) 5.22 kB 🔴 +5.22 kB 🔴 +1.95 kB 🔴 +1.7 kB
assets/CancelSubscriptionDialogContent-CD5-6yMa.js (removed) 5.22 kB 🟢 -5.22 kB 🟢 -1.95 kB 🟢 -1.7 kB
assets/DeleteWorkspaceDialogContent-Cdgxmhd6.js (removed) 4.65 kB 🟢 -4.65 kB 🟢 -1.79 kB 🟢 -1.55 kB
assets/DeleteWorkspaceDialogContent-GqkU0_R8.js (new) 4.65 kB 🔴 +4.65 kB 🔴 +1.79 kB 🔴 +1.55 kB
assets/LeaveWorkspaceDialogContent-Bw22yScV.js (new) 4.48 kB 🔴 +4.48 kB 🔴 +1.74 kB 🔴 +1.51 kB
assets/LeaveWorkspaceDialogContent-D1bT7h5q.js (removed) 4.48 kB 🟢 -4.48 kB 🟢 -1.74 kB 🟢 -1.51 kB
assets/tierBenefits-B_sGF8a3.js (removed) 4.47 kB 🟢 -4.47 kB 🟢 -1.58 kB 🟢 -1.37 kB
assets/tierBenefits-BvybfXrd.js (new) 4.47 kB 🔴 +4.47 kB 🔴 +1.58 kB 🔴 +1.37 kB
assets/RemoveMemberDialogContent-BDtDBQYR.js (new) 4.46 kB 🔴 +4.46 kB 🔴 +1.69 kB 🔴 +1.47 kB
assets/RemoveMemberDialogContent-CNMocPvO.js (removed) 4.46 kB 🟢 -4.46 kB 🟢 -1.69 kB 🟢 -1.47 kB
assets/RevokeInviteDialogContent-CK_SlZbq.js (new) 4.37 kB 🔴 +4.37 kB 🔴 +1.7 kB 🔴 +1.49 kB
assets/RevokeInviteDialogContent-CLlsMwOr.js (removed) 4.37 kB 🟢 -4.37 kB 🟢 -1.7 kB 🟢 -1.49 kB
assets/InviteMemberUpsellDialogContent-BHFCTCAb.js (new) 4.27 kB 🔴 +4.27 kB 🔴 +1.56 kB 🔴 +1.37 kB
assets/InviteMemberUpsellDialogContent-BIO7OXFX.js (removed) 4.27 kB 🟢 -4.27 kB 🟢 -1.56 kB 🟢 -1.37 kB
assets/cloudSessionCookie-DQRU64e3.js (new) 4.13 kB 🔴 +4.13 kB 🔴 +1.49 kB 🔴 +1.3 kB
assets/cloudSessionCookie-lKmVfBst.js (removed) 4.13 kB 🟢 -4.13 kB 🟢 -1.49 kB 🟢 -1.3 kB
assets/saveMesh-9VLWcqzx.js (removed) 3.92 kB 🟢 -3.92 kB 🟢 -1.68 kB 🟢 -1.48 kB
assets/saveMesh-DDX_ZwLU.js (new) 3.92 kB 🔴 +3.92 kB 🔴 +1.69 kB 🔴 +1.48 kB
assets/Media3DTop-CvlXF31o.js (removed) 3.85 kB 🟢 -3.85 kB 🟢 -1.62 kB 🟢 -1.43 kB
assets/Media3DTop-poH2kxbT.js (new) 3.85 kB 🔴 +3.85 kB 🔴 +1.62 kB 🔴 +1.43 kB
assets/GlobalToast-4nw-uXqE.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.25 kB 🔴 +1.1 kB
assets/GlobalToast-DNjESMAo.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/SubscribeToRun-CLTbYCat.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +982 B 🔴 +867 B
assets/SubscribeToRun-pG2dq3J9.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -984 B 🟢 -876 B
assets/MediaAudioTop-BtepWNI8.js (new) 2.02 kB 🔴 +2.02 kB 🔴 +982 B 🔴 +839 B
assets/MediaAudioTop-NdvmtpK4.js (removed) 2.02 kB 🟢 -2.02 kB 🟢 -982 B 🟢 -836 B
assets/CloudRunButtonWrapper-BfNWFDVz.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -912 B 🟢 -806 B
assets/CloudRunButtonWrapper-BO5WKlha.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +914 B 🔴 +804 B
assets/cloudBadges-1rKER0Ol.js (new) 1.77 kB 🔴 +1.77 kB 🔴 +895 B 🔴 +774 B
assets/cloudBadges-KebEOH2-.js (removed) 1.77 kB 🟢 -1.77 kB 🟢 -893 B 🟢 -765 B
assets/cloudSubscription-4HKCZrzr.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +815 B 🔴 +697 B
assets/cloudSubscription-BwlhpPuR.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -814 B 🟢 -702 B
assets/previousFullPath-BeSeBfom.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -691 B 🟢 -599 B
assets/previousFullPath-CTyMTcA5.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +695 B 🔴 +598 B
assets/Load3D-CSdRg0Sr.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +617 B 🔴 +537 B
assets/Load3D-qjA6KtVS.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -615 B 🟢 -542 B
assets/nightlyBadges-BmzO4Gma.js (new) 1.29 kB 🔴 +1.29 kB 🔴 +659 B 🔴 +577 B
assets/nightlyBadges-XfdB4ZRT.js (removed) 1.29 kB 🟢 -1.29 kB 🟢 -658 B 🟢 -578 B
assets/Load3dViewerContent-BVsK4DmG.js (new) 1.23 kB 🔴 +1.23 kB 🔴 +569 B 🔴 +493 B
assets/Load3dViewerContent-Da_qXXWe.js (removed) 1.23 kB 🟢 -1.23 kB 🟢 -566 B 🟢 -499 B
assets/SubscriptionPanelContentWorkspace-BJpm3zOR.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +537 B 🔴 +461 B
assets/SubscriptionPanelContentWorkspace-Cf85g63N.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -534 B 🟢 -468 B
assets/WidgetLegacy--GzA5a24.js (removed) 978 B 🟢 -978 B 🟢 -480 B 🟢 -426 B
assets/WidgetLegacy-zUfhB394.js (new) 978 B 🔴 +978 B 🔴 +483 B 🔴 +417 B
assets/changeTracker-BCT7Maey.js (removed) 952 B 🟢 -952 B 🟢 -468 B 🟢 -415 B
assets/changeTracker-BSOV19NV.js (new) 952 B 🔴 +952 B 🔴 +471 B 🔴 +405 B
assets/graphHasMissingNodes-BuH0Rge_.js (removed) 822 B 🟢 -822 B 🟢 -412 B 🟢 -348 B
assets/graphHasMissingNodes-iSXGq55N.js (new) 822 B 🔴 +822 B 🔴 +415 B 🔴 +348 B

Status: 55 added / 55 removed / 79 unchanged

⚡ Performance Report

⚠️ 3 regressions detected

Metric Baseline PR (n=3) Δ Sig
subgraph-mouse-sweep: style recalcs 83 86 +4% ⚠️ z=3.1
subgraph-mouse-sweep: DOM nodes 73 74 +0% ⚠️ z=3.0
workflow-execution: event listeners 71 71 +0% ⚠️ z=4.6
All metrics
Metric Baseline PR (n=3) Δ Sig
canvas-idle: style recalcs 11 10 -6% z=-1.4
canvas-idle: layouts 0 0 +0%
canvas-idle: task duration 455ms 347ms -24% z=-1.4
canvas-idle: DOM nodes 23 21 -10% z=-1.2
canvas-idle: script duration 29ms 19ms -37% z=-3.0
canvas-idle: event listeners 14 14 +0% z=0.9
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: frame duration 17ms 17ms +0% z=0.8
canvas-mouse-sweep: style recalcs 79 80 +0% z=0.5
canvas-mouse-sweep: layouts 12 12 +0%
canvas-mouse-sweep: task duration 916ms 870ms -5% z=0.1
canvas-mouse-sweep: DOM nodes 65 63 -4% z=0.2
canvas-mouse-sweep: script duration 136ms 132ms -3% z=-0.6
canvas-mouse-sweep: event listeners 29 5 -81% z=-0.9
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: frame duration 17ms 17ms +0% z=1.0
canvas-zoom-sweep: style recalcs 32 31 -3% z=-0.1
canvas-zoom-sweep: layouts 6 6 +0%
canvas-zoom-sweep: task duration 361ms 295ms -18% z=-1.5
canvas-zoom-sweep: DOM nodes 81 80 -1% z=1.3
canvas-zoom-sweep: script duration 29ms 23ms -20% z=-1.4
canvas-zoom-sweep: event listeners 36 30 -18% z=1.4
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: frame duration 17ms 17ms +0% z=1.2
dom-widget-clipping: style recalcs 12 13 +14% z=0.7
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 372ms 352ms -5% z=-0.9
dom-widget-clipping: DOM nodes 19 24 +22% z=1.2
dom-widget-clipping: script duration 64ms 65ms +1% z=-0.9
dom-widget-clipping: event listeners 10 10 +0% variance too high
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: frame duration 17ms 17ms -0% z=-0.9
large-graph-idle: style recalcs 12 12 +3% z=1.4
large-graph-idle: layouts 0 0 +0%
large-graph-idle: task duration 656ms 529ms -19% z=-0.4
large-graph-idle: DOM nodes -263 -261 -1% z=-348.3
large-graph-idle: script duration 106ms 95ms -10% z=-0.7
large-graph-idle: event listeners -143 -147 +2% z=-24.7
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: frame duration 17ms 17ms +0% z=0.1
large-graph-pan: style recalcs 69 68 -2% z=-2.8
large-graph-pan: layouts 0 0 +0%
large-graph-pan: task duration 1195ms 1058ms -11% z=-0.5
large-graph-pan: DOM nodes -270 -271 +0% z=-159.4
large-graph-pan: script duration 406ms 394ms -3% z=-0.5
large-graph-pan: event listeners -171 -171 -0% z=-227.1
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: frame duration 17ms 17ms +0% z=0.3
minimap-idle: style recalcs 9 9 -4% z=-1.2
minimap-idle: layouts 0 0 +0%
minimap-idle: task duration 649ms 511ms -21% z=-0.5
minimap-idle: DOM nodes -272 -269 -1% z=-221.2
minimap-idle: script duration 101ms 89ms -12% z=-0.9
minimap-idle: event listeners -171 -172 +0% z=-240.7
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: frame duration 17ms 17ms -0% z=-0.9
subgraph-dom-widget-clipping: style recalcs 48 48 -1% z=-0.4
subgraph-dom-widget-clipping: layouts 0 0 +0%
subgraph-dom-widget-clipping: task duration 397ms 347ms -13% z=-1.6
subgraph-dom-widget-clipping: DOM nodes 23 21 -9% z=-0.6
subgraph-dom-widget-clipping: script duration 132ms 123ms -7% z=-0.8
subgraph-dom-widget-clipping: event listeners 24 8 -67% z=-1.3
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: frame duration 17ms 17ms +0% z=1.1
subgraph-idle: style recalcs 11 11 -3% z=0.0
subgraph-idle: layouts 0 0 +0%
subgraph-idle: task duration 420ms 347ms -17% z=-0.9
subgraph-idle: DOM nodes 23 22 -1% z=0.2
subgraph-idle: script duration 25ms 16ms -35% z=-1.7
subgraph-idle: event listeners 14 13 -5% variance too high
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: frame duration 17ms 17ms -0% z=-0.7
subgraph-mouse-sweep: style recalcs 83 86 +4% ⚠️ z=3.1
subgraph-mouse-sweep: layouts 16 16 +0%
subgraph-mouse-sweep: task duration 920ms 900ms -2% z=1.6
subgraph-mouse-sweep: DOM nodes 73 74 +0% ⚠️ z=3.0
subgraph-mouse-sweep: script duration 102ms 100ms -2% z=-0.2
subgraph-mouse-sweep: event listeners 29 6 -80% variance too high
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: frame duration 17ms 17ms -0% z=0.2
vue-large-graph-idle: style recalcs 1 1 +0%
vue-large-graph-idle: layouts 1 1 +0%
vue-large-graph-idle: task duration 11247ms 12118ms +8%
vue-large-graph-idle: DOM nodes -7231 -7228 -0%
vue-large-graph-idle: script duration 592ms 596ms +1%
vue-large-graph-idle: event listeners -9810 -9809 -0%
vue-large-graph-idle: TBT 267ms 296ms +11%
vue-large-graph-idle: frame duration 18ms 19ms +3%
vue-large-graph-pan: style recalcs 65 66 +1%
vue-large-graph-pan: layouts 0 0 +0%
vue-large-graph-pan: task duration 12849ms 13953ms +9%
vue-large-graph-pan: DOM nodes -8344 -8343 -0%
vue-large-graph-pan: script duration 878ms 839ms -5%
vue-large-graph-pan: event listeners -16488 -16474 -0%
vue-large-graph-pan: TBT 0ms 12ms
vue-large-graph-pan: frame duration 20ms 19ms -3%
workflow-execution: style recalcs 17 17 +0% z=-0.3
workflow-execution: layouts 5 5 +7% z=0.4
workflow-execution: task duration 131ms 121ms -8% z=-0.3
workflow-execution: DOM nodes 159 159 -0% z=-0.3
workflow-execution: script duration 28ms 29ms +1% z=-0.3
workflow-execution: event listeners 71 71 +0% ⚠️ z=4.6
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: frame duration 17ms 17ms +0% z=0.7
Historical variance (last 10 runs)
Metric μ σ CV
canvas-idle: style recalcs 11 1 4.9%
canvas-idle: layouts 0 0 0.0%
canvas-idle: task duration 397ms 35ms 8.7%
canvas-idle: DOM nodes 22 1 5.9%
canvas-idle: script duration 26ms 2ms 8.9%
canvas-idle: event listeners 10 4 38.6%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: frame duration 17ms 0ms 0.0%
canvas-mouse-sweep: style recalcs 79 2 2.8%
canvas-mouse-sweep: layouts 12 0 0.0%
canvas-mouse-sweep: task duration 866ms 58ms 6.7%
canvas-mouse-sweep: DOM nodes 62 2 3.6%
canvas-mouse-sweep: script duration 136ms 7ms 5.5%
canvas-mouse-sweep: event listeners 9 4 46.3%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: frame duration 17ms 0ms 0.0%
canvas-zoom-sweep: style recalcs 31 0 1.5%
canvas-zoom-sweep: layouts 6 0 0.0%
canvas-zoom-sweep: task duration 330ms 23ms 7.1%
canvas-zoom-sweep: DOM nodes 79 1 0.8%
canvas-zoom-sweep: script duration 28ms 3ms 11.4%
canvas-zoom-sweep: event listeners 23 4 18.4%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: frame duration 17ms 0ms 0.0%
dom-widget-clipping: style recalcs 13 1 4.1%
dom-widget-clipping: layouts 0 0 0.0%
dom-widget-clipping: task duration 368ms 18ms 4.8%
dom-widget-clipping: DOM nodes 22 2 7.1%
dom-widget-clipping: script duration 68ms 4ms 5.6%
dom-widget-clipping: event listeners 8 8 99.9%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: frame duration 17ms 0ms 0.0%
large-graph-idle: style recalcs 12 0 2.7%
large-graph-idle: layouts 0 0 0.0%
large-graph-idle: task duration 554ms 59ms 10.6%
large-graph-idle: DOM nodes 24 1 3.3%
large-graph-idle: script duration 104ms 12ms 11.7%
large-graph-idle: event listeners 25 7 28.2%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: frame duration 17ms 0ms 0.0%
large-graph-pan: style recalcs 70 1 0.9%
large-graph-pan: layouts 0 0 0.0%
large-graph-pan: task duration 1084ms 50ms 4.7%
large-graph-pan: DOM nodes 19 2 9.7%
large-graph-pan: script duration 405ms 23ms 5.7%
large-graph-pan: event listeners 5 1 15.9%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: frame duration 17ms 0ms 0.0%
minimap-idle: style recalcs 9 1 6.9%
minimap-idle: layouts 0 0 0.0%
minimap-idle: task duration 535ms 51ms 9.5%
minimap-idle: DOM nodes 19 1 6.9%
minimap-idle: script duration 99ms 11ms 11.1%
minimap-idle: event listeners 5 1 15.9%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: frame duration 17ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalcs 48 1 1.4%
subgraph-dom-widget-clipping: layouts 0 0 0.0%
subgraph-dom-widget-clipping: task duration 380ms 21ms 5.5%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.7%
subgraph-dom-widget-clipping: script duration 129ms 8ms 5.8%
subgraph-dom-widget-clipping: event listeners 17 7 41.7%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: frame duration 17ms 0ms 0.0%
subgraph-idle: style recalcs 11 1 6.9%
subgraph-idle: layouts 0 0 0.0%
subgraph-idle: task duration 375ms 31ms 8.3%
subgraph-idle: DOM nodes 22 2 7.8%
subgraph-idle: script duration 21ms 3ms 12.7%
subgraph-idle: event listeners 12 8 63.4%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: frame duration 17ms 0ms 0.0%
subgraph-mouse-sweep: style recalcs 80 2 2.2%
subgraph-mouse-sweep: layouts 16 0 0.0%
subgraph-mouse-sweep: task duration 784ms 70ms 9.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.1%
subgraph-mouse-sweep: script duration 102ms 7ms 7.3%
subgraph-mouse-sweep: event listeners 8 4 51.6%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: frame duration 17ms 0ms 0.0%
workflow-execution: style recalcs 18 1 6.8%
workflow-execution: layouts 5 0 5.6%
workflow-execution: task duration 124ms 12ms 9.5%
workflow-execution: DOM nodes 161 6 3.8%
workflow-execution: script duration 30ms 4ms 11.8%
workflow-execution: event listeners 52 4 7.9%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: frame duration 17ms 0ms 0.0%
Trend (last 10 commits on main)
Metric Trend Dir Latest
canvas-idle: style recalcs █▅▁▃▁▃▆█▆█ ➡️ 12
canvas-idle: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: task duration ▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: DOM nodes █▄▁▂▂▅▆▆▇▇ ➡️ 24
canvas-idle: script duration ▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: event listeners █▂▁▂▇██▂█▆ 📈 11
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: frame duration ▁▆█▆▆▃▁▁▃▁ ➡️ 17ms
canvas-mouse-sweep: style recalcs ▂▁▄▄▆▇▆▃█▅ ➡️ 79
canvas-mouse-sweep: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: task duration ▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: DOM nodes ▁▁▄▂▅█▇▃▆▆ ➡️ 64
canvas-mouse-sweep: script duration ▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: event listeners ▁▇▁▁▁██▇▁█ 📈 13
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: frame duration ▄▁██▁▅██▅▄ ➡️ 17ms
canvas-zoom-sweep: style recalcs ▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: task duration ▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: DOM nodes ▁▄█▅▆▆▄▃▅▄ ➡️ 79
canvas-zoom-sweep: script duration ▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: event listeners ▂▂█▁██▇▁█▁ ➡️ 19
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: frame duration ▁▁▁█▁▁███▁ ➡️ 17ms
dom-widget-clipping: style recalcs ▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: task duration ▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: DOM nodes ▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: script duration ▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: event listeners ▅██▁▁▁▁█▁▁ 📉 2
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: frame duration ▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
large-graph-idle: style recalcs ▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: task duration ▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: DOM nodes ▃▁▂▃▆▆▇▂█▆ ➡️ 25
large-graph-idle: script duration ▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: event listeners █▄▁▄▇▇█▂█▇ 📈 29
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: frame duration ▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-pan: style recalcs ▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: task duration ▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: DOM nodes ▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: script duration ▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: event listeners ▆▁▁▃▆▁▃██▃ ➡️ 5
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: frame duration ▃▁█▆▆▆▆█▁▆ ➡️ 17ms
minimap-idle: style recalcs ▄█▁▂▇▂▁▇█▄ ➡️ 9
minimap-idle: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: task duration ▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: DOM nodes ▄█▁▂▇▂▁▇█▄ ➡️ 19
minimap-idle: script duration ▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: event listeners ▁▃▁▁▆▁▃█▆▁ ➡️ 4
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: frame duration ▁█▆▆▃▃▆█▆█ ➡️ 17ms
subgraph-dom-widget-clipping: style recalcs ▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: task duration ▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: DOM nodes ▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: script duration ▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: event listeners ▁▅██▁▁█▅█▅ 📈 16
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: frame duration ▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-idle: style recalcs ▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: task duration ▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: DOM nodes ▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: script duration ▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: event listeners ▁▁▁▁▅▄▁███ 📈 21
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: frame duration ▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-mouse-sweep: style recalcs ▄▂▄█▅▆▃▁▃▄ ➡️ 81
subgraph-mouse-sweep: layouts ▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: task duration ▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: DOM nodes ▃▂▃█▄▅▃▁▄▃ ➡️ 66
subgraph-mouse-sweep: script duration ▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: event listeners ▁▁▁█▇▂▁▇▇▁ ➡️ 5
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: frame duration ▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
workflow-execution: style recalcs ▃▆█▇▆▆▇▃▄▁ ➡️ 15
workflow-execution: layouts ▆▆▁▆▆█▆▃▆▃ ➡️ 5
workflow-execution: task duration ▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: DOM nodes ▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: script duration ▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: event listeners ▄███▁██▄█▄ ➡️ 49
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: frame duration ▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
Raw data
{
  "timestamp": "2026-03-25T13:52:39.972Z",
  "gitSha": "fa6591ca9a0323ca8be49a48f0a3fb31ca0be5a2",
  "branch": "feat/curve-histogram-support",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2013.056999999975,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 11.184,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 354.282,
      "heapDeltaBytes": 20270588,
      "domNodes": 23,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 20.610999999999997,
      "eventListeners": 30,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-idle",
      "durationMs": 2024.628000000007,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.402000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 350.75800000000004,
      "heapDeltaBytes": 20314964,
      "domNodes": 20,
      "jsHeapTotalBytes": 22544384,
      "scriptDurationMs": 20.857999999999997,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.680000000000017
    },
    {
      "name": "canvas-idle",
      "durationMs": 2010.3560000000016,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.097000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 335.442,
      "heapDeltaBytes": 19794552,
      "domNodes": 19,
      "jsHeapTotalBytes": 22806528,
      "scriptDurationMs": 14.292,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2007.6210000000003,
      "styleRecalcs": 80,
      "styleRecalcDurationMs": 41.756,
      "layouts": 12,
      "layoutDurationMs": 3.5889999999999995,
      "taskDurationMs": 934.2969999999999,
      "heapDeltaBytes": 16077200,
      "domNodes": 64,
      "jsHeapTotalBytes": 23330816,
      "scriptDurationMs": 131.234,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1814.875000000029,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 35.471000000000004,
      "layouts": 12,
      "layoutDurationMs": 3.4469999999999996,
      "taskDurationMs": 731.8929999999999,
      "heapDeltaBytes": 16436080,
      "domNodes": 58,
      "jsHeapTotalBytes": 24117248,
      "scriptDurationMs": 130.496,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2041.8560000000525,
      "styleRecalcs": 84,
      "styleRecalcDurationMs": 42.456,
      "layouts": 12,
      "layoutDurationMs": 3.2169999999999996,
      "taskDurationMs": 944.3529999999998,
      "heapDeltaBytes": 15572324,
      "domNodes": 66,
      "jsHeapTotalBytes": 23855104,
      "scriptDurationMs": 132.835,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1729.974999999996,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 18.012,
      "layouts": 6,
      "layoutDurationMs": 0.7599999999999998,
      "taskDurationMs": 300.30400000000003,
      "heapDeltaBytes": 15704300,
      "domNodes": 77,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 22.555999999999997,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1720.2279999999632,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 16.227,
      "layouts": 6,
      "layoutDurationMs": 0.624,
      "taskDurationMs": 289.05099999999993,
      "heapDeltaBytes": 24732856,
      "domNodes": 79,
      "jsHeapTotalBytes": 20447232,
      "scriptDurationMs": 24.514000000000003,
      "eventListeners": 21,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1714.8509999999533,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 18.8,
      "layouts": 6,
      "layoutDurationMs": 0.6829999999999998,
      "taskDurationMs": 295.748,
      "heapDeltaBytes": 24912632,
      "domNodes": 84,
      "jsHeapTotalBytes": 21233664,
      "scriptDurationMs": 23.044,
      "eventListeners": 49,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 597.6640000000089,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 11.938999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 387.392,
      "heapDeltaBytes": 7538012,
      "domNodes": 22,
      "jsHeapTotalBytes": 12320768,
      "scriptDurationMs": 65.634,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 540.8459999999877,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 11.560999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 330.8949999999999,
      "heapDeltaBytes": 6558480,
      "domNodes": 27,
      "jsHeapTotalBytes": 13893632,
      "scriptDurationMs": 63.865,
      "eventListeners": 26,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 588.1990000000314,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 13.156,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 338.874,
      "heapDeltaBytes": 7224372,
      "domNodes": 22,
      "jsHeapTotalBytes": 12845056,
      "scriptDurationMs": 64.537,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2026.6479999999945,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 12.356,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 523.602,
      "heapDeltaBytes": 4294292,
      "domNodes": -261,
      "jsHeapTotalBytes": 16453632,
      "scriptDurationMs": 94.457,
      "eventListeners": -146,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2017.4319999999852,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 13.654,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 539.166,
      "heapDeltaBytes": 18955412,
      "domNodes": -260,
      "jsHeapTotalBytes": 15200256,
      "scriptDurationMs": 97.75699999999999,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2054.144000000065,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 11.607,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 525.504,
      "heapDeltaBytes": 4935900,
      "domNodes": -262,
      "jsHeapTotalBytes": 16191488,
      "scriptDurationMs": 93.38499999999999,
      "eventListeners": -146,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2139.1279999999997,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 14.807999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1030.792,
      "heapDeltaBytes": 17238244,
      "domNodes": -271,
      "jsHeapTotalBytes": 18755584,
      "scriptDurationMs": 384.98299999999995,
      "eventListeners": -170,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2149.411999999984,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 15.834999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1060.147,
      "heapDeltaBytes": 21170352,
      "domNodes": -270,
      "jsHeapTotalBytes": 18522112,
      "scriptDurationMs": 391.579,
      "eventListeners": -170,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2127.4329999999964,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 13.902000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1082.97,
      "heapDeltaBytes": -1874376,
      "domNodes": -272,
      "jsHeapTotalBytes": 18522112,
      "scriptDurationMs": 405.66100000000006,
      "eventListeners": -172,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "minimap-idle",
      "durationMs": 2030.986999999982,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.276999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 509.803,
      "heapDeltaBytes": 3120880,
      "domNodes": -271,
      "jsHeapTotalBytes": 17240064,
      "scriptDurationMs": 90.91700000000002,
      "eventListeners": -170,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "minimap-idle",
      "durationMs": 1992.153999999971,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.719999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 511.182,
      "heapDeltaBytes": 18598916,
      "domNodes": -269,
      "jsHeapTotalBytes": 15986688,
      "scriptDurationMs": 91.71000000000001,
      "eventListeners": -174,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "minimap-idle",
      "durationMs": 2020.328999999947,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.349000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 511.077,
      "heapDeltaBytes": -7253164,
      "domNodes": -268,
      "jsHeapTotalBytes": 15986688,
      "scriptDurationMs": 85.55799999999999,
      "eventListeners": -172,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 532.8599999999994,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 11.867999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 342.994,
      "heapDeltaBytes": 6376848,
      "domNodes": 22,
      "jsHeapTotalBytes": 12845056,
      "scriptDurationMs": 119.415,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 531.5449999999942,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 12.559999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 350.619,
      "heapDeltaBytes": 7405584,
      "domNodes": 22,
      "jsHeapTotalBytes": 12845056,
      "scriptDurationMs": 125.62500000000001,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 546.510000000012,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 10.712,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 346.2609999999999,
      "heapDeltaBytes": 7216936,
      "domNodes": 20,
      "jsHeapTotalBytes": 13369344,
      "scriptDurationMs": 123.09299999999999,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1998.312999999996,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 12.328999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 392.369,
      "heapDeltaBytes": 20122540,
      "domNodes": 23,
      "jsHeapTotalBytes": 22544384,
      "scriptDurationMs": 22.05200000000001,
      "eventListeners": 28,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2014.1670000000431,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 10.51,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 322.468,
      "heapDeltaBytes": 19812688,
      "domNodes": 22,
      "jsHeapTotalBytes": 22806528,
      "scriptDurationMs": 13.676000000000004,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2010.485000000017,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.659999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 327.52799999999996,
      "heapDeltaBytes": 19536032,
      "domNodes": 22,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 13.582000000000004,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1999.5949999999993,
      "styleRecalcs": 86,
      "styleRecalcDurationMs": 47.00299999999999,
      "layouts": 16,
      "layoutDurationMs": 4.534,
      "taskDurationMs": 908.9490000000001,
      "heapDeltaBytes": 11292592,
      "domNodes": 75,
      "jsHeapTotalBytes": 22806528,
      "scriptDurationMs": 97.96300000000001,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1988.8259999999605,
      "styleRecalcs": 88,
      "styleRecalcDurationMs": 45.18900000000001,
      "layouts": 16,
      "layoutDurationMs": 4.3549999999999995,
      "taskDurationMs": 916.458,
      "heapDeltaBytes": 11914164,
      "domNodes": 74,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 105.738,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.67999999999993
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1963.6749999999665,
      "styleRecalcs": 84,
      "styleRecalcDurationMs": 43.675,
      "layouts": 16,
      "layoutDurationMs": 4.6160000000000005,
      "taskDurationMs": 873.564,
      "heapDeltaBytes": 11370704,
      "domNodes": 72,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 95.79299999999999,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11876.463000000002,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11866.154,
      "heapDeltaBytes": -39140040,
      "domNodes": -8343,
      "jsHeapTotalBytes": 16867328,
      "scriptDurationMs": 618.716,
      "eventListeners": -16479,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 20
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12652.814999999975,
      "styleRecalcs": 2,
      "styleRecalcDurationMs": 32.52200000000002,
      "layouts": 2,
      "layoutDurationMs": 9.949,
      "taskDurationMs": 12635.715999999999,
      "heapDeltaBytes": -25198592,
      "domNodes": -5006,
      "jsHeapTotalBytes": 47538176,
      "scriptDurationMs": 582.488,
      "eventListeners": 3535,
      "totalBlockingTimeMs": 889,
      "frameDurationMs": 18.329999999999927
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11862.122,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11851.36,
      "heapDeltaBytes": -31464908,
      "domNodes": -8334,
      "jsHeapTotalBytes": 27877376,
      "scriptDurationMs": 587.8950000000001,
      "eventListeners": -16483,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.31999999999971
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 13785.562999999967,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 13.297999999999977,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13760.418000000001,
      "heapDeltaBytes": -34318912,
      "domNodes": -8343,
      "jsHeapTotalBytes": 25432064,
      "scriptDurationMs": 831.201,
      "eventListeners": -16473,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.329999999999927
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14177.81500000001,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 13.231999999999966,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14158.427,
      "heapDeltaBytes": -34132428,
      "domNodes": -8343,
      "jsHeapTotalBytes": -5763072,
      "scriptDurationMs": 821.9,
      "eventListeners": -16473,
      "totalBlockingTimeMs": 37,
      "frameDurationMs": 19.990000000000144
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 13957.882999999925,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 13.400000000000023,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13938.921,
      "heapDeltaBytes": -21474056,
      "domNodes": -8343,
      "jsHeapTotalBytes": 26480640,
      "scriptDurationMs": 862.4730000000001,
      "eventListeners": -16477,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 20
    },
    {
      "name": "workflow-execution",
      "durationMs": 444.42900000001373,
      "styleRecalcs": 17,
      "styleRecalcDurationMs": 25.39,
      "layouts": 5,
      "layoutDurationMs": 1.487,
      "taskDurationMs": 122.69499999999996,
      "heapDeltaBytes": 4711112,
      "domNodes": 164,
      "jsHeapTotalBytes": 524288,
      "scriptDurationMs": 29.255000000000003,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "workflow-execution",
      "durationMs": 446.85199999992165,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 22.156,
      "layouts": 5,
      "layoutDurationMs": 1.2679999999999998,
      "taskDurationMs": 118.29500000000002,
      "heapDeltaBytes": 4475432,
      "domNodes": 158,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 27.262,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "workflow-execution",
      "durationMs": 441.0060000000158,
      "styleRecalcs": 17,
      "styleRecalcDurationMs": 22.939000000000004,
      "layouts": 5,
      "layoutDurationMs": 1.36,
      "taskDurationMs": 120.65299999999998,
      "heapDeltaBytes": 4498088,
      "domNodes": 155,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 29.471,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    }
  ]
}

coderabbitai[bot]
coderabbitai bot previously approved these changes Mar 21, 2026
@christian-byrne christian-byrne added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch core/1.42 Backport PRs for core 1.42 cloud/1.42 Backport PRs for cloud 1.42 labels Mar 23, 2026
@pythongosssss
Copy link
Copy Markdown
Member

@jtydhr88 could you share the Image Histogram node please so I can give it a test, otherwise lgtm

@jtydhr88 jtydhr88 closed this Mar 24, 2026
@jtydhr88 jtydhr88 reopened this Mar 24, 2026
@jtydhr88 jtydhr88 requested a review from a team March 24, 2026 20:12
@jtydhr88
Copy link
Copy Markdown
Collaborator Author

@pythongosssss @christian-byrne this is preparation for unmerged Comfy-Org/ComfyUI#12757 along with unpushed Image Histogram node, in general, we need to merge this FE change first.

However If you want to try, you can checkout the core PR first, then use nodes_curve.py (I will send in slack) to replace your local file

@jtydhr88 jtydhr88 force-pushed the feat/curve-histogram-support branch from 413e62a to 0870eed Compare March 25, 2026 02:29
@dosubot dosubot bot added size:M This PR changes 30-99 lines, ignoring generated files. and removed size:S This PR changes 10-29 lines, ignoring generated files. labels Mar 25, 2026
@christian-byrne christian-byrne removed their assignment Mar 25, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@src/composables/useUpstreamValue.ts`:
- Around line 43-46: The guard currently checks subgraphOutput?.linkIds.length
which can throw if linkIds is undefined; change the conditional to ensure
linkIds exists before reading .length and indexing: explicitly check
subgraphOutput?.linkIds (or use subgraphOutput?.linkIds?.length) and only call
node.subgraph.getLink(subgraphOutput.linkIds[0]) after verifying linkIds is
defined and has at least one element (referencing subgraphOutput and
node.subgraph.getLink to locate the code).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e30e3a69-65f1-452e-bcf9-ad8222d473ca

📥 Commits

Reviewing files that changed from the base of the PR and between 413e62a and 0870eed.

📒 Files selected for processing (5)
  • src/components/curve/WidgetCurve.vue
  • src/components/curve/curveUtils.ts
  • src/composables/useUpstreamValue.ts
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/types/simplifiedWidget.ts
✅ Files skipped from review due to trivial changes (1)
  • src/types/simplifiedWidget.ts

@jtydhr88 jtydhr88 force-pushed the feat/curve-histogram-support branch from 4796264 to 0b8a443 Compare March 25, 2026 13:00
coderabbitai[bot]
coderabbitai bot previously requested changes Mar 25, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/types/simplifiedWidget.ts (1)

79-80: Prefer the shared locator-id type over bare string.

This key has to match the exact format produced by getLocatorIdFromNodeData() / nodeIdToNodeLocatorId(). Keeping it as plain string makes it easy to pass a raw node id or unrelated key and only notice when the histogram lookup silently misses. If a shared NodeLocatorId alias is already available in a low-level types module, use that here.

Based on learnings: nodeIdToNodeLocatorId(nodeId, subgraph?) always returns a non-nullable NodeLocatorId (string).

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

In `@src/types/simplifiedWidget.ts` around lines 79 - 80, Replace the bare string
type for nodeLocatorId with the shared NodeLocatorId alias to ensure callers use
the exact locator format produced by getLocatorIdFromNodeData() /
nodeIdToNodeLocatorId(); specifically, import the NodeLocatorId type from the
low-level types module and change the field signature from nodeLocatorId?:
string to nodeLocatorId?: NodeLocatorId (keep optionality if callers can omit
it).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/curve/curveUtils.ts`:
- Around line 164-166: The percentile index calculation underflows for small
arrays because it uses Math.floor((len - 1) * 0.995); update the index logic so
it derives from len and is clamped to valid bounds: compute const idx =
Math.min(Math.max(0, Math.floor(len * 0.995)), len - 1) (or equivalent) and then
use const max = sorted[idx]; keep the subsequent check if (max === 0) return ''
so small arrays like [0,100] won’t incorrectly pick 0 as the percentile. Ensure
you reference sqrtValues/ sorted/ len/ max in the updated code.

---

Nitpick comments:
In `@src/types/simplifiedWidget.ts`:
- Around line 79-80: Replace the bare string type for nodeLocatorId with the
shared NodeLocatorId alias to ensure callers use the exact locator format
produced by getLocatorIdFromNodeData() / nodeIdToNodeLocatorId(); specifically,
import the NodeLocatorId type from the low-level types module and change the
field signature from nodeLocatorId?: string to nodeLocatorId?: NodeLocatorId
(keep optionality if callers can omit it).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 271bf85a-f9e7-41b5-be08-1d61d5a5ea7e

📥 Commits

Reviewing files that changed from the base of the PR and between 4796264 and 0b8a443.

📒 Files selected for processing (4)
  • src/components/curve/WidgetCurve.vue
  • src/components/curve/curveUtils.ts
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/types/simplifiedWidget.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/curve/WidgetCurve.vue

@jtydhr88 jtydhr88 force-pushed the feat/curve-histogram-support branch from 0b8a443 to 24831d9 Compare March 25, 2026 13:18
@jtydhr88 jtydhr88 force-pushed the feat/curve-histogram-support branch from 24831d9 to 6a45714 Compare March 25, 2026 13:41
@jtydhr88 jtydhr88 dismissed coderabbitai[bot]’s stale review March 26, 2026 09:28

I don’t see any action I can do

@jtydhr88 jtydhr88 merged commit bcb39b1 into main Mar 26, 2026
33 checks passed
@jtydhr88 jtydhr88 deleted the feat/curve-histogram-support branch March 26, 2026 09:29
github-actions bot pushed a commit that referenced this pull request Mar 26, 2026
## Summary
- WidgetCurve reads histogram data from nodeOutputStore (sent by backend
CurveEditor node via ui output) and passes it to CurveEditor
- histogramToPath now supports arbitrary-length bin arrays instead
ofhardcoded 256

need BE changes

## Screenshots (if applicable)
<img width="2431" height="1022" alt="image"
src="https://github.com/user-attachments/assets/8421d4a7-1bff-4269-8b55-649838f9d619"
/>

<img width="2462" height="979" alt="image"
src="https://github.com/user-attachments/assets/191c9163-82ab-4eb2-bb74-0037b3ccd383"
/>

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-10365-feat-support-histogram-display-in-curve-widget-32a6d73d3650816b9852d73309a0b35f)
by [Unito](https://www.unito.io)
github-actions bot pushed a commit that referenced this pull request Mar 26, 2026
## Summary
- WidgetCurve reads histogram data from nodeOutputStore (sent by backend
CurveEditor node via ui output) and passes it to CurveEditor
- histogramToPath now supports arbitrary-length bin arrays instead
ofhardcoded 256

need BE changes

## Screenshots (if applicable)
<img width="2431" height="1022" alt="image"
src="https://github.com/user-attachments/assets/8421d4a7-1bff-4269-8b55-649838f9d619"
/>

<img width="2462" height="979" alt="image"
src="https://github.com/user-attachments/assets/191c9163-82ab-4eb2-bb74-0037b3ccd383"
/>

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-10365-feat-support-histogram-display-in-curve-widget-32a6d73d3650816b9852d73309a0b35f)
by [Unito](https://www.unito.io)
@comfy-pr-bot
Copy link
Copy Markdown
Member

@jtydhr88 Successfully backported to #10561

@comfy-pr-bot
Copy link
Copy Markdown
Member

@jtydhr88 Successfully backported to #10562

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Mar 26, 2026
comfy-pr-bot added a commit that referenced this pull request Mar 26, 2026
…#10562)

Backport of #10365 to `cloud/1.42`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-10562-backport-cloud-1-42-feat-support-histogram-display-in-curve-widget-32f6d73d365081efa3e7d6eaeb0f2eb1)
by [Unito](https://www.unito.io)

Co-authored-by: Terry Jia <terryjia88@gmail.com>
comfy-pr-bot added a commit that referenced this pull request Mar 26, 2026
…10561)

Backport of #10365 to `core/1.42`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-10561-backport-core-1-42-feat-support-histogram-display-in-curve-widget-32f6d73d365081bfa21fd1d0ed01aa7a)
by [Unito](https://www.unito.io)

Co-authored-by: Terry Jia <terryjia88@gmail.com>
@DrJKL DrJKL added core/1.41 Backport PRs for core 1.41 cloud/1.41 Backport PRs for cloud 1.41 labels Mar 26, 2026
christian-byrne pushed a commit that referenced this pull request Mar 28, 2026
## Summary
- WidgetCurve reads histogram data from nodeOutputStore (sent by backend
CurveEditor node via ui output) and passes it to CurveEditor
- histogramToPath now supports arbitrary-length bin arrays instead
ofhardcoded 256

need BE changes

## Screenshots (if applicable)
<img width="2431" height="1022" alt="image"
src="https://github.com/user-attachments/assets/8421d4a7-1bff-4269-8b55-649838f9d619"
/>

<img width="2462" height="979" alt="image"
src="https://github.com/user-attachments/assets/191c9163-82ab-4eb2-bb74-0037b3ccd383"
/>

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-10365-feat-support-histogram-display-in-curve-widget-32a6d73d3650816b9852d73309a0b35f)
by [Unito](https://www.unito.io)
@comfy-pr-bot comfy-pr-bot added released:core PR has been released to core released:cloud PR has been released to cloud labels Apr 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud/1.41 Backport PRs for cloud 1.41 cloud/1.42 Backport PRs for cloud 1.42 core/1.41 Backport PRs for core 1.41 core/1.42 Backport PRs for core 1.42 released:cloud PR has been released to cloud released:core PR has been released to core size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants