Skip to content

feat(video): VIDEO_EDIT rich widget with trim and crop editors - #14205

Merged
jtydhr88 merged 1 commit into
mainfrom
feat/video-edit-widget
Jul 29, 2026
Merged

feat(video): VIDEO_EDIT rich widget with trim and crop editors#14205
jtydhr88 merged 1 commit into
mainfrom
feat/video-edit-widget

Conversation

@jtydhr88

Copy link
Copy Markdown
Collaborator

This is seperate last part for the big PR of video edit, crop, trim PR #14118

Summary

Wires the VIDEO_EDIT input type end to end and assembles the editor UI from the previously merged building blocks:

  • litegraph: VideoEditValue/VideoEditTrim widget value types, VideoEditWidget class and widgetMap/constructor registration
  • schema/registry: VIDEO_EDIT zod spec in nodeDefSchemaV2, widget registry entry rendering WidgetVideoEdit
  • useVideoEditModel: canonical seconds/pixels edit state with frame-based setters, enable toggles, and handle crossover clamps
  • VideoEditPanel: trim timeline (filmstrip + range handles + playback) and crop overlay with ratio lock, driven by backend video metadata
  • WidgetVideoEdit: widget shell resolving the source video via useVideoSourceUrl and suppressing the default node media preview

@jtydhr88
jtydhr88 requested a review from a team July 28, 2026 18:10
@dosubot dosubot Bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Jul 28, 2026
@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown

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

📊 Browser Reports
  • chromium: View Report (✅ 1736 / ❌ 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/29/2026, 01:55:05 PM UTC

Links

📦 Bundle: 8.16 MB gzip 🔴 +17 kB

Details

Summary

  • Raw size: 34.3 MB baseline 34.2 MB — 🔴 +67.9 kB
  • Gzip: 8.16 MB baseline 8.14 MB — 🔴 +17 kB
  • Brotli: 5.65 MB baseline 5.63 MB — 🔴 +15 kB
  • Bundles: 423 current • 418 baseline • 157 added / 152 removed

Category Glance
Other 🔴 +41.3 kB (12.5 MB) · Utilities & Hooks 🔴 +15.1 kB (384 kB) · UI Components 🔴 +5.89 kB (70.7 kB) · Editors & Dialogs 🔴 +3.29 kB (124 kB) · Data & Services 🔴 +2.19 kB (3.42 MB) · Graph Workspace 🔴 +211 B (1.28 MB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CsWqoSZA.js (removed) 3.63 kB 🟢 -3.63 kB 🟢 -1.82 kB 🟢 -1.58 kB
assets/index-DFU3M_rN.js (new) 3.63 kB 🔴 +3.63 kB 🔴 +1.82 kB 🔴 +1.59 kB

Status: 1 added / 1 removed

Graph Workspace — 1.28 MB (baseline 1.28 MB) • 🔴 +211 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CuGBLDyl.js (new) 1.28 MB 🔴 +1.28 MB 🔴 +275 kB 🔴 +207 kB
assets/GraphView-DjInXjPN.js (removed) 1.28 MB 🟢 -1.28 MB 🟢 -275 kB 🟢 -207 kB

Status: 1 added / 1 removed / 1 unchanged

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BbYzTk1P.js (new) 25 kB 🔴 +25 kB 🔴 +6.26 kB 🔴 +5.54 kB
assets/CloudSurveyView-DSlXnsOc.js (removed) 25 kB 🟢 -25 kB 🟢 -6.26 kB 🟢 -5.54 kB
assets/CloudLoginView-C9fVR7y7.js (removed) 11.6 kB 🟢 -11.6 kB 🟢 -3.14 kB 🟢 -2.75 kB
assets/CloudLoginView-D25KYimY.js (new) 11.6 kB 🔴 +11.6 kB 🔴 +3.14 kB 🔴 +2.76 kB
assets/CloudSignupView-BQyRxWnW.js (new) 9.96 kB 🔴 +9.96 kB 🔴 +2.81 kB 🔴 +2.45 kB
assets/CloudSignupView-XPWLSrn-.js (removed) 9.96 kB 🟢 -9.96 kB 🟢 -2.81 kB 🟢 -2.47 kB
assets/CloudLayoutView---Th_z-O.js (new) 9.54 kB 🔴 +9.54 kB 🔴 +2.35 kB 🔴 +2.02 kB
assets/CloudLayoutView-Cr356rip.js (removed) 9.54 kB 🟢 -9.54 kB 🟢 -2.35 kB 🟢 -2.02 kB
assets/UserCheckView-3WqeBDkU.js (removed) 8.8 kB 🟢 -8.8 kB 🟢 -2.22 kB 🟢 -1.93 kB
assets/UserCheckView-DbGHnks4.js (new) 8.8 kB 🔴 +8.8 kB 🔴 +2.22 kB 🔴 +1.92 kB
assets/WidgetTextPreview-BAYehdVD.js (removed) 6.13 kB 🟢 -6.13 kB 🟢 -2.16 kB 🟢 -1.92 kB
assets/WidgetTextPreview-BeUPYwWG.js (new) 6.13 kB 🔴 +6.13 kB 🔴 +2.16 kB 🔴 +1.91 kB
assets/CloudSubscriptionRedirectView-BRV7MCyn.js (new) 6.06 kB 🔴 +6.06 kB 🔴 +2.26 kB 🔴 +1.97 kB
assets/CloudSubscriptionRedirectView-Burm4LR1.js (removed) 6.06 kB 🟢 -6.06 kB 🟢 -2.26 kB 🟢 -1.97 kB
assets/UserSelectView-CMEcKyNp.js (new) 5.54 kB 🔴 +5.54 kB 🔴 +1.99 kB 🔴 +1.74 kB
assets/UserSelectView-vyIvkPmT.js (removed) 5.54 kB 🟢 -5.54 kB 🟢 -1.99 kB 🟢 -1.74 kB
assets/CloudForgotPasswordView-BwF7vHR-.js (new) 5.15 kB 🔴 +5.15 kB 🔴 +1.76 kB 🔴 +1.54 kB
assets/CloudForgotPasswordView-Cy2ntLUq.js (removed) 5.15 kB 🟢 -5.15 kB 🟢 -1.76 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-lynN79Q6.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.57 kB 🟢 -1.36 kB
assets/CloudAuthTimeoutView-V6mKkLPP.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/OAuthLayoutView-BBvIgzBV.js (new) 1.36 kB 🔴 +1.36 kB 🔴 +734 B 🔴 +620 B
assets/OAuthLayoutView-wSs82b-U.js (removed) 1.36 kB 🟢 -1.36 kB 🟢 -735 B 🟢 -620 B
assets/WidgetTextPreview-D0X11upp.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +88 B
assets/WidgetTextPreview-Y1VNL8kJ.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -89 B

Status: 12 added / 12 removed / 4 unchanged

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-Bg4a7Yab.js (removed) 49.5 kB 🟢 -49.5 kB 🟢 -9.97 kB 🟢 -8.83 kB
assets/KeybindingPanel-BobaSd76.js (new) 49.5 kB 🔴 +49.5 kB 🔴 +9.97 kB 🔴 +8.82 kB
assets/SecretsPanel-B6GLqi8m.js (removed) 31.3 kB 🟢 -31.3 kB 🟢 -7.62 kB 🟢 -6.67 kB
assets/SecretsPanel-Cgogcu0s.js (new) 31.3 kB 🔴 +31.3 kB 🔴 +7.61 kB 🔴 +6.67 kB
assets/CreditsPanel-2gzBQLGh.js (new) 16 kB 🔴 +16 kB 🔴 +4.66 kB 🔴 +4.09 kB
assets/CreditsPanel-DXNVgrkD.js (removed) 16 kB 🟢 -16 kB 🟢 -4.66 kB 🟢 -4.12 kB
assets/SubscriptionPanel-BPM20au5.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.65 kB 🔴 +3.22 kB
assets/SubscriptionPanel-yK4knELj.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.65 kB 🟢 -3.2 kB
assets/AboutPanel-C8cklO5w.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.06 kB 🔴 +2.74 kB
assets/AboutPanel-DCnu4TjK.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.06 kB 🟢 -2.74 kB
assets/ExtensionPanel-9IMICb3g.js (removed) 9.24 kB 🟢 -9.24 kB 🟢 -2.54 kB 🟢 -2.25 kB
assets/ExtensionPanel-CnvmwKFb.js (new) 9.24 kB 🔴 +9.24 kB 🔴 +2.54 kB 🔴 +2.25 kB
assets/ServerConfigPanel-Bj-XX5-x.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -1.97 kB 🟢 -1.75 kB
assets/ServerConfigPanel-BxVDAaoW.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +1.97 kB 🔴 +1.75 kB
assets/UserPanel-Cbb0CeJR.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.81 kB 🔴 +1.57 kB
assets/UserPanel-kTE_DBrE.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.81 kB 🟢 -1.57 kB
assets/refreshRemoteConfig-BDYaUUl9.js (removed) 2.97 kB 🟢 -2.97 kB 🟢 -1.27 kB 🟢 -1.11 kB
assets/refreshRemoteConfig-Bhrl0ydl.js (new) 2.97 kB 🔴 +2.97 kB 🔴 +1.27 kB 🔴 +1.11 kB
assets/cloudRemoteConfig-_TiXvg3d.js (new) 988 B 🔴 +988 B 🔴 +535 B 🔴 +452 B
assets/cloudRemoteConfig-CQatJLIF.js (removed) 988 B 🟢 -988 B 🟢 -538 B 🟢 -454 B
assets/refreshRemoteConfig-B5DrdeHt.js (new) 110 B 🔴 +110 B 🔴 +89 B 🔴 +83 B
assets/refreshRemoteConfig-DwSkRaXk.js (removed) 110 B 🟢 -110 B 🟢 -89 B 🟢 -82 B

Status: 11 added / 11 removed / 15 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SignUpForm-itaRwe3v.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +4.18 kB 🔴 +3.65 kB
assets/SignUpForm-MfYfc2iA.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -4.18 kB 🟢 -3.65 kB
assets/auth-DO7yDh-R.js (removed) 3.69 kB 🟢 -3.69 kB 🟢 -1.3 kB 🟢 -1.12 kB
assets/auth-DYVbO42S.js (new) 3.69 kB 🔴 +3.69 kB 🔴 +1.3 kB 🔴 +1.12 kB
assets/usePostAuthRedirect-BBqCWFRN.js (new) 3.33 kB 🔴 +3.33 kB 🔴 +1.27 kB 🔴 +1.11 kB
assets/usePostAuthRedirect-D-eJ9zRm.js (removed) 3.33 kB 🟢 -3.33 kB 🟢 -1.27 kB 🟢 -1.11 kB
assets/UpdatePasswordContent-ClsCh94g.js (new) 1.91 kB 🔴 +1.91 kB 🔴 +869 B 🔴 +757 B
assets/UpdatePasswordContent-CNcS5N-d.js (removed) 1.91 kB 🟢 -1.91 kB 🟢 -872 B 🟢 -760 B
assets/authStore-BIMDnozM.js (removed) 128 B 🟢 -128 B 🟢 -104 B 🟢 -104 B
assets/authStore-BsIvp-Ft.js (new) 128 B 🔴 +128 B 🔴 +104 B 🔴 +105 B
assets/workspaceAuthStore-BvcX7VWg.js (new) 108 B 🔴 +108 B 🔴 +99 B 🔴 +112 B
assets/workspaceAuthStore-iu3p1_8P.js (removed) 108 B 🟢 -108 B 🟢 -99 B 🟢 -104 B
assets/auth-BQYobRFX.js (removed) 105 B 🟢 -105 B 🟢 -96 B 🟢 -74 B
assets/auth-CFjC2qRT.js (new) 105 B 🔴 +105 B 🔴 +96 B 🔴 +85 B

Status: 7 added / 7 removed / 3 unchanged

Editors & Dialogs — 124 kB (baseline 121 kB) • 🔴 +3.29 kB

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-BVqej7nn.js (removed) 89.9 kB 🟢 -89.9 kB 🟢 -19.2 kB 🟢 -16.4 kB
assets/ComfyHubPublishDialog-BWWPQ92B.js (new) 89.9 kB 🔴 +89.9 kB 🔴 +19.2 kB 🔴 +16.5 kB
assets/useShareDialog-Tx_2kbCb.js (removed) 23.7 kB 🟢 -23.7 kB 🟢 -5.58 kB 🟢 -4.96 kB
assets/useShareDialog-Vjw8p7fg.js (new) 23.7 kB 🔴 +23.7 kB 🔴 +5.58 kB 🔴 +4.96 kB
assets/feedbackDialog-Bh6bILTf.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.9 kB 🟢 -1.62 kB
assets/feedbackDialog-C2uV7Aix.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.89 kB 🔴 +1.62 kB
assets/useRangeEditor-BKvQ6Dey.js (new) 3.29 kB 🔴 +3.29 kB 🔴 +1.16 kB 🔴 +1.05 kB
assets/ComfyHubPublishDialog-C3pZyktr.js (new) 143 B 🔴 +143 B 🔴 +105 B 🔴 +89 B
assets/ComfyHubPublishDialog-CB-jGoFl.js (removed) 143 B 🟢 -143 B 🟢 -105 B 🟢 -93 B
assets/useSubscriptionDialog-Cpu7sDEh.js (new) 108 B 🔴 +108 B 🔴 +102 B 🔴 +90 B
assets/useSubscriptionDialog-EfmIlsoH.js (removed) 108 B 🟢 -108 B 🟢 -102 B 🟢 -93 B

Status: 6 added / 5 removed / 1 unchanged

UI Components — 70.7 kB (baseline 64.8 kB) • 🔴 +5.89 kB

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-C3KxAiCA.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.77 kB 🔴 +3.34 kB
assets/ComfyQueueButton-D9baAEh2.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.76 kB 🟢 -3.34 kB
assets/useTerminalTabs-D9ioTRRp.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.72 kB 🟢 -3.29 kB
assets/useTerminalTabs-sxt1RVOY.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.72 kB 🔴 +3.29 kB
assets/InviteMembersForm-B1UZTOzy.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.68 kB 🟢 -2.39 kB
assets/InviteMembersForm-C_p_V67s.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.67 kB 🔴 +2.39 kB
assets/WidgetInputNumberInput-BDTCTMms.js (new) 5.89 kB 🔴 +5.89 kB 🔴 +2.1 kB 🔴 +1.88 kB
assets/SubscribeButton-CyZQ9tBp.js (new) 2.18 kB 🔴 +2.18 kB 🔴 +986 B 🔴 +862 B
assets/SubscribeButton-ik8Qx8jQ.js (removed) 2.18 kB 🟢 -2.18 kB 🟢 -988 B 🟢 -864 B
assets/cloudFeedbackTopbarButton-BPmuef8-.js (new) 768 B 🔴 +768 B 🔴 +451 B 🔴 +379 B
assets/cloudFeedbackTopbarButton-DVecPQbn.js (removed) 768 B 🟢 -768 B 🟢 -452 B 🟢 -411 B
assets/ComfyQueueButton-C3uxd6cY.js (new) 128 B 🔴 +128 B 🔴 +99 B 🔴 +90 B
assets/ComfyQueueButton-PlVg1-BR.js (removed) 128 B 🟢 -128 B 🟢 -99 B 🟢 -90 B

Status: 7 added / 6 removed / 8 unchanged

Data & Services — 3.42 MB (baseline 3.42 MB) • 🔴 +2.19 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settingStore-BeQ_mUda.js (new) 3.15 MB 🔴 +3.15 MB 🔴 +730 kB 🔴 +550 kB
assets/settingStore-CpHIULBI.js (removed) 3.15 MB 🟢 -3.15 MB 🟢 -729 kB 🟢 -549 kB
assets/load3dService-CfIFLWsF.js (new) 132 kB 🔴 +132 kB 🔴 +29.2 kB 🔴 +24.6 kB
assets/load3dService-Crmlpzva.js (removed) 132 kB 🟢 -132 kB 🟢 -29.2 kB 🟢 -24.6 kB
assets/api-Cf-_NNkp.js (removed) 91.4 kB 🟢 -91.4 kB 🟢 -25.3 kB 🟢 -21.7 kB
assets/api-CnwCu0Tk.js (new) 91.4 kB 🔴 +91.4 kB 🔴 +25.3 kB 🔴 +21.8 kB
assets/workflowShareService-ChASb-a8.js (new) 16.5 kB 🔴 +16.5 kB 🔴 +4.92 kB 🔴 +4.36 kB
assets/workflowShareService-DHv3C81N.js (removed) 16.5 kB 🟢 -16.5 kB 🟢 -4.92 kB 🟢 -4.36 kB
assets/keybindingService-DhgLUkre.js (new) 7.28 kB 🔴 +7.28 kB 🔴 +1.89 kB 🔴 +1.62 kB
assets/keybindingService-ZEhjMk7R.js (removed) 7.28 kB 🟢 -7.28 kB 🟢 -1.9 kB 🟢 -1.62 kB
assets/releaseStore-BWYial9Z.js (removed) 6.77 kB 🟢 -6.77 kB 🟢 -2.06 kB 🟢 -1.8 kB
assets/releaseStore-DkfybgoV.js (new) 6.77 kB 🔴 +6.77 kB 🔴 +2.06 kB 🔴 +1.8 kB
assets/systemStatsStore-Ba2ZnlmJ.js (new) 4.99 kB 🔴 +4.99 kB 🔴 +1.77 kB 🔴 +1.5 kB
assets/systemStatsStore-D0sPpudS.js (removed) 4.99 kB 🟢 -4.99 kB 🟢 -1.77 kB 🟢 -1.5 kB
assets/userStore-D2aHHYMC.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -930 B 🟢 -826 B
assets/userStore-D34-6Tdk.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +927 B 🔴 +818 B
assets/audioService-D6RiZq5F.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -862 B 🟢 -747 B
assets/audioService-ifj_1mLh.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +861 B 🔴 +750 B
assets/dialogService-B5M_nyYk.js (new) 98 B 🔴 +98 B 🔴 +97 B 🔴 +88 B
assets/dialogService-Ck3HYUHk.js (removed) 98 B 🟢 -98 B 🟢 -97 B 🟢 -97 B
assets/releaseStore-C-Xz1ZQm.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -82 B
assets/releaseStore-D2b6KCoa.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +88 B
assets/settingStore-BjsGHE4i.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -89 B
assets/settingStore-DfPl88Cf.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +82 B
assets/assetsStore-B9B5AZCz.js (removed) 94 B 🟢 -94 B 🟢 -92 B 🟢 -83 B
assets/assetsStore-Ciceo0Gz.js (new) 94 B 🔴 +94 B 🔴 +92 B 🔴 +83 B
assets/api-N0cbkDU1.js (new) 62 B 🔴 +62 B 🔴 +74 B 🔴 +66 B
assets/api-w9hJJ97x.js (removed) 62 B 🟢 -62 B 🟢 -74 B 🟢 -66 B

Status: 14 added / 14 removed / 3 unchanged

Utilities & Hooks — 384 kB (baseline 369 kB) • 🔴 +15.1 kB

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-BQOQPqlZ.js (removed) 235 kB 🟢 -235 kB 🟢 -52.5 kB 🟢 -42.7 kB
assets/useConflictDetection-DYptcZL4.js (new) 235 kB 🔴 +235 kB 🔴 +52.5 kB 🔴 +42.7 kB
assets/useLoad3d-Cpmnv2Ys.js (removed) 25.8 kB 🟢 -25.8 kB 🟢 -5.82 kB 🟢 -5.15 kB
assets/useLoad3d-DldnqyTd.js (new) 25.8 kB 🔴 +25.8 kB 🔴 +5.82 kB 🔴 +5.15 kB
assets/useLoad3dViewer-D-ZVg5m0.js (removed) 21.3 kB 🟢 -21.3 kB 🟢 -5 kB 🟢 -4.38 kB
assets/useLoad3dViewer-DJCCJfgf.js (new) 21.3 kB 🔴 +21.3 kB 🔴 +5 kB 🔴 +4.38 kB
assets/useImageCrop-hf8wyvri.js (new) 15.1 kB 🔴 +15.1 kB 🔴 +3.45 kB 🔴 +3.02 kB
assets/useFeatureFlags-CmJS7siG.js (removed) 7.26 kB 🟢 -7.26 kB 🟢 -2.17 kB 🟢 -1.83 kB
assets/useFeatureFlags-GSp4a2Ky.js (new) 7.26 kB 🔴 +7.26 kB 🔴 +2.17 kB 🔴 +1.84 kB
assets/useDowngradeToPersonal-eZkh-5yD.js (removed) 5.9 kB 🟢 -5.9 kB 🟢 -1.8 kB 🟢 -1.57 kB
assets/useDowngradeToPersonal-VGBaEPXW.js (new) 5.9 kB 🔴 +5.9 kB 🔴 +1.8 kB 🔴 +1.57 kB
assets/useExternalLink-C2SajffW.js (new) 2.87 kB 🔴 +2.87 kB 🔴 +1.09 kB 🔴 +945 B
assets/useExternalLink-D5II54f4.js (removed) 2.87 kB 🟢 -2.87 kB 🟢 -1.09 kB 🟢 -947 B
assets/downloadUtil-C2PGoo71.js (new) 2.45 kB 🔴 +2.45 kB 🔴 +1.11 kB 🔴 +901 B
assets/downloadUtil-DahO98Sa.js (removed) 2.45 kB 🟢 -2.45 kB 🟢 -1.11 kB 🟢 -898 B
assets/assetPreviewUtil-BGdUjLxY.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1 kB 🟢 -873 B
assets/assetPreviewUtil-ChudPO5F.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1 kB 🔴 +871 B
assets/useUpstreamValue-BZES9wKn.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +787 B 🔴 +701 B
assets/useUpstreamValue-D8A-LXKN.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -788 B 🟢 -703 B
assets/useWorkspaceTierLabel-BEoJ4n83.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +847 B 🔴 +726 B
assets/useWorkspaceTierLabel-DxrcH-BO.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -844 B 🟢 -728 B
assets/useErrorHandling-mWe1Mlf7.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -646 B 🟢 -547 B
assets/useErrorHandling-RZuPgwTQ.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +646 B 🔴 +547 B
assets/subscriptionCheckoutUtil-BCzEOuTJ.js (new) 903 B 🔴 +903 B 🔴 +534 B 🔴 +456 B
assets/subscriptionCheckoutUtil-J9TkF82y.js (removed) 903 B 🟢 -903 B 🟢 -537 B 🟢 -455 B
assets/useSessionCookie-Bt2GtnOg.js (removed) 746 B 🟢 -746 B 🟢 -388 B 🟢 -336 B
assets/useSessionCookie-CozX3MGN.js (new) 746 B 🔴 +746 B 🔴 +390 B 🔴 +339 B
assets/useLoad3d-C_KxukuU.js (removed) 311 B 🟢 -311 B 🟢 -162 B 🟢 -147 B
assets/useLoad3d-D9JpDX_r.js (new) 311 B 🔴 +311 B 🔴 +162 B 🔴 +146 B
assets/useSessionCookie-BMEQaqrM.js (new) 101 B 🔴 +101 B 🔴 +86 B 🔴 +80 B
assets/useSessionCookie-DyH8BRMf.js (removed) 101 B 🟢 -101 B 🟢 -86 B 🟢 -85 B
assets/useFeatureFlags-4jXVMEov.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +84 B
assets/useFeatureFlags-C-MA-0bD.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -79 B
assets/useLoad3dViewer-CZ8Yeeeg.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -86 B
assets/useLoad3dViewer-DMhHuY3f.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +84 B
assets/useCurrentUser-BjbFi01H.js (removed) 94 B 🟢 -94 B 🟢 -95 B 🟢 -85 B
assets/useCurrentUser-rRFz5Cch.js (new) 94 B 🔴 +94 B 🔴 +95 B 🔴 +82 B

Status: 19 added / 18 removed / 17 unchanged

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

External libraries and shared vendor chunks

Status: 16 unchanged

Other — 12.5 MB (baseline 12.5 MB) • 🔴 +41.3 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/main-Cc-lvgfd.js (new) 195 kB 🔴 +195 kB 🔴 +57.2 kB 🔴 +48.1 kB
assets/main-CNXm6Bpt.js (removed) 195 kB 🟢 -195 kB 🟢 -57 kB 🟢 -47.9 kB
assets/core-D6Qjufox.js (new) 111 kB 🔴 +111 kB 🔴 +28.7 kB 🔴 +24.3 kB
assets/core-Joe3u90m.js (removed) 111 kB 🟢 -111 kB 🟢 -28.7 kB 🟢 -24.3 kB
assets/WidgetSelect-BpkdWrkg.js (new) 88 kB 🔴 +88 kB 🔴 +19.9 kB 🔴 +17.1 kB
assets/WidgetSelect-h0RqTUfB.js (removed) 88 kB 🟢 -88 kB 🟢 -20 kB 🟢 -17.1 kB
assets/Load3D-Ba2-03Q3.js (removed) 71.3 kB 🟢 -71.3 kB 🟢 -11.7 kB 🟢 -10 kB
assets/Load3D-BbAzKCjV.js (new) 71.3 kB 🔴 +71.3 kB 🔴 +11.7 kB 🔴 +10 kB
assets/WidgetVideoEdit-B6TkIkhe.js (new) 63.5 kB 🔴 +63.5 kB 🔴 +14.6 kB 🔴 +12.9 kB
assets/WorkspaceSettingsPanelContent-D51QxzyI.js (removed) 61.6 kB 🟢 -61.6 kB 🟢 -13.2 kB 🟢 -11.5 kB
assets/WorkspaceSettingsPanelContent-glrYR58a.js (new) 61.6 kB 🔴 +61.6 kB 🔴 +13.2 kB 🔴 +11.5 kB
assets/Preview3d-CCE1jPmI.js (removed) 50.9 kB 🟢 -50.9 kB 🟢 -8.34 kB 🟢 -7.26 kB
assets/Preview3d-il9BpOMF.js (new) 50.9 kB 🔴 +50.9 kB 🔴 +8.34 kB 🔴 +7.27 kB
assets/main-C-01b7C2.js (new) 46.7 kB 🔴 +46.7 kB 🔴 +13.8 kB 🔴 +11.9 kB
assets/main-D74HssDn.js (removed) 46.7 kB 🟢 -46.7 kB 🟢 -13.8 kB 🟢 -11.9 kB
assets/SubscriptionTransitionPreviewWorkspace-BhAqr7zo.js (new) 45.4 kB 🔴 +45.4 kB 🔴 +9.65 kB 🔴 +8.45 kB
assets/SubscriptionTransitionPreviewWorkspace-e_najudi.js (removed) 45.4 kB 🟢 -45.4 kB 🟢 -9.64 kB 🟢 -8.46 kB
assets/SubscriptionRequiredDialogContentUnified-BO1P67br.js (new) 42.1 kB 🔴 +42.1 kB 🔴 +9.37 kB 🔴 +8.18 kB
assets/SubscriptionRequiredDialogContentUnified-DLZAA8xq.js (removed) 42.1 kB 🟢 -42.1 kB 🟢 -9.37 kB 🟢 -8.16 kB
assets/MembersPanelContent-C5SlxPQQ.js (removed) 41.9 kB 🟢 -41.9 kB 🟢 -8.8 kB 🟢 -7.84 kB
assets/MembersPanelContent-DKlTqqRI.js (new) 41.9 kB 🔴 +41.9 kB 🔴 +8.8 kB 🔴 +7.84 kB
assets/WidgetBoundingBoxes-C3CXx-zO.js (new) 33.8 kB 🔴 +33.8 kB 🔴 +9.19 kB 🔴 +8.16 kB
assets/WidgetBoundingBoxes-Dxpax5P9.js (removed) 33.8 kB 🟢 -33.8 kB 🟢 -9.19 kB 🟢 -8.16 kB
assets/WidgetPainter-B1lWLGf6.js (removed) 32.7 kB 🟢 -32.7 kB 🟢 -7.9 kB 🟢 -7 kB
assets/WidgetPainter-jJV-LpEx.js (new) 32.7 kB 🔴 +32.7 kB 🔴 +7.9 kB 🔴 +6.98 kB
assets/Load3dViewerContent-2Xs8uOh2.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -6.29 kB 🟢 -5.45 kB
assets/Load3dViewerContent-feOCdY8i.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +6.29 kB 🔴 +5.46 kB
assets/HdrViewerContent-Be88y8Qa.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +8.28 kB 🔴 +7.3 kB
assets/HdrViewerContent-FoIdcV40.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -8.28 kB 🟢 -7.3 kB
assets/SubscriptionPanelContentWorkspace-BfEM2RpP.js (removed) 26.6 kB 🟢 -26.6 kB 🟢 -6.21 kB 🟢 -5.45 kB
assets/SubscriptionPanelContentWorkspace-Db7VKdEj.js (new) 26.6 kB 🔴 +26.6 kB 🔴 +6.21 kB 🔴 +5.45 kB
assets/SubscriptionRequiredDialogContent-CFbJznN5.js (new) 26.1 kB 🔴 +26.1 kB 🔴 +6.17 kB 🔴 +5.44 kB
assets/SubscriptionRequiredDialogContent-yXr64P3t.js (removed) 26.1 kB 🟢 -26.1 kB 🟢 -6.17 kB 🟢 -5.43 kB
assets/SubscriptionRequiredDialogContentWorkspace-AmwcYY21.js (removed) 24.9 kB 🟢 -24.9 kB 🟢 -5.76 kB 🟢 -5.07 kB
assets/SubscriptionRequiredDialogContentWorkspace-kwue3cWt.js (new) 24.9 kB 🔴 +24.9 kB 🔴 +5.76 kB 🔴 +5.05 kB
assets/WidgetImageCrop-BJufwRZF.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.75 kB 🟢 -5.04 kB
assets/load3d-Df_x87RB.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.43 kB 🔴 +4.69 kB
assets/load3d-Dzr5emKF.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.43 kB 🟢 -4.69 kB
assets/CurrentUserPopoverWorkspace-B-WiGAgb.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -4.71 kB 🟢 -4.19 kB
assets/CurrentUserPopoverWorkspace-nLF4hBQd.js (new) 20.5 kB 🔴 +20.5 kB 🔴 +4.71 kB 🔴 +4.19 kB
assets/SignInContent-DjThtZ8G.js (removed) 20.3 kB 🟢 -20.3 kB 🟢 -5.13 kB 🟢 -4.48 kB
assets/SignInContent-ZXoLf8Bi.js (new) 20.3 kB 🔴 +20.3 kB 🔴 +5.13 kB 🔴 +4.47 kB
assets/WidgetInputNumber-ZTHK_km-.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.83 kB 🟢 -4.29 kB
assets/CreditsTile-C1e90Skg.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -4.57 kB 🟢 -4.03 kB
assets/CreditsTile-CNoft8R0.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +4.57 kB 🔴 +4.03 kB
assets/WidgetRange-SJNjAi3h.js (removed) 16.7 kB 🟢 -16.7 kB 🟢 -4.31 kB 🟢 -3.86 kB
assets/WidgetRecordAudio-CEXZgF6g.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.63 kB 🟢 -4.13 kB
assets/WidgetRecordAudio-DmUwS19R.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.63 kB 🔴 +4.13 kB
assets/WidgetInputNumber-DjDQSqId.js (new) 14 kB 🔴 +14 kB 🔴 +3.67 kB 🔴 +3.24 kB
assets/WidgetRange-BCc42S7B.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.57 kB 🔴 +3.15 kB
assets/WaveAudioPlayer-6n9Fu-kN.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.49 kB 🔴 +3.06 kB
assets/WaveAudioPlayer-CnA5vjFc.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.5 kB 🟢 -3.06 kB
assets/i18n-CuDDk8VH.js (removed) 12.6 kB 🟢 -12.6 kB 🟢 -3.34 kB 🟢 -2.81 kB
assets/i18n-D-ODlGas.js (new) 12.6 kB 🔴 +12.6 kB 🔴 +3.33 kB 🔴 +2.79 kB
assets/WidgetCurve-B2rjvi9Q.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.51 kB 🟢 -3.17 kB
assets/WidgetCurve-CySIxpT9.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.5 kB 🔴 +3.16 kB
assets/AudioPreviewPlayer-Cz1AegVz.js (removed) 10.6 kB 🟢 -10.6 kB 🟢 -3.08 kB 🟢 -2.75 kB
assets/AudioPreviewPlayer-DJZqlrXh.js (new) 10.6 kB 🔴 +10.6 kB 🔴 +3.08 kB 🔴 +2.76 kB
assets/TeamWorkspacesDialogContent-0lmNOsl2.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +3 kB 🔴 +2.66 kB
assets/TeamWorkspacesDialogContent-bdkWOaBc.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -3 kB 🟢 -2.66 kB
assets/onboardingCloudRoutes-CD2C-6zf.js (removed) 9.02 kB 🟢 -9.02 kB 🟢 -2.76 kB 🟢 -2.39 kB
assets/onboardingCloudRoutes-Dj9ca1_p.js (new) 9.02 kB 🔴 +9.02 kB 🔴 +2.77 kB 🔴 +2.38 kB
assets/Load3DConfiguration-Cf9HRJo3.js (new) 8.97 kB 🔴 +8.97 kB 🔴 +2.63 kB 🔴 +2.32 kB
assets/Load3DConfiguration-sKuo6_h9.js (removed) 8.97 kB 🟢 -8.97 kB 🟢 -2.63 kB 🟢 -2.32 kB
assets/WidgetImageCrop-SACmfwuV.js (new) 8.55 kB 🔴 +8.55 kB 🔴 +2.68 kB 🔴 +2.37 kB
assets/SetMemberCreditLimitDialogContent-azn2Epnx.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.37 kB 🟢 -2.07 kB
assets/SetMemberCreditLimitDialogContent-CwlSQoKJ.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.37 kB 🔴 +2.07 kB
assets/nodeTemplates-B9ISkR5f.js (new) 8.33 kB 🔴 +8.33 kB 🔴 +2.87 kB 🔴 +2.53 kB
assets/nodeTemplates-C1mzIhNM.js (removed) 8.33 kB 🟢 -8.33 kB 🟢 -2.87 kB 🟢 -2.54 kB
assets/NightlySurveyController-BIuXn4eK.js (new) 7.56 kB 🔴 +7.56 kB 🔴 +2.59 kB 🔴 +2.28 kB
assets/NightlySurveyController-BroSC1AZ.js (removed) 7.56 kB 🟢 -7.56 kB 🟢 -2.59 kB 🟢 -2.28 kB
assets/WidgetWithControl-C1IFF8pA.js (new) 6.37 kB 🔴 +6.37 kB 🔴 +2.59 kB 🔴 +2.32 kB
assets/WidgetWithControl-CdV01juI.js (removed) 6.37 kB 🟢 -6.37 kB 🟢 -2.59 kB 🟢 -2.3 kB
assets/tierBenefits-C8rCniju.js (removed) 6.25 kB 🟢 -6.25 kB 🟢 -2 kB 🟢 -1.74 kB
assets/tierBenefits-vlNz7_EK.js (new) 6.25 kB 🔴 +6.25 kB 🔴 +2 kB 🔴 +1.74 kB
assets/CancelSubscriptionDialogContent-BPC_w9BB.js (new) 5.98 kB 🔴 +5.98 kB 🔴 +2.03 kB 🔴 +1.79 kB
assets/CancelSubscriptionDialogContent-Cb2D9ofF.js (removed) 5.98 kB 🟢 -5.98 kB 🟢 -2.04 kB 🟢 -1.79 kB
assets/load3dPreviewExtensions-D7E11lCL.js (removed) 5.94 kB 🟢 -5.94 kB 🟢 -1.84 kB 🟢 -1.62 kB
assets/load3dPreviewExtensions-D7s553-p.js (new) 5.94 kB 🔴 +5.94 kB 🔴 +1.84 kB 🔴 +1.62 kB
assets/main-hQS29BSI.js (removed) 5.91 kB 🟢 -5.91 kB 🟢 -1.9 kB 🟢 -1.6 kB
assets/main-kdhhLjSq.js (new) 5.91 kB 🔴 +5.91 kB 🔴 +1.89 kB 🔴 +1.61 kB
assets/CreateWorkspaceDialogContent-CtPiuBpu.js (removed) 5.19 kB 🟢 -5.19 kB 🟢 -1.83 kB 🟢 -1.58 kB
assets/CreateWorkspaceDialogContent-oYin0xHt.js (new) 5.19 kB 🔴 +5.19 kB 🔴 +1.82 kB 🔴 +1.58 kB
assets/ChangeMemberRoleDialogContent-CnJVqLhQ.js (new) 5.04 kB 🔴 +5.04 kB 🔴 +1.67 kB 🔴 +1.45 kB
assets/ChangeMemberRoleDialogContent-DcndEtdU.js (removed) 5.04 kB 🟢 -5.04 kB 🟢 -1.67 kB 🟢 -1.46 kB
assets/missingModelDownload-COUevD6J.js (new) 5.03 kB 🔴 +5.03 kB 🔴 +1.95 kB 🔴 +1.7 kB
assets/missingModelDownload-JTXXWlk0.js (removed) 5.03 kB 🟢 -5.03 kB 🟢 -1.95 kB 🟢 -1.7 kB
assets/EditWorkspaceDialogContent-BQWty8SP.js (removed) 5 kB 🟢 -5 kB 🟢 -1.79 kB 🟢 -1.55 kB
assets/EditWorkspaceDialogContent-Cho1uwTa.js (new) 5 kB 🔴 +5 kB 🔴 +1.79 kB 🔴 +1.55 kB
assets/WidgetTextarea-CHTVv_jm.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.9 kB 🟢 -1.66 kB
assets/WidgetTextarea-E84fRqhn.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.9 kB 🔴 +1.66 kB
assets/saveMesh-C5htNjTv.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.55 kB 🟢 -1.37 kB
assets/saveMesh-DJSJ-xk0.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.55 kB 🔴 +1.37 kB
assets/WorkspacePanelContent-BiPJL2rH.js (removed) 4.78 kB 🟢 -4.78 kB 🟢 -1.63 kB 🟢 -1.43 kB
assets/WorkspacePanelContent-CZTTzAs4.js (new) 4.78 kB 🔴 +4.78 kB 🔴 +1.63 kB 🔴 +1.43 kB
assets/InviteMemberDialogContent-BP2qHycT.js (removed) 4.75 kB 🟢 -4.75 kB 🟢 -1.62 kB 🟢 -1.4 kB
assets/InviteMemberDialogContent-DR6mlobc.js (new) 4.75 kB 🔴 +4.75 kB 🔴 +1.61 kB 🔴 +1.41 kB
assets/ValueControlPopover-DtCMsOtq.js (removed) 4.54 kB 🟢 -4.54 kB 🟢 -1.58 kB 🟢 -1.42 kB
assets/ValueControlPopover-gJ5KARLo.js (new) 4.54 kB 🔴 +4.54 kB 🔴 +1.58 kB 🔴 +1.41 kB
assets/ApiNodesSignInContent-CCbzZdbY.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.34 kB 🔴 +1.18 kB
assets/ApiNodesSignInContent-Cka-1tT2.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.34 kB 🟢 -1.18 kB
assets/DeleteWorkspaceDialogContent-C3LAZkyb.js (removed) 3.91 kB 🟢 -3.91 kB 🟢 -1.48 kB 🟢 -1.26 kB
assets/DeleteWorkspaceDialogContent-CMofcHEu.js (new) 3.91 kB 🔴 +3.91 kB 🔴 +1.47 kB 🔴 +1.26 kB
assets/LeaveWorkspaceDialogContent-b9HthEhL.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.42 kB 🟢 -1.21 kB
assets/LeaveWorkspaceDialogContent-CtZFUM8x.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.41 kB 🔴 +1.22 kB
assets/RemoveMemberDialogContent-CVb0wk2l.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.37 kB 🔴 +1.2 kB
assets/RemoveMemberDialogContent-DRF7LToy.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.37 kB 🟢 -1.18 kB
assets/RevokeInviteDialogContent-C3AjP3zN.js (new) 3.62 kB 🔴 +3.62 kB 🔴 +1.38 kB 🔴 +1.2 kB
assets/RevokeInviteDialogContent-CIVsjh9Q.js (removed) 3.62 kB 🟢 -3.62 kB 🟢 -1.38 kB 🟢 -1.2 kB
assets/WidgetToggleSwitch-EmmLgHJL.js (removed) 3.58 kB 🟢 -3.58 kB 🟢 -1.32 kB 🟢 -1.16 kB
assets/WidgetToggleSwitch-D8b3Ab39.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.32 kB 🔴 +1.16 kB
assets/InviteMemberUpsellDialogContent-BfoiGQTw.js (removed) 3.51 kB 🟢 -3.51 kB 🟢 -1.26 kB 🟢 -1.1 kB
assets/InviteMemberUpsellDialogContent-DxS6xFxa.js (new) 3.51 kB 🔴 +3.51 kB 🔴 +1.26 kB 🔴 +1.1 kB
assets/workspaceCheckoutTelemetry-B2dyNMfR.js (removed) 3.46 kB 🟢 -3.46 kB 🟢 -1.55 kB 🟢 -1.35 kB
assets/workspaceCheckoutTelemetry-BHjuih1a.js (new) 3.46 kB 🔴 +3.46 kB 🔴 +1.55 kB 🔴 +1.35 kB
assets/Media3DTop-BRWAMGTC.js (new) 3.26 kB 🔴 +3.26 kB 🔴 +1.29 kB 🔴 +1.13 kB
assets/Media3DTop-D3X72bmm.js (removed) 3.26 kB 🟢 -3.26 kB 🟢 -1.29 kB 🟢 -1.13 kB
assets/GlobalToast-CWYMm80S.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.25 kB 🟢 -1.11 kB
assets/GlobalToast-D-StxtEJ.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.25 kB 🔴 +1.07 kB
assets/load3dAdvanced-Bp1ld10M.js (new) 2.87 kB 🔴 +2.87 kB 🔴 +1.12 kB 🔴 +979 B
assets/load3dAdvanced-t8v9pYVa.js (removed) 2.87 kB 🟢 -2.87 kB 🟢 -1.13 kB 🟢 -976 B
assets/SubscribeToRun-C57sFxjE.js (removed) 2.45 kB 🟢 -2.45 kB 🟢 -1.06 kB 🟢 -942 B
assets/SubscribeToRun-CMs7T-bE.js (new) 2.45 kB 🔴 +2.45 kB 🔴 +1.06 kB 🔴 +924 B
assets/MediaAudioTop-Bf_yymMI.js (new) 1.67 kB 🔴 +1.67 kB 🔴 +837 B 🔴 +692 B
assets/MediaAudioTop-BWM2Hdmw.js (removed) 1.67 kB 🟢 -1.67 kB 🟢 -837 B 🟢 -694 B
assets/signInSchema-BXNoJLz0.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +583 B 🔴 +512 B
assets/signInSchema-YIDw4H1V.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -585 B 🟢 -551 B
assets/CloudRunButtonWrapper-DVqs74yb.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -548 B 🟢 -485 B
assets/CloudRunButtonWrapper-OTMsykmX.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +545 B 🔴 +478 B
assets/cloudSessionCookie-Chug2AdZ.js (removed) 989 B 🟢 -989 B 🟢 -461 B 🟢 -416 B
assets/cloudSessionCookie-DVuZaW69.js (new) 989 B 🔴 +989 B 🔴 +467 B 🔴 +421 B
assets/cloudBadges-BRrn1bf2.js (removed) 971 B 🟢 -971 B 🟢 -546 B 🟢 -461 B
assets/cloudBadges-Sf096Vrr.js (new) 971 B 🔴 +971 B 🔴 +545 B 🔴 +462 B
assets/Load3DAdvanced-CQJL1mi2.js (removed) 813 B 🟢 -813 B 🟢 -454 B 🟢 -408 B
assets/Load3DAdvanced-CxYtLlQY.js (new) 813 B 🔴 +813 B 🔴 +453 B 🔴 +397 B
assets/nightlyBadges-B7WnC7Oh.js (new) 462 B 🔴 +462 B 🔴 +302 B 🔴 +251 B
assets/nightlyBadges-BL-IfMEn.js (removed) 462 B 🟢 -462 B 🟢 -303 B 🟢 -250 B
assets/missingModelDownload-C5dYPqwp.js (new) 228 B 🔴 +228 B 🔴 +150 B 🔴 +132 B
assets/missingModelDownload-w7Ndz1pb.js (removed) 228 B 🟢 -228 B 🟢 -149 B 🟢 -128 B
assets/SubscriptionPanelContentWorkspace-BsrU_HY7.js (removed) 179 B 🟢 -179 B 🟢 -117 B 🟢 -94 B
assets/SubscriptionPanelContentWorkspace-DOh6pb_a.js (new) 179 B 🔴 +179 B 🔴 +117 B 🔴 +90 B
assets/Load3dViewerContent-DePXFGu0.js (removed) 137 B 🟢 -137 B 🟢 -103 B 🟢 -91 B
assets/Load3dViewerContent-DW1iEBGV.js (new) 137 B 🔴 +137 B 🔴 +103 B 🔴 +92 B
assets/WidgetToggleSwitch-B709MDcS.js (new) 134 B 🔴 +134 B 🔴 +101 B 🔴 +101 B
assets/Load3DAdvanced-DAeZZ1tc.js (new) 122 B 🔴 +122 B 🔴 +97 B 🔴 +90 B
assets/Load3DAdvanced-j_bSrlQL.js (removed) 122 B 🟢 -122 B 🟢 -97 B 🟢 -88 B
assets/WidgetLegacy-BJhu6ybw.js (removed) 117 B 🟢 -117 B 🟢 -106 B 🟢 -103 B
assets/WidgetLegacy-muKXKsK_.js (new) 117 B 🔴 +117 B 🔴 +106 B 🔴 +101 B
assets/workflowDraftStoreV2-BKoEd2IT.js (removed) 112 B 🟢 -112 B 🟢 -101 B 🟢 -110 B
assets/workflowDraftStoreV2-C-0BdcAT.js (new) 112 B 🔴 +112 B 🔴 +101 B 🔴 +107 B
assets/Load3D-C7cQgVda.js (removed) 98 B 🟢 -98 B 🟢 -89 B 🟢 -80 B
assets/Load3D-o8XH12sn.js (new) 98 B 🔴 +98 B 🔴 +89 B 🔴 +79 B
assets/i18n-CUNO7g3G.js (new) 97 B 🔴 +97 B 🔴 +92 B 🔴 +84 B
assets/i18n-osX2x87i.js (removed) 97 B 🟢 -97 B 🟢 -92 B 🟢 -89 B
assets/changeTracker-_1sFO9V4.js (new) 91 B 🔴 +91 B 🔴 +93 B 🔴 +87 B
assets/changeTracker-Dll_NdtS.js (removed) 91 B 🟢 -91 B 🟢 -93 B 🟢 -82 B

Status: 79 added / 77 removed / 198 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.5 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 49.9 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.8 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.1 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 62.0 MB heap
large-graph-pan: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.4 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.4 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.7 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.6 MB heap
subgraph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.2 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 51.8 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 138ms TBT · 95.6 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 66.2 MB heap
vue-large-graph-idle: · 55.4 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 163.3 MB heap
vue-large-graph-pan: · 55.4 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 984ms TBT · 151.9 MB heap
workflow-execution: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.7 MB heap

⚠️ 11 regressions detected

Show regressions
Metric Baseline PR (median) Δ Sig
canvas-idle: task duration 343ms 591ms +73% ⚠️ z=6.3
canvas-mouse-sweep: task duration 600ms 1015ms +69% ⚠️ z=2.6
canvas-zoom-sweep: task duration 273ms 469ms +72% ⚠️ z=6.2
dom-widget-clipping: task duration 267ms 427ms +60% ⚠️ z=3.8
large-graph-idle: task duration 487ms 820ms +69% ⚠️ z=5.1
large-graph-idle: script duration 62ms 125ms +102% ⚠️ z=2.1
large-graph-pan: task duration 884ms 1370ms +55% ⚠️ z=6.7
minimap-idle: task duration 472ms 857ms +81% ⚠️ z=7.0
minimap-idle: script duration 59ms 136ms +131% ⚠️ z=3.8
subgraph-dom-widget-clipping: task duration 279ms 440ms +58% ⚠️ z=3.4
subgraph-idle: task duration 328ms 576ms +76% ⚠️ z=6.6
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms +0% z=0.4
canvas-idle: p95 frame time 17ms 17ms -1%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 6ms 8ms +43% z=-3.2
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 10 9 -15% z=-4.7
canvas-idle: task duration 343ms 591ms +73% ⚠️ z=6.3
canvas-idle: script duration 13ms 26ms +100% z=0.2
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 68.3 MB 68.5 MB +0%
canvas-idle: DOM nodes 20 17 -15% z=-4.4
canvas-idle: event listeners 6 4 -33% z=-1.6
canvas-mouse-sweep: avg frame time 17ms 17ms -0% z=-1.5
canvas-mouse-sweep: p95 frame time 17ms 17ms -0%
canvas-mouse-sweep: layout duration 2ms 4ms +69% z=1.3
canvas-mouse-sweep: style recalc duration 21ms 43ms +106% z=0.1
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 72 76 +5% z=-1.4
canvas-mouse-sweep: task duration 600ms 1015ms +69% ⚠️ z=2.6
canvas-mouse-sweep: script duration 71ms 132ms +85% z=-0.6
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 49.9 MB 49.9 MB +0%
canvas-mouse-sweep: DOM nodes -271 -274 +1% z=-130.0
canvas-mouse-sweep: event listeners -146 -148 +1% z=-37.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 +31% z=1.9
canvas-zoom-sweep: style recalc duration 11ms 19ms +70% z=0.2
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 32 31 -3% z=-0.6
canvas-zoom-sweep: task duration 273ms 469ms +72% ⚠️ z=6.2
canvas-zoom-sweep: script duration 14ms 29ms +106% z=0.7
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 71.8 MB 71.8 MB -0%
canvas-zoom-sweep: DOM nodes 79 77 -3% z=-3.5
canvas-zoom-sweep: event listeners 19 19 +0% z=-0.9
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 6ms 10ms +62% z=-0.3
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 13 12 -8% z=-2.2
dom-widget-clipping: task duration 267ms 427ms +60% ⚠️ z=3.8
dom-widget-clipping: script duration 36ms 62ms +74% z=-1.8
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 53.0 MB 53.1 MB +0%
dom-widget-clipping: DOM nodes 22 20 -9% z=-1.5
dom-widget-clipping: event listeners 2 1 -50% variance too high
large-graph-idle: avg frame time 17ms 17ms +0% z=-0.2
large-graph-idle: p95 frame time 17ms 17ms -0%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 6ms 8ms +38% z=-4.2
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 10 8 -20% z=-11.5
large-graph-idle: task duration 487ms 820ms +69% ⚠️ z=5.1
large-graph-idle: script duration 62ms 125ms +102% ⚠️ z=2.1
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 64.3 MB 62.0 MB -3%
large-graph-idle: DOM nodes -273 -276 +1% z=-332.1
large-graph-idle: event listeners -142 -142 +0% z=-27.6
large-graph-pan: avg frame time 17ms 17ms +0% z=0.3
large-graph-pan: p95 frame time 17ms 17ms -0%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 12ms 16ms +29% z=-1.6
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 69 69 -1% z=-1.7
large-graph-pan: task duration 884ms 1370ms +55% ⚠️ z=6.7
large-graph-pan: script duration 273ms 439ms +61% z=1.6
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 61.2 MB 56.4 MB -8%
large-graph-pan: DOM nodes -275 -277 +1% z=-179.1
large-graph-pan: event listeners -144 -144 +0% z=-179.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 9ms +17%
large-graph-zoom: style recalc duration 14ms 16ms +14%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 67 65 -4%
large-graph-zoom: task duration 1062ms 1629ms +53%
large-graph-zoom: script duration 332ms 576ms +73%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 51.6 MB 71.4 MB +38%
large-graph-zoom: DOM nodes 16 -136 -947%
large-graph-zoom: event listeners -146 -70 -52%
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 5ms 8ms +61% z=-1.6
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 10 8 -20% z=-2.3
minimap-idle: task duration 472ms 857ms +81% ⚠️ z=7.0
minimap-idle: script duration 59ms 136ms +131% ⚠️ z=3.8
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 64.4 MB 64.7 MB +0%
minimap-idle: DOM nodes -274 -278 +1% z=-216.9
minimap-idle: event listeners -142 -144 +1% z=-225.0
subgraph-dom-widget-clipping: avg frame time 17ms 17ms -0% z=-0.4
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 7ms 12ms +61% z=-1.2
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 48 47 -3% z=-2.5
subgraph-dom-widget-clipping: task duration 279ms 440ms +58% ⚠️ z=3.4
subgraph-dom-widget-clipping: script duration 77ms 129ms +68% z=0.1
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 53.3 MB 53.6 MB +1%
subgraph-dom-widget-clipping: DOM nodes 22 19 -14% z=-2.8
subgraph-dom-widget-clipping: event listeners 8 8 +0% z=-1.4
subgraph-idle: avg frame time 17ms 17ms -0% z=-0.2
subgraph-idle: p95 frame time 17ms 17ms -0%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 6ms 9ms +37% z=-2.1
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 12 10 -21% z=-2.1
subgraph-idle: task duration 328ms 576ms +76% ⚠️ z=6.6
subgraph-idle: script duration 11ms 22ms +105% z=0.5
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 68.5 MB 68.2 MB -0%
subgraph-idle: DOM nodes 24 19 -21% z=-1.9
subgraph-idle: event listeners 6 4 -33% 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 3ms 5ms +84% z=1.9
subgraph-mouse-sweep: style recalc duration 23ms 41ms +84% z=-0.3
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 77 77 -1% z=-1.9
subgraph-mouse-sweep: task duration 518ms 871ms +68% z=1.5
subgraph-mouse-sweep: script duration 56ms 101ms +80% z=0.0
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 59.5 MB 51.8 MB -13%
subgraph-mouse-sweep: DOM nodes 65 63 -3% z=-1.8
subgraph-mouse-sweep: event listeners 4 -72 -1900% variance too high
subgraph-transition-enter: avg frame time 17ms 17ms -0%
subgraph-transition-enter: p95 frame time 17ms 17ms -1%
subgraph-transition-enter: layout duration 8ms 13ms +62%
subgraph-transition-enter: style recalc duration 22ms 33ms +53%
subgraph-transition-enter: layout count 15 13 -13%
subgraph-transition-enter: style recalc count 19 17 -11%
subgraph-transition-enter: task duration 620ms 1075ms +73%
subgraph-transition-enter: script duration 20ms 43ms +115%
subgraph-transition-enter: TBT 82ms 138ms +68%
subgraph-transition-enter: heap used 92.7 MB 95.6 MB +3%
subgraph-transition-enter: DOM nodes 13673 13673 +0%
subgraph-transition-enter: event listeners 2369 2371 +0%
viewport-pan-sweep: avg frame time 17ms 17ms -0%
viewport-pan-sweep: p95 frame time 17ms 17ms +1%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 37ms 44ms +18%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 249 249 +0%
viewport-pan-sweep: task duration 3124ms 4886ms +56%
viewport-pan-sweep: script duration 928ms 1452ms +57%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 63.5 MB 66.2 MB +4%
viewport-pan-sweep: DOM nodes -273 -277 +1%
viewport-pan-sweep: event listeners -128 -127 -1%
vue-large-graph-idle: avg frame time 17ms 18ms +8%
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 11145ms 18511ms +66%
vue-large-graph-idle: script duration 387ms 599ms +55%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 165.4 MB 163.3 MB -1%
vue-large-graph-idle: DOM nodes -8312 -6670 -20%
vue-large-graph-idle: event listeners -16391 -16386 -0%
vue-large-graph-pan: avg frame time 17ms 18ms +5%
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 15ms 29ms +101%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 66 179 +170%
vue-large-graph-pan: task duration 13525ms 23578ms +74%
vue-large-graph-pan: script duration 646ms 966ms +49%
vue-large-graph-pan: TBT 33ms 984ms +2882%
vue-large-graph-pan: heap used 161.0 MB 151.9 MB -6%
vue-large-graph-pan: DOM nodes -8312 -8312 +0%
vue-large-graph-pan: event listeners -16389 -16379 -0%
workflow-execution: avg frame time 17ms 17ms -0% z=0.1
workflow-execution: p95 frame time 17ms 17ms -0%
workflow-execution: layout duration 1ms 1ms -26% z=-4.9
workflow-execution: style recalc duration 17ms 18ms +9% z=-2.8
workflow-execution: layout count 3 3 -17% z=-4.5
workflow-execution: style recalc count 15 11 -30% z=-3.6
workflow-execution: task duration 97ms 99ms +1% z=-2.2
workflow-execution: script duration 8ms 9ms +15% z=-6.9
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 48.7 MB 57.7 MB +18%
workflow-execution: DOM nodes 123 125 +1% z=-5.1
workflow-execution: event listeners 67 41 -39% z=-2.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-29T14:05:39.913Z",
  "gitSha": "519bf1e8d75a6d6edeac7086ed702e62fae49042",
  "branch": "feat/video-edit-widget",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2069.65299999996,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.667999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 617.419,
      "heapDeltaBytes": 3668040,
      "heapUsedBytes": 71544388,
      "domNodes": 16,
      "jsHeapTotalBytes": 20574208,
      "scriptDurationMs": 26.600999999999996,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-idle",
      "durationMs": 2049.482000000012,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.262000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 565.5779999999999,
      "heapDeltaBytes": 3960272,
      "heapUsedBytes": 72018304,
      "domNodes": 18,
      "jsHeapTotalBytes": 20312064,
      "scriptDurationMs": 24.710000000000004,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1991.7090000000144,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 43.883,
      "layouts": 12,
      "layoutDurationMs": 4.101000000000001,
      "taskDurationMs": 1028.863,
      "heapDeltaBytes": -15421240,
      "heapUsedBytes": 52342812,
      "domNodes": -271,
      "jsHeapTotalBytes": 19390464,
      "scriptDurationMs": 134.24800000000002,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1904.0880000000016,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 42.341,
      "layouts": 12,
      "layoutDurationMs": 3.645,
      "taskDurationMs": 1000.99,
      "heapDeltaBytes": -15567540,
      "heapUsedBytes": 52345212,
      "domNodes": -277,
      "jsHeapTotalBytes": 19914752,
      "scriptDurationMs": 129.668,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1758.2340000000158,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 19.672,
      "layouts": 6,
      "layoutDurationMs": 0.7279999999999999,
      "taskDurationMs": 474.665,
      "heapDeltaBytes": 7114400,
      "heapUsedBytes": 75169980,
      "domNodes": 78,
      "jsHeapTotalBytes": 20574208,
      "scriptDurationMs": 29.531000000000002,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1752.1439999999302,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 19.063,
      "layouts": 6,
      "layoutDurationMs": 0.7300000000000002,
      "taskDurationMs": 464.302,
      "heapDeltaBytes": 7154760,
      "heapUsedBytes": 75308708,
      "domNodes": 75,
      "jsHeapTotalBytes": 20574208,
      "scriptDurationMs": 28.747000000000003,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 612.2500000000173,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 10.340000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 424.76099999999997,
      "heapDeltaBytes": -12351920,
      "heapUsedBytes": 55527540,
      "domNodes": 22,
      "jsHeapTotalBytes": 21884928,
      "scriptDurationMs": 61.784,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 661.5360000000692,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.873000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 429.652,
      "heapDeltaBytes": -12079540,
      "heapUsedBytes": 55874724,
      "domNodes": 18,
      "jsHeapTotalBytes": 21360640,
      "scriptDurationMs": 62.079,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2039.2819999999574,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 8.331000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 825.853,
      "heapDeltaBytes": 6322636,
      "heapUsedBytes": 65062288,
      "domNodes": -275,
      "jsHeapTotalBytes": 5042176,
      "scriptDurationMs": 127.44999999999997,
      "eventListeners": -142,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2030.4370000000063,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.388999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 814.603,
      "heapDeltaBytes": 5966124,
      "heapUsedBytes": 65007268,
      "domNodes": -276,
      "jsHeapTotalBytes": 3993600,
      "scriptDurationMs": 122.662,
      "eventListeners": -142,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2182.307000000037,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 16.522000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1353.259,
      "heapDeltaBytes": -3850824,
      "heapUsedBytes": 55747216,
      "domNodes": -276,
      "jsHeapTotalBytes": 5828608,
      "scriptDurationMs": 435.57500000000005,
      "eventListeners": -142,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2254.997000000003,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 15.518,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1387.2549999999999,
      "heapDeltaBytes": 2601668,
      "heapUsedBytes": 62564616,
      "domNodes": -277,
      "jsHeapTotalBytes": 5246976,
      "scriptDurationMs": 442.137,
      "eventListeners": -146,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3296.2440000000015,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 15.442999999999998,
      "layouts": 60,
      "layoutDurationMs": 8.853,
      "taskDurationMs": 1639.737,
      "heapDeltaBytes": 2696572,
      "heapUsedBytes": 64065208,
      "domNodes": -283,
      "jsHeapTotalBytes": 7401472,
      "scriptDurationMs": 569.199,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3326.4050000000225,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 17.345,
      "layouts": 60,
      "layoutDurationMs": 9.001,
      "taskDurationMs": 1618.364,
      "heapDeltaBytes": 23961000,
      "heapUsedBytes": 85653732,
      "domNodes": 12,
      "jsHeapTotalBytes": 8126464,
      "scriptDurationMs": 583.7439999999999,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2045.6940000000259,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 6.789,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 850.1659999999999,
      "heapDeltaBytes": 7112636,
      "heapUsedBytes": 67845604,
      "domNodes": -279,
      "jsHeapTotalBytes": 3993600,
      "scriptDurationMs": 129.274,
      "eventListeners": -146,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2077.087000000006,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 9.731,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 863.567,
      "heapDeltaBytes": 7165132,
      "heapUsedBytes": 67799816,
      "domNodes": -276,
      "jsHeapTotalBytes": 3469312,
      "scriptDurationMs": 141.845,
      "eventListeners": -142,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 641.2479999999618,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 11.31,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 438.457,
      "heapDeltaBytes": -12003124,
      "heapUsedBytes": 56172224,
      "domNodes": 18,
      "jsHeapTotalBytes": 21884928,
      "scriptDurationMs": 127.017,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 661.5880000000516,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 11.879,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 442.484,
      "heapDeltaBytes": -11787676,
      "heapUsedBytes": 56153688,
      "domNodes": 20,
      "jsHeapTotalBytes": 21622784,
      "scriptDurationMs": 130.6,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2042.1400000000176,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.082999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 555.523,
      "heapDeltaBytes": 3590116,
      "heapUsedBytes": 71704908,
      "domNodes": 20,
      "jsHeapTotalBytes": 20836352,
      "scriptDurationMs": 20.794,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2003.4509999999273,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.516,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 595.972,
      "heapDeltaBytes": 3436720,
      "heapUsedBytes": 71394592,
      "domNodes": 18,
      "jsHeapTotalBytes": 21360640,
      "scriptDurationMs": 22.479000000000003,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1705.9070000000247,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 40.602,
      "layouts": 16,
      "layoutDurationMs": 5.313,
      "taskDurationMs": 829.8810000000001,
      "heapDeltaBytes": -5598360,
      "heapUsedBytes": 62354300,
      "domNodes": 62,
      "jsHeapTotalBytes": 21622784,
      "scriptDurationMs": 99.623,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1759.6019999999726,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 42.281,
      "layouts": 16,
      "layoutDurationMs": 5.33,
      "taskDurationMs": 912.2300000000001,
      "heapDeltaBytes": -21832080,
      "heapUsedBytes": 46188536,
      "domNodes": 64,
      "jsHeapTotalBytes": 21487616,
      "scriptDurationMs": 102.03099999999999,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1433.3430000000362,
      "styleRecalcs": 17,
      "styleRecalcDurationMs": 32.905,
      "layouts": 13,
      "layoutDurationMs": 12.825,
      "taskDurationMs": 1075.251,
      "heapDeltaBytes": 33243332,
      "heapUsedBytes": 100289120,
      "domNodes": 13673,
      "jsHeapTotalBytes": 11272192,
      "scriptDurationMs": 42.852000000000004,
      "eventListeners": 2371,
      "totalBlockingTimeMs": 138,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8343.259000000045,
      "styleRecalcs": 248,
      "styleRecalcDurationMs": 43.351,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4873.677000000001,
      "heapDeltaBytes": 10908880,
      "heapUsedBytes": 69999184,
      "domNodes": -279,
      "jsHeapTotalBytes": 6791168,
      "scriptDurationMs": 1445.144,
      "eventListeners": -128,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333338,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8600.922999999966,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 44.32600000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4898.594,
      "heapDeltaBytes": 10006280,
      "heapUsedBytes": 68819804,
      "domNodes": -274,
      "jsHeapTotalBytes": 6004736,
      "scriptDurationMs": 1459.3149999999998,
      "eventListeners": -126,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18645.606999999985,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 18597.988,
      "heapDeltaBytes": -51623600,
      "heapUsedBytes": 169584036,
      "domNodes": -5028,
      "jsHeapTotalBytes": -7016448,
      "scriptDurationMs": 605.174,
      "eventListeners": -16385,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.330000000000048,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18481.67799999999,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 18423.738,
      "heapDeltaBytes": -38902620,
      "heapUsedBytes": 172849020,
      "domNodes": -8312,
      "jsHeapTotalBytes": -11997184,
      "scriptDurationMs": 592.1690000000001,
      "eventListeners": -16387,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 23533.161000000007,
      "styleRecalcs": 179,
      "styleRecalcDurationMs": 28.876000000000012,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 23485.839,
      "heapDeltaBytes": -47128024,
      "heapUsedBytes": 164253920,
      "domNodes": -8312,
      "jsHeapTotalBytes": -13045760,
      "scriptDurationMs": 934.568,
      "eventListeners": -16377,
      "totalBlockingTimeMs": 853,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 23693.364999999972,
      "styleRecalcs": 178,
      "styleRecalcDurationMs": 29.299999999999994,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 23669.355,
      "heapDeltaBytes": -67193872,
      "heapUsedBytes": 154216812,
      "domNodes": -8312,
      "jsHeapTotalBytes": -14356480,
      "scriptDurationMs": 998.2789999999999,
      "eventListeners": -16381,
      "totalBlockingTimeMs": 1115,
      "frameDurationMs": 18.330000000000048,
      "p95FrameDurationMs": 16.700000000004366
    },
    {
      "name": "workflow-execution",
      "durationMs": 110.6520000000728,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 16.253999999999998,
      "layouts": 2,
      "layoutDurationMs": 0.9830000000000001,
      "taskDurationMs": 79.504,
      "heapDeltaBytes": 2991564,
      "heapUsedBytes": 70036776,
      "domNodes": 132,
      "jsHeapTotalBytes": 2883584,
      "scriptDurationMs": 6.897,
      "eventListeners": 17,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "workflow-execution",
      "durationMs": 476.16099999993367,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 19.810999999999996,
      "layouts": 3,
      "layoutDurationMs": 0.6839999999999999,
      "taskDurationMs": 118.065,
      "heapDeltaBytes": -16078256,
      "heapUsedBytes": 50892804,
      "domNodes": 117,
      "jsHeapTotalBytes": 7729152,
      "scriptDurationMs": 10.629000000000001,
      "eventListeners": 65,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

@github-actions

Copy link
Copy Markdown

🎨 Storybook: 🚧 Building...

@coderabbitai

coderabbitai Bot commented Jul 28, 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

Adds a VIDEO_EDIT widget across schemas, LiteGraph, Vue registration, and node rendering. Implements trim/crop state conversion and a video editing panel with preview, controls, metadata, localization, and tests.

Changes

Video-edit widget contracts and construction

Layer / File(s) Summary
Contracts and widget construction
src/schemas/nodeDef/nodeDefSchemaV2.ts, src/lib/litegraph/src/types/widgets.ts, src/lib/litegraph/src/widgets/*, src/renderer/extensions/vueNodes/widgets/composables/useVideoEditWidget.ts, src/scripts/widgets.ts, src/utils/videoFrameUtil.ts
Defines VIDEO_EDIT schemas and typed widget values, constructs video-edit widgets with feature-specific defaults, updates frame/time conversion parameters, and registers the widget type.
Trim, crop, and enabled-state model
src/composables/video/useVideoEditModel.ts, src/composables/video/useVideoEditModel.test.ts
Converts frame handles and crop bounds to persisted edit values, applies clamping and rounding, and synchronizes section toggles.
Video editing panel
src/components/videoEdit/VideoEditPanel.vue, src/components/videoEdit/VideoEditPanel.test.ts, src/locales/en/main.json
Renders video preview, trim and crop controls, loading state, metadata, resolution, localized labels, and panel behavior tests.
Widget-to-panel integration
src/components/videoEdit/WidgetVideoEdit.vue, src/components/videoEdit/WidgetVideoEdit.test.ts, src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts, src/renderer/extensions/vueNodes/components/LGraphNode.vue
Passes graph-node video metadata and edit models into the panel, registers the Vue widget, expands its layout, and suppresses duplicate video media output.

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

Possibly related PRs

Suggested reviewers: dante01yoon


Important

Pre-merge checks failed

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

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description lacks the required template sections and bullets, so it does not fully satisfy the repository's PR format. Rewrite it using Summary, Changes, Review Focus, and optional Screenshots sections, and add the required What/Breaking/Dependencies bullets.
End-To-End Regression Coverage For Fixes ❓ Inconclusive Commit subjects/title aren’t available in the provided PR metadata, so the bug-fix signal can’t be verified. Please provide the PR title and commit subjects, or restate them in the PR description if you want this check decided.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is specific and matches the main change: adding a rich VIDEO_EDIT widget with trim and crop editors.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Adr Compliance For Entity/Litegraph Changes ✅ Passed LiteGraph changes only add a new widget type/class and registry wiring; no entity mutation, core graph growth, or extension callbacks are introduced.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/video-edit-widget

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

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 4

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

Inline comments:
In `@src/components/videoEdit/VideoEditPanel.test.ts`:
- Around line 122-149: The VideoEditPanel tests lack coverage for the
panel-owned reset start/end frame controls and their disabled-state boundaries.
Extend the trim test flow around the existing trim toggle to locate buttons by
the accessible names “Reset start frame” and “Reset end frame”, verify their
enabled/disabled states for boundary and non-boundary frame values, and click
them to assert the corresponding frame values reset. Keep the test focused on
real panel behavior rather than stub interactions.

In `@src/components/videoEdit/VideoEditPanel.vue`:
- Around line 130-142: Associate the ratio label with the Select control in the
template around selectedRatio: give SelectTrigger a stable id and set the
label’s for attribute to that id, or otherwise provide an equivalent accessible
name. Preserve the existing Select behavior and styling.

In `@src/composables/video/useVideoEditModel.ts`:
- Around line 26-29: Update useVideoEditModel’s frameToTime and timeToFrame
calls to pass the model’s fps ref as the fallback FPS, matching
WidgetVideoEdit.vue’s helper usage. Ensure both toTime and toFrame use the same
fps option when duration or frameMax is unavailable so trim boundaries remain
consistent.

In `@src/schemas/nodeDef/nodeDefSchemaV2.ts`:
- Around line 192-214: The VIDEO_EDIT schema currently accepts negative or
non-finite edit values and defaults can specify disabled features. Update
zVideoEditValue and zVideoEditInputSpec so all trim/crop numeric fields are
finite and non-negative, and validate that each default section is permitted by
the corresponding features entry. Add coverage for negative/non-finite values
and defaults containing unsupported trim or crop sections.
🪄 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: a5c98d19-d854-482c-840d-10a4aa98d969

📥 Commits

Reviewing files that changed from the base of the PR and between 0661299 and 1874e16.

📒 Files selected for processing (17)
  • src/components/videoEdit/VideoEditPanel.test.ts
  • src/components/videoEdit/VideoEditPanel.vue
  • src/components/videoEdit/WidgetVideoEdit.test.ts
  • src/components/videoEdit/WidgetVideoEdit.vue
  • src/composables/video/useVideoEditModel.test.ts
  • src/composables/video/useVideoEditModel.ts
  • src/lib/litegraph/src/types/widgets.ts
  • src/lib/litegraph/src/widgets/VideoEditWidget.ts
  • src/lib/litegraph/src/widgets/widgetMap.ts
  • src/locales/en/main.json
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/index.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useVideoEditWidget.test.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useVideoEditWidget.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • src/schemas/nodeDef/nodeDefSchemaV2.ts
  • src/scripts/widgets.ts

Comment thread src/components/videoEdit/VideoEditPanel.test.ts
Comment thread src/components/videoEdit/VideoEditPanel.vue
Comment thread src/composables/video/useVideoEditModel.ts Outdated
Comment thread src/schemas/nodeDef/nodeDefSchemaV2.ts
@codecov

codecov Bot commented Jul 28, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 90.80000% with 23 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/components/videoEdit/VideoEditPanel.vue 86.36% 18 Missing ⚠️
src/composables/video/useVideoEditModel.ts 97.46% 2 Missing ⚠️
...erer/extensions/vueNodes/components/LGraphNode.vue 66.66% 1 Missing ⚠️
...vueNodes/widgets/composables/useVideoEditWidget.ts 92.30% 1 Missing ⚠️
...nsions/vueNodes/widgets/registry/widgetRegistry.ts 50.00% 1 Missing ⚠️
@@            Coverage Diff             @@
##             main   #14205      +/-   ##
==========================================
- Coverage   79.07%   78.62%   -0.45%     
==========================================
  Files        1750     1758       +8     
  Lines       99329   101365    +2036     
  Branches    32936    32731     -205     
==========================================
+ Hits        78540    79697    +1157     
- Misses      20389    21238     +849     
- Partials      400      430      +30     
Flag Coverage Δ
unit 69.45% <90.80%> (+0.37%) ⬆️

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

Files with missing lines Coverage Δ
src/components/videoEdit/WidgetVideoEdit.vue 100.00% <100.00%> (ø)
src/lib/litegraph/src/types/widgets.ts 83.33% <ø> (ø)
src/lib/litegraph/src/widgets/widgetMap.ts 75.60% <ø> (ø)
src/schemas/nodeDef/nodeDefSchemaV2.ts 92.85% <100.00%> (+0.26%) ⬆️
src/scripts/widgets.ts 80.00% <ø> (ø)
src/utils/videoFrameUtil.ts 100.00% <100.00%> (ø)
...erer/extensions/vueNodes/components/LGraphNode.vue 80.89% <66.66%> (-0.13%) ⬇️
...vueNodes/widgets/composables/useVideoEditWidget.ts 92.30% <92.30%> (ø)
...nsions/vueNodes/widgets/registry/widgetRegistry.ts 70.58% <50.00%> (-0.50%) ⬇️
src/composables/video/useVideoEditModel.ts 97.46% <97.46%> (ø)
... and 1 more

... and 45 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 force-pushed the feat/video-edit-widget branch from 1874e16 to 533a351 Compare July 28, 2026 18:26

@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: 1

🤖 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/videoEdit/VideoEditPanel.test.ts`:
- Around line 180-184: The loading-state test only verifies the spinner and
lacks coverage that crop/trim overlays are suppressed. Extend the `shows a
loading overlay while the filmstrip loads` test using `renderPanel({ loading:
true })` to assert the `VideoCropOverlay` target is absent while preserving the
existing loading-overlay assertion.
🪄 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: 1efe2423-c952-49de-8355-3d5cdee1b940

📥 Commits

Reviewing files that changed from the base of the PR and between 1874e16 and 533a351.

📒 Files selected for processing (17)
  • src/components/videoEdit/VideoEditPanel.test.ts
  • src/components/videoEdit/VideoEditPanel.vue
  • src/components/videoEdit/WidgetVideoEdit.test.ts
  • src/components/videoEdit/WidgetVideoEdit.vue
  • src/composables/video/useVideoEditModel.test.ts
  • src/composables/video/useVideoEditModel.ts
  • src/lib/litegraph/src/types/widgets.ts
  • src/lib/litegraph/src/widgets/VideoEditWidget.ts
  • src/lib/litegraph/src/widgets/widgetMap.ts
  • src/locales/en/main.json
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/index.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useVideoEditWidget.test.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useVideoEditWidget.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • src/schemas/nodeDef/nodeDefSchemaV2.ts
  • src/scripts/widgets.ts

Comment on lines +180 to +184
it('shows a loading overlay while the filmstrip loads', () => {
renderPanel({ loading: true })

expect(screen.getByTestId('video-preview-loading')).toBeTruthy()
})

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.

🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Add coverage that loading suppresses the crop/trim overlays, not just that the spinner shows.

The template gates VideoCropOverlay on !loading (VideoEditPanel.vue Line 34), but this test only checks the loading overlay appears — it doesn't verify the crop overlay is hidden while loading.

✅ Suggested addition
   it('shows a loading overlay while the filmstrip loads', () => {
-    renderPanel({ loading: true })
+    renderPanel({ loading: true, features: ['crop'], cropEnabled: true })

     expect(screen.getByTestId('video-preview-loading')).toBeTruthy()
+    expect(screen.queryByTestId('stub-crop-overlay')).toBeNull()
   })

As per path instructions, .agents/checks/test-quality.md calls out checking "missing test coverage for newly added behaviors (especially edge cases and error/null states)."

📝 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
it('shows a loading overlay while the filmstrip loads', () => {
renderPanel({ loading: true })
expect(screen.getByTestId('video-preview-loading')).toBeTruthy()
})
it('shows a loading overlay while the filmstrip loads', () => {
renderPanel({ loading: true, features: ['crop'], cropEnabled: true })
expect(screen.getByTestId('video-preview-loading')).toBeTruthy()
expect(screen.queryByTestId('stub-crop-overlay')).toBeNull()
})
🤖 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/videoEdit/VideoEditPanel.test.ts` around lines 180 - 184, The
loading-state test only verifies the spinner and lacks coverage that crop/trim
overlays are suppressed. Extend the `shows a loading overlay while the filmstrip
loads` test using `renderPanel({ loading: true })` to assert the
`VideoCropOverlay` target is absent while preserving the existing
loading-overlay assertion.

Source: Path instructions

@jtydhr88
jtydhr88 force-pushed the feat/video-edit-widget branch from 533a351 to dc1f5d9 Compare July 28, 2026 18:44

@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: 1

🤖 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/videoEdit/VideoEditPanel.vue`:
- Around line 301-317: Update setStartFrameDisabled and setEndFrameDisabled to
include loading, and apply the same loading guard to the disabled options in
startFrameWidget and endFrameWidget. Keep the existing videoUrl and frame-bound
checks so all trim reset and number-input controls remain disabled until
reliable frame metadata is available.
🪄 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: 703f646d-8123-427a-a316-dcd251d15495

📥 Commits

Reviewing files that changed from the base of the PR and between 533a351 and dc1f5d9.

📒 Files selected for processing (16)
  • src/components/videoEdit/VideoEditPanel.test.ts
  • src/components/videoEdit/VideoEditPanel.vue
  • src/components/videoEdit/WidgetVideoEdit.test.ts
  • src/components/videoEdit/WidgetVideoEdit.vue
  • src/composables/video/useVideoEditModel.test.ts
  • src/composables/video/useVideoEditModel.ts
  • src/lib/litegraph/src/types/widgets.ts
  • src/lib/litegraph/src/widgets/VideoEditWidget.ts
  • src/lib/litegraph/src/widgets/widgetMap.ts
  • src/locales/en/main.json
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/renderer/extensions/vueNodes/widgets/composables/useVideoEditWidget.test.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useVideoEditWidget.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • src/schemas/nodeDef/nodeDefSchemaV2.ts
  • src/scripts/widgets.ts

Comment thread src/components/videoEdit/VideoEditPanel.vue Outdated

@dante01yoon dante01yoon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Two blocking correctness issues remain in the video edit widget: trim handles serialize off-by-one frame boundaries, and promoted subgraph widgets resolve their source from the outer host node. Details are inline.

get: () => clamp(toFrame(trimSection.value.start_time), 0, frameMax.value),
set: (frame) => {
const maxStart = Math.max(currentEndFrame() - 1, 0)
const startTime = roundSeconds(toTime(clamp(frame, 0, maxStart)))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

issue: This maps a frame index against frameMax (totalFrames - 1) to the full media duration, so the serialized trim does not preserve the selected frames. For example, with 100 frames over 10s, selecting start frame 10 writes about 1.01s; VideoFromFile then skips the frame at 1.0s (pts < start_pts). The end handle has the complementary problem: it is inclusive in the UI, but serializing its own timestamp as the exclusive backend boundary omits that selected frame. Could start use the boundary at frame / totalFrames * duration and a non-final end use the boundary after the selected frame ((frame + 1) / totalFrames * duration), with equivalent FPS fallbacks and exact-frame coverage?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

fixed

(): VideoEditFeature[] => widget.options?.features ?? ['trim', 'crop']
)

const node = computed(() => app.canvas.graph?.getNodeById(nodeId))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

issue: nodeId is the rendered host node ID. For a promoted widget, NodeWidgets passes the outer subgraph node here while widget.nodeLocatorId identifies the inner node that actually owns this editor. Resolving the host makes useVideoSourceUrl inspect/traverse the outer node's video input, so the editor has no source (or the wrong one) unless that input also happens to be promoted onto a matching host slot. Could this resolve the owner through getNodeByLocatorId(app.rootGraph, widget.nodeLocatorId) and only fall back to the host when no locator is available, with a promoted-widget test?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

fixed

@dante01yoon dante01yoon assigned jtydhr88 and unassigned dante01yoon Jul 29, 2026
@jtydhr88
jtydhr88 force-pushed the feat/video-edit-widget branch from e484ab9 to db2e88c Compare July 29, 2026 13:00

@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: 5

🤖 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/videoEdit/VideoEditPanel.vue`:
- Around line 275-291: Update the toTime and toFrame conversions in
VideoEditPanel to pass raw totalFrames instead of effectiveTotalFrames.value,
keeping them aligned with useVideoEditModel’s zero-frame behavior. Retain
effectiveTotalFrames only for display or timeline sizing, including frameMax as
currently used.

In `@src/components/videoEdit/WidgetVideoEdit.test.ts`:
- Around line 90-93: Update the stub button in the video edit test around the
emit-start-frame trigger to include visible, descriptive text and select it by
its accessible button role and name instead of the data-testid. Apply the same
change to the corresponding trigger at the additional occurrence near the later
test location, preserving its existing click behavior.

In `@src/composables/video/useVideoEditModel.ts`:
- Around line 128-157: The trimEnabledState and cropEnabledState watchers only
handle activation, so toggles remain enabled after external clearing. Update the
watchers for hasActiveTrim and hasActiveCrop to mirror both active and inactive
transitions, while preserving the computed setters’ existing reset behavior for
user-disabled toggles.
- Around line 98-116: Update the crop assignment in the setter to clamp the
rounded crop coordinates and dimensions so the crop remains within width.value
and height.value, including after rounding. Preserve the existing
coversFullFrame reset behavior, and ensure the crop’s right and bottom edges
cannot exceed the source frame.

In `@src/renderer/extensions/vueNodes/widgets/composables/useVideoEditWidget.ts`:
- Around line 27-32: Set the workflow-level serialize property on the concrete
videoedit widget instance, not only in the IWidgetVideoEditOptions object.
Update the widget construction flow around toClass() and VideoEditWidget so the
BaseWidget receives serialize: true for workflow-persistable trim/crop state,
including when the source POJO value is undefined.
🪄 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: ce4e13c4-b694-4e4e-8cc8-546d5ef51e61

📥 Commits

Reviewing files that changed from the base of the PR and between e484ab9 and db2e88c.

📒 Files selected for processing (17)
  • src/components/videoEdit/VideoEditPanel.test.ts
  • src/components/videoEdit/VideoEditPanel.vue
  • src/components/videoEdit/WidgetVideoEdit.test.ts
  • src/components/videoEdit/WidgetVideoEdit.vue
  • src/composables/video/useVideoEditModel.test.ts
  • src/composables/video/useVideoEditModel.ts
  • src/lib/litegraph/src/types/widgets.ts
  • src/lib/litegraph/src/widgets/VideoEditWidget.ts
  • src/lib/litegraph/src/widgets/widgetMap.ts
  • src/locales/en/main.json
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/renderer/extensions/vueNodes/widgets/composables/useVideoEditWidget.test.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useVideoEditWidget.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • src/schemas/nodeDef/nodeDefSchemaV2.ts
  • src/scripts/widgets.ts
  • src/utils/videoFrameUtil.ts

Comment thread src/components/videoEdit/VideoEditPanel.vue Outdated
Comment thread src/components/videoEdit/WidgetVideoEdit.test.ts
Comment thread src/composables/video/useVideoEditModel.ts
Comment thread src/composables/video/useVideoEditModel.ts
@jtydhr88
jtydhr88 force-pushed the feat/video-edit-widget branch from db2e88c to 6e6e0b2 Compare July 29, 2026 13:52
@jtydhr88 jtydhr88 assigned dante01yoon and unassigned jtydhr88 Jul 29, 2026
@dante01yoon dante01yoon assigned jtydhr88 and unassigned dante01yoon Jul 29, 2026
@jtydhr88
jtydhr88 merged commit f9b36fc into main Jul 29, 2026
63 checks passed
@jtydhr88
jtydhr88 deleted the feat/video-edit-widget branch July 29, 2026 22:58
@dosubot

dosubot Bot commented Jul 29, 2026

Copy link
Copy Markdown

📄 Knowledge review

Dosu skipped reviewing this PR because your organization has used its 200 included credits for the month. Your usage will reset on 2026-08-01. To have Dosu review this PR before then, ask your organization admin to upgrade to a pro account.


Leave Feedback Ask Dosu about ComfyUI_frontend Add Dosu to your team

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

Labels

size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants