Skip to content

fix: prevent persistent loading state when cycling batches with identical URLs#8999

Merged
christian-byrne merged 3 commits intomainfrom
fix/cycling-batches-vue-nodes
Mar 6, 2026
Merged

fix: prevent persistent loading state when cycling batches with identical URLs#8999
christian-byrne merged 3 commits intomainfrom
fix/cycling-batches-vue-nodes

Conversation

@christian-byrne
Copy link
Contributor

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

Summary

Fix persistent loading/skeleton state when cycling through batch images or videos that share the same URL (common on Cloud).

Changes

  • What: In setCurrentIndex() for both ImagePreview.vue and VideoPreview.vue, only start the loader when the target URL differs from the current URL. When batch items share the same URL, the browser doesn't fire a new load/loadeddata event since src didn't change, so the loader was never dismissed.
  • Also fixes VideoPreview.vue navigation dots using hardcoded bg-white instead of semantic bg-base-foreground tokens.

Review Focus

This bug has regressed 3+ times (PRs #6521, #7094, #8366). The regression tests specifically target the root cause — cycling through identical URLs — to prevent future reintroduction.

Fixes https://www.notion.so/comfy-org/Bug-Cycling-through-image-batches-results-in-persistent-loading-state-on-Cloud-30c6d73d3650816e9738d5dbea52c47d

┆Issue is synchronized with this Notion page by Unito

…ical URLs

In setCurrentIndex(), only start the loader when the target URL differs
from the current URL. When batch images/videos share the same URL (common
on Cloud), the browser doesn't fire a new load event since src didn't
change, leaving the skeleton loader visible permanently.

Also fix VideoPreview navigation dots using bg-white instead of semantic
bg-base-foreground tokens.

Amp-Thread-ID: https://ampcode.com/threads/T-019c796c-8895-74a2-b0d8-c9052a8772f3
@christian-byrne christian-byrne requested a review from a team as a code owner February 20, 2026 05:03
@christian-byrne christian-byrne added the verified bug Something isn't working (confirmed by the team) label Feb 20, 2026
@christian-byrne christian-byrne self-assigned this Feb 20, 2026
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Feb 20, 2026
@github-actions
Copy link

github-actions bot commented Feb 20, 2026

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

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

@github-actions
Copy link

github-actions bot commented Feb 20, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/06/2026, 01:06:55 AM UTC

Links

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 20, 2026

No actionable comments were generated in the recent review. 🎉


📝 Walkthrough

Walkthrough

Updates add tests and adjust ImagePreview and VideoPreview to avoid resetting loader/dimensions when cycling to the same URL; loader is triggered only on actual URL changes. VideoPreview navigation dot classes are updated to use base-foreground tokens. New tests cover identical vs different URL cycling.

Changes

Cohort / File(s) Summary
Tests
src/renderer/extensions/vueNodes/VideoPreview.test.ts, src/renderer/extensions/vueNodes/components/ImagePreview.test.ts
Adds VideoPreview tests and expands ImagePreview tests to cover cycling behavior with identical vs different URLs. Tests use fake timers and simulate media load events to assert aria-busy loader behavior.
Component behavior
src/renderer/extensions/vueNodes/VideoPreview.vue, src/renderer/extensions/vueNodes/components/ImagePreview.vue
Refactors setCurrentIndex() to early-return for same index and to reset dimensions/show loader only when the URL actually changes; preserves other state resets (e.g., error).
Styling/Classes
src/renderer/extensions/vueNodes/VideoPreview.vue
Updates navigation dot class generation to use cn(...) and switches active/inactive classes to base-foreground tokens and hover variants.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐇 I hopped through frames both old and new,

same URL — no flustered view.
When links diverge, I show the spin,
neat dots now glow with base-foreground grin.
Cheers — a rabbit’s tiny debugging cue.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The pull request title accurately and concisely describes the main change: preventing persistent loading state when cycling through batch items with identical URLs.
Description check ✅ Passed The description includes a summary explaining the bug fix, detailed changes for both components, and review focus. It follows the required template structure with all critical sections completed.

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

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

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

@github-actions
Copy link

github-actions bot commented Feb 20, 2026

📦 Bundle: 4.53 MB gzip 🔴 +33 B

Details

Summary

  • Raw size: 21.2 MB baseline 21.2 MB — 🔴 +252 B
  • Gzip: 4.53 MB baseline 4.53 MB — 🔴 +33 B
  • Brotli: 3.5 MB baseline 3.5 MB — 🟢 -18 B
  • Bundles: 233 current • 233 baseline • 2 added / 2 removed

Category Glance
Graph Workspace 🔴 +252 B (935 kB) · Vendor & Third-Party ⚪ 0 B (8.88 MB) · Other ⚪ 0 B (7.92 MB) · Data & Services ⚪ 0 B (2.75 MB) · Panels & Settings ⚪ 0 B (436 kB) · Editors & Dialogs ⚪ 0 B (76.6 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CaFj-Snq.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -6.38 kB 🟢 -5.55 kB
assets/index-DKraYw_Y.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +6.38 kB 🔴 +5.53 kB

Status: 1 added / 1 removed

Graph Workspace — 935 kB (baseline 935 kB) • 🔴 +252 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-DKHVztyv.js (new) 935 kB 🔴 +935 kB 🔴 +198 kB 🔴 +150 kB
assets/GraphView-CSBFUW91.js (removed) 935 kB 🟢 -935 kB 🟢 -198 kB 🟢 -150 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudAuthTimeoutView-TA2r6I06.js 4.96 kB 4.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudForgotPasswordView-CqDDLfPL.js 5.6 kB 5.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLayoutView-Drak8sDo.js 6.47 kB 6.47 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLoginView-DJBtqJDA.js 11.5 kB 11.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSignupView-Crn0wzuP.js 9.41 kB 9.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSorryContactSupportView-kf2atGXo.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSubscriptionRedirectView-cdesIzlF.js 4.8 kB 4.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSurveyView-Mj1OLwVT.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-C7XcDoLd.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserCheckView-CTJbxnpO.js 8.41 kB 8.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserSelectView-BVUNpxII.js 4.5 kB 4.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Panels & Settings — 436 kB (baseline 436 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AboutPanel-CC2G1BZI.js 9.79 kB 9.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudRemoteConfig-CMw2qUCj.js 1.48 kB 1.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/config-CH_cdA2N.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ExtensionPanel-BNRfS9_2.js 9.42 kB 9.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/KeybindingPanel-DWXq98x7.js 12.3 kB 12.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LegacyCreditsPanel-iexeakVU.js 20.7 kB 20.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/refreshRemoteConfig-BH7dLrwm.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SecretsPanel-DhMWtRNJ.js 21.5 kB 21.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ServerConfigPanel-DiZQORBC.js 6.49 kB 6.49 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-71sPPmDw.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B4se7HWo.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B7IP4XTb.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BntF-aiB.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BnWq3fMI.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BsTYoQcE.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bwt_U2hc.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CFCCJ6bh.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CiXfim_M.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DKOsOORk.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-LhJVbur1.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanel-Cj2HtERM.js 18.7 kB 18.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserPanel-DY2Q8gpV.js 6.21 kB 6.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
User & Accounts — 16.1 kB (baseline 16.1 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BCHaBeiC.js 357 B 357 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auth-CnoYAdkW.js 3.4 kB 3.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/firebaseAuthStore-BW6YMpwg.js 831 B 831 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/PasswordFields-B4903XLX.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SignUpForm-CU88KuRK.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UpdatePasswordContent-DeqH8Ohq.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-CssIUQnt.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Editors & Dialogs — 76.6 kB (baseline 76.6 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-Ck5JmPZM.js 75.8 kB 75.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useSubscriptionDialog-65jyl5DF.js 779 B 779 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
UI Components — 50.8 kB (baseline 50.8 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Button-BtrttVwN.js 3.08 kB 3.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-CUfN8Yix.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudFeedbackTopbarButton-Bq1h7uLs.js 1.64 kB 1.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-BCjm471c.js 836 B 836 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-Cb0GIS80.js 8.02 kB 8.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-BUtPhkUs.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-B9UCkUDH.js 5.95 kB 5.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeButton-CvuW3Qsv.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/toggle-group-DMqnpgYF.js 3.83 kB 3.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-DlI-SYgI.js 7.39 kB 7.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-B9_AHnQI.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useTerminalTabs-CaBlNXN-.js 9.89 kB 9.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-BmZQAslQ.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Data & Services — 2.75 MB (baseline 2.75 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/api-lJxz2QTi.js 690 kB 690 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioService-Dl3SAgLe.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/bootstrapStore-CPsp_59y.js 2.08 kB 2.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogService-Bh5JcRUB.js 1.92 MB 1.92 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogService-DUBgDJBs.js 768 B 768 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/extensionStore-DePoAUuw.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/keybindingService-DtU6JEcS.js 6.52 kB 6.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/load3dService-Bo995KeH.js 91.1 kB 91.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-B-wxJQKq.js 7.96 kB 7.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-DdcLNPBJ.js 803 B 803 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-gMFb9Bxl.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settingStore-CmKFsreW.js 787 B 787 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/userStore-qxNOokCl.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/workflowDraftStore-BFOfD1mq.js 779 B 779 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/workflowShareService-D7N7jOPT.js 13.1 kB 13.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Utilities & Hooks — 57.3 kB (baseline 57.3 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioUtils-Co5wlRnM.js 858 B 858 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-DskRKiYG.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-CC-l-L9z.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DOdPeMQc.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-udjgEG1T.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/subscriptionCheckoutUtil-1f632ziE.js 2.53 kB 2.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCopyToClipboard-BQkEMZDl.js 944 B 944 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCurrentUser-pBfTF0wo.js 765 B 765 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useErrorHandling-DfClRINK.js 1.5 kB 1.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-DBp0FXYw.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useFeatureFlags-RVsY5Lgb.js 4.86 kB 4.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3d-BKVF34a2.js 14.6 kB 14.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3d-DaVl1Qpg.js 902 B 902 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3dViewer-BBFGzY7o.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3dViewer-C1CSFEhF.js 881 B 881 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useWorkspaceSwitch-D_8Hvhkm.js 1.25 kB 1.25 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useWorkspaceUI-oyNENTbu.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Vendor & Third-Party — 8.88 MB (baseline 8.88 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-D1OJsayB.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DccD0mxo.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-CHuqBC10.js 1.54 MB 1.54 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-CKBhLh4j.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-C-tDe-KL.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-fZJTFMbU.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-DTO2QA4Q.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-CmHHRvL9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-CH_Hqnyl.js 124 kB 124 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-CWHPCody.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.92 MB (baseline 7.92 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AnimationControls--1RDfDfl.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-Bb2CDwGB.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/AudioPreviewPlayer-DLIb5UAH.js 11 kB 11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-Mr7ZnDOO.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-6VJcY26s.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CancelSubscriptionDialogContent-D41ynJ_V.js 4.84 kB 4.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/changeTracker-BLG0LwbZ.js 9.44 kB 9.44 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/changeTracker-Cc2OlTIC.js 800 B 800 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudBadges-jNYbIG4W.js 1.41 kB 1.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudRunButtonWrapper-CHJZrC8a.js 1.72 kB 1.72 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSessionCookie-msPp1QIt.js 3.14 kB 3.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSubscription-C3L-qmVe.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-C9H6LVPO.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-BiqY9Lcy.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BbyDu2gv.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BEB4P0rH.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Bfucg9mP.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BMLsYxKd.js 19 kB 19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CAkQMSj_.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CCml88sK.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CXLXD2h2.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DbC3OFpW.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DSqCRthz.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DstS1-8g.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DZFUlDVf.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-Cl4K4L4H.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/core-BIJD_KGZ.js 73.8 kB 73.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CreateWorkspaceDialogContent-DprTsO93.js 5.57 kB 5.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CurrentUserPopoverWorkspace-DvOpYgxi.js 20.5 kB 20.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/DeleteWorkspaceDialogContent-CL8hwvpZ.js 4.28 kB 4.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/EditWorkspaceDialogContent-DvUN0KRi.js 5.37 kB 5.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FreeTierDialogContent-BgUzZ8br.js 5.43 kB 5.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/GlobalToast-DI73LyZt.js 2.91 kB 2.91 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/graphHasMissingNodes-D5hxjn7H.js 761 B 761 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/groupNode-BtbPTODi.js 71.8 kB 71.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-BC7HQrMS.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-CjoM4f2l.js 542 kB 542 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/InviteMemberDialogContent-WI4ov9Wl.js 7.43 kB 7.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/InviteMemberUpsellDialogContent-CDnJDRNk.js 3.87 kB 3.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LeaveWorkspaceDialogContent-CW_dHTRz.js 4.11 kB 4.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-CAekFQti.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/load3d-CuhVeZAS.js 14.8 kB 14.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-Ddo4iY44.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3DConfiguration-BdYpuHlv.js 6.27 kB 6.27 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3DControls-ChPZYMmm.js 30.9 kB 30.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3dViewerContent-_igTcxdx.js 1.04 kB 1.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3dViewerContent-cIf-JD7P.js 23 kB 23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Loader-CW1-OX64.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main--05HICbG.js 181 kB 181 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B6BLHPSc.js 153 kB 153 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BShekPOu.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-c7Ovs_lz.js 173 kB 173 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CIoUm5TO.js 158 kB 158 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CYbIsw11.js 210 kB 210 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DFT6rwlP.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dl6mDWN4.js 188 kB 188 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-LJhLBt4I.js 151 kB 151 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-N4W6tcZe.js 150 kB 150 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-uno8Evm7.js 155 kB 155 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-0x8HaYIi.js 1.83 kB 1.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-Cg7hEqmq.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-CsGpbloy.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-BnLYn-y9.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-lRCQfO0C.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-GUUbKzSN.js 2.78 kB 2.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nightlyBadges-gbHAaxZZ.js 1.04 kB 1.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-9jedFKUy.js 404 kB 404 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bcl39Lvm.js 451 kB 451 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BEjht2Qw.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BnufKPki.js 364 kB 364 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BRir5eKv.js 491 kB 491 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DareRcew.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dh_P7hgI.js 450 kB 450 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DtagOBeq.js 400 kB 400 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-GYHTPda6.js 396 kB 396 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-LLg_Oz68.js 416 kB 416 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-XOU4GspB.js 368 kB 368 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeTemplates-1eggtohw.js 9.34 kB 9.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/onboardingCloudRoutes-BM6D14xL.js 5.51 kB 5.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-vXSQNuov.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Preview3d-C78LehlL.js 4.89 kB 4.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DFI_kyMk.js 1.39 kB 1.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/RemoveMemberDialogContent-BDcSdfte.js 4.09 kB 4.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/RevokeInviteDialogContent-DaZBUJ4-.js 4 kB 4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/saveMesh-DfRVBPcd.js 3.42 kB 3.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-CsAGTFyg.js 8.95 kB 8.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SignInContent-MUAelzxG.js 18.9 kB 18.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-D6BsbuSY.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-Sja094jv.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-LCL7cak3.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeToRun-DKXFX-OH.js 2.06 kB 2.06 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-D1DueXTw.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanelContentWorkspace-CLYq8yGC.js 963 B 963 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanelContentWorkspace-D5_GhHkJ.js 22 kB 22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionRequiredDialogContent-HLdMhpU1.js 25.7 kB 25.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionRequiredDialogContentWorkspace-nMTa8PVR.js 46.4 kB 46.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Textarea-BOQxdY4X.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tierBenefits-CORFWAE2.js 3.66 kB 3.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ValueControlPopover-DV1Z80zR.js 4.96 kB 4.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-BciYDrIq.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DIRwAHBY.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-DcDawiRU.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-DGiwLg1r.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-DNsx5Pb6.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-Ccs41qCF.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-CcAQLD_P.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-BNUo8JFg.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-DM-POPnW.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCrop-BLYMA85d.js 22.2 kB 22.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputNumber-BrHkQnil.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-BCr6c8X0.js 2.89 kB 2.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-BJ9UU2rN.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLegacy-pQwl0GE0.js 787 B 787 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-CFDJ6vK7.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetPainter-xF0rkiAp.js 32.9 kB 32.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DWqMK-RY.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetRecordAudio-ofLkcoFK.js 17.4 kB 17.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetSelect-H_rvD54F.js 58.3 kB 58.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-DuxQHyoR.js 4.26 kB 4.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-B19asEEu.js 3.54 kB 3.54 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DYLaC2lj.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetWithControl-B8biw7Mn.js 4.17 kB 4.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspacePanelContent-cGCwHrYw.js 29.3 kB 29.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/renderer/extensions/vueNodes/VideoPreview.vue (1)

250-256: Use cn() to compose navigation-dot classes (avoid array return).
The repo standard requires cn() for class merging and forbids array-based class bindings.

♻️ Suggested refactor
-const getNavigationDotClass = (index: number) => {
-  return [
-    'w-2 h-2 rounded-full transition-all duration-200 border-0 cursor-pointer',
-    index === currentIndex.value
-      ? 'bg-base-foreground'
-      : 'bg-base-foreground/50 hover:bg-base-foreground/80'
-  ]
-}
+const getNavigationDotClass = (index: number) =>
+  cn(
+    'w-2 h-2 rounded-full transition-all duration-200 border-0 cursor-pointer',
+    index === currentIndex.value
+      ? 'bg-base-foreground'
+      : 'bg-base-foreground/50 hover:bg-base-foreground/80'
+  )

As per coding guidelines: Use cn() utility from '@/utils/tailwindUtil' to merge class names; never use :class="[]" syntax.

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

In `@src/renderer/extensions/vueNodes/VideoPreview.vue` around lines 250 - 256,
getNavigationDotClass currently returns an array of class strings which violates
the repo standard; instead import and use the cn() utility from
'@/utils/tailwindUtil' and return a single string composed by cn().
Specifically, update getNavigationDotClass(index: number) to call cn('w-2 h-2
rounded-full transition-all duration-200 border-0 cursor-pointer', index ===
currentIndex.value ? 'bg-base-foreground' : 'bg-base-foreground/50
hover:bg-base-foreground/80') so the class merging uses cn and no array is
returned.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/renderer/extensions/vueNodes/VideoPreview.test.ts`:
- Around line 35-105: The module-level mutable wrapperRegistry should be removed
and mountVideoPreview should be converted to a properly typed function
declaration using Partial<ComponentProps<typeof VideoPreview>> for its props;
stop using a global Set to track wrappers and instead unmount the wrapper
returned by mountVideoPreview inside each test's finally block (and remove the
centralized afterEach cleanup). Update all tests to call mountVideoPreview(...)
and ensure they call wrapper.unmount() in finally to guarantee per-test teardown
while keeping references to VideoPreview and mountVideoPreview to locate the
changes.

---

Nitpick comments:
In `@src/renderer/extensions/vueNodes/VideoPreview.vue`:
- Around line 250-256: getNavigationDotClass currently returns an array of class
strings which violates the repo standard; instead import and use the cn()
utility from '@/utils/tailwindUtil' and return a single string composed by cn().
Specifically, update getNavigationDotClass(index: number) to call cn('w-2 h-2
rounded-full transition-all duration-200 border-0 cursor-pointer', index ===
currentIndex.value ? 'bg-base-foreground' : 'bg-base-foreground/50
hover:bg-base-foreground/80') so the class merging uses cn and no array is
returned.

Copy link
Contributor

@simula-r simula-r left a comment

Choose a reason for hiding this comment

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

Nice. LGTM.

@github-actions
Copy link

github-actions bot commented Mar 6, 2026

⚡ Performance Report

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

Metric Baseline PR Δ
canvas-idle: style recalcs 123 123 -0%
canvas-idle: layouts 0 0 +0%
canvas-idle: task duration 442ms 377ms -15%
canvas-mouse-sweep: style recalcs 183 175 -4%
canvas-mouse-sweep: layouts 13 12 -5%
canvas-mouse-sweep: task duration 1035ms 936ms -10%
dom-widget-clipping: style recalcs 43 43 +1%
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 367ms 360ms -2%
subgraph-dom-widget-clipping: style recalcs 76 75 -1%
subgraph-dom-widget-clipping: layouts 1 0 -50%
subgraph-dom-widget-clipping: task duration 443ms 431ms -3%
subgraph-idle: style recalcs 121 124 +2%
subgraph-idle: layouts 0 1 +200%
subgraph-idle: task duration 417ms 386ms -8%
subgraph-mouse-sweep: style recalcs 171 161 -6%
subgraph-mouse-sweep: layouts 16 16 +0%
subgraph-mouse-sweep: task duration 994ms 790ms -20%
Raw data
{
  "timestamp": "2026-03-06T01:10:05.599Z",
  "gitSha": "675e3886fd8d0dcd00ad6c7144e2db6b47034440",
  "branch": "fix/cycling-batches-vue-nodes",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2027.388000000002,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 20.023,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 377.232,
      "heapDeltaBytes": -2791500
    },
    {
      "name": "canvas-idle",
      "durationMs": 2028.1960000000083,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 19.211999999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 384.633,
      "heapDeltaBytes": -2989748
    },
    {
      "name": "canvas-idle",
      "durationMs": 2014.1499999999724,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 16.793,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 369.339,
      "heapDeltaBytes": -3001268
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2079.958000000005,
      "styleRecalcs": 185,
      "styleRecalcDurationMs": 53.556,
      "layouts": 12,
      "layoutDurationMs": 3.76,
      "taskDurationMs": 1065.79,
      "heapDeltaBytes": -1544456
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1791.9110000000273,
      "styleRecalcs": 162,
      "styleRecalcDurationMs": 42.486,
      "layouts": 12,
      "layoutDurationMs": 3.28,
      "taskDurationMs": 765.331,
      "heapDeltaBytes": -3344968
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1999.3259999999964,
      "styleRecalcs": 179,
      "styleRecalcDurationMs": 51.004,
      "layouts": 12,
      "layoutDurationMs": 2.9729999999999994,
      "taskDurationMs": 976.4370000000001,
      "heapDeltaBytes": -2493624
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 618.5169999999971,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 13.523999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 395.81,
      "heapDeltaBytes": 7607024
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 549.3860000000268,
      "styleRecalcs": 40,
      "styleRecalcDurationMs": 12.307,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 331.97600000000006,
      "heapDeltaBytes": 6836016
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 582.6179999999681,
      "styleRecalcs": 44,
      "styleRecalcDurationMs": 12.868,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 352.538,
      "heapDeltaBytes": 8012128
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 664.0629999999987,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 18.435,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 453.09400000000005,
      "heapDeltaBytes": -7794328
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 607.135000000028,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 18.133000000000003,
      "layouts": 1,
      "layoutDurationMs": 0.22400000000000003,
      "taskDurationMs": 420.20599999999996,
      "heapDeltaBytes": -8695108
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 601.6690000000153,
      "styleRecalcs": 73,
      "styleRecalcDurationMs": 15.419999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 420.359,
      "heapDeltaBytes": -9239124
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2008.3359999999857,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 22.788,
      "layouts": 1,
      "layoutDurationMs": 0.272,
      "taskDurationMs": 385.5690000000001,
      "heapDeltaBytes": -1770848
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2015.6769999999824,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 23.333,
      "layouts": 1,
      "layoutDurationMs": 0.21199999999999994,
      "taskDurationMs": 386.465,
      "heapDeltaBytes": -2747292
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2015.442999999948,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 23.221,
      "layouts": 1,
      "layoutDurationMs": 0.17699999999999996,
      "taskDurationMs": 385.21099999999996,
      "heapDeltaBytes": -2163132
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1745.7349999999963,
      "styleRecalcs": 157,
      "styleRecalcDurationMs": 50.202000000000005,
      "layouts": 16,
      "layoutDurationMs": 3.811,
      "taskDurationMs": 717.197,
      "heapDeltaBytes": -5539308
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1688.0429999999933,
      "styleRecalcs": 154,
      "styleRecalcDurationMs": 43.53999999999999,
      "layouts": 16,
      "layoutDurationMs": 4.0280000000000005,
      "taskDurationMs": 696.793,
      "heapDeltaBytes": -5178020
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1993.1960000000117,
      "styleRecalcs": 172,
      "styleRecalcDurationMs": 54.095000000000006,
      "layouts": 16,
      "layoutDurationMs": 4.246,
      "taskDurationMs": 957.143,
      "heapDeltaBytes": -3848628
    }
  ]
}

@christian-byrne christian-byrne merged commit 47f2b63 into main Mar 6, 2026
31 checks passed
@christian-byrne christian-byrne deleted the fix/cycling-batches-vue-nodes branch March 6, 2026 01:14
@christian-byrne christian-byrne added core/1.40 Backport PRs for core 1.40 needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch labels Mar 8, 2026
github-actions bot pushed a commit that referenced this pull request Mar 8, 2026
…ical URLs (#8999)

## Summary

Fix persistent loading/skeleton state when cycling through batch images
or videos that share the same URL (common on Cloud).

## Changes

- **What**: In `setCurrentIndex()` for both `ImagePreview.vue` and
`VideoPreview.vue`, only start the loader when the target URL differs
from the current URL. When batch items share the same URL, the browser
doesn't fire a new `load`/`loadeddata` event since `src` didn't change,
so the loader was never dismissed.
- Also fixes `VideoPreview.vue` navigation dots using hardcoded
`bg-white` instead of semantic `bg-base-foreground` tokens.

## Review Focus

This bug has regressed 3+ times (PRs #6521, #7094, #8366). The
regression tests specifically target the root cause — cycling through
identical URLs — to prevent future reintroduction.

Fixes
https://www.notion.so/comfy-org/Bug-Cycling-through-image-batches-results-in-persistent-loading-state-on-Cloud-30c6d73d3650816e9738d5dbea52c47d

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8999-fix-prevent-persistent-loading-state-when-cycling-batches-with-identical-URLs-30d6d73d36508180831edbaf8ad8ad48)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Simula_r <18093452+simula-r@users.noreply.github.com>
@comfy-pr-bot
Copy link
Member

@christian-byrne Successfully backported to #9570

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Mar 8, 2026
christian-byrne added a commit that referenced this pull request Mar 8, 2026
…ng batches with identical URLs (#9570)

Backport of #8999 to `core/1.40`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9570-backport-core-1-40-fix-prevent-persistent-loading-state-when-cycling-batches-with-iden-31d6d73d3650818d9136cfc82e73d89f)
by [Unito](https://www.unito.io)

Co-authored-by: Christian Byrne <cbyrne@comfy.org>
Co-authored-by: Simula_r <18093452+simula-r@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

core/1.40 Backport PRs for core 1.40 size:L This PR changes 100-499 lines, ignoring generated files. verified bug Something isn't working (confirmed by the team)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants