Skip to content

Conversation

@AustinMroz
Copy link
Collaborator

@AustinMroz AustinMroz commented Feb 4, 2026

  • "Enter Subgraph" "Show advanced inputs" and a new "show node Errors" button now use a combined button design at the bottom of the node.
  • A new "Errors" tab is added to the right side panel
  • After a failed queue, the label of an invalid widget is now red.
  • Badges other than price are now displayed on the bottom of the node.
  • Price badge will now truncate from the first space, prioritizing the sizing of the node title
  • An indicator for the node resize handle is now displayed while mousing over the node.
image

resize

@AustinMroz AustinMroz requested review from a team as code owners February 4, 2026 04:26
@dosubot dosubot bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Feb 4, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 4, 2026

📝 Walkthrough

Walkthrough

Aggregates execution-store errors for selected nodes and surfaces them as an Error tab in the right-side panel (new TabError component with copy-to-clipboard). Propagates per-widget/slot error flags, adds badge partitioning/composition (usePartitionedBadges + NodeBadges), and updates node/header UI and related tests.

Changes

Cohort / File(s) Summary
Right-side panel / Error UI
src/components/rightSidePanel/RightSidePanel.vue, src/components/rightSidePanel/TabError.vue, src/stores/workspace/rightSidePanelStore.ts
Adds execution-store aggregation of selected-node errors, exposes selectedNodeErrors, extends tabs with 'error', conditionally shows an Error tab and renders new TabError.vue (includes copy-to-clipboard).
Widget & slot error propagation
src/renderer/extensions/vueNodes/components/InputSlot.vue, src/renderer/extensions/vueNodes/components/NodeWidgets.vue
Introduces hasError prop on InputSlot; NodeWidgets computes per-widget hasError from executionStore and passes it down for styling and conditional classes.
Badge partitioning & rendering
src/renderer/extensions/vueNodes/composables/usePartitionedBadges.ts, src/renderer/extensions/vueNodes/components/NodeBadges.vue
Adds usePartitionedBadges composable to derive core/extension/pricing badge groups and a hasComfyBadge flag; adds NodeBadges.vue to render partitioned badges with separators.
Node UI & header updates
src/renderer/extensions/vueNodes/components/LGraphNode.vue, src/renderer/extensions/vueNodes/components/NodeHeader.vue
Integrates partitioned badges into node UI, updates styling, resize handle and error-border behavior, removes subgraph-enter plumbing, and changes NodeHeader to accept priceBadges.
Pricing helper change
src/composables/node/usePriceBadge.ts
Adds exported isCreditsBadge method and relaxes its badge parameter to accept `Partial
Types, tests & processed widgets
src/renderer/extensions/vueNodes/components/NodeWidgets.vue, src/renderer/extensions/vueNodes/components/LGraphNode.subgraph.test.ts
ProcessedWidget now includes hasError and explicit runtime fields; tests updated to mount LGraphNode, adjust typings/mocks and remove subgraph-focused assertions.
Localization
src/locales/en/main.json
Adds g.enterSubgraph translation entry.

Sequence Diagram(s)

sequenceDiagram
    participant Node as LGraphNode
    participant Store as ExecutionStore
    participant Panel as RightSidePanel
    participant Tab as TabError

    Node->>Store: emit/update node runtime errors
    Store-->>Panel: executionStore.getNodeErrors(selectedNodes)
    Panel->>Panel: compute selectedNodeErrors (aggregate)
    alt selectedNodeErrors non-empty
        Panel->>Panel: append 'error' tab if missing
        Panel->>Panel: set/validate active tab (may switch to 'error')
        Panel->>Tab: render TabError with selectedNodeErrors
        Tab->>Tab: display errors and provide copy-to-clipboard
    else no errors
        Panel->>Panel: ensure active tab valid (fallback to first tab)
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Suggested labels

size:XXL

Suggested reviewers

  • christian-byrne
  • comfyui-wiki
  • DrJKL
  • shinshin86
  • KarryCharon

Poem

🐇
I sorted badges, nudged each glowing dot,
Gathered errors from the store they brought,
A tab to show the things that slipped,
A copy click saved them — neatly clipped,
Hoppity-hop, the patch is sought!

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
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.
Description check ❓ Inconclusive The PR description provides specific bullet points about UI changes but lacks structured sections matching the template (Summary, Changes, Review Focus). Restructure the description to match the template: add a concise summary sentence, organize changes under 'What' and 'Breaking', and add a Review Focus section highlighting design decisions or edge cases.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title 'New bottom button and badges' accurately captures the main changes: a new button design at the bottom of nodes and badges displayed there.

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

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch austin/node-bottom-button

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

❤️ Share

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

@github-actions
Copy link

github-actions bot commented Feb 4, 2026

🎭 Playwright Tests: ⚠️ Passed with flaky tests

Results: 509 passed, 0 failed, 1 flaky, 8 skipped (Total: 518)

❌ Failed Tests

📊 Browser Reports
  • chromium: View Report (✅ 497 / ❌ 0 / ⚠️ 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 Feb 4, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/05/2026, 03:07:31 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Feb 4, 2026

Bundle Size Report

Summary

  • Raw size: 20.2 MB baseline 20.2 MB — 🔴 +6.6 kB
  • Gzip: 4.32 MB baseline 4.32 MB — 🔴 +1.74 kB
  • Brotli: 3.34 MB baseline 3.34 MB — 🔴 +1.63 kB
  • Bundles: 234 current • 233 baseline • 204 added / 203 removed

Category Glance
Graph Workspace 🔴 +19 kB (859 kB) · Data & Services 🟢 -14.1 kB (2.08 MB) · Other 🔴 +1.46 kB (7.08 MB) · Panels & Settings 🔴 +150 B (410 kB) · Utilities & Hooks 🔴 +44 B (234 kB) · App Entry Points 🔴 +32 B (22.5 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BgAJMgum.js (new) 22.5 kB 🔴 +22.5 kB 🔴 +7.2 kB 🔴 +6.28 kB
assets/index-ox6wp2rw.js (removed) 22.5 kB 🟢 -22.5 kB 🟢 -7.18 kB 🟢 -6.26 kB

Status: 1 added / 1 removed

Graph Workspace — 859 kB (baseline 840 kB) • 🔴 +19 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CvFiqp6I.js (new) 859 kB 🔴 +859 kB 🔴 +185 kB 🔴 +141 kB
assets/GraphView-JRwAYye5.js (removed) 840 kB 🟢 -840 kB 🟢 -180 kB 🟢 -137 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CRLmjo9o.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -3.46 kB 🟢 -2.94 kB
assets/CloudSurveyView-uteMGEv1.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +3.46 kB 🔴 +2.95 kB
assets/CloudLoginView-1cMCsxAT.js (removed) 10 kB 🟢 -10 kB 🟢 -2.93 kB 🟢 -2.56 kB
assets/CloudLoginView-BrO6kSa8.js (new) 10 kB 🔴 +10 kB 🔴 +2.93 kB 🔴 +2.57 kB
assets/UserCheckView-n6ae9YcB.js (new) 8.39 kB 🔴 +8.39 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/UserCheckView-zR4wcS2c.js (removed) 8.39 kB 🟢 -8.39 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/CloudSignupView-C6fQhj7u.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.31 kB 🔴 +2.02 kB
assets/CloudSignupView-Cd93En5u.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.31 kB 🟢 -2.01 kB
assets/CloudLayoutView-BT1hLX-W.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.12 kB 🟢 -1.83 kB
assets/CloudLayoutView-CGzyiJRX.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.11 kB 🔴 +1.83 kB
assets/CloudForgotPasswordView-BspWkDJb.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.94 kB 🔴 +1.7 kB
assets/CloudForgotPasswordView-VKqTq_jg.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.93 kB 🟢 -1.71 kB
assets/CloudAuthTimeoutView-BikS_ms6.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/CloudAuthTimeoutView-Djumg9DG.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CloudSubscriptionRedirectView-BqaBzMBt.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.77 kB 🔴 +1.57 kB
assets/CloudSubscriptionRedirectView-DWaXkgmN.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.77 kB 🟢 -1.57 kB
assets/UserSelectView-Dw8c4rZ4.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.63 kB 🟢 -1.46 kB
assets/UserSelectView-JcryT_rx.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/CloudSorryContactSupportView-BGk_kmuy.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +538 B 🔴 +461 B
assets/CloudSorryContactSupportView-BPXBOTez.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -539 B 🟢 -464 B
assets/layout-DQyvT9ce.js (new) 296 B 🔴 +296 B 🔴 +223 B 🔴 +185 B
assets/layout-ncetNFDR.js (removed) 296 B 🟢 -296 B 🟢 -222 B 🟢 -186 B

Status: 11 added / 11 removed

Panels & Settings — 410 kB (baseline 410 kB) • 🔴 +150 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settings-BmEXiKRV.js (removed) 32 kB 🟢 -32 kB 🟢 -8.08 kB 🟢 -6.63 kB
assets/settings-DhiOd5RJ.js (new) 32 kB 🔴 +32 kB 🔴 +8.08 kB 🔴 +6.63 kB
assets/settings-CKCscONF.js (removed) 28.1 kB 🟢 -28.1 kB 🟢 -7.15 kB 🟢 -6.03 kB
assets/settings-CODNY0jQ.js (new) 28.1 kB 🔴 +28.1 kB 🔴 +7.15 kB 🔴 +6.02 kB
assets/WorkspacePanel-BiKlpiNp.js (new) 27 kB 🔴 +27 kB 🔴 +5.67 kB 🔴 +5 kB
assets/WorkspacePanel-DthiAUZ4.js (removed) 26.9 kB 🟢 -26.9 kB 🟢 -5.66 kB 🟢 -4.98 kB
assets/settings-D95NIw0v.js (removed) 26.8 kB 🟢 -26.8 kB 🟢 -7 kB 🟢 -5.67 kB
assets/settings-or3Z5VB2.js (new) 26.8 kB 🔴 +26.8 kB 🔴 +7 kB 🔴 +5.67 kB
assets/settings-Dn-91ECq.js (new) 25.7 kB 🔴 +25.7 kB 🔴 +7.28 kB 🔴 +6.1 kB
assets/settings-DQe4OZm2.js (removed) 25.7 kB 🟢 -25.7 kB 🟢 -7.28 kB 🟢 -6.1 kB
assets/settings-BfPS1ep1.js (new) 25 kB 🔴 +25 kB 🔴 +6.99 kB 🔴 +6.11 kB
assets/settings-BgcR6REE.js (removed) 25 kB 🟢 -25 kB 🟢 -6.99 kB 🟢 -6.11 kB
assets/settings-DmYc-PH9.js (removed) 24.2 kB 🟢 -24.2 kB 🟢 -6.75 kB 🟢 -5.74 kB
assets/settings-ihHLHLTG.js (new) 24.2 kB 🔴 +24.2 kB 🔴 +6.75 kB 🔴 +5.75 kB
assets/settings-BNs5rnMt.js (removed) 24.1 kB 🟢 -24.1 kB 🟢 -6.88 kB 🟢 -6.02 kB
assets/settings-BzHHkkP7.js (new) 24.1 kB 🔴 +24.1 kB 🔴 +6.88 kB 🔴 +6.02 kB
assets/settings-C5jqELHS.js (removed) 23.6 kB 🟢 -23.6 kB 🟢 -6.64 kB 🟢 -5.8 kB
assets/settings-j1bEePMm.js (new) 23.6 kB 🔴 +23.6 kB 🔴 +6.64 kB 🔴 +5.8 kB
assets/settings-f2yAwEpW.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -7 kB 🟢 -5.81 kB
assets/settings-ymEyMAEd.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +7 kB 🔴 +5.81 kB
assets/SecretsPanel-CvzwaHHC.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.31 kB 🔴 +4.65 kB
assets/SecretsPanel-nabGFVlQ.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.31 kB 🟢 -4.65 kB
assets/LegacyCreditsPanel-CNbEaVjk.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +5.63 kB 🔴 +4.94 kB
assets/settings-CzcL_U24.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -6.85 kB 🟢 -5.49 kB
assets/settings-Dm3Qx17Q.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +6.85 kB 🔴 +5.49 kB
assets/LegacyCreditsPanel-D25v5gWi.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -5.62 kB 🟢 -4.93 kB
assets/settings-DHh_y6Nd.js (new) 20.3 kB 🔴 +20.3 kB 🔴 +6.62 kB 🔴 +5.16 kB
assets/settings-Dxocpd_-.js (removed) 20.3 kB 🟢 -20.3 kB 🟢 -6.62 kB 🟢 -5.16 kB
assets/SubscriptionPanel-BUA69dVf.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +4.78 kB 🔴 +4.23 kB
assets/SubscriptionPanel-HslsPRHX.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -4.76 kB 🟢 -4.21 kB
assets/KeybindingPanel-DH89yFV7.js (removed) 12.6 kB 🟢 -12.6 kB 🟢 -3.62 kB 🟢 -3.21 kB
assets/KeybindingPanel-Y4vZX89o.js (new) 12.6 kB 🔴 +12.6 kB 🔴 +3.62 kB 🔴 +3.2 kB
assets/ExtensionPanel-BkJUwkOd.js (removed) 9.49 kB 🟢 -9.49 kB 🟢 -2.69 kB 🟢 -2.39 kB
assets/ExtensionPanel-E2wAmhZP.js (new) 9.49 kB 🔴 +9.49 kB 🔴 +2.69 kB 🔴 +2.38 kB
assets/AboutPanel-BXoDnX2b.js (new) 8.62 kB 🔴 +8.62 kB 🔴 +2.46 kB 🔴 +2.21 kB
assets/AboutPanel-E4I9276K.js (removed) 8.62 kB 🟢 -8.62 kB 🟢 -2.46 kB 🟢 -2.21 kB
assets/ServerConfigPanel-7yiJPk08.js (removed) 6.64 kB 🟢 -6.64 kB 🟢 -2.15 kB 🟢 -1.92 kB
assets/ServerConfigPanel-c8AO0db1.js (new) 6.64 kB 🔴 +6.64 kB 🔴 +2.16 kB 🔴 +1.93 kB
assets/UserPanel-4PinnRp8.js (new) 6.28 kB 🔴 +6.28 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/UserPanel-DL8AYtaG.js (removed) 6.28 kB 🟢 -6.28 kB 🟢 -2.02 kB 🟢 -1.77 kB
assets/cloudRemoteConfig-Ci17SJcM.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -700 B 🟢 -607 B
assets/cloudRemoteConfig-D-4kET47.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +698 B 🔴 +607 B
assets/refreshRemoteConfig-DlUEzasc.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -512 B 🟢 -439 B
assets/refreshRemoteConfig-rn6GqDt5.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +511 B 🔴 +447 B
assets/config-CO8TaJRX.js (new) 1.01 kB 🔴 +1.01 kB 🔴 +549 B 🔴 +445 B
assets/config-HAvaVehF.js (removed) 1.01 kB 🟢 -1.01 kB 🟢 -549 B 🟢 -445 B
assets/refreshRemoteConfig-CsE3TS2L.js (removed) 345 B 🟢 -345 B 🟢 -205 B 🟢 -206 B
assets/refreshRemoteConfig-DLrIPXL3.js (new) 345 B 🔴 +345 B 🔴 +201 B 🔴 +184 B
assets/remoteConfig-CUBB_j_I.js 581 B 581 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 24 added / 24 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-CW3SzJ-q.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +993 B
assets/auth-XriQ5P2h.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -990 B
assets/SignUpForm-BoTpchLD.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/SignUpForm-DKoqH7RI.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.24 kB 🟢 -1.1 kB
assets/UpdatePasswordContent-CbuCPvU7.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -947 B
assets/UpdatePasswordContent-CxOBH-L_.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +941 B
assets/WorkspaceProfilePic-B0BztYjc.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -819 B 🟢 -729 B
assets/WorkspaceProfilePic-CD0JjtQG.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +820 B 🔴 +741 B
assets/firebaseAuthStore-C_bifX3R.js (removed) 790 B 🟢 -790 B 🟢 -388 B 🟢 -345 B
assets/firebaseAuthStore-w9jllidu.js (new) 790 B 🔴 +790 B 🔴 +392 B 🔴 +353 B
assets/auth-B4p-DL3B.js (removed) 347 B 🟢 -347 B 🟢 -222 B 🟢 -193 B
assets/auth-DiKXz4Ls.js (new) 347 B 🔴 +347 B 🔴 +221 B 🔴 +210 B
assets/PasswordFields-BAi3GPM-.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-BBA9r_v_.js (new) 2.68 kB 🔴 +2.68 kB 🔴 +1.32 kB 🔴 +1.17 kB
assets/useSubscriptionDialog-Dxj9f14F.js (removed) 2.68 kB 🟢 -2.68 kB 🟢 -1.32 kB 🟢 -1.17 kB
assets/useSubscriptionDialog-DQ3q1ex7.js (new) 783 B 🔴 +783 B 🔴 +389 B 🔴 +345 B
assets/useSubscriptionDialog-DzT5O2pN.js (removed) 783 B 🟢 -783 B 🟢 -389 B 🟢 -344 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-BXK4bLmR.js (removed) 9.9 kB 🟢 -9.9 kB 🟢 -3.4 kB 🟢 -3 kB
assets/useTerminalTabs-n_wjFuAC.js (new) 9.9 kB 🔴 +9.9 kB 🔴 +3.4 kB 🔴 +3 kB
assets/TopbarBadge-BsZTG314.js (removed) 7.52 kB 🟢 -7.52 kB 🟢 -1.82 kB 🟢 -1.6 kB
assets/TopbarBadge-C9aRWkee.js (new) 7.52 kB 🔴 +7.52 kB 🔴 +1.82 kB 🔴 +1.6 kB
assets/ComfyQueueButton-CvjHWQUq.js (new) 7.13 kB 🔴 +7.13 kB 🔴 +2.31 kB 🔴 +2.06 kB
assets/ComfyQueueButton-DlpNHqdU.js (removed) 7.13 kB 🟢 -7.13 kB 🟢 -2.31 kB 🟢 -2.06 kB
assets/SubscribeButton-DmFQPbu6.js (removed) 3.68 kB 🟢 -3.68 kB 🟢 -1.38 kB 🟢 -1.24 kB
assets/SubscribeButton-rx6t-Vse.js (new) 3.68 kB 🔴 +3.68 kB 🔴 +1.38 kB 🔴 +1.21 kB
assets/Button-ChqYCdrL.js (removed) 3 kB 🟢 -3 kB 🟢 -1.21 kB 🟢 -1.08 kB
assets/Button-DoaPA8dW.js (new) 3 kB 🔴 +3 kB 🔴 +1.21 kB 🔴 +1.08 kB
assets/WidgetButton-csS143KA.js (new) 1.84 kB 🔴 +1.84 kB 🔴 +878 B 🔴 +773 B
assets/WidgetButton-DVfWCi_V.js (removed) 1.84 kB 🟢 -1.84 kB 🟢 -877 B 🟢 -776 B
assets/cloudFeedbackTopbarButton-BVwPvVGs.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -856 B 🟢 -767 B
assets/cloudFeedbackTopbarButton-CPd2QUpt.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +858 B 🔴 +755 B
assets/CloudBadge-B6K_uTlw.js (new) 1.2 kB 🔴 +1.2 kB 🔴 +591 B 🔴 +510 B
assets/CloudBadge-V9dvGAv0.js (removed) 1.2 kB 🟢 -1.2 kB 🟢 -591 B 🟢 -510 B
assets/UserAvatar-CsFFUO90.js (new) 1.17 kB 🔴 +1.17 kB 🔴 +620 B 🔴 +571 B
assets/UserAvatar-Dtdiv1Hu.js (removed) 1.17 kB 🟢 -1.17 kB 🟢 -619 B 🟢 -528 B
assets/ComfyQueueButton-B3cXw2m0.js (removed) 795 B 🟢 -795 B 🟢 -395 B 🟢 -353 B
assets/ComfyQueueButton-DEuymV_o.js (new) 795 B 🔴 +795 B 🔴 +397 B 🔴 +354 B

Status: 10 added / 10 removed

Data & Services — 2.08 MB (baseline 2.1 MB) • 🟢 -14.1 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-OTFIcA7w.js (removed) 1.3 MB 🟢 -1.3 MB 🟢 -298 kB 🟢 -232 kB
assets/dialogService-4fUVIEKx.js (new) 1.29 MB 🔴 +1.29 MB 🔴 +295 kB 🔴 +229 kB
assets/api-Ba79_VkR.js (new) 640 kB 🔴 +640 kB 🔴 +144 kB 🔴 +115 kB
assets/api-D8zy9gqe.js (removed) 640 kB 🟢 -640 kB 🟢 -144 kB 🟢 -116 kB
assets/load3dService-EoYdV5jf.js (removed) 91.1 kB 🟢 -91.1 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/load3dService-S3GJW8Kq.js (new) 91.1 kB 🔴 +91.1 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/teamWorkspaceStore-Cln7Q6h2.js (new) 27.1 kB 🔴 +27.1 kB 🔴 +6.12 kB 🔴 +5.41 kB
assets/teamWorkspaceStore-q6Pcd88s.js (removed) 27.1 kB 🟢 -27.1 kB 🟢 -6.12 kB 🟢 -5.41 kB
assets/systemStatsStore-DOkix9Fe.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -4.29 kB 🟢 -3.77 kB
assets/systemStatsStore-Zm6ba4ig.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +4.29 kB 🔴 +3.77 kB
assets/releaseStore-CHqmjQGj.js (new) 8.14 kB 🔴 +8.14 kB 🔴 +2.24 kB 🔴 +1.98 kB
assets/releaseStore-DPOpzHeT.js (removed) 8.14 kB 🟢 -8.14 kB 🟢 -2.24 kB 🟢 -1.97 kB
assets/keybindingService-BXchYDjn.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/keybindingService-DpaasloX.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.71 kB 🟢 -1.47 kB
assets/dialogStore-D2gUGUn6.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.24 kB 🟢 -1.1 kB
assets/dialogStore-DFMIMpEZ.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.24 kB 🔴 +1.1 kB
assets/serverConfigStore-3Fx4b3JX.js (new) 2.32 kB 🔴 +2.32 kB 🔴 +791 B 🔴 +691 B
assets/serverConfigStore-DB58Z5s2.js (removed) 2.32 kB 🟢 -2.32 kB 🟢 -791 B 🟢 -690 B
assets/bootstrapStore-CEA-1LJF.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +883 B 🔴 +811 B
assets/bootstrapStore-H67gVBUB.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -883 B 🟢 -802 B
assets/userStore-Dz8Xidgt.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -719 B 🟢 -679 B
assets/userStore-itagmJti.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +718 B 🔴 +633 B
assets/audioService-C33z0306.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +848 B 🔴 +730 B
assets/audioService-CCv3_SSy.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -846 B 🟢 -725 B
assets/releaseStore-C7vc_aJu.js (new) 762 B 🔴 +762 B 🔴 +388 B 🔴 +336 B
assets/releaseStore-TCggnHul.js (removed) 762 B 🟢 -762 B 🟢 -386 B 🟢 -336 B

Status: 13 added / 13 removed

Utilities & Hooks — 234 kB (baseline 234 kB) • 🔴 +44 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-GziQoRNt.js (new) 177 kB 🔴 +177 kB 🔴 +38.9 kB 🔴 +32.4 kB
assets/useConflictDetection-uwUFlbVH.js (removed) 177 kB 🟢 -177 kB 🟢 -38.9 kB 🟢 -32.3 kB
assets/useLoad3d-By1xZynB.js (new) 14.4 kB 🔴 +14.4 kB 🔴 +3.56 kB 🔴 +3.14 kB
assets/useLoad3d-Ce6GeQ1N.js (removed) 14.4 kB 🟢 -14.4 kB 🟢 -3.56 kB 🟢 -3.14 kB
assets/useLoad3dViewer-Dok6eODK.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.16 kB 🟢 -2.8 kB
assets/useLoad3dViewer-x2Do9AwQ.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.16 kB 🔴 +2.8 kB
assets/colorUtil-CgFTKv2J.js (new) 7 kB 🔴 +7 kB 🔴 +2.14 kB 🔴 +1.9 kB
assets/colorUtil-FW_Ghng2.js (removed) 7 kB 🟢 -7 kB 🟢 -2.14 kB 🟢 -1.9 kB
assets/useErrorHandling-BfeI85Jf.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.34 kB 🔴 +1.18 kB
assets/useErrorHandling-Cwi0yvZs.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.34 kB 🟢 -1.18 kB
assets/useWorkspaceUI-CbHEuaph.js (removed) 3.16 kB 🟢 -3.16 kB 🟢 -882 B 🟢 -801 B
assets/useWorkspaceUI-DCJ5az4Y.js (new) 3.16 kB 🔴 +3.16 kB 🔴 +884 B 🔴 +766 B
assets/useSubscriptionActions-rf8kACdc.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +757 B 🔴 +652 B
assets/useSubscriptionActions-Xy4-nf_N.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -758 B 🟢 -655 B
assets/subscriptionCheckoutUtil-Ck0KWkfS.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -786 B 🟢 -688 B
assets/subscriptionCheckoutUtil-DxaAEwfW.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +785 B 🔴 +678 B
assets/useExternalLink-BGTvgS-9.js (removed) 1.63 kB 🟢 -1.63 kB 🟢 -757 B 🟢 -671 B
assets/useExternalLink-DmG83A5E.js (new) 1.63 kB 🔴 +1.63 kB 🔴 +758 B 🔴 +667 B
assets/useCopyToClipboard-CTuQep2Q.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -666 B 🟢 -551 B
assets/useCopyToClipboard-z7htVbRZ.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +669 B 🔴 +567 B
assets/useSubscriptionCredits-CKT8HBhB.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +517 B 🔴 +456 B
assets/useSubscriptionCredits-WuOdCAs1.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -500 B 🟢 -437 B
assets/useLoad3d-BUMQ9pMT.js (new) 861 B 🔴 +861 B 🔴 +429 B 🔴 +379 B
assets/useLoad3d-DV82VnPp.js (removed) 861 B 🟢 -861 B 🟢 -428 B 🟢 -383 B
assets/audioUtils-BS8VUWgd.js (removed) 858 B 🟢 -858 B 🟢 -500 B 🟢 -421 B
assets/audioUtils-COtH3EdZ.js (new) 858 B 🔴 +858 B 🔴 +500 B 🔴 +420 B
assets/useLoad3dViewer-CwEDMtZc.js (new) 840 B 🔴 +840 B 🔴 +415 B 🔴 +371 B
assets/useLoad3dViewer-Dzw6Ddym.js (removed) 840 B 🟢 -840 B 🟢 -411 B 🟢 -373 B
assets/useCurrentUser-Bo_1hX4a.js (new) 724 B 🔴 +724 B 🔴 +374 B 🔴 +331 B
assets/useCurrentUser-CgAuCjbj.js (removed) 724 B 🟢 -724 B 🟢 -376 B 🟢 -329 B
assets/_plugin-vue_export-helper-CAbbkOlw.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Djb4sHrV.js 524 B 524 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-Cc2LFa5s.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/networkUtil-Du2a_n7V.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-DwBAnKr-.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 15 added / 15 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-BAUgDzpD.js (new) 2.16 MB 🔴 +2.16 MB 🔴 +456 kB 🔴 +346 kB
assets/vendor-other-DPcKX1Hx.js (removed) 2.16 MB 🟢 -2.16 MB 🟢 -456 kB 🟢 -346 kB
assets/vendor-xterm-3PfzLF46.js (new) 398 kB 🔴 +398 kB 🔴 +79.3 kB 🔴 +63.6 kB
assets/vendor-xterm-DOEEpxXk.js (removed) 398 kB 🟢 -398 kB 🟢 -79.3 kB 🟢 -63.5 kB
assets/vendor-axios-D0w6WYH0.js 71.6 kB 71.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-CIdI9Yl4.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-CLEC0CcJ.js 842 kB 842 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-C6_f776o.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-BkVHYrKV.js 102 kB 102 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-Dw8RivU1.js 1.74 MB 1.74 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CPrt7lw0.js 240 kB 240 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-BVA5kbUC.js 183 kB 183 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-CJhOuqDg.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-CvX7mojg.js 632 kB 632 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-BBP9kkTE.js 312 kB 312 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-CS5mlw4Q.js 111 kB 111 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-BtrvIr1x.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-gAWmQIF-.js 110 kB 110 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 2 added / 2 removed

Other — 7.08 MB (baseline 7.08 MB) • 🔴 +1.46 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-CGFvwZok.js (new) 479 kB 🔴 +479 kB 🔴 +91.5 kB 🔴 +71.3 kB
assets/i18n-CPvZppmN.js (removed) 479 kB 🟢 -479 kB 🟢 -91.5 kB 🟢 -71.3 kB
assets/nodeDefs-BlOvckwt.js (new) 441 kB 🔴 +441 kB 🔴 +66.9 kB 🔴 +46.2 kB
assets/nodeDefs-PGdfR_x_.js (removed) 441 kB 🟢 -441 kB 🟢 -66.9 kB 🟢 -46.2 kB
assets/nodeDefs-BcADFj4z.js (removed) 404 kB 🟢 -404 kB 🟢 -60.9 kB 🟢 -42.7 kB
assets/nodeDefs-C8BmOx6E.js (new) 404 kB 🔴 +404 kB 🔴 +60.9 kB 🔴 +42.7 kB
assets/nodeDefs-KEcnT9xq.js (new) 404 kB 🔴 +404 kB 🔴 +62.9 kB 🔴 +44.3 kB
assets/nodeDefs-SDKvs0-9.js (removed) 404 kB 🟢 -404 kB 🟢 -62.9 kB 🟢 -44.3 kB
assets/nodeDefs-BddTsShn.js (removed) 374 kB 🟢 -374 kB 🟢 -60.9 kB 🟢 -42.6 kB
assets/nodeDefs-Duono7u_.js (new) 374 kB 🔴 +374 kB 🔴 +60.9 kB 🔴 +42.6 kB
assets/nodeDefs-Cfjv7JEn.js (removed) 364 kB 🟢 -364 kB 🟢 -59.8 kB 🟢 -42.3 kB
assets/nodeDefs-DdjttegP.js (new) 364 kB 🔴 +364 kB 🔴 +59.7 kB 🔴 +42.3 kB
assets/nodeDefs-CEMSHoZg.js (removed) 360 kB 🟢 -360 kB 🟢 -58.4 kB 🟢 -42.7 kB
assets/nodeDefs-CwOSk61h.js (new) 360 kB 🔴 +360 kB 🔴 +58.4 kB 🔴 +42.7 kB
assets/nodeDefs-aApbAbNI.js (removed) 360 kB 🟢 -360 kB 🟢 -59.7 kB 🟢 -43.5 kB
assets/nodeDefs-B66I34jw.js (new) 360 kB 🔴 +360 kB 🔴 +59.7 kB 🔴 +43.5 kB
assets/nodeDefs-BbVIS5BG.js (removed) 357 kB 🟢 -357 kB 🟢 -57.2 kB 🟢 -41.7 kB
assets/nodeDefs-tM8pn_xw.js (new) 357 kB 🔴 +357 kB 🔴 +57.2 kB 🔴 +41.7 kB
assets/nodeDefs-b1VVfel0.js (new) 353 kB 🔴 +353 kB 🔴 +56.3 kB 🔴 +41.1 kB
assets/nodeDefs-DTPAo_v7.js (removed) 353 kB 🟢 -353 kB 🟢 -56.3 kB 🟢 -41.1 kB
assets/nodeDefs-B2JRfCRl.js (removed) 332 kB 🟢 -332 kB 🟢 -58.4 kB 🟢 -41 kB
assets/nodeDefs-k1_lxi0k.js (new) 332 kB 🔴 +332 kB 🔴 +58.4 kB 🔴 +41 kB
assets/nodeDefs-BrQNg87y.js (removed) 329 kB 🟢 -329 kB 🟢 -57.3 kB 🟢 -39.8 kB
assets/nodeDefs-Dadv6GAk.js (new) 329 kB 🔴 +329 kB 🔴 +57.3 kB 🔴 +39.8 kB
assets/main-CN7pSufO.js (removed) 180 kB 🟢 -180 kB 🟢 -47.6 kB 🟢 -38 kB
assets/main-DMX4rm1H.js (new) 180 kB 🔴 +180 kB 🔴 +47.6 kB 🔴 +38 kB
assets/main-Dt6bQoC3.js (removed) 161 kB 🟢 -161 kB 🟢 -42.9 kB 🟢 -35 kB
assets/main-DYZ26Qq7.js (new) 161 kB 🔴 +161 kB 🔴 +42.9 kB 🔴 +35 kB
assets/main-5vUvgJMx.js (removed) 155 kB 🟢 -155 kB 🟢 -42.8 kB 🟢 -34.6 kB
assets/main-Cd2_rR09.js (new) 155 kB 🔴 +155 kB 🔴 +42.8 kB 🔴 +34.6 kB
assets/main-B_En4SpT.js (removed) 148 kB 🟢 -148 kB 🟢 -42.6 kB 🟢 -34.4 kB
assets/main-hI9XKjOm.js (new) 148 kB 🔴 +148 kB 🔴 +42.6 kB 🔴 +34.4 kB
assets/main-BYoy9XSQ.js (removed) 136 kB 🟢 -136 kB 🟢 -41.3 kB 🟢 -35 kB
assets/main-DMSoONgu.js (new) 136 kB 🔴 +136 kB 🔴 +41.3 kB 🔴 +34.9 kB
assets/main-2HxSpwOp.js (removed) 133 kB 🟢 -133 kB 🟢 -40.8 kB 🟢 -33.4 kB
assets/main-Dr9_Hkeg.js (new) 133 kB 🔴 +133 kB 🔴 +40.8 kB 🔴 +33.4 kB
assets/main-CiTAARZa.js (new) 131 kB 🔴 +131 kB 🔴 +40.3 kB 🔴 +33.9 kB
assets/main-Dn8ME7jP.js (removed) 131 kB 🟢 -131 kB 🟢 -40.4 kB 🟢 -34 kB
assets/main-BuWOig7p.js (removed) 129 kB 🟢 -129 kB 🟢 -40.2 kB 🟢 -34 kB
assets/main-CRYUSY-1.js (new) 129 kB 🔴 +129 kB 🔴 +40.2 kB 🔴 +34 kB
assets/main-Ceb-3q1b.js (new) 128 kB 🔴 +128 kB 🔴 +39.6 kB 🔴 +33.6 kB
assets/main-dc7AuxCr.js (removed) 128 kB 🟢 -128 kB 🟢 -39.6 kB 🟢 -33.6 kB
assets/main-BenE6Oix.js (new) 114 kB 🔴 +114 kB 🔴 +39.4 kB 🔴 +31.8 kB
assets/main-CKN_4E4Z.js (removed) 114 kB 🟢 -114 kB 🟢 -39.4 kB 🟢 -31.7 kB
assets/main-BpnmNj1n.js (removed) 113 kB 🟢 -113 kB 🟢 -39.4 kB 🟢 -31.5 kB
assets/main-D_v_zmb1.js (new) 113 kB 🔴 +113 kB 🔴 +39.4 kB 🔴 +31.5 kB
assets/core-CmhaZvSy.js (new) 71.4 kB 🔴 +71.4 kB 🔴 +18.4 kB 🔴 +15.8 kB
assets/core-CqNc0OmV.js (removed) 71.4 kB 🟢 -71.4 kB 🟢 -18.4 kB 🟢 -15.8 kB
assets/groupNode-CO1YDo91.js (removed) 70.9 kB 🟢 -70.9 kB 🟢 -17.5 kB 🟢 -15.4 kB
assets/groupNode-CRrtA_bU.js (new) 70.9 kB 🔴 +70.9 kB 🔴 +17.5 kB 🔴 +15.4 kB
assets/WidgetSelect-MrbF5WYk.js (new) 56.6 kB 🔴 +56.6 kB 🔴 +12 kB 🔴 +10.4 kB
assets/WidgetSelect-N4FG3U1e.js (removed) 56.6 kB 🟢 -56.6 kB 🟢 -12 kB 🟢 -10.4 kB
assets/SettingDialogContent-Dh1dCHbW.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +8.03 kB 🔴 +7.06 kB
assets/SettingDialogContent-kAsKvMZ5.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -8.01 kB 🟢 -7.07 kB
assets/Load3DControls-Bs35Ml1x.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +5.33 kB 🔴 +4.63 kB
assets/Load3DControls-DNNeP7_j.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -5.33 kB 🟢 -4.62 kB
assets/SubscriptionRequiredDialogContent-BR5kHMVd.js (removed) 25.4 kB 🟢 -25.4 kB 🟢 -6.36 kB 🟢 -5.57 kB
assets/SubscriptionRequiredDialogContent-CLkf39Hy.js (new) 25.4 kB 🔴 +25.4 kB 🔴 +6.36 kB 🔴 +5.57 kB
assets/Load3dViewerContent-Dn8703rs.js (new) 23.2 kB 🔴 +23.2 kB 🔴 +5.24 kB 🔴 +4.54 kB
assets/Load3dViewerContent-DP-YIIb3.js (removed) 23.2 kB 🟢 -23.2 kB 🟢 -5.24 kB 🟢 -4.54 kB
assets/WidgetImageCrop-B9dIOWBN.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.51 kB 🔴 +4.85 kB
assets/WidgetImageCrop-BxQadSr6.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.51 kB 🟢 -4.84 kB
assets/FormItem-BklZLfAq.js (new) 20.2 kB 🔴 +20.2 kB 🔴 +4.87 kB 🔴 +4.25 kB
assets/FormItem-CzGtiheX.js (removed) 20.2 kB 🟢 -20.2 kB 🟢 -4.87 kB 🟢 -4.25 kB
assets/CurrentUserPopoverWorkspace-9B4GqKkc.js (new) 19.7 kB 🔴 +19.7 kB 🔴 +4.76 kB 🔴 +4.24 kB
assets/CurrentUserPopoverWorkspace-sX5aqK3_.js (removed) 19.7 kB 🟢 -19.7 kB 🟢 -4.74 kB 🟢 -4.22 kB
assets/SignInContent-BcnrRqMu.js (new) 19 kB 🔴 +19 kB 🔴 +4.8 kB 🔴 +4.2 kB
assets/SignInContent-CmFdLslm.js (removed) 19 kB 🟢 -19 kB 🟢 -4.8 kB 🟢 -4.2 kB
assets/commands-D7Ez6YeH.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -3.84 kB 🟢 -3 kB
assets/commands-LfAehxTw.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +3.84 kB 🔴 +2.99 kB
assets/WidgetRecordAudio-aOXnS43I.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +4.93 kB 🔴 +4.41 kB
assets/WidgetRecordAudio-B-xlCOsL.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -4.92 kB 🟢 -4.4 kB
assets/TopUpCreditsDialogContent-BDMtWIgH.js (new) 16.9 kB 🔴 +16.9 kB 🔴 +4.81 kB 🔴 +4.26 kB
assets/TopUpCreditsDialogContent-keryGUPP.js (removed) 16.9 kB 🟢 -16.9 kB 🟢 -4.8 kB 🟢 -4.25 kB
assets/commands-bneKLdja.js (new) 16.7 kB 🔴 +16.7 kB 🔴 +3.54 kB 🔴 +2.75 kB
assets/commands-DuYqNMWX.js (removed) 16.7 kB 🟢 -16.7 kB 🟢 -3.54 kB 🟢 -2.75 kB
assets/commands-CVZhWS_N.js (new) 16.7 kB 🔴 +16.7 kB 🔴 +3.57 kB 🔴 +2.84 kB
assets/commands-Ds7u8tBA.js (removed) 16.7 kB 🟢 -16.7 kB 🟢 -3.57 kB 🟢 -2.84 kB
assets/commands-BamWPikz.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +3.63 kB 🔴 +2.89 kB
assets/commands-ovF76AYH.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -3.64 kB 🟢 -2.89 kB
assets/Load3D-N42ygygU.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.51 kB
assets/Load3D-Q_xQgd30.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.51 kB
assets/MissingModelsWarning-BZ358a-4.js (removed) 16.1 kB 🟢 -16.1 kB 🟢 -4.4 kB 🟢 -3.9 kB
assets/MissingModelsWarning-XmTHiWNw.js (new) 16.1 kB 🔴 +16.1 kB 🔴 +4.4 kB 🔴 +3.91 kB
assets/commands-b4ZVTa0J.js (new) 15.9 kB 🔴 +15.9 kB 🔴 +3.39 kB 🔴 +2.84 kB
assets/commands-BTIhwSf_.js (removed) 15.9 kB 🟢 -15.9 kB 🟢 -3.39 kB 🟢 -2.84 kB
assets/SubscriptionPanelContentWorkspace-C8LkfSLB.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.03 kB 🔴 +3.54 kB
assets/SubscriptionPanelContentWorkspace-s3XAXDQM.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -4.03 kB 🟢 -3.54 kB
assets/WidgetInputNumber-BJ6YLAgu.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +4.2 kB 🔴 +3.73 kB
assets/WidgetInputNumber-C5AYvtSY.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -4.2 kB 🟢 -3.74 kB
assets/commands-Bvsmp41f.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +3.37 kB 🔴 +2.83 kB
assets/commands-DFfk2Km5.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -3.37 kB 🟢 -2.83 kB
assets/commands-Ct4jSbcT.js (new) 15.4 kB 🔴 +15.4 kB 🔴 +3.28 kB 🔴 +2.67 kB
assets/commands-tMQq9SrH.js (removed) 15.4 kB 🟢 -15.4 kB 🟢 -3.28 kB 🟢 -2.67 kB
assets/commands-BCSmRi2Z.js (new) 15.3 kB 🔴 +15.3 kB 🔴 +3.23 kB 🔴 +2.68 kB
assets/commands-BYGUQRX1.js (removed) 15.3 kB 🟢 -15.3 kB 🟢 -3.23 kB 🟢 -2.67 kB
assets/commands-B6iGMTjt.js (new) 15.2 kB 🔴 +15.2 kB 🔴 +3.5 kB 🔴 +2.75 kB
assets/commands-CtxsvHdf.js (removed) 15.2 kB 🟢 -15.2 kB 🟢 -3.5 kB 🟢 -2.75 kB
assets/load3d-Bm8C1DgV.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.18 kB 🔴 +3.64 kB
assets/load3d-KigSHXA7.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.18 kB 🟢 -3.65 kB
assets/commands-BqbXSiOi.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.42 kB 🔴 +2.56 kB
assets/commands-BxiMWv9a.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.42 kB 🟢 -2.56 kB
assets/commands-BfntAh7V.js (new) 14.4 kB 🔴 +14.4 kB 🔴 +3.41 kB 🔴 +2.5 kB
assets/commands-D4xkLWYG.js (removed) 14.4 kB 🟢 -14.4 kB 🟢 -3.41 kB 🟢 -2.5 kB
assets/LazyImage-CVvKb-rW.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.78 kB 🟢 -3.32 kB
assets/LazyImage-rUfKa8d-.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.78 kB 🔴 +3.31 kB
assets/NodeConflictDialogContent-BOs4ZA1g.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.37 kB 🟢 -2.08 kB
assets/NodeConflictDialogContent-CQp7dcw1.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.37 kB 🔴 +2.08 kB
assets/AudioPreviewPlayer-B4Ob4MK0.js (removed) 10.1 kB 🟢 -10.1 kB 🟢 -2.99 kB 🟢 -2.69 kB
assets/AudioPreviewPlayer-DuxixVcN.js (new) 10.1 kB 🔴 +10.1 kB 🔴 +2.99 kB 🔴 +2.67 kB
assets/nodeTemplates-DWXpD0U5.js (removed) 9.33 kB 🟢 -9.33 kB 🟢 -3.27 kB 🟢 -2.87 kB
assets/nodeTemplates-ZYuWl2Pz.js (new) 9.33 kB 🔴 +9.33 kB 🔴 +3.27 kB 🔴 +2.87 kB
assets/SelectValue-1KJOqzqF.js (removed) 8.94 kB 🟢 -8.94 kB 🟢 -2.27 kB 🟢 -1.99 kB
assets/SelectValue-B2FSxBaR.js (new) 8.94 kB 🔴 +8.94 kB 🔴 +2.27 kB 🔴 +1.99 kB
assets/InviteMemberDialogContent-DadjuPNT.js (new) 7.95 kB 🔴 +7.95 kB 🔴 +2.57 kB 🔴 +2.22 kB
assets/InviteMemberDialogContent-DxeSJ40y.js (removed) 7.95 kB 🟢 -7.95 kB 🟢 -2.56 kB 🟢 -2.22 kB
assets/WidgetWithControl-BLcl0ZdE.js (removed) 6.97 kB 🟢 -6.97 kB 🟢 -2.59 kB 🟢 -2.31 kB
assets/WidgetWithControl-fdTto-hf.js (new) 6.97 kB 🔴 +6.97 kB 🔴 +2.59 kB 🔴 +2.31 kB
assets/Load3DConfiguration-ClDX3fcJ.js (new) 6.36 kB 🔴 +6.36 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/Load3DConfiguration-CSRy-tGb.js (removed) 6.36 kB 🟢 -6.36 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/MissingNodesContent-B7XL1LCU.js (new) 6.14 kB 🔴 +6.14 kB 🔴 +2.09 kB 🔴 +1.85 kB
assets/MissingNodesContent-DeFU9_UE.js (removed) 6.14 kB 🟢 -6.14 kB 🟢 -2.08 kB 🟢 -1.85 kB
assets/CreateWorkspaceDialogContent-Cci8YYph.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -2 kB 🟢 -1.75 kB
assets/CreateWorkspaceDialogContent-CTf_juCB.js (new) 5.58 kB 🔴 +5.58 kB 🔴 +2 kB 🔴 +1.74 kB
assets/EditWorkspaceDialogContent-C2Il8tQx.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.96 kB 🔴 +1.7 kB
assets/EditWorkspaceDialogContent-ltReEFjR.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.96 kB 🟢 -1.71 kB
assets/ValueControlPopover-CH0WFIL4.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.78 kB 🔴 +1.58 kB
assets/ValueControlPopover-D4e748FU.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.77 kB 🟢 -1.58 kB
assets/Preview3d-ClwY4LA3.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/Preview3d-D8Oc-zWv.js (new) 4.82 kB 🔴 +4.82 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/MissingNodesFooter-Ckc-or85.js (removed) 4.8 kB 🟢 -4.8 kB 🟢 -1.78 kB 🟢 -1.58 kB
assets/MissingNodesFooter-DD58m2Ks.js (new) 4.8 kB 🔴 +4.8 kB 🔴 +1.78 kB 🔴 +1.57 kB
assets/AnimationControls-bPyINTJI.js (removed) 4.61 kB 🟢 -4.61 kB 🟢 -1.6 kB 🟢 -1.41 kB
assets/AnimationControls-C5ckD70r.js (new) 4.61 kB 🔴 +4.61 kB 🔴 +1.6 kB 🔴 +1.41 kB
assets/DeleteWorkspaceDialogContent-BHGitp0J.js (removed) 4.28 kB 🟢 -4.28 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/DeleteWorkspaceDialogContent-Da8NWYiR.js (new) 4.28 kB 🔴 +4.28 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/LeaveWorkspaceDialogContent-BPG9VbiG.js (new) 4.11 kB 🔴 +4.11 kB 🔴 +1.59 kB 🔴 +1.38 kB
assets/LeaveWorkspaceDialogContent-BtidYO_R.js (removed) 4.11 kB 🟢 -4.11 kB 🟢 -1.59 kB 🟢 -1.38 kB
assets/RemoveMemberDialogContent-B2TJnQEk.js (removed) 4.09 kB 🟢 -4.09 kB 🟢 -1.54 kB 🟢 -1.34 kB
assets/RemoveMemberDialogContent-DtyAxjuo.js (new) 4.09 kB 🔴 +4.09 kB 🔴 +1.54 kB 🔴 +1.34 kB
assets/RevokeInviteDialogContent-CCt_VwGI.js (new) 4 kB 🔴 +4 kB 🔴 +1.55 kB 🔴 +1.36 kB
assets/RevokeInviteDialogContent-DXRyko2L.js (removed) 4 kB 🟢 -4 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/WidgetGalleria-C8ikSQqn.js (removed) 3.61 kB 🟢 -3.61 kB 🟢 -1.39 kB 🟢 -1.25 kB
assets/WidgetGalleria-vzNjD_An.js (new) 3.61 kB 🔴 +3.61 kB 🔴 +1.39 kB 🔴 +1.25 kB
assets/Slider-Bh_ZdHn9.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.36 kB 🟢 -1.19 kB
assets/Slider-O9Xtgoh1.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.36 kB 🔴 +1.19 kB
assets/saveMesh-ChFokebB.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.45 kB 🔴 +1.29 kB
assets/saveMesh-hAVONhh_.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.28 kB
assets/WidgetImageCompare-B1RSu0_k.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.15 kB 🟢 -1.02 kB
assets/WidgetImageCompare-CXXuUi79.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.15 kB 🔴 +1.02 kB
assets/WidgetTextarea-CHT6TqUb.js (new) 3.09 kB 🔴 +3.09 kB 🔴 +1.28 kB 🔴 +1.12 kB
assets/WidgetTextarea-COgaptkR.js (removed) 3.09 kB 🟢 -3.09 kB 🟢 -1.28 kB 🟢 -1.12 kB
assets/cloudSessionCookie-C_IpcQj4.js (new) 3.07 kB 🔴 +3.07 kB 🔴 +1.09 kB 🔴 +958 B
assets/cloudSessionCookie-zByNBO6M.js (removed) 3.07 kB 🟢 -3.07 kB 🟢 -1.08 kB 🟢 -971 B
assets/WidgetColorPicker-HsaMDxHE.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +1.23 kB 🔴 +1.11 kB
assets/WidgetColorPicker-jDbRm4n6.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -1.23 kB 🟢 -1.11 kB
assets/WidgetMarkdown-BYrCy83F.js (new) 2.88 kB 🔴 +2.88 kB 🔴 +1.22 kB 🔴 +1.05 kB
assets/WidgetMarkdown-wePHc2fh.js (removed) 2.88 kB 🟢 -2.88 kB 🟢 -1.22 kB 🟢 -1.07 kB
assets/ApiNodesSignInContent-CWyRM9Uw.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -919 B
assets/ApiNodesSignInContent-D1Su4enV.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +956 B
assets/WidgetToggleSwitch-CoKD027B.js (removed) 2.5 kB 🟢 -2.5 kB 🟢 -1.09 kB 🟢 -990 B
assets/WidgetToggleSwitch-sQ0Aq0ap.js (new) 2.5 kB 🔴 +2.5 kB 🔴 +1.09 kB 🔴 +993 B
assets/ImportFailedNodeContent-CFc03Tip.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +972 B 🔴 +828 B
assets/ImportFailedNodeContent-VPjQzi79.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -974 B 🟢 -828 B
assets/NodeConflictFooter-BHJfefj_.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.03 kB 🔴 +896 B
assets/NodeConflictFooter-BOtQMVYa.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.03 kB 🟢 -908 B
assets/GlobalToast-CPbXlenx.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -964 B 🟢 -800 B
assets/GlobalToast-Vxt-awku.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +963 B 🔴 +799 B
assets/MediaVideoTop-CKmQms8p.js (new) 2.23 kB 🔴 +2.23 kB 🔴 +937 B 🔴 +800 B
assets/MediaVideoTop-CQw3f2T6.js (removed) 2.23 kB 🟢 -2.23 kB 🟢 -937 B 🟢 -800 B
assets/WidgetChart-BZvs6tsT.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +948 B 🔴 +822 B
assets/WidgetChart-Dsp6bf_j.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -948 B 🟢 -821 B
assets/SubscribeToRun-DG1CkD-z.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -989 B 🟢 -848 B
assets/SubscribeToRun-xWFNkFLY.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +992 B 🔴 +878 B
assets/WidgetLayoutField-BcUSnWUK.js (removed) 1.95 kB 🟢 -1.95 kB 🟢 -879 B 🟢 -763 B
assets/WidgetLayoutField-BTcioctb.js (new) 1.95 kB 🔴 +1.95 kB 🔴 +878 B 🔴 +760 B
assets/ImportFailedNodeFooter-CrRxcWuZ.js (new) 1.88 kB 🔴 +1.88 kB 🔴 +865 B 🔴 +751 B
assets/ImportFailedNodeFooter-DR052jYb.js (removed) 1.88 kB 🟢 -1.88 kB 🟢 -866 B 🟢 -750 B
assets/WidgetInputText-BEPe6tIH.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +872 B 🔴 +789 B
assets/WidgetInputText-MXN3EUoN.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -872 B 🟢 -795 B
assets/Media3DTop-B0hjzWGd.js (new) 1.82 kB 🔴 +1.82 kB 🔴 +897 B 🔴 +764 B
assets/Media3DTop-DTYkrVtB.js (removed) 1.82 kB 🟢 -1.82 kB 🟢 -897 B 🟢 -767 B
assets/BaseViewTemplate-BhBVWOWE.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +910 B 🔴 +815 B
assets/BaseViewTemplate-BnXUotno.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -910 B 🟢 -799 B
assets/MediaImageTop-ATOoJCQr.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -879 B 🟢 -750 B
assets/MediaImageTop-BaVMScBp.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +877 B 🔴 +751 B
assets/CloudRunButtonWrapper-BDYbYFH1.js (new) 1.67 kB 🔴 +1.67 kB 🔴 +787 B 🔴 +705 B
assets/CloudRunButtonWrapper-hFXN587H.js (removed) 1.67 kB 🟢 -1.67 kB 🟢 -780 B 🟢 -695 B
assets/SettingDialogHeader-BHt-6Ao_.js (removed) 1.62 kB 🟢 -1.62 kB 🟢 -810 B 🟢 -719 B
assets/SettingDialogHeader-GAjia3GS.js (new) 1.62 kB 🔴 +1.62 kB 🔴 +811 B 🔴 +715 B
assets/signInSchema-BmDSdAM3.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +563 B 🔴 +487 B
assets/signInSchema-Dx5pd6PK.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -562 B 🟢 -510 B
assets/MediaAudioTop-AFmsiWi3.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -759 B 🟢 -632 B
assets/MediaAudioTop-DAlaM_mk.js (new) 1.43 kB 🔴 +1.43 kB 🔴 +758 B 🔴 +633 B
assets/cloudBadges-B6jlTc3N.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -703 B 🟢 -614 B
assets/cloudBadges-Ddh5Q7hf.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +702 B 🔴 +613 B
assets/cloudSubscription-D2YHYUhX.js (new) 1.32 kB 🔴 +1.32 kB 🔴 +654 B 🔴 +567 B
assets/cloudSubscription-StOYNLlg.js (removed) 1.32 kB 🟢 -1.32 kB 🟢 -652 B 🟢 -569 B
assets/comfyCredits-DjtAq5R_.js (new) 1.27 kB 🔴 +1.27 kB 🔴 +533 B 🔴 +465 B
assets/PanelTemplate-BhxOxy8a.js (new) 1.2 kB 🔴 +1.2 kB 🔴 +612 B 🔴 +540 B
assets/PanelTemplate-C1h0RxBM.js (removed) 1.2 kB 🟢 -1.2 kB 🟢 -612 B 🟢 -539 B
assets/SubscriptionPanelContentWorkspace-DMuO8qfm.js (new) 1.1 kB 🔴 +1.1 kB 🔴 +494 B 🔴 +431 B
assets/widgetPropFilter-CYRkKG06.js (new) 1.1 kB 🔴 +1.1 kB 🔴 +511 B 🔴 +453 B
assets/widgetPropFilter-DyQHILEf.js (removed) 1.1 kB 🟢 -1.1 kB 🟢 -509 B 🟢 -448 B
assets/NodeConflictHeader-DRxQs5TH.js (removed) 1.09 kB 🟢 -1.09 kB 🟢 -565 B 🟢 -478 B
assets/NodeConflictHeader-Dzr-2wLT.js (new) 1.09 kB 🔴 +1.09 kB 🔴 +564 B 🔴 +477 B
assets/ImportFailedNodeHeader-AFugOvJc.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +551 B 🔴 +469 B
assets/ImportFailedNodeHeader-DUns4_x2.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -550 B 🟢 -471 B
assets/SubscriptionPanelContentWorkspace-CQhwer6V.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -485 B 🟢 -421 B
assets/Load3D-BNIXG4BS.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +487 B 🔴 +433 B
assets/Load3D-Cr7HEPnt.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -485 B 🟢 -436 B
assets/nightlyBadges-DU0O0loJ.js (new) 1 kB 🔴 +1 kB 🔴 +538 B 🔴 +476 B
assets/nightlyBadges-h8007jqN.js (removed) 1 kB 🟢 -1 kB 🟢 -536 B 🟢 -469 B
assets/Load3dViewerContent-Dnk2_UTk.js (removed) 961 B 🟢 -961 B 🟢 -457 B 🟢 -405 B
assets/Load3dViewerContent-Jnd8OXJ7.js (new) 961 B 🔴 +961 B 🔴 +457 B 🔴 +404 B
assets/SettingDialogContent-BoESgDJE.js (new) 917 B 🔴 +917 B 🔴 +443 B 🔴 +393 B
assets/SettingDialogContent-D4uDz3Jp.js (removed) 917 B 🟢 -917 B 🟢 -443 B 🟢 -392 B
assets/ComfyOrgHeader-32ZIoIYN.js (removed) 909 B 🟢 -909 B 🟢 -495 B 🟢 -434 B
assets/ComfyOrgHeader-BrRix61p.js (new) 909 B 🔴 +909 B 🔴 +494 B 🔴 +425 B
assets/graphHasMissingNodes-3IQ_9AX6.js (new) 761 B 🔴 +761 B 🔴 +375 B 🔴 +328 B
assets/graphHasMissingNodes-69oEJBEt.js (removed) 761 B 🟢 -761 B 🟢 -374 B 🟢 -328 B
assets/WidgetLegacy-DJbNHnBZ.js (new) 747 B 🔴 +747 B 🔴 +389 B 🔴 +340 B
assets/WidgetLegacy-Dls89N1X.js (removed) 747 B 🟢 -747 B 🟢 -387 B 🟢 -339 B
assets/previousFullPath-BwqJAUKa.js (new) 665 B 🔴 +665 B 🔴 +366 B 🔴 +318 B
assets/previousFullPath-DsBk66MD.js (removed) 665 B 🟢 -665 B 🟢 -368 B 🟢 -321 B
assets/WidgetInputNumber-CvNonTvW.js (new) 392 B 🔴 +392 B 🔴 +231 B 🔴 +218 B
assets/WidgetInputNumber-DFSBkWkj.js (removed) 392 B 🟢 -392 B 🟢 -232 B 🟢 -215 B
assets/src-BTenZEg9.js (new) 251 B 🔴 +251 B 🔴 +209 B 🔴 +177 B
assets/src-DAMctjF_.js (removed) 251 B 🟢 -251 B 🟢 -210 B 🟢 -177 B
assets/SettingDialogHeader-CKe1fyPF.js (new) 244 B 🔴 +244 B 🔴 +166 B 🔴 +141 B
assets/SettingDialogHeader-D5wathvf.js (removed) 244 B 🟢 -244 B 🟢 -165 B 🟢 -141 B
assets/i18n-CEuPC6JE.js (removed) 199 B 🟢 -199 B 🟢 -160 B 🟢 -160 B
assets/i18n-DA7XuKyt.js (new) 199 B 🔴 +199 B 🔴 +161 B 🔴 +140 B
assets/comfy-logo-single-DCVL1uOL.js (removed) 198 B 🟢 -198 B 🟢 -160 B 🟢 -126 B
assets/comfy-logo-single-Dz1htBh5.js (new) 198 B 🔴 +198 B 🔴 +162 B 🔴 +133 B
assets/mixpanel.module-CQQ8ncs1.js (new) 92 B 🔴 +92 B 🔴 +100 B 🔴 +91 B
assets/mixpanel.module-Dq6XmUX_.js (removed) 92 B 🟢 -92 B 🟢 -100 B 🟢 -81 B
assets/auto-DjoqfnTX.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingNodesHeader-BOlbqJ0O.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-Ca2S-reV.js 1.87 kB 1.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-VDank0gz.js 318 B 318 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-RLUqfB5N.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-2w5BjjHm.js 3.94 kB 3.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-Djm16aYN.js 131 B 131 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-BCsKJASV.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 119 added / 118 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/components/rightSidePanel/RightSidePanel.vue`:
- Around line 104-110: The "Error" label is hardcoded in the list.push call
inside RightSidePanel.vue; replace the literal with the vue-i18n Composition API
call (use useI18n() / t) so the label returns the translated key g.error (i.e.,
obtain t from useI18n in the component setup and change label: () => 'Error' to
label: () => t('g.error')), ensuring selectedNodeErrors and the existing
list.push usage remain unchanged.

In `@src/renderer/extensions/vueNodes/components/NodeBadges.vue`:
- Around line 12-42: The explicit bg-color prop on NodeBadge is being overridden
by v-bind="badge" in both the core and extension badge loops; to fix, change the
prop order so the explicit bg-color="transparent" takes precedence (e.g., bind
badge first then set bg-color, or spread/merge badge with bgColor:
'transparent') for the NodeBadge usages inside the core and extension v-for
templates so badges remain transparent.
🧹 Nitpick comments (6)
src/components/rightSidePanel/TabError.vue (2)

4-4: Use $t in template instead of importing t.

Since t is only used within the template (line 14), prefer using the built-in $t in the template rather than importing from @/i18n. This avoids unnecessary imports when t is not used in the script.

♻️ Suggested refactor
-import { t } from '@/i18n'

And in the template:

-      {{ t('g.copy') }}
+      {{ $t('g.copy') }}

Based on learnings: "In Vue single-file components where the i18n t function is only used within the template, prefer using the built-in $t in the template instead of importing useI18n and destructuring t in the script."


11-25: Consider wrapping the template in a single root element.

The template has multiple root elements: a wrapper div for the button (lines 12-17) and multiple divs from the v-for loop (lines 18-25). While Vue 3 supports fragments, wrapping in a single container improves layout consistency and makes styling more predictable.

♻️ Suggested refactor
 <template>
+  <div class="flex flex-col">
     <div class="m-4">
       <Button class="w-full" `@click`="copyToClipboard(JSON.stringify(errors))">
         {{ t('g.copy') }}
         <i class="icon-[lucide--copy] size-4" />
       </Button>
     </div>
     <div
       v-for="(error, index) in errors.flatMap((ne) => ne.errors)"
       :key="index"
       class="px-2"
     >
       <h3 class="text-error" v-text="error.message" />
       <div class="text-muted-foreground" v-text="error.details" />
     </div>
+  </div>
 </template>
src/components/rightSidePanel/RightSidePanel.vue (1)

95-100: Consider the FIXME for showing all errors when nothing is selected.

The FIXME comment raises a valid point about showing all errors when no nodes are selected. Currently, errors are only shown for selected nodes. Consider whether users would benefit from seeing all errors in the workflow overview.

Would you like me to help implement a solution that shows all workflow errors when nothing is selected, or would you prefer to track this as a separate issue?

src/renderer/extensions/vueNodes/components/NodeHeader.vue (1)

109-113: Consider extracting a shared PriceBadge type.
The { required: string; rest?: string } shape is now used in multiple places (e.g., this prop and the partitioning composable). A shared type keeps the contract aligned.

As per coding guidelines: Extract and name complex type definitions that are inlined in multiple related places for reuse.

src/renderer/extensions/vueNodes/components/LGraphNode.vue (2)

89-124: Avoid passing a pricing attr to NodeBadges via v-bind.
Overriding with :pricing="undefined" works, but it’s brittle. Consider binding only the props NodeBadges accepts.

♻️ Suggested refactor
 const { startDrag } = useNodeDrag()
 const badges = usePartitionedBadges(nodeData)
+const badgeGroups = computed(() => {
+  const { pricing, ...rest } = badges.value
+  return rest
+})
-        <NodeBadges v-bind="badges" :pricing="undefined" />
+        <NodeBadges v-bind="badgeGroups" />

126-164: Use shared button components for the bottom actions.
The raw <button> elements bypass the repo’s common button components, which can lead to inconsistent theming and behavior. Consider swapping each action to IconTextButton/TextButton (or similar) from src/components/button/ and moving the v-if/else chain onto those components.

Based on learnings: In Vue files across the ComfyUI_frontend repo, when a button is needed, prefer the repo's common button components from src/components/button/ (IconButton.vue, TextButton.vue, IconTextButton.vue) over plain HTML elements. These components wrap PrimeVue with the project’s design system styling. Use only the common button components for consistency and theming, and import them from src/components/button/ as needed.

@AustinMroz AustinMroz added the New Browser Test Expectations New browser test screenshot should be set by github action label Feb 4, 2026
@github-actions
Copy link

github-actions bot commented Feb 4, 2026

Updating Playwright Expectations

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

Caution

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

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

150-172: ⚠️ Potential issue | 🟡 Minor

Test targets dblclick but the component uses @click.stop.

The test triggers a dblclick event and claims to test the @dblclick.stop directive, but LGraphNode.vue (line 146) uses @click.stop. The assertion only checks that the button exists, which doesn't verify event propagation behavior. Consider either:

  1. Testing click instead of dblclick
  2. Actually verifying that propagation is stopped by checking a parent handler wasn't called
🧪 Suggested fix to test click propagation
   it('should prevent event propagation on double click', async () => {
+  it('should prevent event propagation on click', async () => {
     await setupMocks(true) // isSubgraph = true

     const wrapper = createWrapper({
       nodeData: createMockNodeData('test-node-1')
     })

     await wrapper.vm.$nextTick()

     const subgraphButton = wrapper.find('[data-testid="subgraph-enter-button"]')

-    // Mock event object
-    const mockEvent = {
-      stopPropagation: vi.fn()
-    }
-
-    // Trigger dblclick event
-    await subgraphButton.trigger('dblclick', mockEvent)
-
-    // Should prevent propagation (handled by `@dblclick.stop` directive)
-    // This is tested by ensuring the component doesn't error and renders correctly
-    expect(subgraphButton.exists()).toBe(true)
+    // Trigger click event - Vue's .stop modifier prevents propagation
+    await subgraphButton.trigger('click')
+
+    // Verify button still exists and component renders correctly
+    expect(subgraphButton.exists()).toBe(true)
   })
🤖 Fix all issues with AI agents
In `@src/components/rightSidePanel/RightSidePanel.vue`:
- Around line 95-110: The Error tab is shown when getNodeErrors returns empty
arrays because selectedNodeErrors only filters falsy values; update the
selectedNodeErrors computed to exclude empty arrays (and/or empty objects) by
mapping selectedNodes via executionStore.getNodeErrors and then filtering where
the result is truthy and has a nonzero length (e.g., nodeError &&
nodeError.length > 0) or use flatMap + filter(Boolean) to produce a flat list of
actual errors; ensure the tabs computed checks selectedNodeErrors.value.length
after this change so the Error tab only appears when there are real errors.

In `@src/renderer/extensions/vueNodes/components/LGraphNode.vue`:
- Line 123: The NodeBadges component is receiving an undeclared pricing prop
because v-bind="badges" spreads everything returned from usePartitionedBadges;
update the call site to only pass declared props by destructuring the badges
object (extract hasComfyBadge, core, extension) and then bind those explicitly
to NodeBadges, or replace v-bind="badges" with explicit bindings
:hasComfyBadge="hasComfyBadge" :core="core" :extension="extension" so pricing is
not forwarded; adjust references to the badges variable accordingly.
🧹 Nitpick comments (3)
src/renderer/extensions/vueNodes/components/NodeBadges.vue (1)

26-27: Consider using a more robust key if badge.text may not be unique.

Using badge.text as the key assumes each badge has a unique text within the array. If duplicates are possible, consider using the index or a combination: :key="\${badge.text}-${index}`"`.

Also applies to: 39-40

src/renderer/extensions/vueNodes/components/LGraphNode.vue (1)

136-142: Avoid calling useRightSidePanelStore() directly in the template.

Instantiating the store in the template on each click is suboptimal. Extract this to a method or access the store via a constant in the script section.

♻️ Suggested fix

Add to script:

const rightSidePanelStore = useRightSidePanelStore()

Then in template:

       <button
         v-if="hasAnyError"
-        `@click.stop`="useRightSidePanelStore().openPanel('error')"
+        `@click.stop`="rightSidePanelStore.openPanel('error')"
       >

Note: useRightSidePanelStore is already imported (line 243), but a constant reference should be created.

src/renderer/extensions/vueNodes/components/LGraphNode.subgraph.test.ts (1)

1-3: Update the file comment to reflect the actual component under test.

The comment still says "Tests for NodeHeader subgraph functionality" but this file now tests LGraphNode. Consider updating to match the new describe block name.

♻️ Suggested fix
 /**
- * Tests for NodeHeader subgraph functionality
+ * Tests for LGraphNode subgraph functionality
  */

@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label 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 (2)
src/renderer/extensions/vueNodes/components/NodeHeader.vue (1)

158-164: ⚠️ Potential issue | 🟡 Minor

User-facing strings should use i18n.

The status badge text values "Muted" and "Bypassed" (lines 160, 162) are hardcoded English strings. Per coding guidelines, user-facing strings should use vue-i18n. As per coding guidelines: "Use vue-i18n for ALL user-facing strings, configured in src/locales/en/main.json".

🌐 Suggested fix
 const statusBadge = computed((): NodeBadgeProps | undefined =>
   muted.value
-    ? { text: 'Muted', cssIcon: 'icon-[lucide--ban]' }
+    ? { text: t('g.muted'), cssIcon: 'icon-[lucide--ban]' }
     : bypassed.value
-      ? { text: 'Bypassed', cssIcon: 'icon-[lucide--redo-dot]' }
+      ? { text: t('g.bypassed'), cssIcon: 'icon-[lucide--redo-dot]' }
       : undefined
 )

You'll need to add useI18n import and add the translation keys to src/locales/en/main.json.

src/renderer/extensions/vueNodes/components/LGraphNode.vue (1)

437-447: ⚠️ Potential issue | 🔴 Critical

Replace bg-error with bg-destructive-background.

The class bg-error is not defined in the Tailwind theme. The semantic background class for error/destructive states is bg-destructive-background, which is properly defined in the theme. Update line 438 to use this semantic class instead.

🧹 Nitpick comments (3)
src/renderer/extensions/vueNodes/composables/usePartitionedBadges.ts (2)

41-80: Consider adding void for consistency on widget value access.

Line 54 accesses w.value without void, while lines 62 and 73 correctly use void inp.link. For consistency in establishing reactive dependencies without using the value, consider adding void:

♻️ Suggested fix
         nodeData?.widgets?.forEach((w) => {
-            if (relevantNames.includes(w.name)) w.value
+            if (relevantNames.includes(w.name)) void w.value
           })

89-102: Consider extracting the magic emoji constant.

The '🦊' emoji is used as a marker for core Comfy nodes. Consider extracting this to a named constant for clarity and maintainability:

♻️ Suggested improvement
+const COMFY_CORE_BADGE_MARKER = '🦊'
+
 export function usePartitionedBadges(nodeData: VueNodeData) {
   // ...
-        if (source === '🦊') isCoreNode = true
+        if (source === COMFY_CORE_BADGE_MARKER) isCoreNode = true
src/renderer/extensions/vueNodes/components/LGraphNode.vue (1)

134-140: Move store access from template to script.

Calling useRightSidePanelStore().openPanel('error') directly in the template instantiates the store on each render evaluation. Consider moving this to a handler function in the script section for better performance and readability.

♻️ Suggested refactor

In the script section, add:

const rightSidePanelStore = useRightSidePanelStore()

function handleShowErrors() {
  rightSidePanelStore.openPanel('error')
}

Then in the template:

       <button
         v-if="hasAnyError"
-        `@click.stop`="useRightSidePanelStore().openPanel('error')"
+        `@click.stop`="handleShowErrors"
       >

Note: useRightSidePanelStore is already imported at line 241, but it's only used inside showAdvancedState. You could reuse that pattern or hoist the store reference.

christian-byrne added a commit that referenced this pull request Feb 6, 2026
## Summary

Increase stroke/outline weight for active node states to improve
visibility during workflow execution (COM-7770).

## Changes

- **What**: Increased border/stroke weight from 2 to 3 for active nodes
in both Vue Nodes and LiteGraph renderers
  - Vue Nodes: `outline-2` → `outline-3` in `LGraphNode.vue`
- LiteGraph: `lineWidth: 3` for `running` stroke (was default 1) and
`executionError` stroke (was 2) in `litegraphService.ts`
  - Updated test assertion to match

## Review Focus

Minimal visual change. The `executionError` lineWidth was also bumped
from 2 → 3 so error states remain at least as prominent as running
states.

> **Note:**
[#8603](#8603) (by
@AustinMroz) also modifies `LGraphNode.vue` with a larger restructuring
(bottom buttons, badges, resize handle). The two PRs do not conflict —
#8603 does not touch the outline/border state classes or
`litegraphService.ts`, so both changes merge cleanly.

---------

Co-authored-by: Alexander Brown <drjkl@comfy.org>
Co-authored-by: github-actions <github-actions@github.com>
Core attributes are grouped into a single badge, regardless of badge
display settings. Trying to determine and split out portions of this
badge based on properties is not feasible. Instead, sections are
individually derived and the badge is instead skipped.

This core badge is always added on the node and simply skipped during
display if it's text field is empty.The node badge extension is always
registered first, but there remains a slim possibility that some custom
node intentionally pushes it's badge to the front of the badges list
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/renderer/extensions/vueNodes/composables/usePartitionedBadges.ts`:
- Line 84: nodeDefsByName[nodeData.type] can be undefined and the code later
reads properties like nodeDef.isCoreNode unguarded; update the logic around the
lookup (the line assigning nodeDef from
useNodeDefStore().nodeDefsByName[nodeData.type]) to handle a missing entry by
either early-returning a safe default or adding a guard and using optional
chaining when accessing nodeDef properties (e.g., in the functions/conditions
that reference nodeDef.isCoreNode, nodeDef.something on lines ~90,102,106,108).
Ensure the code referencing nodeDef (the variable named nodeDef, the
useNodeDefStore call, and any checks against nodeData.type) checks for undefined
and handles it gracefully (return default badge data or skip core-only logic) so
no TypeError is thrown at runtime.
🧹 Nitpick comments (2)
src/renderer/extensions/vueNodes/composables/usePartitionedBadges.ts (2)

54-59: Inconsistent reactive-dependency access pattern: missing void on Line 57.

Lines 49, 65, and 76 use void expr to signal "side-effect-only access" to the reader and to suppress lint warnings for unused expressions. Line 57 (w.value) is the only place that omits void, which may trigger a "no-unused-expressions" lint error.

Suggested fix
         nodeData?.widgets?.forEach((w) => {
-            if (relevantNames.includes(w.name)) w.value
+            if (relevantNames.includes(w.name)) void w.value
         })

114-123: slice(1) relies on an implicit ordering convention that the core badge is always first.

The commit message notes this dependency: the node-badge extension must always register first. If a custom node extension registers before it, the wrong badge gets skipped. Consider adding a brief inline comment explaining the invariant (and why the first element is dropped) so future maintainers don't have to consult git history.

}
return [...(nodeData?.badges ?? [])].map(toValue)
})
const nodeDef = useNodeDefStore().nodeDefsByName[nodeData.type]
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

Potential TypeError if nodeData.type is missing from nodeDefsByName.

nodeDefsByName[nodeData.type] can return undefined for unregistered or dynamically-created node types. The result is accessed unconditionally on lines 90, 102, 106, and 108 (e.g., nodeDef.isCoreNode), which would throw at runtime.

Suggested guard
   const nodeDef = useNodeDefStore().nodeDefsByName[nodeData.type]
+  if (!nodeDef) {
+    return computed(() => ({
+      hasComfyBadge: false,
+      core: [],
+      extension: [],
+      pricing: []
+    }))
+  }
   return computed(() => {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const nodeDef = useNodeDefStore().nodeDefsByName[nodeData.type]
const nodeDef = useNodeDefStore().nodeDefsByName[nodeData.type]
if (!nodeDef) {
return computed(() => ({
hasComfyBadge: false,
core: [],
extension: [],
pricing: []
}))
}
🤖 Prompt for AI Agents
In `@src/renderer/extensions/vueNodes/composables/usePartitionedBadges.ts` at line
84, nodeDefsByName[nodeData.type] can be undefined and the code later reads
properties like nodeDef.isCoreNode unguarded; update the logic around the lookup
(the line assigning nodeDef from
useNodeDefStore().nodeDefsByName[nodeData.type]) to handle a missing entry by
either early-returning a safe default or adding a guard and using optional
chaining when accessing nodeDef properties (e.g., in the functions/conditions
that reference nodeDef.isCoreNode, nodeDef.something on lines ~90,102,106,108).
Ensure the code referencing nodeDef (the variable named nodeDef, the
useNodeDefStore call, and any checks against nodeData.type) checks for undefined
and handles it gracefully (return default badge data or skip core-only logic) so
no TypeError is thrown at runtime.

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/renderer/extensions/vueNodes/composables/usePartitionedBadges.ts`:
- Around line 114-123: The loop in usePartitionedBadges currently uses
unpartitionedBadges.value.slice(1) which silently skips the first badge; instead
explicitly filter out the already-handled source badge by comparing badge.text
to nodeDef.nodeSource?.badgeText (or a derived sourceText) before processing.
Update the iteration to run over all unpartitionedBadges.value and skip any
badge whose text matches the node source badge, then keep the existing handling
for isCreditsBadge, splitAroundFirstSpace -> pricing, and pushing into extension
to avoid dropping or duplicating badges.
🧹 Nitpick comments (1)
src/renderer/extensions/vueNodes/composables/usePartitionedBadges.ts (1)

56-58: Use void for consistency with other reactive-dependency accesses.

Lines 65 and 76 correctly use void inp.link to signal intent, but Line 57 leaves w.value as a bare expression. This is inconsistent and may trigger lint warnings for unused expressions.

Proposed fix
           nodeData?.widgets?.forEach((w) => {
-            if (relevantNames.includes(w.name)) w.value
+            if (relevantNames.includes(w.name)) void w.value
           })

Comment on lines +114 to +123
for (const badge of unpartitionedBadges.value.slice(1)) {
if (!badge.text) continue

if (isCreditsBadge(badge)) {
const [required, rest] = splitAroundFirstSpace(badge.text)
pricing.push({ required, rest })
continue
}
extension.push(badge)
}
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

slice(1) silently skips the first badge — fragile implicit coupling.

This assumes the first badge in unpartitionedBadges is always the node-source badge that's already handled by the explicit nodeDef.nodeSource?.badgeText logic above. If badge ordering changes upstream or a node lacks the expected first badge, this will either drop a real badge or include a duplicate.

Consider a more robust approach: filter out the already-handled source badge explicitly (e.g., by comparing against sourceText or using a predicate) rather than relying on positional indexing.

🤖 Prompt for AI Agents
In `@src/renderer/extensions/vueNodes/composables/usePartitionedBadges.ts` around
lines 114 - 123, The loop in usePartitionedBadges currently uses
unpartitionedBadges.value.slice(1) which silently skips the first badge; instead
explicitly filter out the already-handled source badge by comparing badge.text
to nodeDef.nodeSource?.badgeText (or a derived sourceText) before processing.
Update the iteration to run over all unpartitionedBadges.value and skip any
badge whose text matches the node source badge, then keep the existing handling
for isCreditsBadge, splitAroundFirstSpace -> pricing, and pushing into extension
to avoid dropping or duplicating badges.

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant