Skip to content

perf: virtualize FormDropdownMenu to reduce DOM nodes and image requests#8476

Open
christian-byrne wants to merge 2 commits intomainfrom
perf/image-dropdown-assets-perf
Open

perf: virtualize FormDropdownMenu to reduce DOM nodes and image requests#8476
christian-byrne wants to merge 2 commits intomainfrom
perf/image-dropdown-assets-perf

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Jan 30, 2026

Summary

Virtualize the FormDropdownMenu to only render visible items, fixing slow dropdown performance on cloud.

Changes

  • Integrate VirtualGrid into FormDropdownMenu for virtualized rendering
  • Add computed properties for grid configuration per layout mode (grid/list/list-small)
  • Extend VirtualGrid slot to provide original item index for O(1) lookups
  • Change container from max-h-[640px] to fixed h-[640px] for proper virtualization

Review Focus

  • VirtualGrid integration within the popover context
  • Layout mode switching with :key="layoutMode" to force re-render
  • Grid style computed properties match original Tailwind classes

┆Issue is synchronized with this Notion page by Unito

Summary by CodeRabbit

  • New Features

    • Dropdowns now render with a virtualized grid/list (stable indexes, responsive sizing) and show an empty-state icon when no items exist.
  • Bug Fixes

    • Reduced layout shift and rendering glitches with improved spacer/scroll calculations and more reliable media measurement.
  • Style

    • Simplified media rendering (standard img/video), unified item visuals and hover/background behavior.
  • Tests

    • Added unit and end-to-end tests for virtualization, indexing, layouts, dynamic updates, and empty states.
  • Breaking Changes

    • Dropdown item/selection shapes and related component props/events were updated (adapter changes may be required).

@christian-byrne christian-byrne requested a review from a team as a code owner January 30, 2026 05:03
@christian-byrne christian-byrne self-assigned this Jan 30, 2026
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jan 30, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 30, 2026

Note

Reviews paused

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

Use the following commands to manage reviews:

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

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Reworked dropdown UI surface to use a measured, virtualized VirtualGrid; migrated dropdown item shape and related components to a new DropdownItem/OptionId/SelectedKey model; replaced lazy image handling with plain media rendering; added unit and e2e tests and small config/type cleanup.

Changes

Cohort / File(s) Summary
VirtualGrid core & tests
src/components/common/VirtualGrid.vue, src/components/common/VirtualGrid.test.ts
Expose slot index, refactor updateItemSize to a declared function, add onBeforeUnmount debounce cleanup, adjust column/spacer logic; add deterministic unit tests for virtualization, indexing, and layout.
Dropdown menu & rendering
src/renderer/.../form/dropdown/FormDropdownMenu.vue, .../FormDropdownMenu.test.ts, .../FormDropdownMenuItem.vue, .../FormDropdownMenuActions.vue, .../FormDropdownMenuFilter.vue
Switch menu rendering to VirtualGrid with LayoutConfig/LAYOUT_CONFIGS, map items to virtualItems with stable keys, add empty-state rendering; change item props (previewUrlmediaSrc, add metadata); remove ownership/base-model UI and related props.
Form dropdown core & input
src/renderer/.../form/dropdown/FormDropdown.vue, .../FormDropdownInput.vue, .../shared.ts, .../shared.test.ts
Global type/prop migration from FormDropdownItem to DropdownItem; introduce OptionId/SelectedKey, update searcher/sort/filter signatures and default sort options; adapt model types and template bindings.
Types & composables
src/renderer/.../form/dropdown/types.ts, src/renderer/.../composables/useAssetWidgetData.ts, src/platform/assets/types/filterTypes.ts
Define DropdownItem, OptionId, SelectedKey, new SortOption/FilterOption shapes; remove old FilterOption export in assets types; add dropdownItems in useAssetWidgetData.
WidgetSelectDropdown & tests
src/renderer/.../WidgetSelectDropdown.vue, .../WidgetSelectDropdown.test.ts
Consolidate multiple item forms into DropdownItem model, unify item generation and selection handling, add upload helpers; tests updated to reflect item shape.
Misc tests & e2e
browser_tests/.../imageDropdownVirtualization.spec.ts, src/renderer/.../FormDropdownMenu.test.ts
Add e2e test asserting virtualized dropdown rendering and new unit tests verifying VirtualGrid usage and props propagation.
Tooling/config
playwright.config.ts
Extract local vs CI Playwright options into getMaybeLocalOptions() helper and use it for exported config.
Small API/type removals
src/platform/assets/types/filterTypes.ts
Removed exported FilterOption interface (public API surface reduced).

Sequence Diagram(s)

sequenceDiagram
    participant User as User
    participant Menu as FormDropdownMenu
    participant Grid as VirtualGrid
    participant Viewport as Viewport
    participant Item as FormDropdownMenuItem

    User->>Menu: open dropdown
    Menu->>Menu: compute layoutConfig & gridStyle, map items -> virtualItems
    Menu->>Grid: provide virtualItems, keys, gridStyle
    Grid->>Viewport: measure container size & scroll (useElementSize/useScroll)
    Viewport-->>Grid: sizes & scroll offsets
    Grid->>Grid: calculate visible start/end, spacer heights
    Grid->>Item: render visible items with { item, index }
    User->>Item: interact (click)
    Item->>Menu: emit selection (item, index)
    Menu-->>User: update selection state
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

preview

Suggested reviewers

  • luke-mino-altherr

Poem

"I hopped through grids with measured feet,
keys kept steady where slots and rows meet.
I counted each item, indexed each sight,
spacers stretched softly to render just right.
A merry little hop — the UI takes flight! 🐇"

🚥 Pre-merge checks | ✅ 2 | ❌ 2
❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Merge Conflict Detection ⚠️ Warning ❌ Merge conflicts detected (535 files):

⚔️ .coderabbit.yaml (content)
⚔️ .gitattributes (content)
⚔️ .github/workflows/ci-tests-e2e.yaml (content)
⚔️ .github/workflows/pr-update-playwright-expectations.yaml (content)
⚔️ .gitignore (content)
⚔️ .oxlintrc.json (content)
⚔️ .storybook/main.ts (content)
⚔️ .stylelintrc.json (content)
⚔️ AGENTS.md (content)
⚔️ CODEOWNERS (content)
⚔️ CONTRIBUTING.md (content)
⚔️ apps/desktop-ui/src/views/InstallView.stories.ts (content)
⚔️ browser_tests/AGENTS.md (content)
⚔️ browser_tests/fixtures/ComfyPage.ts (content)
⚔️ browser_tests/fixtures/VueNodeHelpers.ts (content)
⚔️ browser_tests/fixtures/components/ComfyNodeSearchBox.ts (content)
⚔️ browser_tests/fixtures/components/SettingDialog.ts (content)
⚔️ browser_tests/fixtures/components/SidebarTab.ts (content)
⚔️ browser_tests/fixtures/components/Topbar.ts (content)
⚔️ browser_tests/fixtures/utils/litegraphUtils.ts (content)
⚔️ browser_tests/fixtures/utils/vueNodeFixtures.ts (content)
⚔️ browser_tests/fixtures/ws.ts (content)
⚔️ browser_tests/globalSetup.ts (content)
⚔️ browser_tests/globalTeardown.ts (content)
⚔️ browser_tests/helpers/actionbar.ts (content)
⚔️ browser_tests/helpers/fitToView.ts (content)
⚔️ browser_tests/helpers/templates.ts (content)
⚔️ browser_tests/tests/actionbar.spec.ts (content)
⚔️ browser_tests/tests/backgroundImageUpload.spec.ts (content)
⚔️ browser_tests/tests/bottomPanelShortcuts.spec.ts (content)
⚔️ browser_tests/tests/browserTabTitle.spec.ts (content)
⚔️ browser_tests/tests/changeTracker.spec.ts (content)
⚔️ browser_tests/tests/colorPalette.spec.ts (content)
⚔️ browser_tests/tests/commands.spec.ts (content)
⚔️ browser_tests/tests/copyPaste.spec.ts (content)
⚔️ browser_tests/tests/copyPaste.spec.ts-snapshots/copied-node-chromium-linux.png (content)
⚔️ browser_tests/tests/copyPaste.spec.ts-snapshots/paste-in-text-area-with-node-previously-copied-chromium-linux.png (content)
⚔️ browser_tests/tests/customIcons.spec.ts (content)
⚔️ browser_tests/tests/dialog.spec.ts (content)
⚔️ browser_tests/tests/domWidget.spec.ts (content)
⚔️ browser_tests/tests/execution.spec.ts (content)
⚔️ browser_tests/tests/extensionAPI.spec.ts (content)
⚔️ browser_tests/tests/featureFlags.spec.ts (content)
⚔️ browser_tests/tests/graph.spec.ts (content)
⚔️ browser_tests/tests/graphCanvasMenu.spec.ts (content)
⚔️ browser_tests/tests/groupNode.spec.ts (content)
⚔️ browser_tests/tests/interaction.spec.ts (content)
⚔️ browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png (content)
⚔️ browser_tests/tests/keybindings.spec.ts (content)
⚔️ browser_tests/tests/litegraphEvent.spec.ts (content)
⚔️ browser_tests/tests/loadWorkflowInMedia.spec.ts (content)
⚔️ browser_tests/tests/lodThreshold.spec.ts (content)
⚔️ browser_tests/tests/menu.spec.ts (content)
⚔️ browser_tests/tests/minimap.spec.ts (content)
⚔️ browser_tests/tests/mobileBaseline.spec.ts (content)
⚔️ browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-default-workflow-mobile-chrome-linux.png (content)
⚔️ browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-settings-dialog-mobile-chrome-linux.png (content)
⚔️ browser_tests/tests/nodeBadge.spec.ts (content)
⚔️ browser_tests/tests/nodeDisplay.spec.ts (content)
⚔️ browser_tests/tests/nodeHelp.spec.ts (content)
⚔️ browser_tests/tests/nodeSearchBox.spec.ts (content)
⚔️ browser_tests/tests/noteNode.spec.ts (content)
⚔️ browser_tests/tests/primitiveNode.spec.ts (content)
⚔️ browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts (content)
⚔️ browser_tests/tests/propertiesPanel/propertiesPanelPosition.spec.ts (content)
⚔️ browser_tests/tests/recordAudio.spec.ts (content)
⚔️ browser_tests/tests/releaseNotifications.spec.ts (content)
⚔️ browser_tests/tests/remoteWidgets.spec.ts (content)
⚔️ browser_tests/tests/rerouteNode.spec.ts (content)
⚔️ browser_tests/tests/rightClickMenu.spec.ts (content)
⚔️ browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-unpinned-node-moved-chromium-linux.png (content)
⚔️ browser_tests/tests/selectionToolbox.spec.ts (content)
⚔️ browser_tests/tests/selectionToolboxSubmenus.spec.ts (content)
⚔️ browser_tests/tests/sidebar/nodeLibrary.spec.ts (content)
⚔️ browser_tests/tests/sidebar/workflows.spec.ts (content)
⚔️ browser_tests/tests/subgraph-rename-dialog.spec.ts (content)
⚔️ browser_tests/tests/subgraph.spec.ts (content)
⚔️ browser_tests/tests/templates.spec.ts (content)
⚔️ browser_tests/tests/templates.spec.ts-snapshots/template-grid-varying-content-chromium-linux.png (content)
⚔️ browser_tests/tests/useSettingSearch.spec.ts (content)
⚔️ browser_tests/tests/versionMismatchWarnings.spec.ts (content)
⚔️ browser_tests/tests/viewport.spec.ts (content)
⚔️ browser_tests/tests/viewport.spec.ts-snapshots/viewport-fits-when-saved-offscreen-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/groups/groups.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-overlapped-after-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-overlapped-before-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-widget-overlapped-after-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-widget-overlapped-before-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/move.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/remove.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/rename.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/resize.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/interactions/node/select.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/nodeStates/collapse.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/nodeStates/colors.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-light-all-colors-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/nodeStates/error.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/nodeStates/mute.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/nodeStates/pin.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/widgets/int/integerWidget.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png (content)
⚔️ browser_tests/tests/vueNodes/widgets/text/multilineStringWidget.spec.ts (content)
⚔️ browser_tests/tests/vueNodes/widgets/widgetReactivity.spec.ts (content)
⚔️ browser_tests/tests/widget.spec.ts (content)
⚔️ browser_tests/tests/workflowTabThumbnail.spec.ts (content)
⚔️ browser_tests/tsconfig.json (content)
⚔️ components.json (content)
⚔️ docs/guidance/playwright.md (content)
⚔️ docs/guidance/typescript.md (content)
⚔️ eslint.config.ts (content)
⚔️ global.d.ts (content)
⚔️ index.html (content)
⚔️ knip.config.ts (content)
⚔️ manifest.json (content)
⚔️ package.json (content)
⚔️ packages/design-system/package.json (content)
⚔️ packages/design-system/src/css/style.css (content)
⚔️ packages/design-system/src/icons/README.md (content)
⚔️ playwright.config.ts (content)
⚔️ pnpm-lock.yaml (content)
⚔️ pnpm-workspace.yaml (content)
⚔️ scripts/check-unused-i18n-keys.ts (content)
⚔️ scripts/cicd/pr-playwright-deploy-and-comment.sh (content)
⚔️ scripts/diff-i18n.ts (content)
⚔️ src/App.vue (content)
⚔️ src/base/common/downloadUtil.test.ts (content)
⚔️ src/base/common/downloadUtil.ts (content)
⚔️ src/components/TopMenuSection.test.ts (content)
⚔️ src/components/TopMenuSection.vue (content)
⚔️ src/components/actionbar/ComfyRunButton/CloudRunButtonWrapper.vue (content)
⚔️ src/components/bottomPanel/BottomPanel.vue (content)
⚔️ src/components/bottomPanel/tabs/shortcuts/ShortcutsList.vue (content)
⚔️ src/components/bottomPanel/tabs/terminal/BaseTerminal.test.ts (content)
⚔️ src/components/bottomPanel/tabs/terminal/BaseTerminal.vue (content)
⚔️ src/components/common/ElectronFileDownload.vue (content)
⚔️ src/components/common/FileDownload.vue (content)
⚔️ src/components/common/LazyImage.vue (content)
⚔️ src/components/common/TreeExplorer.vue (content)
⚔️ src/components/common/TreeExplorerTreeNode.vue (content)
⚔️ src/components/common/VirtualGrid.vue (content)
⚔️ src/components/custom/widget/WorkflowTemplateSelectorDialog.vue (content)
⚔️ src/components/dialog/GlobalDialog.vue (content)
⚔️ src/components/dialog/content/ConfirmationDialogContent.vue (content)
⚔️ src/components/dialog/content/MissingModelsWarning.vue (content)
⚔️ src/components/dialog/content/MissingNodesFooter.vue (content)
⚔️ src/components/dialog/content/setting/AboutPanel.vue (content)
⚔️ src/components/dialog/content/setting/KeybindingPanel.vue (content)
⚔️ src/components/dialog/content/setting/LegacyCreditsPanel.vue (content)
⚔️ src/components/dialog/content/setting/MembersPanelContent.vue (content)
⚔️ src/components/dialog/content/setting/UserPanel.vue (content)
⚔️ src/components/dialog/content/setting/WorkspacePanelContent.vue (content)
⚔️ src/components/dialog/content/workspace/InviteMemberDialogContent.vue (content)
⚔️ src/components/graph/GraphCanvas.vue (content)
⚔️ src/components/graph/NodeTooltip.vue (content)
⚔️ src/components/graph/SelectionToolbox.vue (content)
⚔️ src/components/graph/widgets/DomWidget.vue (content)
⚔️ src/components/helpcenter/HelpCenterMenuContent.vue (content)
⚔️ src/components/load3d/Load3dViewerContent.vue (content)
⚔️ src/components/load3d/controls/ModelControls.vue (content)
⚔️ src/components/load3d/controls/ViewerControls.vue (content)
⚔️ src/components/load3d/controls/viewer/ViewerCameraControls.vue (content)
⚔️ src/components/load3d/controls/viewer/ViewerModelControls.vue (content)
⚔️ src/components/maskeditor/BrushSettingsPanel.vue (content)
⚔️ src/components/maskeditor/ColorSelectSettingsPanel.vue (content)
⚔️ src/components/maskeditor/ImageLayerSettingsPanel.vue (content)
⚔️ src/components/maskeditor/PaintBucketSettingsPanel.vue (content)
⚔️ src/components/maskeditor/ToolPanel.vue (content)
⚔️ src/components/maskeditor/dialog/TopBarHeader.vue (content)
⚔️ src/components/queue/QueueInlineProgressSummary.vue (content)
⚔️ src/components/queue/job/JobDetailsPopover.stories.ts (content)
⚔️ src/components/rightSidePanel/RightSidePanel.vue (content)
⚔️ src/components/rightSidePanel/parameters/TabGlobalParameters.vue (content)
⚔️ src/components/rightSidePanel/parameters/WidgetActions.vue (content)
⚔️ src/components/rightSidePanel/parameters/WidgetItem.vue (content)
⚔️ src/components/rightSidePanel/settings/TabGlobalSettings.vue (content)
⚔️ src/components/rightSidePanel/shared.test.ts (content)
⚔️ src/components/searchbox/NodeSearchBox.vue (content)
⚔️ src/components/sidebar/ComfyMenuButton.vue (content)
⚔️ src/components/sidebar/ModeToggle.vue (content)
⚔️ src/components/sidebar/SideToolbar.vue (content)
⚔️ src/components/sidebar/tabs/ModelLibrarySidebarTab.vue (content)
⚔️ src/components/sidebar/tabs/NodeLibrarySidebarTab.vue (content)
⚔️ src/components/sidebar/tabs/WorkflowsSidebarTab.vue (content)
⚔️ src/components/sidebar/tabs/nodeLibrary/NodeBookmarkTreeExplorer.vue (content)
⚔️ src/components/sidebar/tabs/nodeLibrary/NodeTreeFolder.vue (content)
⚔️ src/components/sidebar/tabs/nodeLibrary/NodeTreeLeaf.vue (content)
⚔️ src/components/toast/GlobalToast.vue (content)
⚔️ src/components/topbar/CloudBadge.vue (content)
⚔️ src/components/topbar/CurrentUserButton.test.ts (content)
⚔️ src/components/topbar/CurrentUserButton.vue (content)
⚔️ src/components/topbar/CurrentUserPopoverWorkspace.vue (content)
⚔️ src/components/topbar/LoginButton.vue (content)
⚔️ src/components/topbar/WorkflowTabs.vue (content)
⚔️ src/components/topbar/WorkspaceSwitcherPopover.vue (content)
⚔️ src/components/ui/Popover.vue (content)
⚔️ src/components/ui/select/SelectContent.vue (content)
⚔️ src/components/widget/layout/BaseModalLayout.vue (content)
⚔️ src/composables/auth/useFirebaseAuthActions.ts (content)
⚔️ src/composables/bottomPanelTabs/useTerminalTabs.ts (content)
⚔️ src/composables/graph/useGraphNodeManager.test.ts (content)
⚔️ src/composables/graph/useGraphNodeManager.ts (content)
⚔️ src/composables/graph/useVueNodeLifecycle.ts (content)
⚔️ src/composables/node/usePriceBadge.ts (content)
⚔️ src/composables/node/useWatchWidget.ts (content)
⚔️ src/composables/queue/useJobActions.ts (content)
⚔️ src/composables/queue/useJobList.test.ts (content)
⚔️ src/composables/queue/useJobList.ts (content)
⚔️ src/composables/queue/useJobMenu.ts (content)
⚔️ src/composables/sidebarTabs/useAssetsSidebarTab.ts (content)
⚔️ src/composables/sidebarTabs/useModelLibrarySidebarTab.ts (content)
⚔️ src/composables/tree/useTreeFolderOperations.ts (content)
⚔️ src/composables/useCanvasDrop.ts (content)
⚔️ src/composables/useCoreCommands.test.ts (content)
⚔️ src/composables/useCoreCommands.ts (content)
⚔️ src/composables/useExternalLink.test.ts (content)
⚔️ src/composables/useExternalLink.ts (content)
⚔️ src/composables/useFeatureFlags.ts (content)
⚔️ src/composables/useLoad3d.ts (content)
⚔️ src/composables/useLoad3dDrag.test.ts (content)
⚔️ src/composables/usePaste.test.ts (content)
⚔️ src/composables/usePaste.ts (content)
⚔️ src/composables/useWorkflowTemplateSelectorDialog.ts (content)
⚔️ src/constants/serverConfig.ts (content)
⚔️ src/core/graph/subgraph/proxyWidget.test.ts (content)
⚔️ src/core/graph/subgraph/proxyWidget.ts (content)
⚔️ src/core/graph/subgraph/proxyWidgetUtils.ts (content)
⚔️ src/extensions/core/cloudRemoteConfig.ts (content)
⚔️ src/extensions/core/cloudSubscription.ts (content)
⚔️ src/extensions/core/electronAdapter.ts (content)
⚔️ src/extensions/core/groupNode.ts (content)
⚔️ src/extensions/core/load3d.ts (content)
⚔️ src/extensions/core/load3d/constants.ts (content)
⚔️ src/extensions/core/load3dLazy.ts (content)
⚔️ src/extensions/core/previewAny.ts (content)
⚔️ src/extensions/core/slotDefaults.ts (content)
⚔️ src/extensions/core/uploadAudio.ts (content)
⚔️ src/extensions/core/widgetInputs.ts (content)
⚔️ src/i18n.ts (content)
⚔️ src/lib/litegraph/AGENTS.md (content)
⚔️ src/lib/litegraph/API.md (content)
⚔️ src/lib/litegraph/README.md (content)
⚔️ src/lib/litegraph/src/LGraph.test.ts (content)
⚔️ src/lib/litegraph/src/LGraph.ts (content)
⚔️ src/lib/litegraph/src/LGraphCanvas.ts (content)
⚔️ src/lib/litegraph/src/LGraphNode.test.ts (content)
⚔️ src/lib/litegraph/src/LGraphNode.ts (content)
⚔️ src/lib/litegraph/src/LGraphNode.widgetOrder.test.ts (content)
⚔️ src/lib/litegraph/src/canvas/LinkConnectorSubgraphInputValidation.test.ts (content)
⚔️ src/lib/litegraph/src/canvas/ToInputFromIoNodeLink.ts (content)
⚔️ src/lib/litegraph/src/contextMenuCompat.test.ts (content)
⚔️ src/lib/litegraph/src/contextMenuCompat.ts (content)
⚔️ src/lib/litegraph/src/infrastructure/CustomEventTarget.ts (content)
⚔️ src/lib/litegraph/src/interfaces.ts (content)
⚔️ src/lib/litegraph/src/litegraph.ts (content)
⚔️ src/lib/litegraph/src/subgraph/ExecutableNodeDTO.ts (content)
⚔️ src/lib/litegraph/src/subgraph/SubgraphConversion.test.ts (content)
⚔️ src/lib/litegraph/src/subgraph/SubgraphNode.test.ts (content)
⚔️ src/lib/litegraph/src/subgraph/SubgraphNode.ts (content)
⚔️ src/lib/litegraph/src/subgraph/__fixtures__/README.md (content)
⚔️ src/lib/litegraph/src/subgraph/subgraphUtils.test.ts (content)
⚔️ src/lib/litegraph/src/types/widgets.ts (content)
⚔️ src/lib/litegraph/src/utils/arrange.ts (content)
⚔️ src/lib/litegraph/src/utils/type.ts (content)
⚔️ src/lib/litegraph/src/widgets/BaseWidget.ts (content)
⚔️ src/lib/litegraph/src/widgets/ComboWidget.ts (content)
⚔️ src/lib/litegraph/src/widgets/widgetMap.ts (content)
⚔️ src/locales/ar/commands.json (content)
⚔️ src/locales/ar/main.json (content)
⚔️ src/locales/ar/nodeDefs.json (content)
⚔️ src/locales/ar/settings.json (content)
⚔️ src/locales/en/commands.json (content)
⚔️ src/locales/en/main.json (content)
⚔️ src/locales/en/nodeDefs.json (content)
⚔️ src/locales/en/settings.json (content)
⚔️ src/locales/es/commands.json (content)
⚔️ src/locales/es/main.json (content)
⚔️ src/locales/es/nodeDefs.json (content)
⚔️ src/locales/es/settings.json (content)
⚔️ src/locales/fa/commands.json (content)
⚔️ src/locales/fa/main.json (content)
⚔️ src/locales/fa/nodeDefs.json (content)
⚔️ src/locales/fa/settings.json (content)
⚔️ src/locales/fr/commands.json (content)
⚔️ src/locales/fr/main.json (content)
⚔️ src/locales/fr/nodeDefs.json (content)
⚔️ src/locales/fr/settings.json (content)
⚔️ src/locales/ja/commands.json (content)
⚔️ src/locales/ja/main.json (content)
⚔️ src/locales/ja/nodeDefs.json (content)
⚔️ src/locales/ja/settings.json (content)
⚔️ src/locales/ko/commands.json (content)
⚔️ src/locales/ko/main.json (content)
⚔️ src/locales/ko/nodeDefs.json (content)
⚔️ src/locales/ko/settings.json (content)
⚔️ src/locales/pt-BR/commands.json (content)
⚔️ src/locales/pt-BR/main.json (content)
⚔️ src/locales/pt-BR/nodeDefs.json (content)
⚔️ src/locales/pt-BR/settings.json (content)
⚔️ src/locales/ru/commands.json (content)
⚔️ src/locales/ru/main.json (content)
⚔️ src/locales/ru/nodeDefs.json (content)
⚔️ src/locales/ru/settings.json (content)
⚔️ src/locales/tr/commands.json (content)
⚔️ src/locales/tr/main.json (content)
⚔️ src/locales/tr/nodeDefs.json (content)
⚔️ src/locales/tr/settings.json (content)
⚔️ src/locales/zh-TW/commands.json (content)
⚔️ src/locales/zh-TW/main.json (content)
⚔️ src/locales/zh-TW/nodeDefs.json (content)
⚔️ src/locales/zh-TW/settings.json (content)
⚔️ src/locales/zh/commands.json (content)
⚔️ src/locales/zh/main.json (content)
⚔️ src/locales/zh/nodeDefs.json (content)
⚔️ src/locales/zh/settings.json (content)
⚔️ src/main.ts (content)
⚔️ src/platform/assets/components/AssetBrowserModal.vue (content)
⚔️ src/platform/assets/components/MediaAssetFilterBar.vue (content)
⚔️ src/platform/assets/components/UploadModelUpgradeModal.vue (content)
⚔️ src/platform/assets/components/UploadModelUrlInput.vue (content)
⚔️ src/platform/assets/composables/useAssetBrowserDialog.ts (content)
⚔️ src/platform/assets/composables/useMediaAssetActions.ts (content)
⚔️ src/platform/assets/services/assetService.ts (content)
⚔️ src/platform/assets/types/filterTypes.ts (content)
⚔️ src/platform/assets/utils/assetUrlUtil.ts (content)
⚔️ src/platform/auth/workspace/useWorkspaceSwitch.test.ts (content)
⚔️ src/platform/cloud/onboarding/CloudSubscriptionRedirectView.test.ts (content)
⚔️ src/platform/cloud/onboarding/CloudSubscriptionRedirectView.vue (content)
⚔️ src/platform/cloud/onboarding/components/CloudTemplate.vue (content)
⚔️ src/platform/cloud/subscription/components/PricingTable.test.ts (content)
⚔️ src/platform/cloud/subscription/components/PricingTable.vue (content)
⚔️ src/platform/cloud/subscription/components/SubscribeButton.vue (content)
⚔️ src/platform/cloud/subscription/components/SubscribeToRun.vue (content)
⚔️ src/platform/cloud/subscription/components/SubscriptionPanel.test.ts (content)
⚔️ src/platform/cloud/subscription/components/SubscriptionPanel.vue (content)
⚔️ src/platform/cloud/subscription/components/SubscriptionPanelContentWorkspace.vue (content)
⚔️ src/platform/cloud/subscription/components/SubscriptionRequiredDialogContent.vue (content)
⚔️ src/platform/cloud/subscription/composables/useSubscription.test.ts (content)
⚔️ src/platform/cloud/subscription/composables/useSubscription.ts (content)
⚔️ src/platform/cloud/subscription/composables/useSubscriptionActions.test.ts (content)
⚔️ src/platform/cloud/subscription/composables/useSubscriptionActions.ts (content)
⚔️ src/platform/cloud/subscription/composables/useSubscriptionCancellationWatcher.test.ts (content)
⚔️ src/platform/cloud/subscription/composables/useSubscriptionCancellationWatcher.ts (content)
⚔️ src/platform/cloud/subscription/composables/useSubscriptionCredits.test.ts (content)
⚔️ src/platform/cloud/subscription/composables/useSubscriptionCredits.ts (content)
⚔️ src/platform/cloud/subscription/composables/useSubscriptionDialog.ts (content)
⚔️ src/platform/cloud/subscription/constants/tierPricing.ts (content)
⚔️ src/platform/cloud/subscription/utils/subscriptionCheckoutUtil.ts (content)
⚔️ src/platform/distribution/types.ts (content)
⚔️ src/platform/keybindings/defaults.ts (content)
⚔️ src/platform/keybindings/keybindingService.ts (content)
⚔️ src/platform/nodeReplacement/nodeReplacementStore.test.ts (content)
⚔️ src/platform/nodeReplacement/nodeReplacementStore.ts (content)
⚔️ src/platform/remoteConfig/types.ts (content)
⚔️ src/platform/secrets/components/SecretFormDialog.vue (content)
⚔️ src/platform/settings/components/ExtensionPanel.vue (content)
⚔️ src/platform/settings/components/ServerConfigPanel.vue (content)
⚔️ src/platform/settings/components/SettingGroup.vue (content)
⚔️ src/platform/settings/components/SettingItem.vue (content)
⚔️ src/platform/settings/composables/useSettingUI.ts (content)
⚔️ src/platform/settings/constants/coreSettings.ts (content)
⚔️ src/platform/settings/settingStore.test.ts (content)
⚔️ src/platform/settings/settingStore.ts (content)
⚔️ src/platform/settings/types.ts (content)
⚔️ src/platform/telemetry/index.ts (content)
⚔️ src/platform/telemetry/types.ts (content)
⚔️ src/platform/updates/common/releaseStore.test.ts (content)
⚔️ src/platform/updates/common/releaseStore.ts (content)
⚔️ src/platform/updates/components/ReleaseNotificationToast.test.ts (content)
⚔️ src/platform/updates/components/ReleaseNotificationToast.vue (content)
⚔️ src/platform/workflow/core/services/workflowActionsService.ts (content)
⚔️ src/platform/workflow/core/services/workflowService.ts (content)
⚔️ src/platform/workflow/management/stores/workflowStore.ts (content)
⚔️ src/platform/workflow/persistence/composables/useWorkflowPersistence.test.ts (content)
⚔️ src/platform/workflow/validation/schemas/workflowSchema.ts (content)
⚔️ src/platform/workspace/api/workspaceApi.ts (content)
⚔️ src/platform/workspace/composables/useInviteUrlLoader.test.ts (content)
⚔️ src/platform/workspace/composables/useInviteUrlLoader.ts (content)
⚔️ src/platform/workspace/composables/useWorkspaceUI.ts (content)
⚔️ src/platform/workspace/stores/teamWorkspaceStore.test.ts (content)
⚔️ src/platform/workspace/stores/teamWorkspaceStore.ts (content)
⚔️ src/renderer/core/canvas/litegraph/litegraphLinkAdapter.ts (content)
⚔️ src/renderer/core/layout/store/layoutStore.test.ts (content)
⚔️ src/renderer/core/layout/store/layoutStore.ts (content)
⚔️ src/renderer/core/layout/types.ts (content)
⚔️ src/renderer/extensions/linearMode/LinearControls.vue (content)
⚔️ src/renderer/extensions/linearMode/LinearPreview.vue (content)
⚔️ src/renderer/extensions/linearMode/LinearWelcome.vue (content)
⚔️ src/renderer/extensions/linearMode/MobileMenu.vue (content)
⚔️ src/renderer/extensions/vueNodes/components/ImagePreview.test.ts (content)
⚔️ src/renderer/extensions/vueNodes/components/ImagePreview.vue (content)
⚔️ src/renderer/extensions/vueNodes/components/InputSlot.vue (content)
⚔️ src/renderer/extensions/vueNodes/components/LGraphNode.test.ts (content)
⚔️ src/renderer/extensions/vueNodes/components/LGraphNode.vue (content)
⚔️ src/renderer/extensions/vueNodes/components/LGraphNodePreview.vue (content)
⚔️ src/renderer/extensions/vueNodes/components/LivePreview.vue (content)
⚔️ src/renderer/extensions/vueNodes/components/NodeHeader.vue (content)
⚔️ src/renderer/extensions/vueNodes/components/NodeWidgets.test.ts (content)
⚔️ src/renderer/extensions/vueNodes/components/NodeWidgets.vue (content)
⚔️ src/renderer/extensions/vueNodes/components/OutputSlot.vue (content)
⚔️ src/renderer/extensions/vueNodes/components/SlotConnectionDot.vue (content)
⚔️ src/renderer/extensions/vueNodes/composables/useSlotElementTracking.ts (content)
⚔️ src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts (content)
⚔️ src/renderer/extensions/vueNodes/interactions/resize/useNodeResize.ts (content)
⚔️ src/renderer/extensions/vueNodes/layout/ensureCorrectLayoutScale.ts (content)
⚔️ src/renderer/extensions/vueNodes/preview/useNodePreviewState.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetChart.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetColorPicker.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetDOM.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetInputText.test.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetRecordAudio.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetSelect.test.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetSelect.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDefault.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.test.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/audio/AudioPreviewPlayer.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/form/FormSearchInput.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownInput.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenu.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuFilter.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuItem.vue (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/form/dropdown/shared.test.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/form/dropdown/shared.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/components/form/dropdown/types.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/composables/useAssetWidgetData.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/composables/useImageCompareWidget.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/composables/useMarkdownWidget.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/composables/useProgressTextWidget.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/composables/useStringWidget.ts (content)
⚔️ src/renderer/extensions/vueNodes/widgets/composables/useWidgetRenderer.test.ts (content)
⚔️ src/router.ts (content)
⚔️ src/schemas/apiSchema.ts (content)
⚔️ src/schemas/nodeDefSchema.ts (content)
⚔️ src/scripts/api.ts (content)
⚔️ src/scripts/app.ts (content)
⚔️ src/scripts/domWidget.ts (content)
⚔️ src/scripts/metadata/png.ts (content)
⚔️ src/scripts/pnginfo.ts (content)
⚔️ src/scripts/ui.ts (content)
⚔️ src/scripts/widgets.ts (content)
⚔️ src/services/colorPaletteService.ts (content)
⚔️ src/services/customerEventsService.test.ts (content)
⚔️ src/services/customerEventsService.ts (content)
⚔️ src/services/dialogService.ts (content)
⚔️ src/services/extensionService.ts (content)
⚔️ src/services/litegraphService.ts (content)
⚔️ src/services/load3dService.ts (content)
⚔️ src/services/nodeSearchService.test.ts (content)
⚔️ src/stores/aboutPanelStore.ts (content)
⚔️ src/stores/electronDownloadStore.ts (content)
⚔️ src/stores/executionStore.ts (content)
⚔️ src/stores/firebaseAuthStore.test.ts (content)
⚔️ src/stores/firebaseAuthStore.ts (content)
⚔️ src/stores/imagePreviewStore.test.ts (content)
⚔️ src/stores/imagePreviewStore.ts (content)
⚔️ src/stores/maskEditorStore.ts (content)
⚔️ src/stores/modelToNodeStore.test.ts (content)
⚔️ src/stores/modelToNodeStore.ts (content)
⚔️ src/stores/nodeDefStore.ts (content)
⚔️ src/stores/queueStore.ts (content)
⚔️ src/stores/serverConfigStore.test.ts (content)
⚔️ src/stores/subgraphStore.test.ts (content)
⚔️ src/stores/subgraphStore.ts (content)
⚔️ src/stores/systemStatsStore.test.ts (content)
⚔️ src/stores/systemStatsStore.ts (content)
⚔️ src/stores/workspace/bottomPanelStore.test.ts (content)
⚔️ src/stores/workspace/bottomPanelStore.ts (content)
⚔️ src/stores/workspace/rightSidePanelStore.ts (content)
⚔️ src/stores/workspaceStore.ts (content)
⚔️ src/storybook/mocks/useJobActions.ts (content)
⚔️ src/types/algoliaTypes.ts (content)
⚔️ src/types/comfy.ts (content)
⚔️ src/types/litegraph-augmentation.d.ts (content)
⚔️ src/types/simplifiedWidget.ts (content)
⚔️ src/types/treeExplorerTypes.ts (content)
⚔️ src/types/widgetTypes.ts (content)
⚔️ src/utils/__tests__/eventUtils.test.ts (content)
⚔️ src/utils/envUtil.ts (content)
⚔️ src/utils/eventUtils.ts (content)
⚔️ src/utils/litegraphUtil.test.ts (content)
⚔️ src/utils/litegraphUtil.ts (content)
⚔️ src/utils/queueDisplay.ts (content)
⚔️ src/utils/widgetPropFilter.ts (content)
⚔️ src/views/GraphView.vue (content)
⚔️ src/views/LinearView.vue (content)
⚔️ src/views/templates/BaseViewTemplate.vue (content)
⚔️ src/workbench/extensions/manager/components/ManagerProgressToast.vue (content)
⚔️ src/workbench/extensions/manager/components/manager/ManagerDialog.vue (content)
⚔️ src/workbench/extensions/manager/components/manager/NodeConflictDialogContent.test.ts (content)
⚔️ src/workbench/extensions/manager/components/manager/PackVersionBadge.test.ts (content)
⚔️ src/workbench/extensions/manager/components/manager/PackVersionBadge.vue (content)
⚔️ src/workbench/extensions/manager/components/manager/PackVersionSelectorPopover.test.ts (content)
⚔️ src/workbench/extensions/manager/components/manager/button/PackEnableToggle.test.ts (content)
⚔️ src/workbench/extensions/manager/components/manager/infoPanel/tabs/NodesTabPanel.vue (content)
⚔️ src/workbench/extensions/manager/components/manager/skeleton/PackCardGridSkeleton.test.ts (content)
⚔️ src/workbench/extensions/manager/composables/useConflictDetection.ts (content)
⚔️ src/workbench/extensions/manager/composables/useManagerDialog.ts (content)
⚔️ src/workbench/extensions/manager/composables/useManagerQueue.ts (content)
⚔️ src/workbench/extensions/manager/composables/useManagerState.test.ts (content)
⚔️ src/workbench/extensions/manager/composables/useManagerState.ts (content)
⚔️ src/workbench/extensions/manager/services/comfyManagerService.ts (content)
⚔️ src/workbench/extensions/manager/stores/comfyManagerStore.ts (content)
⚔️ src/workbench/extensions/manager/types/conflictDetectionTypes.ts (content)
⚔️ src/workbench/extensions/manager/utils/conflictMessageUtil.ts (content)
⚔️ tsconfig.json (content)

These conflicts must be resolved before merging into main.
Resolve conflicts locally and push changes to this branch.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: virtualizing FormDropdownMenu to reduce DOM nodes and image requests, which aligns with the core objective of the pull request.
Description check ✅ Passed The description covers the required template sections with concrete details: Summary explains the virtualization fix, Changes lists specific modifications, and Review Focus highlights critical design decisions.

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

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch perf/image-dropdown-assets-perf

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

@github-actions
Copy link

github-actions bot commented Jan 30, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/14/2026, 05:02:50 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 30, 2026

Playwright: ❌ 521 passed, 2 failed · 1 flaky

❌ Failed Tests

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

@github-actions
Copy link

github-actions bot commented Jan 30, 2026

Bundle Size Report

Summary

  • Raw size: 19.8 MB baseline 19.8 MB — 🔴 +326 B
  • Gzip: 4.24 MB baseline 4.24 MB — 🟢 -172 B
  • Brotli: 3.29 MB baseline 3.29 MB — 🟢 -261 B
  • Bundles: 230 current • 230 baseline • 109 added / 109 removed

Category Glance
Other 🟢 -11.8 kB (7.3 MB) · Graph Workspace 🔴 +8.31 kB (888 kB) · UI Components 🔴 +3.72 kB (40.3 kB) · Data & Services 🔴 +98 B (2.15 MB) · App Entry Points 🔴 +6 B (21.7 kB) · Vendor & Third-Party ⚪ 0 B (8.69 MB) · + 5 more

Per-category breakdown
App Entry Points — 21.7 kB (baseline 21.7 kB) • 🔴 +6 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BkITkULG.js (new) 21.7 kB 🔴 +21.7 kB 🔴 +7.03 kB 🔴 +6.12 kB
assets/index-B-4uiC3g.js (removed) 21.7 kB 🟢 -21.7 kB 🟢 -7.02 kB 🟢 -6.1 kB

Status: 1 added / 1 removed

Graph Workspace — 888 kB (baseline 879 kB) • 🔴 +8.31 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CfE-lx3n.js (new) 888 kB 🔴 +888 kB 🔴 +191 kB 🔴 +146 kB
assets/GraphView-HoeLwPCL.js (removed) 879 kB 🟢 -879 kB 🟢 -190 kB 🟢 -144 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CBqtF8kn.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -3.31 kB 🟢 -2.81 kB
assets/CloudSurveyView-yLxy2rwI.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +3.31 kB 🔴 +2.8 kB
assets/CloudLoginView-BPYfz2sO.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.95 kB 🟢 -2.6 kB
assets/CloudLoginView-BujeoF0j.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.95 kB 🔴 +2.6 kB
assets/UserCheckView-o3LjdL65.js (new) 8.38 kB 🔴 +8.38 kB 🔴 +2.21 kB 🔴 +1.92 kB
assets/UserCheckView-rsW2C4uJ.js (removed) 8.38 kB 🟢 -8.38 kB 🟢 -2.21 kB 🟢 -1.92 kB
assets/CloudSignupView-bgXlp5B9.js (removed) 7.46 kB 🟢 -7.46 kB 🟢 -2.34 kB 🟢 -2.06 kB
assets/CloudSignupView-DmGR0k9c.js (new) 7.46 kB 🔴 +7.46 kB 🔴 +2.34 kB 🔴 +2.06 kB
assets/CloudLayoutView-D4uKhBJy.js (removed) 6.48 kB 🟢 -6.48 kB 🟢 -2.12 kB 🟢 -1.85 kB
assets/CloudLayoutView-ifdadLDA.js (new) 6.48 kB 🔴 +6.48 kB 🔴 +2.12 kB 🔴 +1.86 kB
assets/CloudForgotPasswordView-CqbjZlSZ.js (removed) 5.61 kB 🟢 -5.61 kB 🟢 -1.96 kB 🟢 -1.75 kB
assets/CloudForgotPasswordView-D1vXq5tv.js (new) 5.61 kB 🔴 +5.61 kB 🔴 +1.96 kB 🔴 +1.72 kB
assets/CloudAuthTimeoutView-BNXUuLR9.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.79 kB 🟢 -1.57 kB
assets/CloudAuthTimeoutView-f9GzKREC.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/CloudSubscriptionRedirectView-CmpecomM.js (new) 4.76 kB 🔴 +4.76 kB 🔴 +1.8 kB 🔴 +1.6 kB
assets/CloudSubscriptionRedirectView-uUkSW1Gm.js (removed) 4.76 kB 🟢 -4.76 kB 🟢 -1.8 kB 🟢 -1.59 kB
assets/UserSelectView-Caau0hYh.js (new) 4.46 kB 🔴 +4.46 kB 🔴 +1.62 kB 🔴 +1.46 kB
assets/UserSelectView-SHW8t_Tu.js (removed) 4.46 kB 🟢 -4.46 kB 🟢 -1.62 kB 🟢 -1.45 kB
assets/CloudSorryContactSupportView-CnbSE1aL.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-BN-ntRG8.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-BbEp9fG8.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.29 kB 🔴 +4.64 kB
assets/SecretsPanel-CoaeQO2w.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.29 kB 🟢 -4.63 kB
assets/LegacyCreditsPanel-BYfx-K3F.js (new) 20.7 kB 🔴 +20.7 kB 🔴 +5.59 kB 🔴 +4.91 kB
assets/LegacyCreditsPanel-LG8q37G-.js (removed) 20.7 kB 🟢 -20.7 kB 🟢 -5.59 kB 🟢 -4.91 kB
assets/SubscriptionPanel-_53aybBI.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.73 kB 🟢 -4.2 kB
assets/SubscriptionPanel-BsHzWXz_.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.73 kB 🔴 +4.18 kB
assets/KeybindingPanel-BpppPVaj.js (removed) 12.4 kB 🟢 -12.4 kB 🟢 -3.6 kB 🟢 -3.19 kB
assets/KeybindingPanel-DEGb7vT9.js (new) 12.4 kB 🔴 +12.4 kB 🔴 +3.6 kB 🔴 +3.18 kB
assets/ExtensionPanel-D8-2ApDh.js (removed) 9.43 kB 🟢 -9.43 kB 🟢 -2.68 kB 🟢 -2.37 kB
assets/ExtensionPanel-Dx0HluTd.js (new) 9.43 kB 🔴 +9.43 kB 🔴 +2.68 kB 🔴 +2.37 kB
assets/AboutPanel-GNGJbul4.js (new) 8.49 kB 🔴 +8.49 kB 🔴 +2.43 kB 🔴 +2.18 kB
assets/AboutPanel-rxUgzD8Q.js (removed) 8.49 kB 🟢 -8.49 kB 🟢 -2.43 kB 🟢 -2.18 kB
assets/ServerConfigPanel-P0YkzRrZ.js (new) 6.5 kB 🔴 +6.5 kB 🔴 +2.13 kB 🔴 +1.95 kB
assets/ServerConfigPanel-SL8H6x6E.js (removed) 6.5 kB 🟢 -6.5 kB 🟢 -2.13 kB 🟢 -1.94 kB
assets/UserPanel-ChyW243S.js (removed) 6.21 kB 🟢 -6.21 kB 🟢 -2.02 kB 🟢 -1.76 kB
assets/UserPanel-DfaPZydC.js (new) 6.21 kB 🔴 +6.21 kB 🔴 +2.02 kB 🔴 +1.76 kB
assets/cloudRemoteConfig-C5w8qMm4.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -732 B 🟢 -630 B
assets/cloudRemoteConfig-DdaicAY3.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +733 B 🔴 +629 B
assets/refreshRemoteConfig-CF0qqvLl.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +518 B 🔴 +464 B
assets/refreshRemoteConfig-DjjXNcoP.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -520 B 🟢 -456 B
assets/config-CepyQFhC.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-8z66fa9o.js 29.2 kB 29.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B_EruZyQ.js 27.1 kB 27.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BPuOKZZg.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C5NycgSh.js 31.6 kB 31.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CF6cmuWq.js 37.6 kB 37.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CMSM0-YP.js 28.1 kB 28.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Djbh331J.js 29.8 kB 29.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-emoCO0AT.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-H0rWARzj.js 23.3 kB 23.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-HiOqkizv.js 28 kB 28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-ohqijv3i.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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-DB2xHrjv.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +990 B
assets/auth-DDlx1Uue.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -989 B
assets/SignUpForm-Cv6_Z_Rl.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/SignUpForm-xWeMjrFP.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.1 kB
assets/UpdatePasswordContent-B7fkOjTt.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.09 kB 🟢 -961 B
assets/UpdatePasswordContent-CT_e_p38.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.09 kB 🔴 +963 B
assets/firebaseAuthStore-BjsklzoU.js (new) 837 B 🔴 +837 B 🔴 +413 B 🔴 +369 B
assets/firebaseAuthStore-BrKFmNVr.js (removed) 837 B 🟢 -837 B 🟢 -417 B 🟢 -366 B
assets/auth-D0b3BgID.js (removed) 317 B 🟢 -317 B 🟢 -206 B 🟢 -195 B
assets/auth-Qev3hk-Z.js (new) 317 B 🔴 +317 B 🔴 +205 B 🔴 +193 B
assets/PasswordFields-CdUdjtQy.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-BQO-2kig.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Editors & Dialogs — 785 B (baseline 785 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-D5ZE7vem.js (removed) 785 B 🟢 -785 B 🟢 -404 B 🟢 -348 B
assets/useSubscriptionDialog-DxO8iY3o.js (new) 785 B 🔴 +785 B 🔴 +402 B 🔴 +349 B

Status: 1 added / 1 removed

UI Components — 40.3 kB (baseline 36.6 kB) • 🔴 +3.72 kB

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-BbajJOm2.js (new) 9.89 kB 🔴 +9.89 kB 🔴 +3.42 kB 🔴 +3.01 kB
assets/useTerminalTabs-TrW1IJVS.js (removed) 9.89 kB 🟢 -9.89 kB 🟢 -3.42 kB 🟢 -3.02 kB
assets/ComfyQueueButton-C0jx-z49.js (removed) 7.17 kB 🟢 -7.17 kB 🟢 -2.31 kB 🟢 -2.07 kB
assets/ComfyQueueButton-Cr2Z94AX.js (new) 7.17 kB 🔴 +7.17 kB 🔴 +2.32 kB 🔴 +2.07 kB
assets/FormSearchInput-D5Y_lXPK.js (new) 3.72 kB 🔴 +3.72 kB 🔴 +1.54 kB 🔴 +1.35 kB
assets/SubscribeButton-CUP5sXBD.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.02 kB 🔴 +890 B
assets/SubscribeButton-DRlV7y4y.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.02 kB 🟢 -887 B
assets/cloudFeedbackTopbarButton-DN5A2Vyv.js (new) 1.64 kB 🔴 +1.64 kB 🔴 +880 B 🔴 +784 B
assets/cloudFeedbackTopbarButton-Dr7tNoMU.js (removed) 1.64 kB 🟢 -1.64 kB 🟢 -880 B 🟢 -750 B
assets/ComfyQueueButton-9ZN_F3D8.js (new) 842 B 🔴 +842 B 🔴 +415 B 🔴 +371 B
assets/ComfyQueueButton-CulQtv99.js (removed) 842 B 🟢 -842 B 🟢 -418 B 🟢 -369 B
assets/Button-BlbRDbqy.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-hxJOdoys.js 1.24 kB 1.24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-Ds7IqP5Z.js 7.45 kB 7.45 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-DrH_EiZZ.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DgRwIURU.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 5 removed

Data & Services — 2.15 MB (baseline 2.15 MB) • 🔴 +98 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-CS1PQ9MY.js (new) 1.38 MB 🔴 +1.38 MB 🔴 +310 kB 🔴 +239 kB
assets/dialogService-COfXCPpi.js (removed) 1.38 MB 🟢 -1.38 MB 🟢 -310 kB 🟢 -239 kB
assets/api-CbJia4dn.js (new) 646 kB 🔴 +646 kB 🔴 +146 kB 🔴 +116 kB
assets/api-DM91a_D4.js (removed) 646 kB 🟢 -646 kB 🟢 -146 kB 🟢 -116 kB
assets/load3dService-B0wixIOx.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-iSJtmA8J.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/systemStatsStore-Bw5QI-Qx.js (removed) 12.2 kB 🟢 -12.2 kB 🟢 -4.27 kB 🟢 -3.74 kB
assets/systemStatsStore-CQEAZqz0.js (new) 12.2 kB 🔴 +12.2 kB 🔴 +4.26 kB 🔴 +3.75 kB
assets/releaseStore-CpQfICq-.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/releaseStore-rjBD-H_l.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/keybindingService-C5pxJMQU.js (new) 6.57 kB 🔴 +6.57 kB 🔴 +1.73 kB 🔴 +1.49 kB
assets/keybindingService-DH4NGyRQ.js (removed) 6.57 kB 🟢 -6.57 kB 🟢 -1.73 kB 🟢 -1.49 kB
assets/bootstrapStore-0NlPdXUg.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -877 B 🟢 -796 B
assets/bootstrapStore-BiiHEQB4.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +877 B 🔴 +796 B
assets/userStore-D3pYU7qW.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +721 B 🔴 +679 B
assets/userStore-grr_5GFG.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -721 B 🟢 -634 B
assets/audioService-CiJfvQl6.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -849 B 🟢 -725 B
assets/audioService-XeQZZ-L_.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +848 B 🔴 +723 B
assets/releaseStore-CuhRqYgf.js (removed) 809 B 🟢 -809 B 🟢 -408 B 🟢 -357 B
assets/releaseStore-xqZ_JtUO.js (new) 809 B 🔴 +809 B 🔴 +405 B 🔴 +356 B
assets/workflowDraftStore-BfJjN9-S.js (new) 785 B 🔴 +785 B 🔴 +402 B 🔴 +353 B
assets/workflowDraftStore-Dq2TFDJb.js (removed) 785 B 🟢 -785 B 🟢 -403 B 🟢 -350 B
assets/dialogService-BHrRyXqU.js (new) 774 B 🔴 +774 B 🔴 +394 B 🔴 +349 B
assets/dialogService-BSoJCSOQ.js (removed) 774 B 🟢 -774 B 🟢 -396 B 🟢 -347 B
assets/dialogStore-D5Kfd1UD.js 4.1 kB 4.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-CRmy-NJp.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-BjmAcF_N.js (removed) 178 kB 🟢 -178 kB 🟢 -39.4 kB 🟢 -32.7 kB
assets/useConflictDetection-DFzzQbSn.js (new) 178 kB 🔴 +178 kB 🔴 +39.4 kB 🔴 +32.8 kB
assets/useLoad3d-BBeaXtsO.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3d-C858zIer.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3dViewer-D1Okxrrk.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useLoad3dViewer-DmfoqWjv.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.8 kB
assets/useFeatureFlags-CMv4I8Y-.js (removed) 3.32 kB 🟢 -3.32 kB 🟢 -1.04 kB 🟢 -898 B
assets/useFeatureFlags-qzaxUIL4.js (new) 3.32 kB 🔴 +3.32 kB 🔴 +1.04 kB 🔴 +898 B
assets/useWorkspaceUI-BdwcFIoF.js (new) 3 kB 🔴 +3 kB 🔴 +823 B 🔴 +696 B
assets/useWorkspaceUI-JbOwee2I.js (removed) 3 kB 🟢 -3 kB 🟢 -821 B 🟢 -700 B
assets/useSubscriptionCredits-CCtRUKBY.js (removed) 2.75 kB 🟢 -2.75 kB 🟢 -1.04 kB 🟢 -895 B
assets/useSubscriptionCredits-DU7VxlEc.js (new) 2.75 kB 🔴 +2.75 kB 🔴 +1.04 kB 🔴 +898 B
assets/subscriptionCheckoutUtil-DkU7Jtm0.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +960 B
assets/subscriptionCheckoutUtil-QORpWLhD.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -953 B
assets/useErrorHandling-Bt0yIBIP.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +555 B 🔴 +509 B
assets/useErrorHandling-DYBD8ZZz.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -555 B 🟢 -477 B
assets/useWorkspaceSwitch-CEHO3ye1.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -543 B 🟢 -488 B
assets/useWorkspaceSwitch-CYlFBEPw.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +546 B 🔴 +480 B
assets/useLoad3d-DKWmuida.js (removed) 908 B 🟢 -908 B 🟢 -447 B 🟢 -400 B
assets/useLoad3d-uuPwODFD.js (new) 908 B 🔴 +908 B 🔴 +446 B 🔴 +400 B
assets/useLoad3dViewer-DjIfPoME.js (new) 887 B 🔴 +887 B 🔴 +431 B 🔴 +386 B
assets/useLoad3dViewer-vLk9iQi3.js (removed) 887 B 🟢 -887 B 🟢 -433 B 🟢 -386 B
assets/audioUtils-dbUQQNNt.js (removed) 858 B 🟢 -858 B 🟢 -499 B 🟢 -420 B
assets/audioUtils-DvQO7khz.js (new) 858 B 🔴 +858 B 🔴 +502 B 🔴 +402 B
assets/useCurrentUser-7FWC23v4.js (new) 771 B 🔴 +771 B 🔴 +397 B 🔴 +349 B
assets/useCurrentUser-DklJw2r7.js (removed) 771 B 🟢 -771 B 🟢 -398 B 🟢 -348 B
assets/_plugin-vue_export-helper-CY4XIWDa.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-BiqWg6CN.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-BHmbpOtd.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DKmelI5u.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BputJAFn.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCopyToClipboard-g_l_VTR-.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-BW7ksmwd.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-C4mPrLmU.js 70.3 kB 70.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-BxkFiWzp.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-BxsQv-KC.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-uorjc_FY.js 102 kB 102 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-CON5ZIHM.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-Bd8j9uVq.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-B82zTENX.js 255 kB 255 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-LBLOE6BD.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-Bi_34iZD.js 625 kB 625 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-BjA-tjXK.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-DcEOrMQz.js 112 kB 112 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-Yc0APIKH.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CBmk8HiD.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.3 MB (baseline 7.31 MB) • 🟢 -11.8 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-BXnc4ERN.js (new) 72.4 kB 🔴 +72.4 kB 🔴 +18.6 kB 🔴 +16 kB
assets/core-nQaG3Vpk.js (removed) 72.4 kB 🟢 -72.4 kB 🟢 -18.6 kB 🟢 -16 kB
assets/groupNode-BLpM2ZMc.js (removed) 72.1 kB 🟢 -72.1 kB 🟢 -17.7 kB 🟢 -15.6 kB
assets/groupNode-Cqy1psbO.js (new) 72.1 kB 🔴 +72.1 kB 🔴 +17.7 kB 🔴 +15.6 kB
assets/WidgetSelect-B1vkPkZz.js (new) 58.4 kB 🔴 +58.4 kB 🔴 +12.5 kB 🔴 +10.7 kB
assets/WidgetSelect-CQMk9AWE.js (removed) 57.8 kB 🟢 -57.8 kB 🟢 -12.3 kB 🟢 -10.6 kB
assets/SubscriptionRequiredDialogContentWorkspace-1FgbQB03.js (new) 45.9 kB 🔴 +45.9 kB 🔴 +8.59 kB 🔴 +7.46 kB
assets/SubscriptionRequiredDialogContentWorkspace-CKqw5L6r.js (removed) 45.9 kB 🟢 -45.9 kB 🟢 -8.59 kB 🟢 -7.43 kB
assets/Load3DControls-CvE2PwbP.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/Load3DControls-Ive2N6Z3.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/WorkspacePanelContent-BC_uj0cH.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.13 kB 🟢 -5.39 kB
assets/WorkspacePanelContent-DuwJ3xo6.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.13 kB 🔴 +5.42 kB
assets/SubscriptionRequiredDialogContent-byMbm_6B.js (removed) 26.2 kB 🟢 -26.2 kB 🟢 -6.6 kB 🟢 -5.8 kB
assets/SubscriptionRequiredDialogContent-CK-Ud3EU.js (new) 26.2 kB 🔴 +26.2 kB 🔴 +6.59 kB 🔴 +5.79 kB
assets/Load3dViewerContent-Bm0dP57H.js (new) 23.1 kB 🔴 +23.1 kB 🔴 +5.2 kB 🔴 +4.5 kB
assets/Load3dViewerContent-Ddl1nQW5.js (removed) 23.1 kB 🟢 -23.1 kB 🟢 -5.2 kB 🟢 -4.5 kB
assets/WidgetImageCrop-B97ttQy7.js (new) 22.4 kB 🔴 +22.4 kB 🔴 +5.54 kB 🔴 +4.87 kB
assets/WidgetImageCrop-CL-NTCjh.js (removed) 22.4 kB 🟢 -22.4 kB 🟢 -5.54 kB 🟢 -4.86 kB
assets/SubscriptionPanelContentWorkspace-CmZzJ9DU.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -5.02 kB 🟢 -4.43 kB
assets/SubscriptionPanelContentWorkspace-DVwG-XHf.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +5.02 kB 🔴 +4.43 kB
assets/CurrentUserPopoverWorkspace-DWAmoqVP.js (new) 19.9 kB 🔴 +19.9 kB 🔴 +4.88 kB 🔴 +4.35 kB
assets/CurrentUserPopoverWorkspace-MfGcK0Kn.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -4.89 kB 🟢 -4.36 kB
assets/SignInContent-DS0gTuGP.js (new) 19 kB 🔴 +19 kB 🔴 +4.81 kB 🔴 +4.21 kB
assets/SignInContent-Dv-mUDO7.js (removed) 19 kB 🟢 -19 kB 🟢 -4.81 kB 🟢 -4.21 kB
assets/WidgetRecordAudio-Cxl5NKdi.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +4.97 kB 🔴 +4.45 kB
assets/WidgetRecordAudio-H3-VbbUl.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -4.97 kB 🟢 -4.44 kB
assets/MissingModelsWarning-BvHXV47I.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +4.71 kB 🔴 +4.18 kB
assets/MissingModelsWarning-CWR-sLUR.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -4.71 kB 🟢 -4.17 kB
assets/Load3D-9USmHzbG.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.04 kB 🟢 -3.53 kB
assets/Load3D-FvTPnubJ.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.04 kB 🔴 +3.53 kB
assets/WidgetInputNumber-BQ5FsBuh.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.26 kB 🔴 +3.8 kB
assets/WidgetInputNumber-D75-HCal.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -4.26 kB 🟢 -3.8 kB
assets/load3d-Br0abtAN.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.21 kB 🟢 -3.64 kB
assets/load3d-DkcfgI0C.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.21 kB 🔴 +3.64 kB
assets/LazyImage-DR-0-yTy.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.8 kB 🟢 -3.33 kB
assets/AudioPreviewPlayer-D97fMUUj.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.21 kB 🟢 -2.88 kB
assets/AudioPreviewPlayer-DL_xsjb6.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.22 kB 🔴 +2.87 kB
assets/NodeConflictDialogContent-BGCFmGCN.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.36 kB 🟢 -2.07 kB
assets/NodeConflictDialogContent-cswVTmp4.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.37 kB 🔴 +2.08 kB
assets/changeTracker-BkefQWMS.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.89 kB 🟢 -2.54 kB
assets/changeTracker-CI6xUL-C.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.89 kB 🔴 +2.55 kB
assets/nodeTemplates-95fa6GNi.js (removed) 9.35 kB 🟢 -9.35 kB 🟢 -3.28 kB 🟢 -2.88 kB
assets/nodeTemplates-xyazUmD_.js (new) 9.35 kB 🔴 +9.35 kB 🔴 +3.28 kB 🔴 +2.88 kB
assets/InviteMemberDialogContent-DP_8-lHr.js (new) 7.44 kB 🔴 +7.44 kB 🔴 +2.31 kB 🔴 +2.01 kB
assets/InviteMemberDialogContent-ydOwQRmo.js (removed) 7.44 kB 🟢 -7.44 kB 🟢 -2.31 kB 🟢 -2.02 kB
assets/WidgetWithControl-B51NH7ME.js (new) 7.08 kB 🔴 +7.08 kB 🔴 +2.65 kB 🔴 +2.36 kB
assets/WidgetWithControl-v_6nvlg8.js (removed) 7.08 kB 🟢 -7.08 kB 🟢 -2.65 kB 🟢 -2.36 kB
assets/MissingNodesFooter-BfAgzdoj.js (new) 6.75 kB 🔴 +6.75 kB 🔴 +2.3 kB 🔴 +2.04 kB
assets/MissingNodesFooter-ZcQw2OQN.js (removed) 6.75 kB 🟢 -6.75 kB 🟢 -2.3 kB 🟢 -2.05 kB
assets/Load3DConfiguration-icByCHNI.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/Load3DConfiguration-iXV-ymbs.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/MissingNodesContent-CLJ4k1uj.js (removed) 6.18 kB 🟢 -6.18 kB 🟢 -2.1 kB 🟢 -1.87 kB
assets/MissingNodesContent-DsCk_qXn.js (new) 6.18 kB 🔴 +6.18 kB 🔴 +2.1 kB 🔴 +1.86 kB
assets/CreateWorkspaceDialogContent-Dd3qfutP.js (new) 5.58 kB 🔴 +5.58 kB 🔴 +2.01 kB 🔴 +1.75 kB
assets/CreateWorkspaceDialogContent-DxUlD8XI.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -2.01 kB 🟢 -1.75 kB
assets/EditWorkspaceDialogContent-CTPpLDlJ.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.97 kB 🟢 -1.72 kB
assets/EditWorkspaceDialogContent-D2juV-Do.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.97 kB 🔴 +1.71 kB
assets/ValueControlPopover-CAjyKvet.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.79 kB 🔴 +1.6 kB
assets/ValueControlPopover-I8FlYoIn.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.79 kB 🟢 -1.6 kB
assets/Preview3d-BbdiU-65.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.59 kB 🟢 -1.39 kB
assets/Preview3d-DxnAyZqr.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.59 kB 🔴 +1.39 kB
assets/CancelSubscriptionDialogContent-DoXDoCkm.js (new) 4.85 kB 🔴 +4.85 kB 🔴 +1.8 kB 🔴 +1.58 kB
assets/CancelSubscriptionDialogContent-GeP5waU2.js (removed) 4.85 kB 🟢 -4.85 kB 🟢 -1.8 kB 🟢 -1.58 kB
assets/DeleteWorkspaceDialogContent-Bs910rhx.js (removed) 4.29 kB 🟢 -4.29 kB 🟢 -1.65 kB 🟢 -1.44 kB
assets/DeleteWorkspaceDialogContent-CmwSERy1.js (new) 4.29 kB 🔴 +4.29 kB 🔴 +1.66 kB 🔴 +1.44 kB
assets/LeaveWorkspaceDialogContent-IP3vkBb7.js (removed) 4.12 kB 🟢 -4.12 kB 🟢 -1.6 kB 🟢 -1.39 kB
assets/LeaveWorkspaceDialogContent-NdIAzuT2.js (new) 4.12 kB 🔴 +4.12 kB 🔴 +1.6 kB 🔴 +1.39 kB
assets/RemoveMemberDialogContent-8i_h0s0H.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.55 kB 🟢 -1.35 kB
assets/RemoveMemberDialogContent-CLrMOvfC.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.55 kB 🔴 +1.35 kB
assets/RevokeInviteDialogContent-BVRDjfgR.js (removed) 4.01 kB 🟢 -4.01 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/RevokeInviteDialogContent-Do-Xn-ZL.js (new) 4.01 kB 🔴 +4.01 kB 🔴 +1.56 kB 🔴 +1.37 kB
assets/InviteMemberUpsellDialogContent-BIxjTlM1.js (removed) 3.88 kB 🟢 -3.88 kB 🟢 -1.42 kB 🟢 -1.25 kB
assets/InviteMemberUpsellDialogContent-CUkyztO7.js (new) 3.88 kB 🔴 +3.88 kB 🔴 +1.43 kB 🔴 +1.25 kB
assets/saveMesh-BiwvEQ0V.js (removed) 3.43 kB 🟢 -3.43 kB 🟢 -1.48 kB 🟢 -1.33 kB
assets/saveMesh-Cxp-TTJz.js (new) 3.43 kB 🔴 +3.43 kB 🔴 +1.48 kB 🔴 +1.31 kB
assets/cloudSessionCookie-BO6ZDL4Z.js (new) 3.15 kB 🔴 +3.15 kB 🔴 +1.11 kB 🔴 +967 B
assets/cloudSessionCookie-SHoucsz1.js (removed) 3.15 kB 🟢 -3.15 kB 🟢 -1.11 kB 🟢 -993 B
assets/GlobalToast-BvCc6Q55.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/GlobalToast-Dj06SQmC.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.03 kB
assets/SubscribeToRun-Bz7g8SAX.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -895 B
assets/SubscribeToRun-CDdLWtzU.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +893 B
assets/CloudRunButtonWrapper-Dt2qIJl2.js (new) 1.72 kB 🔴 +1.72 kB 🔴 +807 B 🔴 +734 B
assets/CloudRunButtonWrapper-igqBGqFU.js (removed) 1.72 kB 🟢 -1.72 kB 🟢 -807 B 🟢 -717 B
assets/cloudBadges-BC5p89Qh.js (new) 1.42 kB 🔴 +1.42 kB 🔴 +732 B 🔴 +633 B
assets/cloudBadges-BpCZWrVj.js (removed) 1.42 kB 🟢 -1.42 kB 🟢 -728 B 🟢 -624 B
assets/cloudSubscription-ClTmdHbI.js (new) 1.38 kB 🔴 +1.38 kB 🔴 +682 B 🔴 +585 B
assets/cloudSubscription-D28QMdQm.js (removed) 1.38 kB 🟢 -1.38 kB 🟢 -682 B 🟢 -586 B
assets/Load3D-CaTysJbD.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +521 B 🔴 +465 B
assets/Load3D-CoLNxwGR.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -522 B 🟢 -464 B
assets/nightlyBadges-CCyk4g8j.js (removed) 1.05 kB 🟢 -1.05 kB 🟢 -560 B 🟢 -490 B
assets/nightlyBadges-DC9LSu5-.js (new) 1.05 kB 🔴 +1.05 kB 🔴 +558 B 🔴 +491 B
assets/Load3dViewerContent-22bOkHW7.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +491 B 🔴 +433 B
assets/Load3dViewerContent-BcgyHe83.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -493 B 🟢 -432 B
assets/SubscriptionPanelContentWorkspace-C7zrQ_ws.js (new) 979 B 🔴 +979 B 🔴 +457 B 🔴 +400 B
assets/SubscriptionPanelContentWorkspace-CibhSHC_.js (removed) 979 B 🟢 -979 B 🟢 -460 B 🟢 -404 B
assets/changeTracker-B63hrD1o.js (removed) 806 B 🟢 -806 B 🟢 -410 B 🟢 -354 B
assets/changeTracker-w1hIX9VD.js (new) 806 B 🔴 +806 B 🔴 +406 B 🔴 +357 B
assets/WidgetLegacy-B-6WkIsH.js (new) 794 B 🔴 +794 B 🔴 +408 B 🔴 +354 B
assets/WidgetLegacy-Ce1W9RRq.js (removed) 794 B 🟢 -794 B 🟢 -408 B 🟢 -352 B
assets/graphHasMissingNodes-BiEpCA8i.js (removed) 761 B 🟢 -761 B 🟢 -373 B 🟢 -319 B
assets/graphHasMissingNodes-OxQZRvdF.js (new) 761 B 🔴 +761 B 🔴 +373 B 🔴 +321 B
assets/WidgetInputNumber-BGrd1GYG.js (removed) 392 B 🟢 -392 B 🟢 -231 B 🟢 -198 B
assets/WidgetInputNumber-BS5pU18H.js (new) 392 B 🔴 +392 B 🔴 +232 B 🔴 +215 B
assets/AnimationControls-C2PN8K_8.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-DxP_ywVH.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-BTnZwrs2.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-D1Wkn_Pz.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-IINhk7dd.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-DAYiT6Xw.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BA_pLDIO.js 14.7 kB 14.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BhzDZEGT.js 15.7 kB 15.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BNvNJ49l.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BrjHW_IV.js 18.4 kB 18.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BuCfvdT4.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BumftKwc.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cq5uT6l1.js 16.6 kB 16.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CxH3xT8b.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D_Nd488H.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D1Ii1DEp.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-uLreJTDW.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-fZH7ZM7u.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-D7oDc9A5.js 495 kB 495 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-Dkin6cXj.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeContent-CNb288kC.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeFooter-D7x-tpBl.js 1.88 kB 1.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeHeader-LMkGR62F.js 1.08 kB 1.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B2rqO4ok.js 136 kB 136 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B7zbjYoC.js 154 kB 154 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Be3mUkOG.js 118 kB 118 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BHvPYFxt.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CL3WdXR2.js 118 kB 118 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CLfqZq3_.js 187 kB 187 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CUXerpeP.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D8_6_IyP.js 134 kB 134 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DiuZUyLe.js 167 kB 167 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-NSLXfI7X.js 138 kB 138 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-UlVmKY0W.js 141 kB 141 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-CHdzdEY0.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-aTfN9fO4.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-DwcJSZ5v.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-C7I_Nivi.js 2.23 kB 2.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingNodesHeader-BAZcszup.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictFooter-UR8--yb_.js 2.37 kB 2.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictHeader-Dw3rwJjr.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-3cab5KeM.js 415 kB 415 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-aLMm0gZm.js 362 kB 362 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BkRL-oJ_.js 454 kB 454 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BNE1oPUr.js 337 kB 337 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BXPcnYpT.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CD0BvEYx.js 370 kB 370 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CiYiQ6D5.js 416 kB 416 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DcpehiUU.js 340 kB 340 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DyWG6Iir.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-hyXgxlxY.js 384 kB 384 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-TCrvxtjI.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DEaITebJ.js 665 B 665 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-CdzHv1VF.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-B_w46prb.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-B-nteaB9.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src--CSlktKB.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-Db2yG1o2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-BhHc6T04.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-05_iDuzU.js 131 B 131 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-JezhrbLj.js 3.91 kB 3.91 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-B1i-QEjC.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-BUNId5TS.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-DhRGcwZO.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-CV8eZwv_.js 3.1 kB 3.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-Ww-Tpbsi.js 1.86 kB 1.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-CLaC3IDH.js 1.95 kB 1.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-CnTGrGUn.js 2.88 kB 2.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-Cd0O5LPR.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-bavVor9x.js 3.18 kB 3.18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-CYFSDGXH.js 2.5 kB 2.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-Cp8f93Pk.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 51 added / 52 removed

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: 2

🤖 Fix all issues with AI agents
In
`@src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenu.vue`:
- Around line 79-91: The gridTemplateColumns property in the computed gridStyle
is redundant because VirtualGrid's mergedGridStyle will override it with
repeat(${maxColumns}, minmax(0, 1fr)) when maxColumns is finite (which it always
is here), so remove the gridTemplateColumns key from the gridStyle computed
object (leave display, gap, padding, width intact) to avoid dead code; reference
the gridStyle computed, layoutMode.value conditions, and the
VirtualGrid/mergedGridStyle behavior when making the change.
- Line 30: Replace the non-destructured props assignment const props =
defineProps<Props>() with reactive destructuring so the component accesses props
directly (e.g., const { items, ... } = defineProps<Props>()), then update usages
(notably where items is referenced around the template and the code at the
former line 95) to use items directly; ensure you keep the Props type on
defineProps and preserve reactivity by using the direct destructuring pattern
recommended by the guidelines.

@coderabbitai coderabbitai bot requested a review from DrJKL January 30, 2026 08:18
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: 3

🤖 Fix all issues with AI agents
In `@src/components/common/VirtualGrid.test.ts`:
- Around line 74-79: The test currently skips all assertions when
receivedIndices is empty which masks failures; update the assertion around the
receivedIndices checks in VirtualGrid.test (the block using receivedIndices and
the for loop) to explicitly assert that receivedIndices.length > 0 (e.g.,
expect(receivedIndices.length).toBeGreaterThan(0)) before asserting the first
index and the incremental sequence, and keep the existing loop that verifies
receivedIndices[i] === receivedIndices[i-1] + 1 so the test fails if no items
render or indices are non-sequential.
- Around line 84-101: The test "respects maxColumns prop" in VirtualGrid.test.ts
currently only checks for a grid element but doesn't assert that maxColumns: 2
influences layout; update the test that mounts VirtualGrid<TestItem> to read the
rendered element's computed style (or the element.style.gridTemplateColumns) and
assert it contains exactly two column tracks (e.g., two "px" or "fr" entries or
matches a regex for two columns), referencing the mounted wrapper and the grid
element found via wrapper.find(...) and using
getComputedStyle(gridElement.element).gridTemplateColumns (or
gridElement.element.style.gridTemplateColumns) to verify the maxColumns behavior
before calling wrapper.unmount().

In `@src/components/common/VirtualGrid.vue`:
- Around line 60-62: Remove the explicit defineSlots call (defineSlots<{ item:
(props: { item: T & { key: string }; index: number }) => unknown }>() ) from
VirtualGrid.vue; instead rely on the template-declared slot (the "item" slot
already defined at line 14) for slot typing per the coding guideline, so delete
the defineSlots invocation and ensure any TypeScript generics or props
referenced in the template stay intact to preserve type inference for the item
slot.

@christian-byrne
Copy link
Contributor Author

christian-byrne commented Jan 30, 2026

There's some issues right now like the grid not being properly truncated.

To confirm: bottleneck is the DOM insertion

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: 0

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/form/dropdown/FormDropdownMenu.vue (1)

83-84: ⚠️ Potential issue | 🟠 Major

Container needs fixed height for proper virtualization.

The PR objectives mention changing from max-h-[640px] to h-[640px], but the current code still uses max-h-[640px]. This likely explains the truncation issue you reported—VirtualGrid needs a deterministic container height to calculate the visible range correctly. With max-h, the container can shrink based on content, causing virtualization miscalculations.

🐛 Proposed fix
   <div
-    class="flex max-h-[640px] w-103 flex-col rounded-lg bg-component-node-background pt-4 outline outline-offset-[-1px] outline-node-component-border"
+    class="flex h-[640px] w-103 flex-col rounded-lg bg-component-node-background pt-4 outline outline-offset-[-1px] outline-node-component-border"
   >

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: 2

🤖 Fix all issues with AI agents
In `@src/components/common/VirtualGrid.test.ts`:
- Around line 23-46: The test can pass with zero rendered items and mask
regressions; after mounting VirtualGrid (in VirtualGrid.test.ts) and computing
renderedItems via wrapper.findAll('.test-item'), add an assertion that at least
one item is rendered (e.g., expect(renderedItems.length).toBeGreaterThan(0))
before the existing virtualization assertion that renderedItems.length is less
than items.length; update references around createItems, wrapper and
renderedItems so the test fails if nothing is rendered.

In `@src/components/common/VirtualGrid.vue`:
- Around line 9-15: The slot binding in VirtualGrid.vue uses an explicit prop
binding for item; update the <slot name="item" ...> usage to use the same-name
shorthand for the item prop (replace :item="item" with :item) while leaving the
other prop (:index="state.start + i") unchanged so it follows the repo's
slot-binding convention and matches existing styling in the component rendering
loop.

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

🤖 Fix all issues with AI agents
In `@src/components/common/VirtualGrid.test.ts`:
- Around line 134-151: The test "renders empty when no items provided" mounts a
wrapper but never unmounts it, which can leak DOM state; add a call to
wrapper.unmount() at the end of this test (after the expect) to tear down the
mounted component instance, or alternatively introduce a scoped variable and an
afterEach(() => wrapper?.unmount()) cleanup; reference the wrapper variable and
the test name "renders empty when no items provided" to locate where to add
wrapper.unmount().

Comment on lines 112 to 135
@@ -97,7 +131,7 @@ const searchQuery = defineModel<string>('searchQuery')
:layout="layoutMode"
@click="emit('item-click', item, index)"
/>
</div>
</div>
</template>
</VirtualGrid>
Copy link
Collaborator

@LittleSound LittleSound Feb 3, 2026

Choose a reason for hiding this comment

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

The tooltip for the file name was not displaying properly when scrolling to the bottom, and I've fixed it.

  • Fixes a VirtualGrid edge-case where grid gap wasn’t included in the measured row/column step,
    causing scrollTop to jitter near the bottom (e.g. 429.5 ↔ 429) and breaking PrimeVue tooltips
    (they auto-hide on scroll).
  • Now measures the actual grid step via offsetTop/offsetLeft and computes spacer heights by whole
    rows for stable layout.
  • Adds a unit test to lock in “row step includes gap” behavior and prevent regressions.

@dosubot dosubot bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Feb 3, 2026
LittleSound
LittleSound previously approved these changes Feb 3, 2026
@LittleSound LittleSound removed their assignment Feb 3, 2026
LittleSound
LittleSound previously approved these changes Feb 3, 2026
LittleSound
LittleSound previously approved these changes Feb 3, 2026
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Feb 4, 2026
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: 0

Caution

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

⚠️ Outside diff range comments (1)
src/components/common/VirtualGrid.vue (1)

104-113: ⚠️ Potential issue | 🟠 Major

Spacer height undercounts partial rows, which can truncate scroll range.

rowsToHeight(itemsCount) divides by cols, so any remaining items that don’t fill a full row only contribute a fractional height. In a CSS grid, a partially filled row still consumes a full row height, so the bottom spacer becomes too short and items near the end can become unreachable. This matches the “truncation” symptoms noted in the PR discussion.

🛠️ Suggested fix
-function rowsToHeight(rows: number): string {
-  return `${(rows / cols.value) * itemHeight.value}px`
-}
+function rowsToHeight(itemsCount: number): string {
+  const rows = Math.ceil(itemsCount / cols.value)
+  return `${rows * itemHeight.value}px`
+}
🧹 Nitpick comments (1)
src/components/common/VirtualGrid.test.ts (1)

9-23: Avoid module-level mutable refs in the vueuse mock.

mockedWidth/Height/ScrollY are mutated across tests at module scope, which can leak state between cases. Use vi.hoisted() to define them for the mock and reset in beforeEach to keep tests isolated.

♻️ Suggested pattern
-import { describe, expect, it, vi } from 'vitest'
+import { beforeEach, describe, expect, it, vi } from 'vitest'
 import { nextTick, ref } from 'vue'
 
-const mockedWidth = ref(400)
-const mockedHeight = ref(200)
-const mockedScrollY = ref(0)
+const { mockedWidth, mockedHeight, mockedScrollY } = vi.hoisted(() => ({
+  mockedWidth: ref(400),
+  mockedHeight: ref(200),
+  mockedScrollY: ref(0)
+}))
+
+beforeEach(() => {
+  mockedWidth.value = 400
+  mockedHeight.value = 200
+  mockedScrollY.value = 0
+})

Based on learnings: "Keep module mocks contained; do not use global mutable state within test files; use vi.hoisted() if necessary for per-test Arrange phase manipulation".

@dosubot dosubot bot added size:XXL This PR changes 1000+ lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Feb 14, 2026
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

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/widgets/components/form/dropdown/FormDropdown.vue (1)

144-144: ⚠️ Potential issue | 🟡 Minor

Use i18n for user-facing toast message.

The hardcoded string "Maximum selection limit reached" should use vue-i18n for localization.

🌐 Proposed fix
-      toastStore.addAlert(`Maximum selection limit reached`)
+      toastStore.addAlert(t('widgets.dropdown.maxSelectionReached'))

Add to src/locales/en/main.json:

{
  "widgets": {
    "dropdown": {
      "maxSelectionReached": "Maximum selection limit reached"
    }
  }
}

As per coding guidelines: "Use vue-i18n for ALL user-facing strings"

src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue (1)

355-358: ⚠️ Potential issue | 🟡 Minor

Use i18n for error messages.

The hardcoded error strings should use vue-i18n for localization.

🌐 Proposed fix
     if (uploadedPaths.length === 0) {
-      toastStore.addAlert('File upload failed')
+      toastStore.addAlert(t('widgets.uploadSelect.uploadFailed'))
       return
     }

And at line 380:

   } catch (error) {
     console.error('Upload error:', error)
-    toastStore.addAlert(`Upload failed: ${error}`)
+    toastStore.addAlert(t('widgets.uploadSelect.uploadError', { error: String(error) }))
   }

As per coding guidelines: "Use vue-i18n for ALL user-facing strings"

🤖 Fix all issues with AI agents
In
`@src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue`:
- Around line 77-81: The array of filter options in WidgetSelectDropdown.vue
currently uses hardcoded labels ("All", "Inputs", "Outputs"); replace those with
vue-i18n translations (e.g., use this.$t('widget.filter.all'),
this.$t('widget.filter.inputs'), this.$t('widget.filter.outputs') or use the
composition API useI18n().t('...') if the component uses setup) and add
corresponding keys ("widget.filter.all", "widget.filter.inputs",
"widget.filter.outputs") to the locale message files; keep the option ids
('all','inputs','outputs') unchanged so existing logic consuming them still
works.
🧹 Nitpick comments (1)
src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownInput.vue (1)

48-51: Avoid using !important prefix in Tailwind classes.

Line 49 uses !outline-zinc-300/10 which violates the coding guideline to never use !important or the ! important prefix for Tailwind classes. Find and correct the interfering existing class instead.

As per coding guidelines: "Never use !important or the ! important prefix for Tailwind classes; instead find and correct interfering existing !important classes"

Comment on lines 77 to 81
return [
{ name: 'All', value: 'all' },
{ name: 'Inputs', value: 'inputs' },
{ name: 'Outputs', value: 'outputs' }
{ id: 'all', name: 'All' },
{ id: 'inputs', name: 'Inputs' },
{ id: 'outputs', name: 'Outputs' }
]
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Use i18n for filter option labels.

The hardcoded strings "All", "Inputs", "Outputs" should use vue-i18n for localization.

🌐 Proposed fix
   return [
-    { id: 'all', name: 'All' },
-    { id: 'inputs', name: 'Inputs' },
-    { id: 'outputs', name: 'Outputs' }
+    { id: 'all', name: t('g.all') },
+    { id: 'inputs', name: t('widgets.uploadSelect.inputs') },
+    { id: 'outputs', name: t('widgets.uploadSelect.outputs') }
   ]

As per coding guidelines: "Use vue-i18n for ALL user-facing strings"

🤖 Prompt for AI Agents
In `@src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue`
around lines 77 - 81, The array of filter options in WidgetSelectDropdown.vue
currently uses hardcoded labels ("All", "Inputs", "Outputs"); replace those with
vue-i18n translations (e.g., use this.$t('widget.filter.all'),
this.$t('widget.filter.inputs'), this.$t('widget.filter.outputs') or use the
composition API useI18n().t('...') if the component uses setup) and add
corresponding keys ("widget.filter.all", "widget.filter.inputs",
"widget.filter.outputs") to the locale message files; keep the option ids
('all','inputs','outputs') unchanged so existing logic consuming them still
works.

- Integrate VirtualGrid into FormDropdownMenu for virtualized rendering
- Fix jitter: overflow-anchor:none, scrollbar-gutter:stable, cols=maxColumns when finite
- Remove transition-[width] from grid items, replace transition-all with explicit properties
- Replace LazyImage with native img (redundant with virtualization)
- Change max-h-[640px] to fixed h-[640px] for proper virtualization
- Add unit tests for VirtualGrid and FormDropdownMenu
- Add E2E test for image dropdown virtualization

Amp-Thread-ID: https://ampcode.com/threads/T-019c5a71-66c8-76e9-95ed-671a1b4538da
@christian-byrne christian-byrne force-pushed the perf/image-dropdown-assets-perf branch from d162c9d to b54b862 Compare February 14, 2026 04:58
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:XXL This PR changes 1000+ lines, ignoring generated files. labels Feb 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:widgets perf:speed size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants