Skip to content

Load video trim node (Design Prototype)#13293

Draft
uytieu wants to merge 12 commits into
mainfrom
load-video-trim-node
Draft

Load video trim node (Design Prototype)#13293
uytieu wants to merge 12 commits into
mainfrom
load-video-trim-node

Conversation

@uytieu

@uytieu uytieu commented Jun 29, 2026

Copy link
Copy Markdown

Summary

This PR serves as a prototype and reference ONLY.
Vibe coded to show expected behaviors for video trim feature but does NOT address all UX edge cases.

Improved the Load Video node to be similar to new Load Image node pattern (ex. empty state, select from asset library or from device) and extended it to have video trim functionality.

  • correct empty/upload states,
  • video preview with removal
  • trim toggle
  • trim-range scrubbing,
  • polished trim action controls with shared widget styling and tooltips.

Changes

  • What:
    • Add hover remove button on the video preview (with "Remove" tooltip) that clears the file widget, preview cache, and trim state, returning the node to the drag-and-drop empty state
    • Fix new and removed Load Video nodes incorrectly showing a loading/uploading state instead of the empty state (useLoadVideoPreview ignores placeholder values; WidgetVideoTrim only shows uploading during actual uploads)
    • Constrain filmstrip scrubbing to the active trim range when trim is enabled
    • Add "Set start frame" / "Set end frame" actions that reset trim handles to the first/last frame and seek the preview; disable each button when its handle is already at the default position
    • Introduce TooltipHint (Reka UI) for centered, overflow-safe tooltips on remove and trim action buttons
    • Add WidgetInputActionButtonClass for shared enabled/disabled widget button styling (cursor-not-allowed, Comfy disabled tokens)
    • Add semantic video-trim design tokens and apply them to filmstrip selection/playhead styling
    • Expand unit tests for remove, disabled trim actions, playhead/trim collision, and scrub-to-preview behavior

Review Focus

  • Remove flow: verify clearing file widget, widgetValueStore, and nodeOutputStore reliably returns to the empty drag-and-drop state (including after remove and on newly placed nodes)
  • Trim scrubbing: confirm playhead stays within [startFrame, endFrame] when trim is enabled, including click/drag in dimmed regions outside the selection
  • Disabled trim buttons: "Set start frame" disabled at frame 0, "Set end frame" disabled at last frame; tooltips suppressed and cursor-not-allowed shown
  • Preview layout: remove button/tooltips should not be clipped by the video container’s overflow-hidden
  • Tooltip behavior: TooltipHint positioning and hover delay feel consistent across remove + set start/end buttons

Screenshots

image load-video-trim

uytieu added 7 commits June 26, 2026 23:58
Add utilities to detect MP4 average frame-rate and HTTP resource byte size and wire them into the video filmstrip loading flow. Files added: probeVideoFrameRate.ts (+test) and httpResourceByteSize.ts (+test). useVideoFilmstrip now probes frame-rate and fetches file size, exposes fps and fileSize refs, and uses those values when computing totalFrames. Removed redundant fileSize fetching from useLoadVideoPreview and updated components/stories/tests to consume the filmstrip-provided fileSize. Also fix fps usage to read ref.value and add a small layout spacing tweak (mt-2). Tests added/updated for the new behavior.
@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds LoadVideo trim support across MP4 probing, preview derivation, filmstrip generation, trim controls, widget registration, and LoadVideo node layout updates.

Changes

LoadVideo video trim feature

Layer / File(s) Summary
Video probing and filmstrip data
src/utils/httpResourceByteSize.ts, src/utils/httpResourceByteSize.test.ts, src/composables/video/probeVideoFrameRate.ts, src/composables/video/probeVideoFrameRate.test.ts, src/composables/video/useLoadVideoPreview.ts, src/composables/video/useLoadVideoPreview.test.ts, src/composables/video/useVideoFilmstrip.ts, src/composables/video/useVideoFilmstrip.test.ts
fetchHttpResourceByteSize resolves remote byte size from HEAD and Range requests. probeVideoFrameRate parses partial MP4 data to derive average frame rate. useLoadVideoPreview derives preview URLs from node outputs or file values. useVideoFilmstrip samples thumbnails and derived metadata.
Trim panel and tooltip UI
packages/design-system/src/css/style.css, src/components/ui/tooltip/Tooltip.vue, src/components/ui/tooltip/TooltipContent.vue, src/components/ui/tooltip/TooltipProvider.vue, src/components/ui/tooltip/TooltipTrigger.vue, src/components/ui/tooltip/TooltipHint.vue, src/components/ui/tooltip/TooltipHint.stories.ts, src/components/video/MediaUploadEmpty.vue, src/components/video/MediaUploadEmpty.test.ts, src/components/video/MediaUploadEmpty.stories.ts, src/components/video/VideoFilmstripTrim.vue, src/components/video/VideoFilmstripTrim.test.ts, src/components/video/timelineInsetStyle.ts, src/components/video/LoadVideoTrimPanel.vue, src/components/video/LoadVideoTrimPanel.test.ts, src/components/video/LoadVideoTrimPanel.stories.ts, src/locales/en/main.json
Adds tooltip wrappers, trim-related color tokens, upload empty-state UI, the filmstrip trim control, and the LoadVideo trim panel with scrubbing, trim handles, playback, metadata, localization, and storybook coverage.
LiteGraph widget type and Vue bridge
src/lib/litegraph/src/types/widgets.ts, src/lib/litegraph/src/widgets/VideoTrimWidget.ts, src/lib/litegraph/src/widgets/widgetMap.ts, src/renderer/extensions/vueNodes/widgets/composables/useVideoTrimWidget.ts, src/renderer/extensions/vueNodes/widgets/composables/useVideoTrimWidget.test.ts, src/renderer/extensions/vueNodes/widgets/components/layout/index.ts, src/renderer/extensions/vueNodes/widgets/components/WidgetVideoTrim.vue, src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts, src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts, src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.test.ts, src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.ts, src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.test.ts
Defines the videotrim widget type and Vue bridge, registers it, and makes LoadVideo file defaults and widget output behavior video-trim aware.
LoadVideo node layout and dropdown behavior
src/renderer/extensions/vueNodes/components/LGraphNode.vue, src/renderer/extensions/vueNodes/components/NodeWidgets.vue, src/renderer/extensions/vueNodes/composables/useProcessedWidgets.ts, src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts, src/renderer/extensions/vueNodes/widgets/components/WidgetSelect.vue, src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue, src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.test.ts, src/extensions/core/loadVideoTrim.ts, src/extensions/core/index.ts
Adapts LoadVideo node sizing, widget grid layout, dropdown state, extension registration, and load-video preview measurement behavior.
Repository config and ignore rules
.gitignore
Updates ignore patterns for local environment and deployment artifacts.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Suggested labels

size:XXL, core/1.45, cloud/1.45

Suggested reviewers

  • pythongosssss
  • DrJKL
  • dante01yoon

🐇 I nibbled through bytes and frames today,
Trimmed little carrots in a UI bouquet.
Filmstrips now hop when the playhead takes flight,
And LoadVideo nodes snugly fit just right.


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
Adr Compliance For Entity/Litegraph Changes ⚠️ Warning src/extensions/core/loadVideoTrim.ts imperatively resizes a node on init, a direct entity spatial mutation outside a command/store (ADR 0003). Move node sizing/visibility adjustments into a serializable command or store-backed mutation path; keep extension setup side-effect free. See docs/adr/0003 and docs/adr/0008.
End-To-End Regression Coverage For Fixes ❓ Inconclusive Commit subjects and PR title aren’t available here, so I can’t verify the required bug-fix signal without guessing. Please provide the PR title or commit subjects so I can check for bug-fix language and then assess whether an e2e test explanation is needed.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately reflects the main change: adding Load Video trim functionality.
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.
Description check ✅ Passed The PR description follows the required template sections and covers summary, changes, review focus, and screenshots.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch load-video-trim-node

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.

@uytieu uytieu added the preview-cpu Creates a preview ephemeral environment for this PR (CPU only) label Jun 29, 2026
@github-actions

github-actions Bot commented Jun 29, 2026

Copy link
Copy Markdown

🌐 Website E2E

Tip

All tests passed.

Status ✅ Passed
Report View Report

🔗 Website Preview

Website Preview: https://comfy-website-preview-pr-13293.vercel.app

This commit: https://website-frontend-cjyqo2qps-comfyui.vercel.app

Last updated: 2026-06-30T09:03:41Z for f89ab3a

@github-actions

github-actions Bot commented Jun 29, 2026

Copy link
Copy Markdown

🎭 Playwright: ❌ 1617 passed, 36 failed · 2 flaky

❌ Failed Tests

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

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 06/30/2026, 09:04:01 AM UTC

Links

📦 Bundle: 7.79 MB gzip 🔴 +20.9 kB

Details

Summary

  • Raw size: 32.9 MB baseline 32.8 MB — 🔴 +91.7 kB
  • Gzip: 7.79 MB baseline 7.77 MB — 🔴 +20.9 kB
  • Brotli: 5.36 MB baseline 5.34 MB — 🔴 +17.1 kB
  • Bundles: 303 current • 299 baseline • 242 added / 238 removed

Category Glance
Other 🔴 +52.6 kB (11.8 MB) · Vendor & Third-Party 🔴 +24.6 kB (15.3 MB) · UI Components 🔴 +5.81 kB (63 kB) · Utilities & Hooks 🔴 +4.28 kB (3.37 MB) · Editors & Dialogs 🔴 +2.9 kB (120 kB) · Graph Workspace 🔴 +1.05 kB (1.25 MB) · + 5 more

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

Main entry bundles and manifests

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

Status: 1 added / 1 removed

Graph Workspace — 1.25 MB (baseline 1.25 MB) • 🔴 +1.05 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-C5yME1SE.js (new) 1.25 MB 🔴 +1.25 MB 🔴 +267 kB 🔴 +201 kB
assets/GraphView-DUL7Vb7r.js (removed) 1.25 MB 🟢 -1.25 MB 🟢 -267 kB 🟢 -201 kB

Status: 1 added / 1 removed

Views & Navigation — 98.1 kB (baseline 97.7 kB) • 🔴 +419 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-D66bYkxz.js (removed) 19.4 kB 🟢 -19.4 kB 🟢 -5.04 kB 🟢 -4.46 kB
assets/CloudSurveyView-kNJbTgOs.js (new) 19.4 kB 🔴 +19.4 kB 🔴 +5.03 kB 🔴 +4.46 kB
assets/OAuthConsentView-D2kypZUX.js (removed) 15 kB 🟢 -15 kB 🟢 -4.1 kB 🟢 -3.57 kB
assets/OAuthConsentView-De1PdIzk.js (new) 15 kB 🔴 +15 kB 🔴 +4.1 kB 🔴 +3.57 kB
assets/CloudLoginView-BJopxPbb.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.07 kB 🟢 -2.68 kB
assets/CloudLoginView-DE31HuOw.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.07 kB 🔴 +2.68 kB
assets/CloudSignupView-DCPuUGDT.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.74 kB 🔴 +2.41 kB
assets/CloudSignupView-DDIBibTJ.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.74 kB 🟢 -2.4 kB
assets/CloudLayoutView-DNCVPy1N.js (new) 9.36 kB 🔴 +9.36 kB 🔴 +2.34 kB 🔴 +2.03 kB
assets/CloudLayoutView-Ynwb0JJh.js (removed) 9.36 kB 🟢 -9.36 kB 🟢 -2.34 kB 🟢 -2.03 kB
assets/UserCheckView-BQPtj4jc.js (removed) 8.8 kB 🟢 -8.8 kB 🟢 -2.22 kB 🟢 -1.93 kB
assets/UserCheckView-C03fs6bb.js (new) 8.8 kB 🔴 +8.8 kB 🔴 +2.22 kB 🔴 +1.92 kB
assets/CloudSubscriptionRedirectView-3nS1bQSk.js (new) 6.63 kB 🔴 +6.63 kB 🔴 +2.46 kB 🔴 +2.15 kB
assets/CloudSubscriptionRedirectView-JDYjAv9u.js (removed) 6.63 kB 🟢 -6.63 kB 🟢 -2.46 kB 🟢 -2.15 kB
assets/UserSelectView-Cr0VYfCp.js (new) 6 kB 🔴 +6 kB 🔴 +2.15 kB 🔴 +1.88 kB
assets/UserSelectView-tqOWrRnM.js (removed) 6 kB 🟢 -6 kB 🟢 -2.15 kB 🟢 -1.88 kB
assets/CloudForgotPasswordView-CgipLbrH.js (new) 5.15 kB 🔴 +5.15 kB 🔴 +1.76 kB 🔴 +1.54 kB
assets/CloudForgotPasswordView-CwqHRGpg.js (removed) 5.15 kB 🟢 -5.15 kB 🟢 -1.76 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-CrMk1G_H.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.58 kB 🔴 +1.37 kB
assets/CloudAuthTimeoutView-CzhwEDri.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/CloudSorryContactSupportView-J37Xjc9t.js (removed) 1.21 kB 🟢 -1.21 kB 🟢 -607 B 🟢 -528 B
assets/CloudSorryContactSupportView-YEWjXvP4.js (new) 1.21 kB 🔴 +1.21 kB 🔴 +608 B 🔴 +527 B
assets/layout-o4z3wpNr.js (new) 866 B 🔴 +866 B 🔴 +400 B 🔴 +337 B
assets/layout-C2s1oU-T.js (removed) 447 B 🟢 -447 B 🟢 -284 B 🟢 -235 B

Status: 12 added / 12 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-B3tFrzFZ.js (removed) 49.4 kB 🟢 -49.4 kB 🟢 -9.97 kB 🟢 -8.83 kB
assets/KeybindingPanel-DTGCD5LM.js (new) 49.4 kB 🔴 +49.4 kB 🔴 +9.97 kB 🔴 +8.84 kB
assets/settings-C9Tmk3bJ.js (removed) 39.8 kB 🟢 -39.8 kB 🟢 -9.73 kB 🟢 -7.99 kB
assets/settings-iCA_svS6.js (new) 39.8 kB 🔴 +39.8 kB 🔴 +9.73 kB 🔴 +7.98 kB
assets/settings-C2wKwgxO.js (removed) 35.4 kB 🟢 -35.4 kB 🟢 -8.66 kB 🟢 -7.29 kB
assets/settings-o5pPExCR.js (new) 35.4 kB 🔴 +35.4 kB 🔴 +8.66 kB 🔴 +7.32 kB
assets/settings-Br4yRO0X.js (new) 33.5 kB 🔴 +33.5 kB 🔴 +8.48 kB 🔴 +6.91 kB
assets/settings-zmAzXhGy.js (removed) 33.5 kB 🟢 -33.5 kB 🟢 -8.48 kB 🟢 -6.9 kB
assets/settings-C4BF2z9s.js (removed) 33.1 kB 🟢 -33.1 kB 🟢 -8.51 kB 🟢 -7.1 kB
assets/settings-DrwVN8Ew.js (new) 33.1 kB 🔴 +33.1 kB 🔴 +8.51 kB 🔴 +7.09 kB
assets/settings-BYApwqx_.js (new) 31.5 kB 🔴 +31.5 kB 🔴 +8.78 kB 🔴 +7.31 kB
assets/settings-DMXOgQVA.js (removed) 31.5 kB 🟢 -31.5 kB 🟢 -8.78 kB 🟢 -7.31 kB
assets/settings-Bg4QnQI8.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +8.41 kB 🔴 +7.38 kB
assets/settings-BwQRFbgb.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -8.41 kB 🟢 -7.37 kB
assets/settings-C2gc9HUt.js (removed) 29.7 kB 🟢 -29.7 kB 🟢 -8.07 kB 🟢 -6.88 kB
assets/settings-DvAV062j.js (new) 29.7 kB 🔴 +29.7 kB 🔴 +8.07 kB 🔴 +6.88 kB
assets/settings-CG5yZo1m.js (new) 29.6 kB 🔴 +29.6 kB 🔴 +8.31 kB 🔴 +7.26 kB
assets/settings-DbaQC_wv.js (removed) 29.6 kB 🟢 -29.6 kB 🟢 -8.31 kB 🟢 -7.25 kB
assets/settings-BNqisXpi.js (new) 28.8 kB 🔴 +28.8 kB 🔴 +7.99 kB 🔴 +6.95 kB
assets/settings-DPFn4SDi.js (removed) 28.8 kB 🟢 -28.8 kB 🟢 -7.99 kB 🟢 -6.95 kB
assets/settings-C0b1G-4Q.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -8.44 kB 🟢 -7.03 kB
assets/settings-D315AuoN.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +8.44 kB 🔴 +7.03 kB
assets/settings-C3lEMXTa.js (new) 25.2 kB 🔴 +25.2 kB 🔴 +8.2 kB 🔴 +6.6 kB
assets/settings-Dd_PQ-qm.js (removed) 25.2 kB 🟢 -25.2 kB 🟢 -8.2 kB 🟢 -6.6 kB
assets/settings-BH_B17Kh.js (new) 24.6 kB 🔴 +24.6 kB 🔴 +8.02 kB 🔴 +6.27 kB
assets/settings-hVo59da3.js (removed) 24.6 kB 🟢 -24.6 kB 🟢 -8.01 kB 🟢 -6.28 kB
assets/SecretsPanel-CpxZLebA.js (removed) 24.2 kB 🟢 -24.2 kB 🟢 -5.77 kB 🟢 -5.07 kB
assets/SecretsPanel-CyjTquzU.js (new) 24.2 kB 🔴 +24.2 kB 🔴 +5.77 kB 🔴 +5.07 kB
assets/CreditsPanel-BW7L0_Rs.js (new) 15.6 kB 🔴 +15.6 kB 🔴 +4.61 kB 🔴 +4.04 kB
assets/CreditsPanel-I7oyTs0L.js (removed) 15.6 kB 🟢 -15.6 kB 🟢 -4.61 kB 🟢 -4.05 kB
assets/AboutPanel-CE6sIE3r.js (removed) 12 kB 🟢 -12 kB 🟢 -3.29 kB 🟢 -2.94 kB
assets/AboutPanel-D22ssXkP.js (new) 12 kB 🔴 +12 kB 🔴 +3.29 kB 🔴 +2.94 kB
assets/SubscriptionPanel-CX4OV5Qs.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.52 kB 🔴 +3.09 kB
assets/SubscriptionPanel-Dqe1D19l.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.52 kB 🟢 -3.09 kB
assets/ExtensionPanel-_GVrCFlt.js (new) 9.03 kB 🔴 +9.03 kB 🔴 +2.49 kB 🔴 +2.2 kB
assets/ExtensionPanel-CNPLodvI.js (removed) 9.03 kB 🟢 -9.03 kB 🟢 -2.49 kB 🟢 -2.2 kB
assets/ServerConfigPanel-D8TSeivr.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -1.98 kB 🟢 -1.75 kB
assets/ServerConfigPanel-DOGfcVtV.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +1.98 kB 🔴 +1.76 kB
assets/UserPanel-bPAWULgO.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.82 kB 🟢 -1.58 kB
assets/UserPanel-BzIrGeKj.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.82 kB 🔴 +1.57 kB
assets/refreshRemoteConfig-BXbELmYW.js (removed) 2.73 kB 🟢 -2.73 kB 🟢 -1.22 kB 🟢 -1.07 kB
assets/refreshRemoteConfig-CefIB86Z.js (new) 2.73 kB 🔴 +2.73 kB 🔴 +1.22 kB 🔴 +1.07 kB
assets/config-B2VX_hK9.js (new) 2.14 kB 🔴 +2.14 kB 🔴 +1.04 kB 🔴 +846 B
assets/config-sCFY6THA.js (removed) 2.14 kB 🟢 -2.14 kB 🟢 -1.04 kB 🟢 -842 B
assets/cloudRemoteConfig-BgJ4EWp4.js (removed) 990 B 🟢 -990 B 🟢 -543 B 🟢 -458 B
assets/cloudRemoteConfig-tFF9x3gA.js (new) 990 B 🔴 +990 B 🔴 +542 B 🔴 +446 B
assets/refreshRemoteConfig-CDpCK3Z5.js (removed) 110 B 🟢 -110 B 🟢 -89 B 🟢 -88 B
assets/refreshRemoteConfig-CMc_gTOs.js (new) 110 B 🔴 +110 B 🔴 +89 B 🔴 +90 B

Status: 24 added / 24 removed / 3 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SignUpForm-BHpf1MQ-.js (new) 10 kB 🔴 +10 kB 🔴 +3.46 kB 🔴 +3.03 kB
assets/SignUpForm-DZHJ2hu4.js (removed) 10 kB 🟢 -10 kB 🟢 -3.46 kB 🟢 -3.04 kB
assets/auth-Cmf8Ewhl.js (new) 3.69 kB 🔴 +3.69 kB 🔴 +1.3 kB 🔴 +1.12 kB
assets/auth-DGlhUiQC.js (removed) 3.69 kB 🟢 -3.69 kB 🟢 -1.3 kB 🟢 -1.14 kB
assets/usePostAuthRedirect-DA8qvcRI.js (removed) 3.33 kB 🟢 -3.33 kB 🟢 -1.27 kB 🟢 -1.11 kB
assets/usePostAuthRedirect-VmxEUtzb.js (new) 3.33 kB 🔴 +3.33 kB 🔴 +1.27 kB 🔴 +1.11 kB
assets/UpdatePasswordContent-C4SXNANk.js (removed) 1.92 kB 🟢 -1.92 kB 🟢 -877 B 🟢 -767 B
assets/UpdatePasswordContent-DTtFZ5Yw.js (new) 1.92 kB 🔴 +1.92 kB 🔴 +879 B 🔴 +767 B
assets/WorkspaceProfilePic-1GR-yxtZ.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -862 B 🟢 -777 B
assets/WorkspaceProfilePic-DA3oYgmE.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +860 B 🔴 +777 B
assets/authStore-BP0RdPcG.js (removed) 130 B 🟢 -130 B 🟢 -112 B 🟢 -116 B
assets/authStore-CuFvLeon.js (new) 130 B 🔴 +130 B 🔴 +112 B 🔴 +111 B
assets/workspaceAuthStore-BQa5b58s.js (removed) 110 B 🟢 -110 B 🟢 -104 B 🟢 -114 B
assets/workspaceAuthStore-Cqn4A841.js (new) 110 B 🔴 +110 B 🔴 +104 B 🔴 +114 B
assets/auth-6qJNxwbG.js (removed) 105 B 🟢 -105 B 🟢 -96 B 🟢 -75 B
assets/auth-B0aWcgAO.js (new) 105 B 🔴 +105 B 🔴 +96 B 🔴 +79 B

Status: 8 added / 8 removed / 2 unchanged

Editors & Dialogs — 120 kB (baseline 117 kB) • 🔴 +2.9 kB

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-cbPo-fU6.js (new) 90.5 kB 🔴 +90.5 kB 🔴 +19.3 kB 🔴 +16.5 kB
assets/ComfyHubPublishDialog-DCgpwXup.js (removed) 90.5 kB 🟢 -90.5 kB 🟢 -19.3 kB 🟢 -16.5 kB
assets/useShareDialog-DSUmT6SU.js (new) 23.7 kB 🔴 +23.7 kB 🔴 +5.59 kB 🔴 +4.96 kB
assets/useShareDialog-DWjHrMZ8.js (removed) 23.7 kB 🟢 -23.7 kB 🟢 -5.59 kB 🟢 -4.96 kB
assets/useRangeEditor-DnI9W33B.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +1.06 kB 🔴 +962 B
assets/SubscriptionInactiveMemberDialog-B82spW03.js (removed) 2.55 kB 🟢 -2.55 kB 🟢 -1.03 kB 🟢 -895 B
assets/SubscriptionInactiveMemberDialog-C0N4i_YM.js (new) 2.55 kB 🔴 +2.55 kB 🔴 +1.03 kB 🔴 +900 B
assets/ComfyHubPublishDialog-C4hoD4U7.js (removed) 143 B 🟢 -143 B 🟢 -105 B 🟢 -91 B
assets/ComfyHubPublishDialog-Cw1BTFAW.js (new) 143 B 🔴 +143 B 🔴 +105 B 🔴 +89 B
assets/useSubscriptionDialog-DiJqdWdw.js (removed) 110 B 🟢 -110 B 🟢 -102 B 🟢 -93 B
assets/useSubscriptionDialog-wkVa1b8-.js (new) 110 B 🔴 +110 B 🔴 +102 B 🔴 +89 B

Status: 6 added / 5 removed

UI Components — 63 kB (baseline 57.2 kB) • 🔴 +5.81 kB

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-BL9xghGB.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +3.82 kB 🔴 +3.41 kB
assets/ComfyQueueButton-CjQDbTZK.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -3.82 kB 🟢 -3.41 kB
assets/useTerminalTabs-DpKPnFRq.js (removed) 12.1 kB 🟢 -12.1 kB 🟢 -3.83 kB 🟢 -3.38 kB
assets/useTerminalTabs-yHAjmsow.js (new) 12.1 kB 🔴 +12.1 kB 🔴 +3.83 kB 🔴 +3.38 kB
assets/TopbarBadge-4XMVBkLC.js (removed) 7.7 kB 🟢 -7.7 kB 🟢 -1.87 kB 🟢 -1.65 kB
assets/TopbarBadge-CRc0YaAb.js (new) 7.7 kB 🔴 +7.7 kB 🔴 +1.87 kB 🔴 +1.64 kB
assets/ScrubableNumberInput-BjOzgz7e.js (new) 6.31 kB 🔴 +6.31 kB 🔴 +2.14 kB 🔴 +1.88 kB
assets/ScrubableNumberInput-WwAxz-Yw.js (removed) 6.31 kB 🟢 -6.31 kB 🟢 -2.13 kB 🟢 -1.88 kB
assets/WidgetInputNumberInput-Bv9HfHyd.js (new) 5.81 kB 🔴 +5.81 kB 🔴 +2.07 kB 🔴 +1.84 kB
assets/toggle-group-DRz5g9y7.js (new) 4.16 kB 🔴 +4.16 kB 🔴 +1.45 kB 🔴 +1.28 kB
assets/toggle-group-TzH8HFvr.js (removed) 4.16 kB 🟢 -4.16 kB 🟢 -1.45 kB 🟢 -1.28 kB
assets/Button-BfeK6RrJ.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.41 kB 🟢 -1.24 kB
assets/Button-CesH5M_6.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.41 kB 🔴 +1.24 kB
assets/SubscribeButton-CsYZgIQR.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.04 kB 🟢 -908 B
assets/SubscribeButton-oyFJh7fV.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.04 kB 🔴 +904 B
assets/WidgetButton-b1XpxoyF.js (removed) 1.98 kB 🟢 -1.98 kB 🟢 -920 B 🟢 -809 B
assets/WidgetButton-C95hUPgR.js (new) 1.98 kB 🔴 +1.98 kB 🔴 +921 B 🔴 +806 B
assets/CloudBadge-CM0lQyYo.js (removed) 1.18 kB 🟢 -1.18 kB 🟢 -595 B 🟢 -521 B
assets/CloudBadge-CZNisnYb.js (new) 1.18 kB 🔴 +1.18 kB 🔴 +592 B 🔴 +518 B
assets/cloudFeedbackTopbarButton-DTWWCNGw.js (new) 829 B 🔴 +829 B 🔴 +501 B 🔴 +452 B
assets/cloudFeedbackTopbarButton-h9Qshpvb.js (removed) 829 B 🟢 -829 B 🟢 -498 B 🟢 -420 B
assets/ComfyQueueButton-BprO-qiZ.js (removed) 128 B 🟢 -128 B 🟢 -99 B 🟢 -95 B
assets/ComfyQueueButton-Z1DSDVfR.js (new) 128 B 🔴 +128 B 🔴 +99 B 🔴 +90 B

Status: 12 added / 11 removed / 2 unchanged

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

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/load3dService-BcspSYKL.js (removed) 126 kB 🟢 -126 kB 🟢 -27.8 kB 🟢 -23.5 kB
assets/load3dService-BDHDdMUV.js (new) 126 kB 🔴 +126 kB 🔴 +27.8 kB 🔴 +23.5 kB
assets/api-BecU1yti.js (new) 91.9 kB 🔴 +91.9 kB 🔴 +25.3 kB 🔴 +21.7 kB
assets/api-BYSl7YRA.js (removed) 91.9 kB 🟢 -91.9 kB 🟢 -25.3 kB 🟢 -21.6 kB
assets/workflowShareService-B2vDlU5a.js (new) 17 kB 🔴 +17 kB 🔴 +5.01 kB 🔴 +4.44 kB
assets/workflowShareService-C-9eWqwX.js (removed) 17 kB 🟢 -17 kB 🟢 -5.01 kB 🟢 -4.44 kB
assets/releaseStore-Di33AfaF.js (removed) 8.29 kB 🟢 -8.29 kB 🟢 -2.34 kB 🟢 -2.04 kB
assets/releaseStore-sFgu4goi.js (new) 8.29 kB 🔴 +8.29 kB 🔴 +2.33 kB 🔴 +2.04 kB
assets/keybindingService-C5ml31C-.js (removed) 7.46 kB 🟢 -7.46 kB 🟢 -1.92 kB 🟢 -1.64 kB
assets/keybindingService-CkZFdEMF.js (new) 7.46 kB 🔴 +7.46 kB 🔴 +1.91 kB 🔴 +1.65 kB
assets/extensionStore-4wja3q6I.js (removed) 5.29 kB 🟢 -5.29 kB 🟢 -1.86 kB 🟢 -1.57 kB
assets/extensionStore-7-hltAYG.js (new) 5.29 kB 🔴 +5.29 kB 🔴 +1.86 kB 🔴 +1.57 kB
assets/userStore-DUYpTQ8X.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +932 B 🔴 +821 B
assets/userStore-iSc_ImFe.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -932 B 🟢 -817 B
assets/serverConfigStore-CN4Xkrt5.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +811 B 🔴 +707 B
assets/serverConfigStore-m5ZP9rkQ.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -811 B 🟢 -707 B
assets/audioService-CbrKeDp1.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -862 B 🟢 -751 B
assets/audioService-DnrGrEVN.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +859 B 🔴 +752 B
assets/dialogService-c_QXK8Yk.js (removed) 100 B 🟢 -100 B 🟢 -99 B 🟢 -94 B
assets/dialogService-DhE7hBWJ.js (new) 100 B 🔴 +100 B 🔴 +99 B 🔴 +92 B
assets/settingStore-Bf5sU6Ij.js (new) 98 B 🔴 +98 B 🔴 +98 B 🔴 +91 B
assets/settingStore-D3qQZguo.js (removed) 98 B 🟢 -98 B 🟢 -98 B 🟢 -102 B
assets/assetsStore-C_sJAvx3.js (new) 96 B 🔴 +96 B 🔴 +97 B 🔴 +100 B
assets/assetsStore-CDUEQj2g.js (removed) 96 B 🟢 -96 B 🟢 -97 B 🟢 -88 B
assets/releaseStore-CAzNPmdW.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -84 B
assets/releaseStore-CHnOb1Ha.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +81 B
assets/api-BtXAajU5.js (new) 62 B 🔴 +62 B 🔴 +74 B 🔴 +66 B
assets/api-DAZDo_WJ.js (removed) 62 B 🟢 -62 B 🟢 -74 B 🟢 -66 B

Status: 14 added / 14 removed / 2 unchanged

Utilities & Hooks — 3.37 MB (baseline 3.37 MB) • 🔴 +4.28 kB

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/promotionUtils-CUTjQPIp.js (new) 3.01 MB 🔴 +3.01 MB 🔴 +696 kB 🔴 +525 kB
assets/promotionUtils-BAkxlLbM.js (removed) 3.01 MB 🟢 -3.01 MB 🟢 -695 kB 🟢 -524 kB
assets/useConflictDetection-05ZCHpTb.js (removed) 234 kB 🟢 -234 kB 🟢 -52.3 kB 🟢 -42.6 kB
assets/useConflictDetection-RhF-3X4z.js (new) 234 kB 🔴 +234 kB 🔴 +52.3 kB 🔴 +42.6 kB
assets/useLoad3d-3SbZMsOW.js (removed) 25.5 kB 🟢 -25.5 kB 🟢 -5.76 kB 🟢 -5.09 kB
assets/useLoad3d-CvjUZ1nl.js (new) 25.5 kB 🔴 +25.5 kB 🔴 +5.75 kB 🔴 +5.09 kB
assets/useLoad3dViewer-CCn8rPmo.js (new) 21.1 kB 🔴 +21.1 kB 🔴 +4.97 kB 🔴 +4.35 kB
assets/useLoad3dViewer-DIgTpZXg.js (removed) 21.1 kB 🟢 -21.1 kB 🟢 -4.98 kB 🟢 -4.37 kB
assets/useFeatureFlags-48_8xdpX.js (removed) 5.55 kB 🟢 -5.55 kB 🟢 -1.71 kB 🟢 -1.46 kB
assets/useFeatureFlags-kQQjmfcg.js (new) 5.55 kB 🔴 +5.55 kB 🔴 +1.71 kB 🔴 +1.45 kB
assets/useTypeformEmbed-BPpLqbsy.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.96 kB 🔴 +1.63 kB
assets/useTypeformEmbed-jq1pPuGB.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.96 kB 🟢 -1.64 kB
assets/downloadUtil-BsRQpzsM.js (new) 4.68 kB 🔴 +4.68 kB 🔴 +1.85 kB 🔴 +1.54 kB
assets/downloadUtil-DmruXCTb.js (removed) 4.68 kB 🟢 -4.68 kB 🟢 -1.85 kB 🟢 -1.54 kB
assets/useTransformState-DTBFWJgd.js (new) 3.58 kB 🔴 +3.58 kB 🔴 +1.58 kB 🔴 +1.31 kB
assets/useTransformState-VmwWA6Xs.js (removed) 3.58 kB 🟢 -3.58 kB 🟢 -1.58 kB 🟢 -1.31 kB
assets/subscriptionCheckoutUtil-BJmqgzlM.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.45 kB 🔴 +1.26 kB
assets/subscriptionCheckoutUtil-WGUx0Em6.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.45 kB 🟢 -1.26 kB
assets/useSessionCookie-BHARp2a1.js (removed) 3.33 kB 🟢 -3.33 kB 🟢 -1.15 kB 🟢 -989 B
assets/useSessionCookie-COhY7oN3.js (new) 3.33 kB 🔴 +3.33 kB 🔴 +1.15 kB 🔴 +980 B
assets/useExternalLink-CK198fiS.js (new) 3.03 kB 🔴 +3.03 kB 🔴 +1.16 kB 🔴 +1.03 kB
assets/useExternalLink-XnC3MruT.js (removed) 3.03 kB 🟢 -3.03 kB 🟢 -1.16 kB 🟢 -1.02 kB
assets/useDowngradeToPersonal-Chug9FyF.js (removed) 3 kB 🟢 -3 kB 🟢 -1.18 kB 🟢 -1.02 kB
assets/useDowngradeToPersonal-hyw-mmev.js (new) 3 kB 🔴 +3 kB 🔴 +1.18 kB 🔴 +1.02 kB
assets/assetPreviewUtil-C8ErS9Cr.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1 kB 🔴 +878 B
assets/assetPreviewUtil-ZElME27r.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1.01 kB 🟢 -877 B
assets/useUpstreamValue-CyRUdK_2.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -793 B 🟢 -703 B
assets/useUpstreamValue-DwHAZ8bI.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +794 B 🔴 +706 B
assets/useWorkspaceTierLabel-CwAcH5tC.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -853 B 🟢 -740 B
assets/useWorkspaceTierLabel-HuY1NLDe.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +853 B 🔴 +734 B
assets/useErrorHandling-B5ZyNvgs.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -647 B 🟢 -558 B
assets/useErrorHandling-BS6Qc2nQ.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +648 B 🔴 +555 B
assets/useLoad3d-C3M9dyMj.js (new) 311 B 🔴 +311 B 🔴 +163 B 🔴 +147 B
assets/useLoad3d-D-dL2RAk.js (removed) 311 B 🟢 -311 B 🟢 -164 B 🟢 -146 B
assets/useSessionCookie-BCCTjIQ4.js (new) 101 B 🔴 +101 B 🔴 +86 B 🔴 +81 B
assets/useSessionCookie-C757VXQd.js (removed) 101 B 🟢 -101 B 🟢 -86 B 🟢 -82 B
assets/useFeatureFlags-CHJc-0gX.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +83 B
assets/useFeatureFlags-CV-bnV8j.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -85 B
assets/useLoad3dViewer-CxSndm_g.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +83 B
assets/useLoad3dViewer-yM2H3Mri.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -86 B
assets/useCurrentUser-coC3iCI9.js (new) 96 B 🔴 +96 B 🔴 +97 B 🔴 +84 B
assets/useCurrentUser-DeGMZxaL.js (removed) 96 B 🟢 -96 B 🟢 -97 B 🟢 -85 B

Status: 21 added / 21 removed / 12 unchanged

Vendor & Third-Party — 15.3 MB (baseline 15.3 MB) • 🔴 +24.6 kB

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-reka-ui-B6jtMg9L.js (new) 515 kB 🔴 +515 kB 🔴 +93.5 kB 🔴 +71.5 kB
assets/vendor-reka-ui-BAysHLjf.js (removed) 491 kB 🟢 -491 kB 🟢 -89.4 kB 🟢 -68.9 kB
assets/vendor-xterm-CxZK3uIy.js (new) 374 kB 🔴 +374 kB 🔴 +75.6 kB 🔴 +61.1 kB
assets/vendor-xterm-Dw-c804Z.js (removed) 374 kB 🟢 -374 kB 🟢 -75.6 kB 🟢 -61 kB

Status: 2 added / 2 removed / 14 unchanged

Other — 11.8 MB (baseline 11.7 MB) • 🔴 +52.6 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/nodeDefs-BVReO2Ir.js (removed) 692 kB 🟢 -692 kB 🟢 -112 kB 🟢 -76.7 kB
assets/nodeDefs-CvenK_Dx.js (new) 692 kB 🔴 +692 kB 🔴 +112 kB 🔴 +76.7 kB
assets/nodeDefs-CECu2fPz.js (new) 634 kB 🔴 +634 kB 🔴 +102 kB 🔴 +71.1 kB
assets/nodeDefs-DEt_ujgC.js (removed) 634 kB 🟢 -634 kB 🟢 -102 kB 🟢 -71.1 kB
assets/nodeDefs-Boy1CVTf.js (new) 631 kB 🔴 +631 kB 🔴 +105 kB 🔴 +73.1 kB
assets/nodeDefs-BOZkNaBV.js (removed) 631 kB 🟢 -631 kB 🟢 -105 kB 🟢 -73.1 kB
assets/nodeDefs-DvtYNaPO.js (removed) 580 kB 🟢 -580 kB 🟢 -102 kB 🟢 -70.7 kB
assets/nodeDefs-pswsxUmn.js (new) 580 kB 🔴 +580 kB 🔴 +102 kB 🔴 +70.7 kB
assets/nodeDefs-BbkaGvv_.js (new) 577 kB 🔴 +577 kB 🔴 +96.2 kB 🔴 +68.5 kB
assets/nodeDefs-BHolcFG0.js (removed) 577 kB 🟢 -577 kB 🟢 -96.2 kB 🟢 -68.5 kB
assets/nodeDefs-daSYebel.js (removed) 559 kB 🟢 -559 kB 🟢 -99.4 kB 🟢 -70 kB
assets/nodeDefs-DOaxTBJc.js (new) 559 kB 🔴 +559 kB 🔴 +99.4 kB 🔴 +70 kB
assets/nodeDefs-C7QsZoqL.js (removed) 556 kB 🟢 -556 kB 🟢 -97.8 kB 🟢 -71 kB
assets/nodeDefs-CPCJb_xt.js (new) 556 kB 🔴 +556 kB 🔴 +97.8 kB 🔴 +71 kB
assets/nodeDefs-CIgpFbzl.js (new) 551 kB 🔴 +551 kB 🔴 +98.5 kB 🔴 +71.5 kB
assets/nodeDefs-DlE0SJ96.js (removed) 551 kB 🟢 -551 kB 🟢 -98.5 kB 🟢 -71.5 kB
assets/nodeDefs-BHxUV7Wu.js (removed) 548 kB 🟢 -548 kB 🟢 -95.3 kB 🟢 -69.2 kB
assets/nodeDefs-rLKHWRy3.js (new) 548 kB 🔴 +548 kB 🔴 +95.3 kB 🔴 +69.2 kB
assets/nodeDefs-CRNmGaHv.js (removed) 541 kB 🟢 -541 kB 🟢 -94.2 kB 🟢 -68.5 kB
assets/nodeDefs-DrCuGidp.js (new) 541 kB 🔴 +541 kB 🔴 +94.2 kB 🔴 +68.5 kB
assets/nodeDefs-BBEK8jGs.js (removed) 504 kB 🟢 -504 kB 🟢 -97.6 kB 🟢 -68.3 kB
assets/nodeDefs-C76U1zck.js (new) 504 kB 🔴 +504 kB 🔴 +97.6 kB 🔴 +68.3 kB
assets/nodeDefs-CWSr3nGp.js (removed) 499 kB 🟢 -499 kB 🟢 -96.2 kB 🟢 -66.8 kB
assets/nodeDefs-IC4I27i_.js (new) 499 kB 🔴 +499 kB 🔴 +96.2 kB 🔴 +66.9 kB
assets/main-9MvXihMA.js (new) 286 kB 🔴 +286 kB 🔴 +71.3 kB 🔴 +55.8 kB
assets/main-9WVPdED5.js (removed) 286 kB 🟢 -286 kB 🟢 -71.4 kB 🟢 -55.8 kB
assets/main-CjhSaP28.js (new) 256 kB 🔴 +256 kB 🔴 +64.6 kB 🔴 +51.7 kB
assets/main-ZsakGBGn.js (removed) 256 kB 🟢 -256 kB 🟢 -64.6 kB 🟢 -51.7 kB
assets/main-BkgeqeNK.js (new) 244 kB 🔴 +244 kB 🔴 +64.1 kB 🔴 +50.9 kB
assets/main-CyKvEzda.js (removed) 244 kB 🟢 -244 kB 🟢 -64.1 kB 🟢 -50.9 kB
assets/main-C1cqicH2.js (new) 235 kB 🔴 +235 kB 🔴 +63.7 kB 🔴 +50.3 kB
assets/main-DxtZVO1O.js (removed) 235 kB 🟢 -235 kB 🟢 -63.7 kB 🟢 -50.3 kB
assets/main-BAB5Pyne.js (removed) 227 kB 🟢 -227 kB 🟢 -61.5 kB 🟢 -49.3 kB
assets/main-CXn-gBN9.js (new) 227 kB 🔴 +227 kB 🔴 +61.5 kB 🔴 +49.3 kB
assets/main-CyaE1Ypn.js (new) 214 kB 🔴 +214 kB 🔴 +62.4 kB 🔴 +51.7 kB
assets/main-DAb8ArUg.js (removed) 214 kB 🟢 -214 kB 🟢 -62.4 kB 🟢 -51.7 kB
assets/main--1gWbj6r.js (new) 212 kB 🔴 +212 kB 🔴 +61.6 kB 🔴 +49.4 kB
assets/main-x8Swm7YW.js (removed) 212 kB 🟢 -212 kB 🟢 -61.7 kB 🟢 -49.4 kB
assets/main-Ca3MK5T7.js (removed) 207 kB 🟢 -207 kB 🟢 -60.7 kB 🟢 -50.2 kB
assets/main-Gi7YXtJj.js (new) 207 kB 🔴 +207 kB 🔴 +60.7 kB 🔴 +50.2 kB
assets/main-BQEkNxa_.js (new) 204 kB 🔴 +204 kB 🔴 +61 kB 🔴 +50.8 kB
assets/main-uG0Jrrrl.js (removed) 204 kB 🟢 -204 kB 🟢 -61 kB 🟢 -50.8 kB
assets/main-CxOf62yR.js (new) 203 kB 🔴 +203 kB 🔴 +60.1 kB 🔴 +50.2 kB
assets/main-zAY2e_61.js (removed) 203 kB 🟢 -203 kB 🟢 -60.1 kB 🟢 -50.2 kB
assets/main-Bxn0h0om.js (new) 185 kB 🔴 +185 kB 🔴 +54.4 kB 🔴 +45.7 kB
assets/main-CIXdNL0Z.js (removed) 184 kB 🟢 -184 kB 🟢 -54.1 kB 🟢 -45.4 kB
assets/main-_Ahcbdkk.js (new) 180 kB 🔴 +180 kB 🔴 +59.8 kB 🔴 +47.6 kB
assets/main-BT8KtYQg.js (removed) 180 kB 🟢 -180 kB 🟢 -59.8 kB 🟢 -47.6 kB
assets/main-CBKTaxLV.js (removed) 179 kB 🟢 -179 kB 🟢 -59.7 kB 🟢 -47.3 kB
assets/main-kg-N4bL2.js (new) 179 kB 🔴 +179 kB 🔴 +59.7 kB 🔴 +47.3 kB
assets/core-D_Q99gf2.js (new) 122 kB 🔴 +122 kB 🔴 +31.4 kB 🔴 +26.5 kB
assets/core-MtpmZhNl.js (removed) 119 kB 🟢 -119 kB 🟢 -30.7 kB 🟢 -25.9 kB
assets/WidgetSelect-GwSRGOxM.js (new) 90.3 kB 🔴 +90.3 kB 🔴 +20.3 kB 🔴 +17.4 kB
assets/WidgetSelect-CxuLFVNE.js (removed) 89 kB 🟢 -89 kB 🟢 -20 kB 🟢 -17.2 kB
assets/WidgetVideoTrim-DldPEmSV.js (new) 54.9 kB 🔴 +54.9 kB 🔴 +12.6 kB 🔴 +11.1 kB
assets/Load3DControls-C4IbTa7m.js (new) 46.8 kB 🔴 +46.8 kB 🔴 +7.56 kB 🔴 +6.62 kB
assets/Load3DControls-hSrJt9wj.js (removed) 46.8 kB 🟢 -46.8 kB 🟢 -7.56 kB 🟢 -6.62 kB
assets/SubscriptionTransitionPreviewWorkspace-7eQLXmBJ.js (new) 45.7 kB 🔴 +45.7 kB 🔴 +9.48 kB 🔴 +8.38 kB
assets/SubscriptionTransitionPreviewWorkspace-DZUzvKzT.js (removed) 45.7 kB 🟢 -45.7 kB 🟢 -9.48 kB 🟢 -8.37 kB
assets/SubscriptionRequiredDialogContentUnified-CE6K6luA.js (new) 41.2 kB 🔴 +41.2 kB 🔴 +9.15 kB 🔴 +7.96 kB
assets/SubscriptionRequiredDialogContentUnified-hsHUsz-x.js (removed) 41.2 kB 🟢 -41.2 kB 🟢 -9.15 kB 🟢 -7.96 kB
assets/WorkspacePanelContent-hzwuo5r3.js (removed) 34.5 kB 🟢 -34.5 kB 🟢 -7.48 kB 🟢 -6.59 kB
assets/WorkspacePanelContent-Ups69zZ1.js (new) 34.5 kB 🔴 +34.5 kB 🔴 +7.48 kB 🔴 +6.59 kB
assets/WidgetPainter-B1hKD74m.js (new) 32.7 kB 🔴 +32.7 kB 🔴 +7.9 kB 🔴 +7.01 kB
assets/WidgetPainter-BsOuwm4N.js (removed) 32.7 kB 🟢 -32.7 kB 🟢 -7.9 kB 🟢 -7.01 kB
assets/Load3dViewerContent-BKDRO1Sc.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +6.3 kB 🔴 +5.46 kB
assets/Load3dViewerContent-Tf-pIFGp.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -6.3 kB 🟢 -5.46 kB
assets/HdrViewerContent-BwVcRpt6.js (new) 29.2 kB 🔴 +29.2 kB 🔴 +8.09 kB 🔴 +7.14 kB
assets/HdrViewerContent-CNzbuRXX.js (removed) 29.2 kB 🟢 -29.2 kB 🟢 -8.09 kB 🟢 -7.14 kB
assets/WidgetBoundingBoxes-C6aMZN-9.js (new) 28.6 kB 🔴 +28.6 kB 🔴 +7.9 kB 🔴 +7.01 kB
assets/WidgetBoundingBoxes-Dt4w_BTb.js (removed) 28.6 kB 🟢 -28.6 kB 🟢 -7.9 kB 🟢 -7 kB
assets/SubscriptionRequiredDialogContent-BbGYu4RF.js (new) 26.8 kB 🔴 +26.8 kB 🔴 +6.63 kB 🔴 +5.85 kB
assets/SubscriptionRequiredDialogContent-CJ58IBo8.js (removed) 26.8 kB 🟢 -26.8 kB 🟢 -6.63 kB 🟢 -5.86 kB
assets/initHostTelemetry-B873_SZr.js (removed) 25.2 kB 🟢 -25.2 kB 🟢 -6.22 kB 🟢 -5.19 kB
assets/initHostTelemetry-D6zuPZfD.js (new) 25.2 kB 🔴 +25.2 kB 🔴 +6.22 kB 🔴 +5.18 kB
assets/SubscriptionPanelContentWorkspace-Co4xJYIA.js (new) 24.8 kB 🔴 +24.8 kB 🔴 +5.78 kB 🔴 +5.07 kB
assets/SubscriptionPanelContentWorkspace-Dh7V2Wsd.js (removed) 24.8 kB 🟢 -24.8 kB 🟢 -5.78 kB 🟢 -5.07 kB
assets/SubscriptionRequiredDialogContentWorkspace-4K69YXET.js (removed) 24.6 kB 🟢 -24.6 kB 🟢 -5.65 kB 🟢 -4.97 kB
assets/SubscriptionRequiredDialogContentWorkspace-sqWwKQZJ.js (new) 24.6 kB 🔴 +24.6 kB 🔴 +5.66 kB 🔴 +4.96 kB
assets/ColorPicker-xmXBliXL.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +6.34 kB 🔴 +5.59 kB
assets/ColorPicker-DRUgvfFz.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -6.34 kB 🟢 -5.59 kB
assets/WidgetImageCrop-CDCb-iNX.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.75 kB 🟢 -5.05 kB
assets/WidgetImageCrop-D2g52F7d.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +5.75 kB 🔴 +5.05 kB
assets/load3d-Dyy1o7YK.js (removed) 21.3 kB 🟢 -21.3 kB 🟢 -5.19 kB 🟢 -4.5 kB
assets/load3d-UTB9B3MZ.js (new) 21.3 kB 🔴 +21.3 kB 🔴 +5.19 kB 🔴 +4.5 kB
assets/CurrentUserPopoverWorkspace-JS-aLX3H.js (new) 20.5 kB 🔴 +20.5 kB 🔴 +4.71 kB 🔴 +4.2 kB
assets/CurrentUserPopoverWorkspace-wxq8Bkrc.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -4.7 kB 🟢 -4.2 kB
assets/SignInContent-BsWSRaVU.js (new) 20.1 kB 🔴 +20.1 kB 🔴 +5.07 kB 🔴 +4.44 kB
assets/SignInContent-Ce8P9Oas.js (removed) 20.1 kB 🟢 -20.1 kB 🟢 -5.07 kB 🟢 -4.43 kB
assets/Load3D-CfDQ04Al.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.52 kB 🟢 -3.94 kB
assets/Load3D-CjrgBQRq.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.51 kB 🔴 +3.94 kB
assets/WidgetInputNumber-DwjVKUBZ.js (removed) 19 kB 🟢 -19 kB 🟢 -4.79 kB 🟢 -4.25 kB
assets/commands-8BJa1tUH.js (new) 18.4 kB 🔴 +18.4 kB 🔴 +4 kB 🔴 +3.12 kB
assets/commands-BCR5v4jO.js (removed) 18.4 kB 🟢 -18.4 kB 🟢 -4 kB 🟢 -3.12 kB
assets/commands-DLhPZ1b6.js (removed) 17.5 kB 🟢 -17.5 kB 🟢 -3.65 kB 🟢 -2.88 kB
assets/commands-KWp2QHjJ.js (new) 17.5 kB 🔴 +17.5 kB 🔴 +3.65 kB 🔴 +2.88 kB
assets/commands-DBoEDfRg.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +3.69 kB 🔴 +2.83 kB
assets/commands-ZL67hGVC.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -3.69 kB 🟢 -2.84 kB
assets/commands-ADMnfph0.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.76 kB 🔴 +2.96 kB
assets/commands-DNq7V1Bd.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.77 kB 🟢 -2.96 kB
assets/CreditsTile-DKgiHWqO.js (new) 17 kB 🔴 +17 kB 🔴 +4.52 kB 🔴 +3.99 kB
assets/CreditsTile-LRs9HMTZ.js (removed) 17 kB 🟢 -17 kB 🟢 -4.53 kB 🟢 -3.99 kB
assets/WidgetRecordAudio-fbTjSxfm.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.63 kB 🔴 +4.13 kB
assets/WidgetRecordAudio-lroJxaKl.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.63 kB 🟢 -4.14 kB
assets/commands-BozNMrPH.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +3.79 kB 🔴 +2.99 kB
assets/commands-q6-PsLUZ.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -3.8 kB 🟢 -2.99 kB
assets/commands-DqZHjSEb.js (new) 16.3 kB 🔴 +16.3 kB 🔴 +3.53 kB 🔴 +2.95 kB
assets/commands-EZNoZhIQ.js (removed) 16.3 kB 🟢 -16.3 kB 🟢 -3.53 kB 🟢 -2.95 kB
assets/WidgetRange-DrjVbeBa.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.17 kB 🟢 -3.72 kB
assets/commands-Cq6ZsgGb.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -3.5 kB 🟢 -2.91 kB
assets/commands-DX1BN-nq.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +3.5 kB 🔴 +2.91 kB
assets/commands-aQkHTdTB.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -3.42 kB 🟢 -2.8 kB
assets/commands-BmFuKeTZ.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +3.42 kB 🔴 +2.8 kB
assets/commands-Dqb6GUHE.js (new) 15.7 kB 🔴 +15.7 kB 🔴 +3.39 kB 🔴 +2.81 kB
assets/commands-Dxp06ttF.js (removed) 15.7 kB 🟢 -15.7 kB 🟢 -3.39 kB 🟢 -2.81 kB
assets/commands-B8qT9HDX.js (new) 15.6 kB 🔴 +15.6 kB 🔴 +3.66 kB 🔴 +2.85 kB
assets/commands-BQu3xLRE.js (removed) 15.6 kB 🟢 -15.6 kB 🟢 -3.65 kB 🟢 -2.85 kB
assets/commands-CNOXwlmE.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +3.59 kB 🔴 +2.74 kB
assets/commands-DeppHLGy.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -3.59 kB 🟢 -2.72 kB
assets/commands-cQYjl6qv.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -3.54 kB 🟢 -2.64 kB
assets/commands-J67MQZm-.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +3.54 kB 🔴 +2.64 kB
assets/WidgetInputNumber-Aph2wBhG.js (new) 14 kB 🔴 +14 kB 🔴 +3.66 kB 🔴 +3.23 kB
assets/DialogHeader-HDp-4wJP.js (removed) 13.9 kB 🟢 -13.9 kB 🟢 -3.79 kB 🟢 -3.36 kB
assets/DialogHeader-w4CQzUBq.js (new) 13.9 kB 🔴 +13.9 kB 🔴 +3.79 kB 🔴 +3.36 kB
assets/WidgetRange-CrRNyPZq.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.57 kB 🔴 +3.16 kB
assets/WaveAudioPlayer-DOvffWBK.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.48 kB 🔴 +3.06 kB
assets/WaveAudioPlayer-DYnHK4fz.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.48 kB 🟢 -3.06 kB
assets/i18n-BwUCL_jj.js (removed) 12.2 kB 🟢 -12.2 kB 🟢 -3.24 kB 🟢 -2.72 kB
assets/i18n-DOpRzGMR.js (new) 12.2 kB 🔴 +12.2 kB 🔴 +3.24 kB 🔴 +2.72 kB
assets/WidgetCurve-BVeKWY2d.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.51 kB 🔴 +3.16 kB
assets/WidgetCurve-HaRNwwQa.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.5 kB 🟢 -3.18 kB
assets/AudioPreviewPlayer-B4eeGCmh.js (removed) 10.6 kB 🟢 -10.6 kB 🟢 -3.06 kB 🟢 -2.73 kB
assets/AudioPreviewPlayer-DyMD8a-q.js (new) 10.6 kB 🔴 +10.6 kB 🔴 +3.06 kB 🔴 +2.74 kB
assets/TeamWorkspacesDialogContent-BzLYV4SI.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -3 kB 🟢 -2.67 kB
assets/TeamWorkspacesDialogContent-cupI6qF9.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +3 kB 🔴 +2.66 kB
assets/SelectValue-By8Ot4VN.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.48 kB 🟢 -2.19 kB
assets/SelectValue-CskvUPO0.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.48 kB 🔴 +2.19 kB
assets/Load3DConfiguration-BjOs-3jt.js (new) 9.02 kB 🔴 +9.02 kB 🔴 +2.66 kB 🔴 +2.35 kB
assets/Load3DConfiguration-BMOJiPKU.js (removed) 9.02 kB 🟢 -9.02 kB 🟢 -2.66 kB 🟢 -2.35 kB
assets/nodeTemplates-CQi1owIQ.js (new) 8.33 kB 🔴 +8.33 kB 🔴 +2.88 kB 🔴 +2.54 kB
assets/nodeTemplates-KGhXgf4Z.js (removed) 8.33 kB 🟢 -8.33 kB 🟢 -2.88 kB 🟢 -2.54 kB
assets/onboardingCloudRoutes-Csojj0_G.js (new) 8.28 kB 🔴 +8.28 kB 🔴 +2.59 kB 🔴 +2.23 kB
assets/onboardingCloudRoutes-FyAo8fnk.js (removed) 8.28 kB 🟢 -8.28 kB 🟢 -2.59 kB 🟢 -2.22 kB
assets/WidgetImageCompare-B5EmIv6u.js (removed) 8.19 kB 🟢 -8.19 kB 🟢 -2.33 kB 🟢 -2.04 kB
assets/WidgetImageCompare-C9UIX3Hl.js (new) 8.19 kB 🔴 +8.19 kB 🔴 +2.33 kB 🔴 +2.04 kB
assets/NightlySurveyController-BfeoQjC6.js (removed) 7.95 kB 🟢 -7.95 kB 🟢 -2.7 kB 🟢 -2.39 kB
assets/NightlySurveyController-DhvIM6Be.js (new) 7.95 kB 🔴 +7.95 kB 🔴 +2.7 kB 🔴 +2.39 kB
assets/Popover-5xXV70e5.js (new) 7.18 kB 🔴 +7.18 kB 🔴 +2.59 kB 🔴 +2.27 kB
assets/Popover-BgHTgs8K.js (removed) 7.18 kB 🟢 -7.18 kB 🟢 -2.59 kB 🟢 -2.27 kB
assets/InviteMemberDialogContent-BYddFYQr.js (new) 6.76 kB 🔴 +6.76 kB 🔴 +2.22 kB 🔴 +1.96 kB
assets/InviteMemberDialogContent-KeOVCeoG.js (removed) 6.76 kB 🟢 -6.76 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/WidgetWithControl-DsXr_5xS.js (removed) 6.3 kB 🟢 -6.3 kB 🟢 -2.54 kB 🟢 -2.25 kB
assets/WidgetWithControl-DZ_fufBy.js (new) 6.3 kB 🔴 +6.3 kB 🔴 +2.54 kB 🔴 +2.26 kB
assets/AnimationControls-CVxzimKA.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -1.88 kB 🟢 -1.67 kB
assets/AnimationControls-vqbgEi-_.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +1.88 kB 🔴 +1.67 kB
assets/tierBenefits-DEp0LPcd.js (new) 5.94 kB 🔴 +5.94 kB 🔴 +1.9 kB 🔴 +1.64 kB
assets/tierBenefits-SctzuG6s.js (removed) 5.94 kB 🟢 -5.94 kB 🟢 -1.9 kB 🟢 -1.65 kB
assets/main-DVk5qdrT.js (new) 5.72 kB 🔴 +5.72 kB 🔴 +1.84 kB 🔴 +1.56 kB
assets/main-CTItiKsh.js (removed) 5.68 kB 🟢 -5.68 kB 🟢 -1.83 kB 🟢 -1.54 kB
assets/load3dPreviewExtensions-CVFvuObw.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.75 kB 🟢 -1.55 kB
assets/load3dPreviewExtensions-D1SZUcZt.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.75 kB 🔴 +1.55 kB
assets/FreeTierDialogContent-0PPlGr7w.js (new) 5.23 kB 🔴 +5.23 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/FreeTierDialogContent-ccKr8BrC.js (removed) 5.23 kB 🟢 -5.23 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CreateWorkspaceDialogContent-CfEWlIfD.js (removed) 5.19 kB 🟢 -5.19 kB 🟢 -1.83 kB 🟢 -1.58 kB
assets/CreateWorkspaceDialogContent-CGMPZuiR.js (new) 5.19 kB 🔴 +5.19 kB 🔴 +1.83 kB 🔴 +1.58 kB
assets/CloudNotificationContent-rIsdKz6V.js (new) 5.11 kB 🔴 +5.11 kB 🔴 +1.79 kB 🔴 +1.54 kB
assets/CloudNotificationContent-TqZKLgYV.js (removed) 5.11 kB 🟢 -5.11 kB 🟢 -1.79 kB 🟢 -1.54 kB
assets/missingModelDownload-Cf2DAZza.js (removed) 5.07 kB 🟢 -5.07 kB 🟢 -1.98 kB 🟢 -1.73 kB
assets/missingModelDownload-DaKK9Hxh.js (new) 5.07 kB 🔴 +5.07 kB 🔴 +1.98 kB 🔴 +1.72 kB
assets/ChangeMemberRoleDialogContent-Bgaycxiq.js (removed) 5.04 kB 🟢 -5.04 kB 🟢 -1.66 kB 🟢 -1.46 kB
assets/ChangeMemberRoleDialogContent-CWcNsDgu.js (new) 5.04 kB 🔴 +5.04 kB 🔴 +1.67 kB 🔴 +1.46 kB
assets/EditWorkspaceDialogContent-CURoETjp.js (new) 5 kB 🔴 +5 kB 🔴 +1.79 kB 🔴 +1.56 kB
assets/EditWorkspaceDialogContent-zbwzUE82.js (removed) 5 kB 🟢 -5 kB 🟢 -1.79 kB 🟢 -1.56 kB
assets/WidgetTextarea-Ci7y_VHr.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.9 kB 🟢 -1.66 kB
assets/WidgetTextarea-DYyvRYsS.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.9 kB 🔴 +1.66 kB
assets/DowngradeRemoveMembersDialogContent-C7xCczBY.js (removed) 4.83 kB 🟢 -4.83 kB 🟢 -1.71 kB 🟢 -1.47 kB
assets/DowngradeRemoveMembersDialogContent-CpccloDI.js (new) 4.83 kB 🔴 +4.83 kB 🔴 +1.7 kB 🔴 +1.47 kB
assets/saveMesh-B2QCismR.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.56 kB 🔴 +1.38 kB
assets/saveMesh-JOKra4oy.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.56 kB 🟢 -1.38 kB
assets/Preview3d-Bq5xs3I3.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.43 kB 🔴 +1.23 kB
assets/Preview3d-CD-RtNAi.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.43 kB 🟢 -1.23 kB
assets/ValueControlPopover-DJJ0HEq-.js (new) 4.55 kB 🔴 +4.55 kB 🔴 +1.59 kB 🔴 +1.42 kB
assets/ValueControlPopover-IqLazBef.js (removed) 4.55 kB 🟢 -4.55 kB 🟢 -1.59 kB 🟢 -1.42 kB
assets/CancelSubscriptionDialogContent-CH37jKUF.js (removed) 4.54 kB 🟢 -4.54 kB 🟢 -1.65 kB 🟢 -1.44 kB
assets/CancelSubscriptionDialogContent-cwTKsczb.js (new) 4.54 kB 🔴 +4.54 kB 🔴 +1.65 kB 🔴 +1.44 kB
assets/ApiNodesSignInContent-C3s6FHH4.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.34 kB 🔴 +1.2 kB
assets/ApiNodesSignInContent-DmO1amAK.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.34 kB 🟢 -1.18 kB
assets/Slider-BvVBA-dA.js (removed) 3.92 kB 🟢 -3.92 kB 🟢 -1.45 kB 🟢 -1.26 kB
assets/Slider-D_t4FGfK.js (new) 3.92 kB 🔴 +3.92 kB 🔴 +1.45 kB 🔴 +1.26 kB
assets/DeleteWorkspaceDialogContent-BVx8Dyyu.js (removed) 3.91 kB 🟢 -3.91 kB 🟢 -1.47 kB 🟢 -1.27 kB
assets/DeleteWorkspaceDialogContent-ByNhI01I.js (new) 3.91 kB 🔴 +3.91 kB 🔴 +1.47 kB 🔴 +1.27 kB
assets/WidgetBoundingBox-BL4hBGvw.js (removed) 3.82 kB 🟢 -3.82 kB 🟢 -1.06 kB 🟢 -921 B
assets/WidgetBoundingBox-DyqYbsT8.js (new) 3.82 kB 🔴 +3.82 kB 🔴 +1.06 kB 🔴 +919 B
assets/WidgetGalleria-B7MwER-x.js (removed) 3.8 kB 🟢 -3.8 kB 🟢 -1.48 kB 🟢 -1.32 kB
assets/WidgetGalleria-DzL3VP8u.js (new) 3.8 kB 🔴 +3.8 kB 🔴 +1.48 kB 🔴 +1.32 kB
assets/LeaveWorkspaceDialogContent-BLLjz55F.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.42 kB 🔴 +1.23 kB
assets/LeaveWorkspaceDialogContent-e4NVksAi.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.42 kB 🟢 -1.23 kB
assets/RemoveMemberDialogContent-CSEmVqSb.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.37 kB 🟢 -1.19 kB
assets/RemoveMemberDialogContent-Fjf2zr6N.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.37 kB 🔴 +1.19 kB
assets/WidgetToggleSwitch-BoNq-Ghy.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.4 kB 🟢 -1.23 kB
assets/WidgetToggleSwitch-Sv8mJG8B.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.4 kB 🔴 +1.24 kB
assets/RevokeInviteDialogContent-88n5OAg1.js (new) 3.63 kB 🔴 +3.63 kB 🔴 +1.38 kB 🔴 +1.21 kB
assets/RevokeInviteDialogContent-CVO0ZXZe.js (removed) 3.63 kB 🟢 -3.63 kB 🟢 -1.38 kB 🟢 -1.21 kB
assets/InviteMemberUpsellDialogContent-0Mddtomy.js (removed) 3.47 kB 🟢 -3.47 kB 🟢 -1.25 kB 🟢 -1.09 kB
assets/InviteMemberUpsellDialogContent-D6lPAcIJ.js (new) 3.47 kB 🔴 +3.47 kB 🔴 +1.25 kB 🔴 +1.11 kB
assets/Media3DTop-ChfyW763.js (new) 3.26 kB 🔴 +3.26 kB 🔴 +1.3 kB 🔴 +1.13 kB
assets/Media3DTop-DKZxH3fw.js (removed) 3.26 kB 🟢 -3.26 kB 🟢 -1.3 kB 🟢 -1.13 kB
assets/WidgetMarkdown-ClcE_sge.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.27 kB 🔴 +1.1 kB
assets/WidgetMarkdown-CnNX4txX.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.27 kB 🟢 -1.1 kB
assets/WidgetInputText-DHCFrZsy.js (removed) 3.07 kB 🟢 -3.07 kB 🟢 -1.29 kB 🟢 -1.16 kB
assets/WidgetInputText-e9XJFcg0.js (new) 3.07 kB 🔴 +3.07 kB 🔴 +1.3 kB 🔴 +1.16 kB
assets/GlobalToast-CijY_M20.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.26 kB 🔴 +1.09 kB
assets/GlobalToast-Doe6bATL.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/MediaVideoTop-8jxjx8mO.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.18 kB 🟢 -1.03 kB
assets/MediaVideoTop-DTzoL8dg.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.18 kB 🔴 +1.03 kB
assets/load3dAdvanced-BEekDmyx.js (removed) 2.87 kB 🟢 -2.87 kB 🟢 -1.13 kB 🟢 -981 B
assets/load3dAdvanced-C2zikvJM.js (new) 2.87 kB 🔴 +2.87 kB 🔴 +1.13 kB 🔴 +986 B
assets/teamPlanCreditStops-BK6OKGCe.js (removed) 2.83 kB 🟢 -2.83 kB 🟢 -1.3 kB 🟢 -1.11 kB
assets/teamPlanCreditStops-Dlh_rZn8.js (new) 2.83 kB 🔴 +2.83 kB 🔴 +1.3 kB 🔴 +1.11 kB
assets/ErrorPanelSurveyCta-C-a7HFki.js (removed) 2.64 kB 🟢 -2.64 kB 🟢 -1.16 kB 🟢 -1.03 kB
assets/ErrorPanelSurveyCta-D4jP9dis.js (new) 2.64 kB 🔴 +2.64 kB 🔴 +1.17 kB 🔴 +1.03 kB
assets/SubscribeToRun-CgZ_iENL.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.1 kB 🟢 -969 B
assets/SubscribeToRun-DJcjzAin.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.1 kB 🔴 +968 B
assets/WidgetLayoutField-CyZCNSPq.js (new) 2.43 kB 🔴 +2.43 kB 🔴 +1.06 kB 🔴 +936 B
assets/WidgetLayoutField-D2qGWQwb.js (removed) 2.43 kB 🟢 -2.43 kB 🟢 -1.06 kB 🟢 -937 B
assets/WidgetChart-CUcivpiS.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1.03 kB 🟢 -887 B
assets/WidgetChart-DVxOFmYa.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1.03 kB 🔴 +887 B
assets/SubscriptionBenefits-B-DXLZh1.js (removed) 2.07 kB 🟢 -2.07 kB 🟢 -710 B 🟢 -609 B
assets/SubscriptionBenefits-Bk0EbzpD.js (new) 2.07 kB 🔴 +2.07 kB 🔴 +710 B 🔴 +606 B
assets/MediaImageTop-CKOVNt74.js (new) 2.06 kB 🔴 +2.06 kB 🔴 +995 B 🔴 +890 B
assets/MediaImageTop-Cygn2y79.js (removed) 2.06 kB 🟢 -2.06 kB 🟢 -994 B 🟢 -878 B
assets/graphHasMissingNodes-DSES3ZVw.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +909 B 🔴 +792 B
assets/graphHasMissingNodes-k3kR3CqA.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -907 B 🟢 -801 B
assets/WidgetColorPicker-B_g0_N1t.js (new) 1.74 kB 🔴 +1.74 kB 🔴 +783 B 🔴 +695 B
assets/WidgetColorPicker-BI8fjYbK.js (removed) 1.74 kB 🟢 -1.74 kB 🟢 -786 B 🟢 -693 B
assets/MediaAudioTop-AfcKCsPy.js (new) 1.67 kB 🔴 +1.67 kB 🔴 +837 B 🔴 +700 B
assets/MediaAudioTop-BAW67qcJ.js (removed) 1.67 kB 🟢 -1.67 kB 🟢 -839 B 🟢 -703 B
assets/signInSchema-BNOfvodS.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -586 B 🟢 -511 B
assets/signInSchema-OqXRS6Ut.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +586 B 🔴 +513 B
assets/widgetPropFilter-Bu53tk7j.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +705 B 🔴 +603 B
assets/widgetPropFilter-Dpa84SyG.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -704 B 🟢 -604 B
assets/CloudRunButtonWrapper-BTt11AqY.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -551 B 🟢 -516 B
assets/CloudRunButtonWrapper-CR_smzIP.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +549 B 🔴 +486 B
assets/MediaOtherTop-ejrLHe36.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +607 B 🔴 +504 B
assets/MediaOtherTop-wWt5rXzg.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -606 B 🟢 -502 B
assets/MediaTextTop-BmYmtyBm.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +600 B 🔴 +501 B
assets/MediaTextTop-BsXZPdug.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -600 B 🟢 -503 B
assets/cloudSessionCookie-Be-JmES7.js (removed) 991 B 🟢 -991 B 🟢 -468 B 🟢 -425 B
assets/cloudSessionCookie-C_wsG2FG.js (new) 991 B 🔴 +991 B 🔴 +470 B 🔴 +399 B
assets/cloudBadges-9pRI1iyF.js (new) 973 B 🔴 +973 B 🔴 +552 B 🔴 +466 B
assets/cloudBadges-CYWfMvRR.js (removed) 973 B 🟢 -973 B 🟢 -548 B 🟢 -495 B
assets/load3dSerialize-BEarJvnG.js (new) 885 B 🔴 +885 B 🔴 +424 B 🔴 +359 B
assets/load3dSerialize-BGyX73HL.js (removed) 885 B 🟢 -885 B 🟢 -426 B 🟢 -363 B
assets/Load3DAdvanced-dw0xRtaa.js (new) 813 B 🔴 +813 B 🔴 +453 B 🔴 +411 B
assets/Load3DAdvanced-G14kdRdq.js (removed) 813 B 🟢 -813 B 🟢 -455 B 🟢 -409 B
assets/nightlyBadges-Be_CsguB.js (new) 464 B 🔴 +464 B 🔴 +305 B 🔴 +257 B
assets/nightlyBadges-DP0D3WUF.js (removed) 464 B 🟢 -464 B 🟢 -307 B 🟢 -259 B
assets/cloud-subscription-Bc9NQDoO.js (new) 279 B 🔴 +279 B 🔴 +184 B 🔴 +146 B
assets/cloud-subscription-CMkhwSUG.js (removed) 279 B 🟢 -279 B 🟢 -184 B 🟢 -147 B
assets/missingModelDownload-DFJWx-MI.js (new) 228 B 🔴 +228 B 🔴 +149 B 🔴 +133 B
assets/missingModelDownload-DFKqp3j2.js (removed) 228 B 🟢 -228 B 🟢 -149 B 🟢 -129 B
assets/SubscriptionPanelContentWorkspace-DvTLOcqp.js (new) 179 B 🔴 +179 B 🔴 +117 B 🔴 +104 B
assets/SubscriptionPanelContentWorkspace-FwYyJHF7.js (removed) 179 B 🟢 -179 B 🟢 -117 B 🟢 -101 B
assets/Load3dViewerContent-C1e8CcgY.js (removed) 137 B 🟢 -137 B 🟢 -103 B 🟢 -91 B
assets/Load3dViewerContent-C8U20Q9D.js (new) 137 B 🔴 +137 B 🔴 +103 B 🔴 +96 B
assets/WidgetToggleSwitch-Bhr9gdO1.js (new) 134 B 🔴 +134 B 🔴 +101 B 🔴 +97 B
assets/WidgetBoundingBox-3nQl0H2i.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +94 B
assets/WidgetBoundingBox-BZyq0HXr.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -92 B
assets/Load3DAdvanced-9NORQnXY.js (removed) 122 B 🟢 -122 B 🟢 -97 B 🟢 -88 B
assets/Load3DAdvanced-BsrKerdU.js (new) 122 B 🔴 +122 B 🔴 +97 B 🔴 +90 B
assets/WidgetLegacy-C5hQ9CPQ.js (removed) 119 B 🟢 -119 B 🟢 -108 B 🟢 -95 B
assets/WidgetLegacy-cvZbtqGy.js (new) 119 B 🔴 +119 B 🔴 +108 B 🔴 +97 B
assets/workflowDraftStoreV2-PFzOSqg3.js (new) 113 B 🔴 +113 B 🔴 +105 B 🔴 +111 B
assets/workflowDraftStoreV2-u2EF5jSf.js (removed) 113 B 🟢 -113 B 🟢 -105 B 🟢 -110 B
assets/Load3D-Ba2Bi6yw.js (new) 98 B 🔴 +98 B 🔴 +89 B 🔴 +82 B
assets/Load3D-YvtktXJc.js (removed) 98 B 🟢 -98 B 🟢 -89 B 🟢 -82 B
assets/i18n-3dXMA0S0.js (new) 97 B 🔴 +97 B 🔴 +92 B 🔴 +85 B
assets/i18n-DOVcIhor.js (removed) 97 B 🟢 -97 B 🟢 -92 B 🟢 -92 B
assets/changeTracker-CE2SyfIk.js (new) 93 B 🔴 +93 B 🔴 +95 B 🔴 +84 B
assets/changeTracker-CrRwcpg0.js (removed) 93 B 🟢 -93 B 🟢 -95 B 🟢 -83 B

Status: 141 added / 139 removed / 26 unchanged

⚡ Performance

⏳ Performance tests in progress…

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/renderer/extensions/vueNodes/components/LGraphNode.vue (1)

496-513: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Keep external width updates enabled in shrink-wrap mode.

Line 505 exits before --node-width is refreshed, so Canvas/External size changes stop affecting LoadVideo nodes whenever preview shrink-wrap is active.

Suggested fix
 function handleLayoutChange(change: LayoutChange) {
   // Only handle Canvas or External source (extensions calling setSize)
   if (
     change.source !== LayoutSource.Canvas &&
     change.source !== LayoutSource.External
   )
     return
   if (layoutStore.isResizingVueNodes.value) return
   if (isCollapsed.value) return
-  if (loadVideoShrinkWrapBody.value) return

   const el = nodeContainerRef.value
   if (!el) return

   const newSize = size.value
-  const fullHeight = newSize.height + LiteGraph.NODE_TITLE_HEIGHT
   el.style.setProperty('--node-width', `${newSize.width}px`)
-  el.style.setProperty('--node-height', `${fullHeight}px`)
+  if (loadVideoShrinkWrapBody.value) {
+    el.style.removeProperty('--node-height')
+    return
+  }
+
+  const fullHeight = newSize.height + LiteGraph.NODE_TITLE_HEIGHT
+  el.style.setProperty('--node-height', `${fullHeight}px`)
 }
🤖 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/renderer/extensions/vueNodes/components/LGraphNode.vue` around lines 496
- 513, The shrink-wrap guard in handleLayoutChange is preventing External and
Canvas width updates from reaching LoadVideo nodes, so adjust the early-return
conditions to allow width refreshes while still preserving the body-height
behavior for shrink-wrap. Keep the existing source checks and the
isCollapsed/layoutStore guards, but move or narrow the loadVideoShrinkWrapBody
check so --node-width is still updated from size.value in LGraphNode.vue when
setSize or Canvas changes arrive.
🤖 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 @.gitignore:
- Around line 99-101: The .gitignore rule using .env* is also hiding
.env.example, so explicitly exempt that template if the repo relies on it.
Update the ignore pattern set near the existing .amp and .vercel entries so
.env.example remains tracked while other env files stay ignored, preserving the
documented template for developers.

In `@src/components/ui/tooltip/TooltipProvider.vue`:
- Around line 5-10: The TooltipProvider wrapper is using defineProps as a whole
object instead of the repo’s reactive props destructuring pattern. Update the
TooltipProvider component to destructure the props with a rest binding in the
script block, then pass that rest object through the TooltipProvider wrapper so
it matches the other UI wrappers and the Reka UI guideline.

In `@src/components/ui/tooltip/TooltipTrigger.vue`:
- Around line 5-10: The TooltipTrigger wrapper is binding the raw defineProps()
object instead of following the reactive props destructuring pattern used by
other src/components/ui wrappers. Update TooltipTrigger.vue to destructure
TooltipTriggerProps with a class alias and rest props, then pass the rest object
into the TooltipTrigger component so it matches the Reka UI wrapper convention.

In `@src/components/video/LoadVideoTrimPanel.vue`:
- Around line 444-451: The frame calculation in handleTimeUpdate() is
inconsistent with the seeking logic because it maps currentTime back to frames
using fps instead of the inverse of frameToTime(). Update handleTimeUpdate() to
derive the playhead frame from the same duration/frameMax-based mapping used by
frameToTime(), so scrubbing and playback stay aligned even when duration * fps
does not match frameMax. Keep the existing clamp logic, but make the frame
conversion consistent with the functions and state in LoadVideoTrimPanel.vue
such as frameToTime(), frameMax, and playheadFrame.
- Around line 22-23: The remove action in LoadVideoTrimPanel is only exposed
through isVideoHovered, which depends on mouseenter/mouseleave and makes the
control unreachable by keyboard. Update the remove control so it can be focused
and activated from the keyboard as well, and do not rely solely on hover state
to render it; use the same approach for the related remove UI around the other
affected block as well.
- Around line 471-480: The metadata labels in formatDuration and formatFileSize
are hardcoded user-facing strings and should be moved to vue-i18n. Update these
helpers to read localized values instead of returning raw literals like 0s, B,
KB, MB, and —, and add the needed translation entries in
src/locales/en/main.json so the LoadVideoTrimPanel stays consistent with the
repo’s localization rules.
- Around line 347-363: The playback toggle flow in handlePlaybackChange ignores
the promise returned by video.play(), so a rejected play attempt can leave
isPlaying stuck true while the video stays paused. Update the isPlaying
watcher/handlePlaybackChange logic to await or catch video.play() and, on
failure, roll back isPlaying to false and propagate or surface the error
appropriately. Use the existing symbols watch(isPlaying), handlePlaybackChange,
and videoRef to locate the change.

In `@src/components/video/MediaUploadEmpty.test.ts`:
- Around line 25-34: The renderEmpty test helper is typed too loosely with
Record<string, unknown>, which bypasses prop validation for MediaUploadEmpty.
Update the props parameter to use Partial<ComponentProps<typeof
MediaUploadEmpty>> in renderEmpty so test inputs stay type-checked while still
allowing overrides, and keep the helper’s default accept prop merge behavior
intact.

In `@src/components/video/MediaUploadEmpty.vue`:
- Around line 54-55: The drag-drop handler in MediaUploadEmpty.vue is dropping
the promise from onDragDrop, which can cause unhandled rejections. Update the
event path around onDragDrop to properly await or return the promise and add
error handling so failures are propagated or surfaced instead of being ignored.
Use the onDragDrop callback and the drag/drop event handler in
MediaUploadEmpty.vue to locate the fix.

In `@src/composables/video/probeVideoFrameRate.ts`:
- Around line 96-107: Update probeVideoFrameRate to handle both mdhd version 0
and version 1 before reading timescale and duration. The current logic in the
mdhd parsing block assumes fixed offsets, so adjust the offsets based on the
mdhd version (read from the box header) and use the 64-bit duration layout for
version 1 while keeping the existing version 0 path. Keep the sampleSizes/stsz
handling unchanged and make sure the track duration calculation still falls back
correctly when the box is unsupported.
- Around line 143-147: The fetchRange helper in probeVideoFrameRate currently
accepts any 200 OK response and buffers the full video, which can defeat the
range probe. Update fetchRange to only treat a partial-content response as valid
by requiring the expected range status from the response object and returning
undefined for full-body responses. Keep the logic centered around the fetch call
and response status check so the leading/trailing probes never download the
entire asset.

In `@src/composables/video/useVideoFilmstrip.ts`:
- Around line 123-126: The video load flow is probing the same remote resource
size twice because `useVideoFilmstrip` calls both `probeVideoFrameRate()` and
`fetchHttpResourceByteSize()` in the same `Promise.all`, while
`probeVideoFrameRate()` already performs the byte-size fetch internally. Update
the `useVideoFilmstrip` load path to avoid the duplicate HEAD/Range request by
either having `probeVideoFrameRate()` return both `frameRate` and `byteSize`, or
by fetching the size once in `useVideoFilmstrip` and passing it into
`probeVideoFrameRate()`. Keep the change localized around `probeVideoFrameRate`,
`fetchHttpResourceByteSize`, and the load/sampling logic in `useVideoFilmstrip`.

In `@src/renderer/extensions/vueNodes/composables/useProcessedWidgets.ts`:
- Around line 463-470: The `loadVideoHasPreview` computed in
`useProcessedWidgets` is missing a dependency on preview-image state, so it can
stay stale when `nodePreviewImages` changes without `nodeOutputs` changing.
Update the dependency tracking in this computed to also read from the
preview-image source used by `nodeHasLoadVideoPreview()` (alongside
`nodeOutputs` and the `file` widget) so `loadVideoTrimFillsSpace` recalculates
when previews arrive from cache.
- Around line 34-36: The imports in useProcessedWidgets currently duplicate
symbols from nodeIdentification, causing a duplicate identifier issue.
Consolidate createNodeExecutionId and NodeExecutionId into a single import from
`@/types/nodeIdentification`, and keep useNodeOutputStore separate so the module
has only one nodeIdentification import block.

In
`@src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.test.ts`:
- Around line 317-335: The WidgetSelectDropdown tests are asserting the
wrapper’s opacity class instead of the dropdown’s actual disabled behavior.
Update the affected cases in WidgetSelectDropdown.test.ts to check the control’s
disabled or aria-disabled state on the rendered button from
renderLoadVideoDropdown, rather than inspecting parentElement class names. Keep
the assertions focused on behavior for the load video dropdown state when
mockLoadVideoNode.isUploading is true and when the preview resolves from the
file widget fallback.

In
`@src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue`:
- Around line 27-30: The node lookup in WidgetSelectDropdown.vue is failing
type-checking because the nodeId prop is declared as a plain string while
getNodeById expects LiteGraph’s branded NodeId. Update the Props interface for
nodeId to use the branded NodeId at the boundary, or convert the prop to NodeId
immediately before the getNodeById call in the WidgetSelectDropdown component so
the types match cleanly.

In `@src/renderer/extensions/vueNodes/widgets/components/WidgetVideoTrim.vue`:
- Around line 28-38: The WidgetVideoTrim component is importing NodeId from a
module that does not export it, which breaks type-checking. Update the import in
WidgetVideoTrim.vue to use the correct NodeId source used elsewhere in the
codebase, and keep the defineProps typing for nodeId aligned with that symbol so
the component compiles cleanly.

In `@src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts`:
- Around line 164-165: The LoadVideo guard in useComboWidget should run before
the specDefault lookup so it can preserve the empty-selection behavior in cloud
mode. Update the relevant branch in the widget selection flow to short-circuit
on nodeType === 'LoadVideo' before any schema default matching, and keep the
rest of the logic unchanged so LoadVideo never auto-selects a cloud asset from
specDefault.

In
`@src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.ts`:
- Around line 126-129: The image upload widget is stringifying the combo value
before validating it, so unset values can still be saved as literal strings like
undefined or null. Update the logic in useImageUploadWidget’s node output
handling to check the raw fileComboWidget.value first for missing/placeholder
states, and only then convert it with String(...) before calling
nodeOutputStore.setNodeOutputs.

In `@src/renderer/extensions/vueNodes/widgets/composables/useVideoTrimWidget.ts`:
- Around line 31-115: Document migration guidance for the new LoadVideo widget
surface introduced in useVideoTrimWidget, since adding trim, trim_enabled,
start_frame, and end_frame changes node.widgets names/order seen by downstream
extensions. Add a concise migration note near the change or in the relevant
changelog/docs explaining the new widget contract and any extension adjustments
needed, referencing useVideoTrimWidget and the LoadVideo node widget setup so
future maintainers can locate it.

In `@src/utils/httpResourceByteSize.ts`:
- Around line 36-43: In fetchHttpResourceByteSize(), the Range probe only parses
Content-Range, so a 200 OK response that ignores Range can still return
undefined even when Content-Length is available. Update the existing
range-handling branch to treat 200 as a valid fallback and extract the total
size from Content-Length when Content-Range is missing, while still keeping 206
parsing via parseContentRangeTotal(). This will let probeVideoFrameRate()
получить the byte size it needs for the trailing chunk path and avoid falling
back to the default FPS for tail-moov MP4s.

---

Outside diff comments:
In `@src/renderer/extensions/vueNodes/components/LGraphNode.vue`:
- Around line 496-513: The shrink-wrap guard in handleLayoutChange is preventing
External and Canvas width updates from reaching LoadVideo nodes, so adjust the
early-return conditions to allow width refreshes while still preserving the
body-height behavior for shrink-wrap. Keep the existing source checks and the
isCollapsed/layoutStore guards, but move or narrow the loadVideoShrinkWrapBody
check so --node-width is still updated from size.value in LGraphNode.vue when
setSize or Canvas changes arrive.
🪄 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: 1e6a22d3-3dfe-42ca-9c94-6dde553b0b9d

📥 Commits

Reviewing files that changed from the base of the PR and between 61cb1bc and d50d219.

📒 Files selected for processing (49)
  • .gitignore
  • packages/design-system/src/css/style.css
  • src/components/ui/tooltip/Tooltip.vue
  • src/components/ui/tooltip/TooltipContent.vue
  • src/components/ui/tooltip/TooltipHint.stories.ts
  • src/components/ui/tooltip/TooltipHint.vue
  • src/components/ui/tooltip/TooltipProvider.vue
  • src/components/ui/tooltip/TooltipTrigger.vue
  • src/components/video/LoadVideoTrimPanel.stories.ts
  • src/components/video/LoadVideoTrimPanel.test.ts
  • src/components/video/LoadVideoTrimPanel.vue
  • src/components/video/MediaUploadEmpty.stories.ts
  • src/components/video/MediaUploadEmpty.test.ts
  • src/components/video/MediaUploadEmpty.vue
  • src/components/video/VideoFilmstripTrim.test.ts
  • src/components/video/VideoFilmstripTrim.vue
  • src/components/video/timelineInsetStyle.ts
  • src/composables/useRangeEditor.test.ts
  • src/composables/useRangeEditor.ts
  • src/composables/video/probeVideoFrameRate.test.ts
  • src/composables/video/probeVideoFrameRate.ts
  • src/composables/video/useLoadVideoPreview.test.ts
  • src/composables/video/useLoadVideoPreview.ts
  • src/composables/video/useVideoFilmstrip.test.ts
  • src/composables/video/useVideoFilmstrip.ts
  • src/extensions/core/index.ts
  • src/extensions/core/loadVideoTrim.ts
  • src/lib/litegraph/src/types/widgets.ts
  • src/lib/litegraph/src/widgets/VideoTrimWidget.ts
  • src/lib/litegraph/src/widgets/widgetMap.ts
  • src/locales/en/main.json
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/renderer/extensions/vueNodes/composables/useProcessedWidgets.ts
  • src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts
  • src/renderer/extensions/vueNodes/widgets/components/WidgetSelect.vue
  • src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.test.ts
  • src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue
  • src/renderer/extensions/vueNodes/widgets/components/WidgetVideoTrim.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/index.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.test.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.test.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useVideoTrimWidget.test.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useVideoTrimWidget.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • src/utils/httpResourceByteSize.test.ts
  • src/utils/httpResourceByteSize.ts

Comment thread .gitignore
Comment on lines +99 to +101
.amp
.vercel
.env*

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Consider explicitly tracking .env.example if used as a template.

The .env* pattern also ignores .env.example. If your repository uses .env.example as a documented template for required environment variables, add an explicit exception:

 .env*
+!.env.example

This is a common pattern to prevent accidental secret commits while keeping the template visible to developers.

📝 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
.amp
.vercel
.env*
.amp
.vercel
.env*
!.env.example
🤖 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 @.gitignore around lines 99 - 101, The .gitignore rule using .env* is also
hiding .env.example, so explicitly exempt that template if the repo relies on
it. Update the ignore pattern set near the existing .amp and .vercel entries so
.env.example remains tracked while other env files stay ignored, preserving the
documented template for developers.

Comment thread src/components/ui/tooltip/TooltipProvider.vue Outdated
Comment thread src/components/ui/tooltip/TooltipTrigger.vue Outdated
Comment thread src/components/video/LoadVideoTrimPanel.vue Outdated
Comment thread src/components/video/LoadVideoTrimPanel.vue
Comment thread src/renderer/extensions/vueNodes/widgets/components/WidgetVideoTrim.vue Outdated
Comment thread src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts Outdated
Comment thread src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.ts Outdated
Comment thread src/utils/httpResourceByteSize.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/renderer/extensions/vueNodes/components/LGraphNode.vue (2)

754-768: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Clear the collapsed height var when shrink-wrap turns on.

This watcher only removes --node-height. If the preview appears while the node is collapsed, --node-height-x survives and the collapse watcher later copies that stale fixed height back on expand.

♻️ Proposed fix
   if (shrinkWrap) {
     el.style.removeProperty('--node-height')
+    el.style.removeProperty('--node-height-x')
   } else {
     initSizeStyles()
   }
🤖 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/renderer/extensions/vueNodes/components/LGraphNode.vue` around lines 754
- 768, The shrink-wrap watcher in LGraphNode.vue only clears --node-height when
loadVideoShrinkWrapBody turns on, leaving --node-height-x behind and causing
stale collapsed height to be restored later. Update this
watch(loadVideoShrinkWrapBody, ...) handler to clear the collapsed height
variables together, using the existing nodeContainerRef and initSizeStyles flow
so the expand/collapse logic stays consistent.

748-752: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Track preview-cache updates in loadVideoShrinkWrapBody.

nodeHasLoadVideoPreview() is also driven by preview-image cache state, but this computed only touches nodeOutputs. When a cached preview arrives without a new output payload, shrink-wrap never recomputes and the node stays in the non-preview layout until some unrelated update happens.

♻️ Proposed fix
 const loadVideoShrinkWrapBody = computed(() => {
   if (nodeData.type !== 'LoadVideo') return false
   void nodeOutputs.nodeOutputs
+  void nodeOutputs.nodePreviewImages
   return nodeHasLoadVideoPreview(lgraphNode.value)
 })
🤖 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/renderer/extensions/vueNodes/components/LGraphNode.vue` around lines 748
- 752, The loadVideoShrinkWrapBody computed only depends on nodeOutputs, so it
misses preview-cache changes and can stay stale after a cached image arrives.
Update the dependency tracking inside loadVideoShrinkWrapBody in LGraphNode.vue
so it also touches the preview-cache state used by nodeHasLoadVideoPreview,
ensuring the LoadVideo layout recomputes when preview data changes even without
a new output payload.
♻️ Duplicate comments (2)
src/composables/video/useVideoFilmstrip.ts (1)

123-130: ⚠️ Potential issue | 🟠 Major

The size probe still runs twice when the first lookup returns undefined.

detectedFileSize is passed through here, but probeVideoFrameRate() still resolves byteSize ?? fetchHttpResourceByteSize(url). Any asset that hides total-size headers will therefore pay the HEAD/Range flow twice before frame sampling starts. Pass an explicit sentinel for “already attempted but unknown”, or a separate flag, so this path can skip the second probe.

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

In `@src/composables/video/useVideoFilmstrip.ts` around lines 123 - 130, The size
probe is being repeated in the frame-rate path because `probeVideoFrameRate()`
falls back to `fetchHttpResourceByteSize(url)` when `detectedFileSize` is
`undefined`. Update the `useVideoFilmstrip` flow so the initial
`fetchHttpResourceByteSize` attempt is treated as “already tried but unknown”
and pass that state into `probeVideoFrameRate()` (or equivalent), allowing it to
skip its internal re-probe when the size is still unavailable. Keep the fix
localized around `detectedFileSize` and `probeVideoFrameRate()` so the second
HEAD/Range lookup is avoided.
src/components/video/MediaUploadEmpty.vue (1)

54-56: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Don't swallow onDragDrop() failures.

Line 55 converts a rejected drop handler into a silent no-op, so failed drops cannot be surfaced or recovered. Please propagate that failure through an error path instead of .catch(() => {}). As per coding guidelines, "Implement proper error propagation" and "Disallow floating promises."

🤖 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/video/MediaUploadEmpty.vue` around lines 54 - 56, The
drag-and-drop handler in MediaUploadEmpty.vue is swallowing failures by turning
a rejected onDragDrop() call into a silent no-op. Update the drop handling logic
around the onDragDrop/event branch to propagate errors through the component’s
existing error path instead of using a blank catch, while still addressing the
floating promise by explicitly awaiting or otherwise handling the promise in a
way that preserves rejection visibility. Use the onDragDrop handler site to
locate the change.

Source: Coding guidelines

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

Inline comments:
In `@src/components/video/LoadVideoTrimPanel.test.ts`:
- Around line 149-151: The test is querying the remove control by data-testid
even though it already has a stable accessible role and name. Update the
assertion setup in LoadVideoTrimPanel.test.ts to use the button’s accessible
query via getByRole with the name “Remove” instead of
getByTestId('video-remove-button'), so the keyboard interaction remains aligned
with how users access the control.

In `@src/composables/video/useVideoFilmstrip.ts`:
- Around line 123-131: Reset the previously derived video metadata at the start
of the load flow in useVideoFilmstrip before the sequential fetch/probe awaits
run, so stale values do not persist while a new URL is loading. Clear the refs
that hold duration, totalFrames, width, height, fps, and fileSize right before
this serial load path begins, then let the existing fetchHttpResourceByteSize
and probeVideoFrameRate logic repopulate them once the new asset finishes
probing.

In
`@src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue`:
- Line 18: The WidgetSelectDropdown component is importing NodeId from the wrong
module, which breaks the prop type in the component definition. Update the
import in WidgetSelectDropdown.vue to reference the project’s वास्तविक NodeId
declaration module instead of the litegraph barrel, and ensure the NodeId type
used in the props definition stays aligned with that source.

---

Outside diff comments:
In `@src/renderer/extensions/vueNodes/components/LGraphNode.vue`:
- Around line 754-768: The shrink-wrap watcher in LGraphNode.vue only clears
--node-height when loadVideoShrinkWrapBody turns on, leaving --node-height-x
behind and causing stale collapsed height to be restored later. Update this
watch(loadVideoShrinkWrapBody, ...) handler to clear the collapsed height
variables together, using the existing nodeContainerRef and initSizeStyles flow
so the expand/collapse logic stays consistent.
- Around line 748-752: The loadVideoShrinkWrapBody computed only depends on
nodeOutputs, so it misses preview-cache changes and can stay stale after a
cached image arrives. Update the dependency tracking inside
loadVideoShrinkWrapBody in LGraphNode.vue so it also touches the preview-cache
state used by nodeHasLoadVideoPreview, ensuring the LoadVideo layout recomputes
when preview data changes even without a new output payload.

---

Duplicate comments:
In `@src/components/video/MediaUploadEmpty.vue`:
- Around line 54-56: The drag-and-drop handler in MediaUploadEmpty.vue is
swallowing failures by turning a rejected onDragDrop() call into a silent no-op.
Update the drop handling logic around the onDragDrop/event branch to propagate
errors through the component’s existing error path instead of using a blank
catch, while still addressing the floating promise by explicitly awaiting or
otherwise handling the promise in a way that preserves rejection visibility. Use
the onDragDrop handler site to locate the change.

In `@src/composables/video/useVideoFilmstrip.ts`:
- Around line 123-130: The size probe is being repeated in the frame-rate path
because `probeVideoFrameRate()` falls back to `fetchHttpResourceByteSize(url)`
when `detectedFileSize` is `undefined`. Update the `useVideoFilmstrip` flow so
the initial `fetchHttpResourceByteSize` attempt is treated as “already tried but
unknown” and pass that state into `probeVideoFrameRate()` (or equivalent),
allowing it to skip its internal re-probe when the size is still unavailable.
Keep the fix localized around `detectedFileSize` and `probeVideoFrameRate()` so
the second HEAD/Range lookup is avoided.
🪄 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: d20b664d-0c75-4db9-910a-a15f5bffda65

📥 Commits

Reviewing files that changed from the base of the PR and between d50d219 and 4cb82ed.

📒 Files selected for processing (22)
  • .gitignore
  • packages/design-system/src/css/style.css
  • src/components/ui/tooltip/TooltipProvider.vue
  • src/components/ui/tooltip/TooltipTrigger.vue
  • src/components/video/LoadVideoTrimPanel.test.ts
  • src/components/video/LoadVideoTrimPanel.vue
  • src/components/video/MediaUploadEmpty.test.ts
  • src/components/video/MediaUploadEmpty.vue
  • src/composables/video/probeVideoFrameRate.ts
  • src/composables/video/useVideoFilmstrip.ts
  • src/locales/en/main.json
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/renderer/extensions/vueNodes/composables/useProcessedWidgets.ts
  • src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.test.ts
  • src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue
  • src/renderer/extensions/vueNodes/widgets/components/WidgetVideoTrim.vue
  • src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownInput.vue
  • src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.ts
  • src/renderer/extensions/vueNodes/widgets/composables/useVideoTrimWidget.ts
  • src/utils/httpResourceByteSize.test.ts
  • src/utils/httpResourceByteSize.ts

Comment on lines +149 to +151
const removeButton = screen.getByTestId('video-remove-button')
removeButton.focus()
await user.keyboard('{Enter}')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Query the remove action by role/name.

This button already has a stable accessible name, so getByRole('button', { name: 'Remove' }) would keep the test aligned with the keyboard behavior it's asserting instead of coupling it to data-testid. Based on learnings, tests in this repo should prefer accessible queries over data-testid when the element already has a stable role/name.

♻️ Proposed change
-    const removeButton = screen.getByTestId('video-remove-button')
+    const removeButton = screen.getByRole('button', { name: 'Remove' })
     removeButton.focus()
     await user.keyboard('{Enter}')
📝 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
const removeButton = screen.getByTestId('video-remove-button')
removeButton.focus()
await user.keyboard('{Enter}')
const removeButton = screen.getByRole('button', { name: 'Remove' })
removeButton.focus()
await user.keyboard('{Enter}')
🤖 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/video/LoadVideoTrimPanel.test.ts` around lines 149 - 151, The
test is querying the remove control by data-testid even though it already has a
stable accessible role and name. Update the assertion setup in
LoadVideoTrimPanel.test.ts to use the button’s accessible query via getByRole
with the name “Remove” instead of getByTestId('video-remove-button'), so the
keyboard interaction remains aligned with how users access the control.

Source: Learnings

Comment on lines +123 to +131
const detectedFileSize = await fetchHttpResourceByteSize(url)

if (isLoadStale(loadId, url)) return

const detectedFrameRate = await probeVideoFrameRate(
url,
videoDuration,
detectedFileSize
)

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 | 🟠 Major | ⚡ Quick win

Reset the previous probe results before this serial load path runs.

These awaits now run one after the other. Since the composable keeps the previous video's duration, totalFrames, width/height, fps, and fileSize until they finish, switching URLs can keep rendering stale trim bounds and metadata for the new asset throughout this block. Clear the derived refs at the start of the load so the panel goes blank instead of showing old data while the new probes are in flight.

♻️ Proposed change
 async function loadVideo(url: string) {
   const loadId = ++activeLoadId
   loading.value = true
   error.value = null
   thumbnails.value = []
+  duration.value = 0
+  totalFrames.value = 0
+  width.value = 0
+  height.value = 0
+  fps.value = options.fps ?? DEFAULT_VIDEO_FPS
+  fileSize.value = undefined
 
   const video = document.createElement('video')
📝 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
const detectedFileSize = await fetchHttpResourceByteSize(url)
if (isLoadStale(loadId, url)) return
const detectedFrameRate = await probeVideoFrameRate(
url,
videoDuration,
detectedFileSize
)
async function loadVideo(url: string) {
const loadId = ++activeLoadId
loading.value = true
error.value = null
thumbnails.value = []
duration.value = 0
totalFrames.value = 0
width.value = 0
height.value = 0
fps.value = options.fps ?? DEFAULT_VIDEO_FPS
fileSize.value = undefined
const video = document.createElement('video')
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/composables/video/useVideoFilmstrip.ts` around lines 123 - 131, Reset the
previously derived video metadata at the start of the load flow in
useVideoFilmstrip before the sequential fetch/probe awaits run, so stale values
do not persist while a new URL is loading. Clear the refs that hold duration,
totalFrames, width, height, fps, and fileSize right before this serial load path
begins, then let the existing fetchHttpResourceByteSize and probeVideoFrameRate
logic repopulate them once the new asset finishes probing.

Comment thread src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue Outdated
@uytieu uytieu changed the title Load video trim node Load video trim node (Design Prototype) Jun 30, 2026
@uytieu uytieu marked this pull request as ready for review June 30, 2026 08:48
@uytieu uytieu requested a review from a team June 30, 2026 08:48
@dosubot dosubot Bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Jun 30, 2026
@uytieu uytieu added preview-cpu Creates a preview ephemeral environment for this PR (CPU only) and removed preview-cpu Creates a preview ephemeral environment for this PR (CPU only) labels Jun 30, 2026

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/renderer/extensions/vueNodes/widgets/components/WidgetVideoTrim.vue (1)

83-116: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Reset the node upload flag during removal.

handleRemove() clears the file and preview state, but it never clears currentNode.isUploading. Both this component and WidgetSelectDropdown.vue now use that flag as their busy-state source, so removing a video while the node is marked uploading can leave the trim UI and dropdown stuck disabled/spinning even though the file is gone.

Proposed fix
   useNodeOutputStore().removeNodeOutputsForNode(currentNode)
+  currentNode.isUploading = false
   currentNode.imgs = undefined
   currentNode.videoContainer = undefined
🤖 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/renderer/extensions/vueNodes/widgets/components/WidgetVideoTrim.vue`
around lines 83 - 116, `handleRemove()` in `WidgetVideoTrim.vue` clears the file
and preview state but leaves `currentNode.isUploading` unchanged, which can keep
the trim widget and shared upload UI busy after removal. Update `handleRemove()`
to reset the node’s upload flag alongside the other cleanup in this function,
using the existing `currentNode` object so `WidgetSelectDropdown.vue` and this
trim component both see the node as no longer uploading.
🤖 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.

Outside diff comments:
In `@src/renderer/extensions/vueNodes/widgets/components/WidgetVideoTrim.vue`:
- Around line 83-116: `handleRemove()` in `WidgetVideoTrim.vue` clears the file
and preview state but leaves `currentNode.isUploading` unchanged, which can keep
the trim widget and shared upload UI busy after removal. Update `handleRemove()`
to reset the node’s upload flag alongside the other cleanup in this function,
using the existing `currentNode` object so `WidgetSelectDropdown.vue` and this
trim component both see the node as no longer uploading.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 57fcb180-9116-4f62-8b6d-cd6d77e1f923

📥 Commits

Reviewing files that changed from the base of the PR and between 4cb82ed and f89ab3a.

📒 Files selected for processing (4)
  • src/renderer/extensions/vueNodes/composables/useProcessedWidgets.ts
  • src/renderer/extensions/vueNodes/widgets/components/WidgetSelect.vue
  • src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue
  • src/renderer/extensions/vueNodes/widgets/components/WidgetVideoTrim.vue
💤 Files with no reviewable changes (1)
  • src/renderer/extensions/vueNodes/composables/useProcessedWidgets.ts

@uytieu uytieu marked this pull request as draft June 30, 2026 09:25
@uytieu

uytieu commented Jun 30, 2026

Copy link
Copy Markdown
Author

This PR serves as a prototype and reference ONLY.
Vibe coded to show expected behaviors for video trim feature but does NOT address all UX edge cases.

UPDATE: Added to summary above

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

Labels

preview-cpu Creates a preview ephemeral environment for this PR (CPU only) size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant