Skip to content

feat/fix: App mode QA updates#9439

Merged
pythongosssss merged 20 commits intomainfrom
pysssss/app-mode-fixes
Mar 6, 2026
Merged

feat/fix: App mode QA updates#9439
pythongosssss merged 20 commits intomainfrom
pysssss/app-mode-fixes

Conversation

@pythongosssss
Copy link
Member

@pythongosssss pythongosssss commented Mar 5, 2026

Summary

Various fixes from app mode QA

Changes

  • What:

  • fix: prevent inserting nodes from workflow/apps sidebar tabs

  • fix: hide json extension in workflow tab

  • fix: hide apps nav button in apps tab when already in apps mode

  • fix: center text on arrange page

  • fix: prevent IoItems from "jumping" due to stale transform after drag and drop op

  • fix: refactor side panels and add custom stable pixel based sizing

  • fix: make outputs/inputs lists in app builder scrollable

  • fix: fix rerun not working correctly

  • feat: add text to interrupt button

  • feat: add enter app mode button to builder toolbar

  • feat: add tooltip to download button on linear view

  • feat: show last output of workflow in arrange tab if available

  • feat: show download count in download all button, hide if only 1 asset to download

Review Focus

  • Rerun - I am not sure why it was triggering widget actions, removing it seemed like the correct fix
  • useStablePrimeVueSplitter - this is a workaround for the fact it uses percent sizing, I also tried switching to reka-ui splitters, but they also only support % sizing in our version [pixel based looks to have been added in a newer version, will log an issue to upgrade & replace splitters with this]

Screenshots (if applicable)

image image image image image image

┆Issue is synchronized with this Notion page by Unito

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/06/2026, 07:57:31 PM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

🎭 Playwright: ✅ 555 passed, 0 failed · 2 flaky

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 5, 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

Refactors AppBuilder inputs/outputs to a DraggableList/IoItem/PropertiesAccordionItem structure, adds Enter App Mode wiring and app-mode awareness in sidebars and menu, centralizes media previews into MediaOutputPreview, introduces useStablePrimeVueSplitterSizer with tests for persistent Splitter widths, and several UI/utility tweaks.

Changes

Cohort / File(s) Summary
App Builder
src/components/builder/AppBuilder.vue
Large restructure of inputs/outputs UI: full-height column layout, DraggableList + IoItem composition, PropertiesAccordionItem for inputs/outputs, explicit empty/unknown widget handling, and state-driven rename/remove controls.
Builder Menu & Sidebar App Mode
src/components/builder/BuilderMenu.vue, src/components/sidebar/tabs/AppsSidebarTab.vue, src/components/sidebar/tabs/BaseWorkflowsSidebarTab.vue, src/locales/en/main.json
Replaced static buttons with menuItems-driven menu, added Enter App Mode action and setMode/isAppMode wiring, removed labelTransform prop and strip-suffix helper, and added/adjusted locale strings.
Media Preview Consolidation
src/renderer/extensions/linearMode/MediaOutputPreview.vue, src/renderer/extensions/linearMode/LinearPreview.vue, src/renderer/extensions/linearMode/LinearArrange.vue, src/renderer/extensions/linearMode/ImagePreview.vue
Added MediaOutputPreview component and replaced multiple inline media branches in LinearPreview/LinearArrange with unified media rendering; integrated node output lookup and forwarded attrs/classes.
Splitter Sizing & Persistence
src/composables/useStablePrimeVueSplitterSizer.ts, src/composables/useStablePrimeVueSplitterSizer.test.ts, src/views/LinearView.vue
New composable to persist PrimeVue Splitter panel widths via per-panel useStorage keys, unit tests added, LinearView wired to use onResizeEnd, dynamic splitter remounting (splitterKey) and panel refs.
Draggable Utility & Small Tweaks
src/scripts/ui/draggableList.ts, src/renderer/extensions/linearMode/LinearArrange.vue, src/renderer/extensions/linearMode/LinearPreview.vue
Deferred re-adding is-idle to next animation frame for smoother transitions, minor typing fixes, removed lazy 3D import, simplified rerun/load flow and download UI logic.
Tests & Browser Tests
src/composables/useStablePrimeVueSplitterSizer.test.ts, browser_tests/tests/*.spec.ts
Added comprehensive tests for splitter sizer; updated browser tests to remove .json suffixes from workflow names to match new labeling.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Splitter as Splitter (PrimeVue)
    participant LinearView as LinearView (Vue)
    participant Sizer as useStablePrimeVueSplitterSizer (Composable)
    participant Storage as localStorage
    participant DOM as PanelElements

    User->>Splitter: drag resize handle
    Splitter->>LinearView: emit resizeend(event)
    LinearView->>Sizer: onResizeEnd(event)
    Sizer->>DOM: read panels' offsetWidth
    Sizer->>Storage: persist widths via useStorage keys

    rect rgba(100, 150, 200, 0.5)
    Note over LinearView,Sizer: On watchSources change (immediate apply)
    LinearView->>Sizer: watch triggers applyStoredWidths()
    Sizer->>Storage: read stored widths
    Sizer->>DOM: set flex-basis and fix flexGrow/flexShrink
    end

    DOM->>User: panels rendered with persisted widths
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

size:XXL

Suggested reviewers

  • AustinMroz

Poem

🐰 I hopped through code to keep widths true,
I nudged the lists so items dance anew,
Previews gather in one cozy view,
Menus and modes now know what to do —
Hooray, small rabbit cheers for you!

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

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.
Title check ❓ Inconclusive The title 'feat/fix: App mode QA updates' is vague and generic, using non-descriptive terms that don't convey meaningful information about the specific changes in this multi-file, multi-feature changeset. Provide a more specific title that highlights the primary change or dominant theme, such as 'refactor: stabilize app mode UI with pixel-based panel sizing and sidebar navigation fixes' or focus on the main feature.
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The PR description is comprehensive and well-structured, covering multiple fixes and features with clear categorization, review focus notes, and supporting screenshots that align with the template structure.

✏️ 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 pysssss/app-mode-fixes

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 Mar 5, 2026

📦 Bundle: 4.53 MB gzip 🔴 +221 B

Details

Summary

  • Raw size: 21.2 MB baseline 21.2 MB — 🔴 +3.26 kB
  • Gzip: 4.53 MB baseline 4.53 MB — 🔴 +221 B
  • Brotli: 3.5 MB baseline 3.5 MB — 🔴 +599 B
  • Bundles: 233 current • 233 baseline • 116 added / 116 removed

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

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-79HbUU4d.js (new) 28.9 kB 🔴 +28.9 kB 🔴 +11.4 kB 🔴 +9.33 kB
assets/index-Bj1Gf_ep.js (removed) 28.9 kB 🟢 -28.9 kB 🟢 -11.4 kB 🟢 -9.32 kB

Status: 1 added / 1 removed

Graph Workspace — 938 kB (baseline 935 kB) • 🔴 +3.03 kB

Graph editor runtime, canvas, workflow orchestration

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

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-1Ibz3YKI.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.82 kB
assets/CloudSurveyView-C8_tti22.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.31 kB 🟢 -2.82 kB
assets/CloudLoginView-BBVGtehu.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.2 kB 🔴 +2.83 kB
assets/CloudLoginView-D8k-6ImZ.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.21 kB 🟢 -2.85 kB
assets/CloudSignupView-BJex9BzF.js (removed) 9.41 kB 🟢 -9.41 kB 🟢 -2.72 kB 🟢 -2.38 kB
assets/CloudSignupView-BqGKpt0g.js (new) 9.41 kB 🔴 +9.41 kB 🔴 +2.71 kB 🔴 +2.39 kB
assets/UserCheckView-D5_-DA8P.js (removed) 8.42 kB 🟢 -8.42 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/UserCheckView-sx9-qNT2.js (new) 8.42 kB 🔴 +8.42 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/CloudLayoutView-CDCQ5PHe.js (removed) 6.47 kB 🟢 -6.47 kB 🟢 -2.12 kB 🟢 -1.85 kB
assets/CloudLayoutView-CF0PlP-W.js (new) 6.47 kB 🔴 +6.47 kB 🔴 +2.12 kB 🔴 +1.85 kB
assets/CloudForgotPasswordView-BfZ1VSAa.js (removed) 5.59 kB 🟢 -5.59 kB 🟢 -1.95 kB 🟢 -1.72 kB
assets/CloudForgotPasswordView-Dr7-W7F5.js (new) 5.59 kB 🔴 +5.59 kB 🔴 +1.94 kB 🔴 +1.73 kB
assets/CloudAuthTimeoutView-B5jHtAY3.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.79 kB 🟢 -1.57 kB
assets/CloudAuthTimeoutView-BARpOMB9.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/CloudSubscriptionRedirectView-CBpKlt-h.js (removed) 4.78 kB 🟢 -4.78 kB 🟢 -1.8 kB 🟢 -1.59 kB
assets/CloudSubscriptionRedirectView-DFvUQqXt.js (new) 4.78 kB 🔴 +4.78 kB 🔴 +1.8 kB 🔴 +1.59 kB
assets/UserSelectView-2-QIKxJ0.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.47 kB
assets/UserSelectView-tu0NTvWk.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.47 kB
assets/CloudSorryContactSupportView-kf2atGXo.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-C7XcDoLd.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-Dmxvsgv5.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.3 kB 🔴 +4.66 kB
assets/SecretsPanel-YU87pskZ.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.65 kB
assets/LegacyCreditsPanel-BDb8GmCK.js (removed) 20.7 kB 🟢 -20.7 kB 🟢 -5.59 kB 🟢 -4.91 kB
assets/LegacyCreditsPanel-CxUa8ejx.js (new) 20.7 kB 🔴 +20.7 kB 🔴 +5.58 kB 🔴 +4.91 kB
assets/SubscriptionPanel-B3kMl5IN.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.76 kB 🟢 -4.18 kB
assets/SubscriptionPanel-BP2Ayf-8.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.76 kB 🔴 +4.18 kB
assets/KeybindingPanel-CpLiGvrw.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.54 kB 🟢 -3.13 kB
assets/KeybindingPanel-DjqeKhbO.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.53 kB 🔴 +3.13 kB
assets/AboutPanel-BoPc4SY0.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.74 kB 🟢 -2.46 kB
assets/AboutPanel-C9LQALsH.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.74 kB 🔴 +2.48 kB
assets/ExtensionPanel-CExL0ayK.js (removed) 9.42 kB 🟢 -9.42 kB 🟢 -2.67 kB 🟢 -2.37 kB
assets/ExtensionPanel-CZk8Zk1v.js (new) 9.42 kB 🔴 +9.42 kB 🔴 +2.67 kB 🔴 +2.38 kB
assets/ServerConfigPanel-BeIfqK_d.js (new) 6.49 kB 🔴 +6.49 kB 🔴 +2.13 kB 🔴 +1.92 kB
assets/ServerConfigPanel-h5oOqKZm.js (removed) 6.49 kB 🟢 -6.49 kB 🟢 -2.14 kB 🟢 -1.93 kB
assets/UserPanel-1fnohr1t.js (new) 6.2 kB 🔴 +6.2 kB 🔴 +2 kB 🔴 +1.76 kB
assets/UserPanel-MoNj9Zp7.js (removed) 6.2 kB 🟢 -6.2 kB 🟢 -2.01 kB 🟢 -1.77 kB
assets/cloudRemoteConfig-Bi9DoCPc.js (removed) 1.48 kB 🟢 -1.48 kB 🟢 -721 B 🟢 -627 B
assets/cloudRemoteConfig-Bt53Go-Q.js (new) 1.48 kB 🔴 +1.48 kB 🔴 +721 B 🔴 +627 B
assets/refreshRemoteConfig-BdMfADfJ.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -519 B 🟢 -472 B
assets/refreshRemoteConfig-CqaJ-aTN.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +520 B 🔴 +458 B
assets/config-CH_cdA2N.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-71sPPmDw.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B4se7HWo.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B7IP4XTb.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BntF-aiB.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BnWq3fMI.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BsTYoQcE.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bwt_U2hc.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CFCCJ6bh.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CiXfim_M.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DKOsOORk.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-LhJVbur1.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

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-BnjrQJo4.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +986 B
assets/auth-CEhpsmuu.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -990 B
assets/SignUpForm-B-XYQvD3.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.1 kB
assets/SignUpForm-B8KgOcAE.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/UpdatePasswordContent-ChD-Rcfy.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1.09 kB 🟢 -960 B
assets/UpdatePasswordContent-CVGIaOkK.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1.09 kB 🔴 +963 B
assets/firebaseAuthStore-B1Gv0EY6.js (removed) 831 B 🟢 -831 B 🟢 -408 B 🟢 -364 B
assets/firebaseAuthStore-Csem74Gq.js (new) 831 B 🔴 +831 B 🔴 +402 B 🔴 +357 B
assets/auth-DBnu8lTv.js (new) 357 B 🔴 +357 B 🔴 +225 B 🔴 +191 B
assets/auth-DTBY1oAJ.js (removed) 357 B 🟢 -357 B 🟢 -223 B 🟢 -194 B
assets/PasswordFields-B4903XLX.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-CssIUQnt.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-DeRcdC4F.js (removed) 75.8 kB 🟢 -75.8 kB 🟢 -16.1 kB 🟢 -13.7 kB
assets/useShareDialog-gHS2vRp2.js (new) 75.8 kB 🔴 +75.8 kB 🔴 +16.1 kB 🔴 +13.8 kB
assets/useSubscriptionDialog-6iT9eKOa.js (new) 779 B 🔴 +779 B 🔴 +393 B 🔴 +342 B
assets/useSubscriptionDialog-BTfmJyL3.js (removed) 779 B 🟢 -779 B 🟢 -398 B 🟢 -342 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-D6xT7gZo.js (new) 9.87 kB 🔴 +9.87 kB 🔴 +3.41 kB 🔴 +3.01 kB
assets/useTerminalTabs-DxI8YDbY.js (removed) 9.87 kB 🟢 -9.87 kB 🟢 -3.41 kB 🟢 -3 kB
assets/ComfyQueueButton-0KpXM8nb.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.49 kB 🟢 -2.23 kB
assets/ComfyQueueButton-BhiZYd8e.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.49 kB 🔴 +2.23 kB
assets/SubscribeButton-C5l3G9BZ.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.01 kB 🔴 +881 B
assets/SubscribeButton-C8ne57sG.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1.01 kB 🟢 -886 B
assets/cloudFeedbackTopbarButton-CDNmXDZB.js (new) 1.64 kB 🔴 +1.64 kB 🔴 +869 B 🔴 +784 B
assets/cloudFeedbackTopbarButton-CrZMHEyk.js (removed) 1.64 kB 🟢 -1.64 kB 🟢 -872 B 🟢 -784 B
assets/ComfyQueueButton-B2SEvdmD.js (new) 836 B 🔴 +836 B 🔴 +409 B 🔴 +365 B
assets/ComfyQueueButton-C1M_KIX1.js (removed) 836 B 🟢 -836 B 🟢 -412 B 🟢 -365 B
assets/Button-N_vwQyKM.js 3.08 kB 3.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-CXz10wN-.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-CCyXrnmF.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-Cy9Nq-C_.js 5.95 kB 5.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/toggle-group-C6BH2eSy.js 3.83 kB 3.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-CEVxj-GC.js 7.39 kB 7.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-B9_AHnQI.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-CaR97ZzR.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.75 MB (baseline 2.75 MB) • 🔴 +93 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-P7dPL7Hm.js (new) 1.92 MB 🔴 +1.92 MB 🔴 +430 kB 🔴 +323 kB
assets/dialogService-DZUvJuRX.js (removed) 1.92 MB 🟢 -1.92 MB 🟢 -430 kB 🟢 -323 kB
assets/api-DPgG1zcS.js (new) 689 kB 🔴 +689 kB 🔴 +155 kB 🔴 +124 kB
assets/api-JHZ_Cfrx.js (removed) 689 kB 🟢 -689 kB 🟢 -155 kB 🟢 -124 kB
assets/load3dService-q1MlQIIi.js (removed) 91.1 kB 🟢 -91.1 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/load3dService-Uu_m0W3N.js (new) 91.1 kB 🔴 +91.1 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/extensionStore-BzHTRFt_.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -4.63 kB 🟢 -4.1 kB
assets/extensionStore-C8N7HLLl.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +4.63 kB 🔴 +4.1 kB
assets/workflowShareService--ZwxBGWW.js (removed) 13.1 kB 🟢 -13.1 kB 🟢 -4.01 kB 🟢 -3.55 kB
assets/workflowShareService-BgWmt6oa.js (new) 13.1 kB 🔴 +13.1 kB 🔴 +4 kB 🔴 +3.54 kB
assets/releaseStore-D0e4tBdL.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/releaseStore-DSWY9OvH.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/keybindingService-Cy_DNm6E.js (removed) 7.16 kB 🟢 -7.16 kB 🟢 -1.72 kB 🟢 -1.48 kB
assets/keybindingService-DX9_99yw.js (new) 7.16 kB 🔴 +7.16 kB 🔴 +1.72 kB 🔴 +1.49 kB
assets/bootstrapStore-BCy0sA_Q.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -874 B 🟢 -795 B
assets/bootstrapStore-eR0Shcy5.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +873 B 🔴 +790 B
assets/userStore-CdZBkRqI.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -719 B 🟢 -670 B
assets/userStore-CvxnufiM.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +717 B 🔴 +632 B
assets/audioService-Dll7IreI.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -847 B 🟢 -725 B
assets/audioService-gHa3fDns.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +845 B 🔴 +724 B
assets/releaseStore-B6DEs2xP.js (removed) 803 B 🟢 -803 B 🟢 -404 B 🟢 -360 B
assets/releaseStore-D0s8-FYm.js (new) 803 B 🔴 +803 B 🔴 +400 B 🔴 +356 B
assets/settingStore-CH_6RDgP.js (new) 787 B 🔴 +787 B 🔴 +401 B 🔴 +357 B
assets/settingStore-O4PYaqzV.js (removed) 787 B 🟢 -787 B 🟢 -406 B 🟢 -357 B
assets/workflowDraftStore-BeUVyeAR.js (new) 779 B 🔴 +779 B 🔴 +394 B 🔴 +349 B
assets/workflowDraftStore-qsVXA7tE.js (removed) 779 B 🟢 -779 B 🟢 -398 B 🟢 -347 B
assets/dialogService-CsuUA1Xy.js (removed) 768 B 🟢 -768 B 🟢 -389 B 🟢 -342 B
assets/dialogService-CW2kUE0d.js (new) 768 B 🔴 +768 B 🔴 +385 B 🔴 +342 B
assets/serverConfigStore-gMFb9Bxl.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 14 added / 14 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-pp2Ejqzz.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-VTFsdewx.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3dViewer-B926UuqU.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.8 kB
assets/useLoad3dViewer-mmB45hlk.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useFeatureFlags-BzDoDwQA.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.37 kB 🟢 -1.17 kB
assets/useFeatureFlags-C2E8Ci74.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.37 kB 🔴 +1.17 kB
assets/useWorkspaceUI-Dp5GyQym.js (removed) 3 kB 🟢 -3 kB 🟢 -823 B 🟢 -708 B
assets/useWorkspaceUI-X_c4ckTt.js (new) 3 kB 🔴 +3 kB 🔴 +822 B 🔴 +706 B
assets/subscriptionCheckoutUtil-BrjKyVjp.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +951 B
assets/subscriptionCheckoutUtil-DbomX9Yv.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -959 B
assets/useExternalLink-BTGSTJfY.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -773 B 🟢 -679 B
assets/useExternalLink-BuZQnlur.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +773 B 🔴 +681 B
assets/useErrorHandling-DLrecTeM.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +630 B 🔴 +532 B
assets/useErrorHandling-Dr6UrvoJ.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -630 B 🟢 -533 B
assets/useWorkspaceSwitch-DRrzA_JT.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -543 B 🟢 -483 B
assets/useWorkspaceSwitch-DwyiMIEj.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +543 B 🔴 +486 B
assets/useCopyToClipboard-B75lX_PD.js (new) 944 B 🔴 +944 B 🔴 +429 B 🔴 +367 B
assets/useCopyToClipboard-Dj7NNBxg.js (removed) 944 B 🟢 -944 B 🟢 -427 B 🟢 -366 B
assets/useLoad3d-D5iXdq28.js (removed) 902 B 🟢 -902 B 🟢 -443 B 🟢 -398 B
assets/useLoad3d-DKhJNagf.js (new) 902 B 🔴 +902 B 🔴 +442 B 🔴 +396 B
assets/useLoad3dViewer-CrlCiMRu.js (removed) 881 B 🟢 -881 B 🟢 -429 B 🟢 -385 B
assets/useLoad3dViewer-DxgpQKSl.js (new) 881 B 🔴 +881 B 🔴 +427 B 🔴 +385 B
assets/audioUtils-CANhhP6o.js (new) 858 B 🔴 +858 B 🔴 +499 B 🔴 +404 B
assets/audioUtils-FVawtiOw.js (removed) 858 B 🟢 -858 B 🟢 -500 B 🟢 -413 B
assets/useCurrentUser-CJ0L5lgP.js (removed) 765 B 🟢 -765 B 🟢 -393 B 🟢 -342 B
assets/useCurrentUser-Dt86GZeC.js (new) 765 B 🔴 +765 B 🔴 +388 B 🔴 +341 B
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-DskRKiYG.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-CC-l-L9z.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DOdPeMQc.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-udjgEG1T.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

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

External libraries and shared vendor chunks

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

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-DEK4x2S5.js (new) 542 kB 🔴 +542 kB 🔴 +105 kB 🔴 +82.2 kB
assets/i18n-DDvq0t34.js (removed) 542 kB 🟢 -542 kB 🟢 -105 kB 🟢 -82.2 kB
assets/core-DceJknV-.js (removed) 73.8 kB 🟢 -73.8 kB 🟢 -19 kB 🟢 -16.3 kB
assets/core-oXCcLMkn.js (new) 73.8 kB 🔴 +73.8 kB 🔴 +19 kB 🔴 +16.3 kB
assets/groupNode-0XT1ggJn.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.5 kB
assets/groupNode-CQU9_-Ng.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.6 kB
assets/WidgetSelect-BHiz-S-7.js (new) 58.3 kB 🔴 +58.3 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/WidgetSelect-CuLRYE_0.js (removed) 58.3 kB 🟢 -58.3 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-B6qn_4hE.js (new) 46.3 kB 🔴 +46.3 kB 🔴 +8.65 kB 🔴 +7.5 kB
assets/SubscriptionRequiredDialogContentWorkspace-BH2h8Itq.js (removed) 46.3 kB 🟢 -46.3 kB 🟢 -8.65 kB 🟢 -7.5 kB
assets/WidgetPainter-CU4zvRIK.js (new) 32.9 kB 🔴 +32.9 kB 🔴 +7.97 kB 🔴 +7.06 kB
assets/WidgetPainter-ylpSIRis.js (removed) 32.9 kB 🟢 -32.9 kB 🟢 -7.97 kB 🟢 -7.07 kB
assets/Load3DControls-CrsHkhdt.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/Load3DControls-yPvX5Agl.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/WorkspacePanelContent-5Iut3gwR.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.16 kB 🟢 -5.41 kB
assets/WorkspacePanelContent-hmlM2jEr.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.15 kB 🔴 +5.4 kB
assets/SubscriptionRequiredDialogContent-BrFknZGY.js (new) 25.6 kB 🔴 +25.6 kB 🔴 +6.56 kB 🔴 +5.78 kB
assets/SubscriptionRequiredDialogContent-D9LQ7O9w.js (removed) 25.6 kB 🟢 -25.6 kB 🟢 -6.56 kB 🟢 -5.78 kB
assets/Load3dViewerContent-C5-iLuwQ.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.5 kB
assets/Load3dViewerContent-CjY2WIfI.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.5 kB
assets/WidgetImageCrop-BD2GyA8n.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.52 kB 🔴 +4.84 kB
assets/WidgetImageCrop-BY7T2WuX.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.52 kB 🟢 -4.87 kB
assets/SubscriptionPanelContentWorkspace-BKIjMJpL.js (new) 22 kB 🔴 +22 kB 🔴 +5.11 kB 🔴 +4.5 kB
assets/SubscriptionPanelContentWorkspace-Y1hfgz2n.js (removed) 22 kB 🟢 -22 kB 🟢 -5.11 kB 🟢 -4.5 kB
assets/CurrentUserPopoverWorkspace-B-fcC8Mz.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -4.95 kB 🟢 -4.41 kB
assets/CurrentUserPopoverWorkspace-kCbZjY-G.js (new) 20.5 kB 🔴 +20.5 kB 🔴 +4.94 kB 🔴 +4.42 kB
assets/SignInContent-azRRc8Xo.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.77 kB 🟢 -4.18 kB
assets/SignInContent-DmZl8t3n.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.77 kB 🔴 +4.17 kB
assets/WidgetInputNumber-BB-Bmt-Z.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -4.79 kB 🟢 -4.25 kB
assets/WidgetInputNumber-CQTMskym.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +4.79 kB 🔴 +4.26 kB
assets/WidgetRecordAudio-BSbiELIJ.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +5.01 kB 🔴 +4.48 kB
assets/WidgetRecordAudio-DPSpfHAw.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -5.01 kB 🟢 -4.49 kB
assets/Load3D-CbwRNyJk.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.02 kB 🔴 +3.51 kB
assets/Load3D-Pve58S4J.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.02 kB 🟢 -3.51 kB
assets/load3d-Cw1S0gr0.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.21 kB 🔴 +3.65 kB
assets/load3d-DZy1BIFi.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.21 kB 🟢 -3.65 kB
assets/AudioPreviewPlayer-BU_nSuLo.js (removed) 11 kB 🟢 -11 kB 🟢 -3.26 kB 🟢 -2.92 kB
assets/AudioPreviewPlayer-DT3auo9R.js (new) 11 kB 🔴 +11 kB 🔴 +3.25 kB 🔴 +2.91 kB
assets/changeTracker-BYcPTtOu.js (new) 9.44 kB 🔴 +9.44 kB 🔴 +2.91 kB 🔴 +2.57 kB
assets/changeTracker-C9TqKj4D.js (removed) 9.44 kB 🟢 -9.44 kB 🟢 -2.91 kB 🟢 -2.56 kB
assets/nodeTemplates-CA8_ibiC.js (new) 9.34 kB 🔴 +9.34 kB 🔴 +3.27 kB 🔴 +2.87 kB
assets/nodeTemplates-CGEMJbU-.js (removed) 9.34 kB 🟢 -9.34 kB 🟢 -3.27 kB 🟢 -2.88 kB
assets/InviteMemberDialogContent-B5oP-plF.js (new) 7.41 kB 🔴 +7.41 kB 🔴 +2.31 kB 🔴 +2.01 kB
assets/InviteMemberDialogContent-FLabfVlG.js (removed) 7.41 kB 🟢 -7.41 kB 🟢 -2.31 kB 🟢 -2.03 kB
assets/Load3DConfiguration-BwPGb1MC.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.92 kB 🔴 +1.69 kB
assets/Load3DConfiguration-DBYVVfe8.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.92 kB 🟢 -1.68 kB
assets/CreateWorkspaceDialogContent-CpNvVo5z.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +2 kB 🔴 +1.75 kB
assets/CreateWorkspaceDialogContent-VmUL1oLL.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -2.01 kB 🟢 -1.76 kB
assets/onboardingCloudRoutes-C3YC865u.js (new) 5.51 kB 🔴 +5.51 kB 🔴 +1.88 kB 🔴 +1.63 kB
assets/onboardingCloudRoutes-DRuStaP7.js (removed) 5.51 kB 🟢 -5.51 kB 🟢 -1.88 kB 🟢 -1.64 kB
assets/FreeTierDialogContent-D0LOPPwK.js (new) 5.42 kB 🔴 +5.42 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/FreeTierDialogContent-D10yjBiu.js (removed) 5.42 kB 🟢 -5.42 kB 🟢 -1.92 kB 🟢 -1.68 kB
assets/EditWorkspaceDialogContent-Bcxd-va3.js (new) 5.36 kB 🔴 +5.36 kB 🔴 +1.96 kB 🔴 +1.71 kB
assets/EditWorkspaceDialogContent-DxD9SjUG.js (removed) 5.36 kB 🟢 -5.36 kB 🟢 -1.96 kB 🟢 -1.72 kB
assets/ValueControlPopover-BHb27CSh.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.77 kB 🔴 +1.58 kB
assets/ValueControlPopover-D4IAdwBc.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.78 kB 🟢 -1.59 kB
assets/Preview3d-B0ZEqkBh.js (removed) 4.89 kB 🟢 -4.89 kB 🟢 -1.61 kB 🟢 -1.4 kB
assets/Preview3d-JrCny-HE.js (new) 4.89 kB 🔴 +4.89 kB 🔴 +1.6 kB 🔴 +1.4 kB
assets/CancelSubscriptionDialogContent-D774Yh7O.js (removed) 4.83 kB 🟢 -4.83 kB 🟢 -1.8 kB 🟢 -1.58 kB
assets/CancelSubscriptionDialogContent-DBf5cPXp.js (new) 4.83 kB 🔴 +4.83 kB 🔴 +1.8 kB 🔴 +1.58 kB
assets/DeleteWorkspaceDialogContent-BFN5Jzs8.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.65 kB 🔴 +1.43 kB
assets/DeleteWorkspaceDialogContent-gyVrG5gW.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.65 kB 🟢 -1.45 kB
assets/WidgetTextarea-CsTLJfWp.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.64 kB 🟢 -1.44 kB
assets/WidgetTextarea-DRd6lueX.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.64 kB 🔴 +1.44 kB
assets/WidgetWithControl-CTLHaRu1.js (removed) 4.17 kB 🟢 -4.17 kB 🟢 -1.82 kB 🟢 -1.64 kB
assets/WidgetWithControl-Dc0cnALo.js (new) 4.17 kB 🔴 +4.17 kB 🔴 +1.81 kB 🔴 +1.62 kB
assets/LeaveWorkspaceDialogContent-DshsJ4mj.js (removed) 4.09 kB 🟢 -4.09 kB 🟢 -1.6 kB 🟢 -1.39 kB
assets/LeaveWorkspaceDialogContent-DU2h8-Qt.js (new) 4.09 kB 🔴 +4.09 kB 🔴 +1.59 kB 🔴 +1.39 kB
assets/RemoveMemberDialogContent-CrvkqCSI.js (new) 4.08 kB 🔴 +4.08 kB 🔴 +1.54 kB 🔴 +1.35 kB
assets/RemoveMemberDialogContent-gHLVnT7q.js (removed) 4.08 kB 🟢 -4.08 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/RevokeInviteDialogContent-6F8Kysvo.js (new) 3.99 kB 🔴 +3.99 kB 🔴 +1.56 kB 🔴 +1.37 kB
assets/RevokeInviteDialogContent-D4nnHcip.js (removed) 3.99 kB 🟢 -3.99 kB 🟢 -1.56 kB 🟢 -1.37 kB
assets/InviteMemberUpsellDialogContent-BgjnRn5F.js (removed) 3.86 kB 🟢 -3.86 kB 🟢 -1.43 kB 🟢 -1.25 kB
assets/InviteMemberUpsellDialogContent-D2ETwhNl.js (new) 3.86 kB 🔴 +3.86 kB 🔴 +1.42 kB 🔴 +1.25 kB
assets/tierBenefits-CD77NZ2A.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.3 kB 🔴 +1.16 kB
assets/tierBenefits-K5vGWxjF.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.3 kB 🟢 -1.15 kB
assets/saveMesh-BZghLr37.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +1.48 kB 🔴 +1.31 kB
assets/saveMesh-CAwyDNps.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -1.47 kB 🟢 -1.31 kB
assets/cloudSessionCookie-BhoHDKVA.js (removed) 3.14 kB 🟢 -3.14 kB 🟢 -1.11 kB 🟢 -994 B
assets/cloudSessionCookie-CzrvjMq5.js (new) 3.14 kB 🔴 +3.14 kB 🔴 +1.1 kB 🔴 +956 B
assets/GlobalToast-B64SR9-s.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.03 kB
assets/GlobalToast-Utq5IUh5.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.07 kB
assets/ApiNodesSignInContent-DF_c2vFc.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +956 B
assets/ApiNodesSignInContent-Z10Yt7Qz.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -924 B
assets/SubscribeToRun-B2HbjV7Y.js (removed) 2.06 kB 🟢 -2.06 kB 🟢 -950 B 🟢 -829 B
assets/SubscribeToRun-t9IwoYSp.js (new) 2.06 kB 🔴 +2.06 kB 🔴 +949 B 🔴 +829 B
assets/CloudRunButtonWrapper-BhIXbb5s.js (new) 1.72 kB 🔴 +1.72 kB 🔴 +801 B 🔴 +722 B
assets/CloudRunButtonWrapper-DfHhLK3P.js (removed) 1.72 kB 🟢 -1.72 kB 🟢 -804 B 🟢 -727 B
assets/signInSchema-Bt5yMYkC.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -564 B 🟢 -514 B
assets/signInSchema-DM6JfW9k.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +565 B 🔴 +519 B
assets/cloudBadges-iIJ5bvxf.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +721 B 🔴 +622 B
assets/cloudBadges-Ud7yhle4.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -725 B 🟢 -634 B
assets/previousFullPath-BVdLLEH8.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -652 B 🟢 -577 B
assets/previousFullPath-CWJmNDXf.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +652 B 🔴 +576 B
assets/cloudSubscription-B7Y3Yd66.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +672 B 🔴 +584 B
assets/cloudSubscription-BLmludwe.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -675 B 🟢 -586 B
assets/Load3D-Dt_LmRG0.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +518 B 🔴 +461 B
assets/Load3D-j4Fr_g9L.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -516 B 🟢 -459 B
assets/nightlyBadges-CubIvgVv.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +546 B 🔴 +487 B
assets/nightlyBadges-DtZD9vj-.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -548 B 🟢 -489 B
assets/Load3dViewerContent-b8YoyId2.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -486 B 🟢 -441 B
assets/Load3dViewerContent-K59lFLru.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +487 B 🔴 +430 B
assets/SubscriptionPanelContentWorkspace-BZvgo8WI.js (removed) 963 B 🟢 -963 B 🟢 -458 B 🟢 -395 B
assets/SubscriptionPanelContentWorkspace-qcWZRF-v.js (new) 963 B 🔴 +963 B 🔴 +454 B 🔴 +399 B
assets/changeTracker-CgDp9clk.js (removed) 800 B 🟢 -800 B 🟢 -404 B 🟢 -355 B
assets/changeTracker-DbTH3km3.js (new) 800 B 🔴 +800 B 🔴 +400 B 🔴 +353 B
assets/WidgetLegacy-Dd3NeLMC.js (new) 787 B 🔴 +787 B 🔴 +399 B 🔴 +348 B
assets/WidgetLegacy-WGn-t8PB.js (removed) 787 B 🟢 -787 B 🟢 -404 B 🟢 -349 B
assets/graphHasMissingNodes-08p2f7Rv.js (removed) 761 B 🟢 -761 B 🟢 -374 B 🟢 -319 B
assets/graphHasMissingNodes-X4B5SD2S.js (new) 761 B 🔴 +761 B 🔴 +375 B 🔴 +317 B
assets/i18n-DQ9NF5PK.js (new) 199 B 🔴 +199 B 🔴 +162 B 🔴 +139 B
assets/i18n-F2P7B4dC.js (removed) 199 B 🟢 -199 B 🟢 -160 B 🟢 -137 B
assets/AnimationControls-MMe3SVlD.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-Mr7ZnDOO.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-6VJcY26s.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-C9H6LVPO.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-BiqY9Lcy.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BbyDu2gv.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BEB4P0rH.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Bfucg9mP.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BMLsYxKd.js 19 kB 19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CAkQMSj_.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CCml88sK.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CXLXD2h2.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DbC3OFpW.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DSqCRthz.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DstS1-8g.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DZFUlDVf.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-Cl4K4L4H.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Loader-CW1-OX64.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BBaUZnpF.js 181 kB 181 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BdDSvujx.js 151 kB 151 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BgdDDyHY.js 211 kB 211 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CBswMsc-.js 150 kB 150 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CYHSDXJ3.js 188 kB 188 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DA1wOx7a.js 156 kB 156 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DxMfC0Xk.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DXtzF5oy.js 159 kB 159 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-HANZ9FZw.js 153 kB 153 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Ivx1LSmO.js 173 kB 173 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-k8ICB470.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-0x8HaYIi.js 1.83 kB 1.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-Cg7hEqmq.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-CsGpbloy.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-BnLYn-y9.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-lRCQfO0C.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-GUUbKzSN.js 2.78 kB 2.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-3ypc2-io.js 397 kB 397 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B8OsAZ59.js 450 kB 450 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bv39sqP1.js 451 kB 451 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CJPZB8jl.js 400 kB 400 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Ck_RbOds.js 492 kB 492 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Ct4I98dt.js 400 kB 400 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D1QSnvAe.js 416 kB 416 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DK4i8jfV.js 404 kB 404 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DRNH3qAO.js 364 kB 364 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DWeE5stC.js 368 kB 368 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-mLZFEWZZ.js 392 kB 392 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-BAz5icrP.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-DTlZN9Iz.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-Da9q2um5.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-LCL7cak3.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-D1DueXTw.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Textarea-h5LgL2vk.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-BciYDrIq.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DIRwAHBY.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-CdlYdKQ5.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-OlRrWaNc.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-BiI2RQCJ.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-DPuMBxG1.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-CcAQLD_P.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-Do6cgqtI.js 3.6 kB 3.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-jY2-DHmF.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-CTH3BU4p.js 2.89 kB 2.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-BZhqi3N7.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-CFDJ6vK7.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DWqMK-RY.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-B_kNaRoH.js 3.54 kB 3.54 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DYLaC2lj.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 56 added / 56 removed

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

🔧 Auto-fixes Applied

This PR has been automatically updated to fix linting and formatting issues.

⚠️ Important: Your local branch is now behind. Run git pull before making additional changes to avoid conflicts.

Changes made:

  • ESLint auto-fixes
  • Oxfmt formatting

@pythongosssss pythongosssss force-pushed the pysssss/app-mode-fixes branch from 91bbb11 to 7714efa Compare March 5, 2026 16:36
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
src/locales/en/main.json (1)

3037-3037: Use i18n plural forms for downloadAll count text.

This key is count-driven; using plural syntax avoids grammar drift if UI conditions change.

♻️ Proposed update
-    "downloadAll": "Download {count} assets from this run",
+    "downloadAll": "Download {count} assets from this run | Download {count} asset from this run | Download {count} assets from this run",

As per coding guidelines: "Use vue-i18n for ALL user-facing strings ... use the plurals system instead of hardcoding pluralization."

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

In `@src/locales/en/main.json` at line 3037, The "downloadAll" key currently
hardcodes a singular/plural string; replace it with a vue-i18n pluralized
message so the text varies by count (use vue-i18n plural syntax with {count}
interpolation) under the same key "downloadAll" in main.json, and ensure callers
pass the count (e.g., $t('main.downloadAll', count: n) or equivalent) so the
i18n system selects the correct plural form.
src/components/builder/AppBuilder.vue (2)

312-321: Same duplication pattern for outputs section.

Similar to the inputs section, the #empty slot (lines 312-317) and the subsequent div (lines 318-321) both display promptAddOutputs. Consider consolidating if both are not required.

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

In `@src/components/builder/AppBuilder.vue` around lines 312 - 321, The outputs
area duplicates the prompt by rendering the same text in the template slot
"#empty" and again immediately after; remove the redundant element so the prompt
is rendered only once. Locate the template with "#empty" (the slot rendering
v-text="t('linearMode.builder.promptAddOutputs')") in AppBuilder.vue and either
keep the slot and delete the subsequent div, or keep the div and remove the
"#empty" slot, ensuring only one instance of
t('linearMode.builder.promptAddOutputs') remains.

259-268: Duplicate content in empty and default slots.

The #empty slot (lines 259-264) and the subsequent div (lines 265-268) both render the same promptAddInputs text. If the #empty slot is meant for when the accordion is disabled/collapsed and the default slot for when expanded, showing identical content in both cases appears redundant.

Verify whether both are needed or if the default slot content (lines 265-268) should be removed.

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

In `@src/components/builder/AppBuilder.vue` around lines 259 - 268, The template
duplicates the same prompt in the accordion empty slot and immediately after it;
remove the redundant default div so the prompt is only rendered via the
<template `#empty`> slot (or conversely remove the <template `#empty`> and keep the
standalone div) to avoid duplicate UI text — locate the duplicate rendering in
AppBuilder.vue (the <template `#empty`> block and the following div that both use
t('linearMode.builder.promptAddInputs')) and delete the unneeded one.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/renderer/extensions/linearMode/MediaOutputPreview.vue`:
- Around line 24-54: The template lacks a final v-else fallback for unrecognized
media types so getMediaType(output) may render nothing; add a v-else branch
after the Preview3d block that renders a visible unsupported-content placeholder
(e.g., a small message/card indicating "Unsupported media type" or a generic
PreviewFallback) using attrs.class and output.url/metadata as context, and also
emit or log a warning (console.warn or a logger) including getMediaType(output)
and output.id to aid debugging; update the template around
ImagePreview/VideoPreview/Preview3d and ensure the fallback appears when
getMediaType returns unexpected values.

---

Nitpick comments:
In `@src/components/builder/AppBuilder.vue`:
- Around line 312-321: The outputs area duplicates the prompt by rendering the
same text in the template slot "#empty" and again immediately after; remove the
redundant element so the prompt is rendered only once. Locate the template with
"#empty" (the slot rendering v-text="t('linearMode.builder.promptAddOutputs')")
in AppBuilder.vue and either keep the slot and delete the subsequent div, or
keep the div and remove the "#empty" slot, ensuring only one instance of
t('linearMode.builder.promptAddOutputs') remains.
- Around line 259-268: The template duplicates the same prompt in the accordion
empty slot and immediately after it; remove the redundant default div so the
prompt is only rendered via the <template `#empty`> slot (or conversely remove the
<template `#empty`> and keep the standalone div) to avoid duplicate UI text —
locate the duplicate rendering in AppBuilder.vue (the <template `#empty`> block
and the following div that both use t('linearMode.builder.promptAddInputs')) and
delete the unneeded one.

In `@src/locales/en/main.json`:
- Line 3037: The "downloadAll" key currently hardcodes a singular/plural string;
replace it with a vue-i18n pluralized message so the text varies by count (use
vue-i18n plural syntax with {count} interpolation) under the same key
"downloadAll" in main.json, and ensure callers pass the count (e.g.,
$t('main.downloadAll', count: n) or equivalent) so the i18n system selects the
correct plural form.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 1ce04483-8010-4896-bc07-57ca3f9c10b1

📥 Commits

Reviewing files that changed from the base of the PR and between 25d8384 and 91bbb11.

📒 Files selected for processing (14)
  • src/components/builder/AppBuilder.vue
  • src/components/builder/BuilderMenu.vue
  • src/components/rightSidePanel/errors/MissingNodeCard.vue
  • src/components/sidebar/tabs/AppsSidebarTab.vue
  • src/components/sidebar/tabs/BaseWorkflowsSidebarTab.vue
  • src/composables/useStablePrimeVueSplitterSizer.test.ts
  • src/composables/useStablePrimeVueSplitterSizer.ts
  • src/locales/en/main.json
  • src/renderer/extensions/linearMode/ImagePreview.vue
  • src/renderer/extensions/linearMode/LinearArrange.vue
  • src/renderer/extensions/linearMode/LinearPreview.vue
  • src/renderer/extensions/linearMode/MediaOutputPreview.vue
  • src/scripts/ui/draggableList.ts
  • src/views/LinearView.vue

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

♻️ Duplicate comments (1)
src/renderer/extensions/linearMode/MediaOutputPreview.vue (1)

24-54: ⚠️ Potential issue | 🟡 Minor

Add a fallback branch for unsupported media types.

If getMediaType(output) returns an unexpected value, this component currently renders nothing.

💡 Proposed fallback branch
   <Preview3d
     v-else-if="getMediaType(output) === '3d'"
     :class="attrs.class as string"
     :model-url="output.url"
   />
+  <div
+    v-else
+    :class="
+      cn(
+        'flex items-center justify-center text-muted-foreground',
+        attrs.class as string
+      )
+    "
+  >
+    {{ $t('linearMode.unsupportedMediaType') }}
+  </div>
 </template>

As per coding guidelines, "Use vue-i18n for ALL user-facing strings, configured in src/locales/en/main.json."

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

In `@src/renderer/extensions/linearMode/MediaOutputPreview.vue` around lines 24 -
54, The component renders nothing for unknown media types; add a final v-else
fallback block in MediaOutputPreview that displays a user-facing message (e.g.,
a centered div or paragraph) when getMediaType(output) returns an unexpected
value, using this.$t('media.unsupported') (vue-i18n) instead of hard-coded text;
also add the corresponding key "media.unsupported" with the English message to
src/locales/en/main.json so translations are available.
🧹 Nitpick comments (2)
src/composables/useStablePrimeVueSplitterSizer.test.ts (1)

8-14: Current mock does not fully emulate useStorage key-based persistence, but tests as written do not require it.

The mock ignores the key parameter and returns a fresh ref(defaultValue) on each call, losing the real behavior where same-key calls read previously stored values. However, because no test instantiates the composable twice with the same storage key, this gap doesn't affect behavioral coverage here. Tests verify capture, apply, multi-panel independence, and null-ref handling within single composable instances—all working correctly with the current mock.

If persistence across re-instantiation becomes a behavioral requirement to test, follow the project pattern of using vi.hoisted() for per-test mock state isolation (seen throughout src/composables/*.test.ts), rather than introducing a global mutable store.

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

In `@src/composables/useStablePrimeVueSplitterSizer.test.ts` around lines 8 - 14,
The current vi.mock for useStorage ignores the key and returns a fresh ref, so
if you need same-key persistence across composable re-instantiation update the
mock to maintain a per-test key->ref map: hoist a mutable store with
vi.hoisted(), implement the mocked useStorage(key, defaultValue) to return the
existing ref for that key or create and store ref(defaultValue) if missing, and
ensure tests reset isolation by keeping the hoisted store per-test; reference
the mocked function name useStorage, the existing vi.mock call, and vi.hoisted
for where to implement the per-test state.
src/renderer/extensions/linearMode/MediaOutputPreview.vue (1)

10-12: Wrap async 3D preview rendering in a Suspense boundary.

Preview3d is async-loaded, but there is no explicit loading/error fallback in this branch. Please render it with <Suspense> for deterministic UX during load.

As per coding guidelines, "Use Suspense for async components."

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

In `@src/renderer/extensions/linearMode/MediaOutputPreview.vue` around lines 10 -
12, The async component Preview3d (created via defineAsyncComponent) must be
rendered inside a Vue <Suspense> boundary to provide deterministic loading/error
UX; update the MediaOutputPreview component to wrap the <Preview3d ... /> usage
with <Suspense> and add a fallback (e.g., a loading placeholder) in the fallback
slot and an error/fallback branch for failures so the UI shows a stable loader
while the async chunk loads and surfaces an error state if it fails.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/builder/AppBuilder.vue`:
- Around line 318-321: Remove the duplicated guidance div that's duplicating the
`#empty` template: delete the <div class="w-full p-4 pt-2 text-muted-foreground"
v-text="t('linearMode.builder.promptAddOutputs')"/> so the guidance is only
rendered by the existing `#empty` template; confirm no other duplicated
v-text("t('linearMode.builder.promptAddOutputs')") instances remain in
AppBuilder.vue.
- Around line 265-268: The div rendering the prompt via v-text
("t('linearMode.builder.promptAddInputs')") is duplicated outside the `#empty`
slot and causes the guidance to always display; remove that external div so the
prompt only appears via the PropertiesAccordionItem empty slot when there are no
inputs (refer to the PropertiesAccordionItem usage and the DraggableList/default
slot in AppBuilder.vue), leaving the `#empty` template as the sole source of the
empty-state message.

In `@src/renderer/extensions/linearMode/LinearPreview.vue`:
- Around line 110-115: In LinearPreview.vue, remove the redundant aria-label
attribute from the visible-text interrupt Button (the element rendering {{
t('linearMode.cancelThisRun') }}) so screen readers don't get duplicate labels;
locate the Button that calls commandStore.execute('Comfy.Interrupt') and delete
the :aria-label="t('linearMode.cancelThisRun')" attribute, leaving the click
handler and visible text intact.

---

Duplicate comments:
In `@src/renderer/extensions/linearMode/MediaOutputPreview.vue`:
- Around line 24-54: The component renders nothing for unknown media types; add
a final v-else fallback block in MediaOutputPreview that displays a user-facing
message (e.g., a centered div or paragraph) when getMediaType(output) returns an
unexpected value, using this.$t('media.unsupported') (vue-i18n) instead of
hard-coded text; also add the corresponding key "media.unsupported" with the
English message to src/locales/en/main.json so translations are available.

---

Nitpick comments:
In `@src/composables/useStablePrimeVueSplitterSizer.test.ts`:
- Around line 8-14: The current vi.mock for useStorage ignores the key and
returns a fresh ref, so if you need same-key persistence across composable
re-instantiation update the mock to maintain a per-test key->ref map: hoist a
mutable store with vi.hoisted(), implement the mocked useStorage(key,
defaultValue) to return the existing ref for that key or create and store
ref(defaultValue) if missing, and ensure tests reset isolation by keeping the
hoisted store per-test; reference the mocked function name useStorage, the
existing vi.mock call, and vi.hoisted for where to implement the per-test state.

In `@src/renderer/extensions/linearMode/MediaOutputPreview.vue`:
- Around line 10-12: The async component Preview3d (created via
defineAsyncComponent) must be rendered inside a Vue <Suspense> boundary to
provide deterministic loading/error UX; update the MediaOutputPreview component
to wrap the <Preview3d ... /> usage with <Suspense> and add a fallback (e.g., a
loading placeholder) in the fallback slot and an error/fallback branch for
failures so the UI shows a stable loader while the async chunk loads and
surfaces an error state if it fails.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 52e02faa-e9e3-405c-8afe-131d0b4782c7

📥 Commits

Reviewing files that changed from the base of the PR and between 91bbb11 and 7714efa.

📒 Files selected for processing (13)
  • src/components/builder/AppBuilder.vue
  • src/components/builder/BuilderMenu.vue
  • src/components/sidebar/tabs/AppsSidebarTab.vue
  • src/components/sidebar/tabs/BaseWorkflowsSidebarTab.vue
  • src/composables/useStablePrimeVueSplitterSizer.test.ts
  • src/composables/useStablePrimeVueSplitterSizer.ts
  • src/locales/en/main.json
  • src/renderer/extensions/linearMode/ImagePreview.vue
  • src/renderer/extensions/linearMode/LinearArrange.vue
  • src/renderer/extensions/linearMode/LinearPreview.vue
  • src/renderer/extensions/linearMode/MediaOutputPreview.vue
  • src/scripts/ui/draggableList.ts
  • src/views/LinearView.vue
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/renderer/extensions/linearMode/ImagePreview.vue
  • src/views/LinearView.vue
  • src/locales/en/main.json
  • src/scripts/ui/draggableList.ts

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

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/renderer/extensions/linearMode/LinearPreview.vue`:
- Around line 71-75: The rerun function is calling the runButtonClick prop
without awaiting it, which swallows errors and breaks sequencing; update the
prop definition for runButtonClick (the prop used in LinearPreview.vue) to
accept an async function/Promise-returning signature and change the rerun
function to await runButtonClick(e) after await loadWorkflow(selectedItem.value)
so the async callback's errors propagate and execution order is preserved;
ensure any callers (e.g., LinearControls.vue) still pass an async function that
returns a Promise.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: fc58f90f-b3a5-4eaf-99b2-52b4cb353f38

📥 Commits

Reviewing files that changed from the base of the PR and between 7714efa and 4e55efb.

📒 Files selected for processing (1)
  • src/renderer/extensions/linearMode/LinearPreview.vue

@pythongosssss pythongosssss marked this pull request as ready for review March 5, 2026 17:36
@pythongosssss pythongosssss requested review from a team as code owners March 5, 2026 17:36
@dosubot dosubot bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Mar 5, 2026
AustinMroz
AustinMroz previously approved these changes Mar 5, 2026
Copy link
Collaborator

@AustinMroz AustinMroz left a comment

Choose a reason for hiding this comment

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

Splitter changes are spooky, but work well from my testing.


Didn't know that reka-UI was adding pixel sizes. That's super exciting.

When I last attempted a migration, there was some bugginess where "setting a size well bellow the minimum content size for an area (as we did with 1-98-1) would require a panel be dragged the distance of this discrepency before resizing would visually occur."

Since pixel sizes would solve this, we may be able to migrate in the future.

<ZoomPane
v-if="!mobile"
v-slot="slotProps"
:class="cn('flex-1 w-full', attrs.class as string)"
Copy link
Collaborator

Choose a reason for hiding this comment

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

You can use $attrs instead of the importing useAttrs

Suggested change
:class="cn('flex-1 w-full', attrs.class as string)"
:class="cn('flex-1 w-full', $attrs.class as string)"

As a whole, I'm confused for why the attrs changes are needed in the first place. Both from my understanding of vue, and quick testing, the padding changes in LinearArrange will still correctly propagate downwards.

Copy link
Member Author

@pythongosssss pythongosssss Mar 5, 2026

Choose a reason for hiding this comment

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

Fixed

@pythongosssss pythongosssss enabled auto-merge (squash) March 5, 2026 21:11
@github-actions
Copy link

github-actions bot commented Mar 5, 2026

⚡ Performance Report

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

Metric Baseline PR Δ
canvas-idle: style recalcs 123 122 -1%
canvas-idle: layouts 0 0 +0%
canvas-idle: task duration 418ms 421ms +1%
canvas-mouse-sweep: style recalcs 178 180 +1%
canvas-mouse-sweep: layouts 12 12 +3%
canvas-mouse-sweep: task duration 944ms 1006ms +7%
dom-widget-clipping: style recalcs 44 42 -5%
dom-widget-clipping: layouts 0 0 -100%
dom-widget-clipping: task duration 372ms 355ms -5%
subgraph-dom-widget-clipping: style recalcs 75 74 -1%
subgraph-dom-widget-clipping: layouts 0 0 +0%
subgraph-dom-widget-clipping: task duration 432ms 422ms -2%
subgraph-idle: style recalcs 121 121 +0%
subgraph-idle: layouts 0 0 +0%
subgraph-idle: task duration 435ms 403ms -7%
subgraph-mouse-sweep: style recalcs 158 163 +3%
subgraph-mouse-sweep: layouts 16 17 +2%
subgraph-mouse-sweep: task duration 765ms 833ms +9%
Raw data
{
  "timestamp": "2026-03-06T20:00:36.376Z",
  "gitSha": "72d97c5a2ab0cd09a3dbcf038d88c61fd49b9a0a",
  "branch": "pysssss/app-mode-fixes",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2009.4359999999938,
      "styleRecalcs": 120,
      "styleRecalcDurationMs": 21.802,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 417.83000000000004,
      "heapDeltaBytes": -1625788
    },
    {
      "name": "canvas-idle",
      "durationMs": 2035.6740000000002,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 24.485999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 419.47299999999996,
      "heapDeltaBytes": -2342768
    },
    {
      "name": "canvas-idle",
      "durationMs": 2021.2340000000495,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 24.141999999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 425.691,
      "heapDeltaBytes": -3034720
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2094.332999999978,
      "styleRecalcs": 189,
      "styleRecalcDurationMs": 64.98799999999999,
      "layouts": 13,
      "layoutDurationMs": 3.772,
      "taskDurationMs": 1143.1979999999999,
      "heapDeltaBytes": -2220488
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1857.5810000000104,
      "styleRecalcs": 170,
      "styleRecalcDurationMs": 52.53000000000001,
      "layouts": 12,
      "layoutDurationMs": 3.248999999999999,
      "taskDurationMs": 841.496,
      "heapDeltaBytes": -1864588
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2029.471000000001,
      "styleRecalcs": 181,
      "styleRecalcDurationMs": 55.779,
      "layouts": 12,
      "layoutDurationMs": 3.372,
      "taskDurationMs": 1033.281,
      "heapDeltaBytes": -3291384
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 579.44999999998,
      "styleRecalcs": 42,
      "styleRecalcDurationMs": 14.285999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 360.546,
      "heapDeltaBytes": 6695520
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 570.2409999999816,
      "styleRecalcs": 42,
      "styleRecalcDurationMs": 13.835999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 351.976,
      "heapDeltaBytes": 6472372
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 565.1230000000282,
      "styleRecalcs": 42,
      "styleRecalcDurationMs": 12.93,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 351.28999999999996,
      "heapDeltaBytes": 6494656
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 595.4700000000059,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 16.288,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 419.77400000000006,
      "heapDeltaBytes": -9909288
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 609.8120000000335,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 17.267999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 429.32000000000005,
      "heapDeltaBytes": 15880364
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 607.9960000000142,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 15.995000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 415.643,
      "heapDeltaBytes": -8614496
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1994.9880000000064,
      "styleRecalcs": 120,
      "styleRecalcDurationMs": 23.915999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 421.11699999999996,
      "heapDeltaBytes": -1762552
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2006.1220000000048,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 22.447000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 406.615,
      "heapDeltaBytes": -1802200
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1999.6909999999843,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 20.682,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 381.26900000000006,
      "heapDeltaBytes": -3288664
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1698.0580000000032,
      "styleRecalcs": 155,
      "styleRecalcDurationMs": 50.17699999999999,
      "layouts": 16,
      "layoutDurationMs": 4.6610000000000005,
      "taskDurationMs": 757.217,
      "heapDeltaBytes": -5441132
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 2026.3429999999971,
      "styleRecalcs": 176,
      "styleRecalcDurationMs": 61.189,
      "layouts": 17,
      "layoutDurationMs": 4.687,
      "taskDurationMs": 1012.9619999999999,
      "heapDeltaBytes": -2632788
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1704.4250000000147,
      "styleRecalcs": 157,
      "styleRecalcDurationMs": 50.257000000000005,
      "layouts": 17,
      "layoutDurationMs": 4.397999999999999,
      "taskDurationMs": 730.174,
      "heapDeltaBytes": -4827156
    }
  ]
}

@pythongosssss
Copy link
Member Author

@coderabbitai add a new issue to look at upgrading reka-ui and replacing PrimeVue splitters so we can use pixel sizing https://reka-ui.com/docs/components/splitter#pixel-sizing

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 6, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

Let me check the current reka-ui version before creating the issue.


🏁 Script executed:

#!/bin/bash
# Check current reka-ui version
cat package.json | grep -i "reka"

Length of output: 26


🏁 Script executed:

#!/bin/bash
# Also check for primevue splitter usage
rg -n "Splitter" --type vue -l

Length of output: 27


🏁 Script executed:

#!/bin/bash
# Check actual reka-ui version in catalog
cat pnpm-workspace.yaml | grep -i "reka"

# Find Splitter usages
rg -rn "Splitter" --include="*.vue" -l

Length of output: 459


🏁 Script executed:

#!/bin/bash
# Find Splitter usages
rg -rn "Splitter" -g "*.vue" -l

# Also check latest reka-ui version for reference
rg -rn "useStablePrimeVueSplitter" -g "*.ts" -g "*.vue" -l

Length of output: 241


🏁 Script executed:

#!/bin/bash
gh issue create \
  --repo Comfy-Org/ComfyUI_frontend \
  --title "Upgrade reka-ui and replace PrimeVue Splitters with pixel sizing support" \
  --assignee "pythongosssss" \
  --body "## Overview

PrimeVue's Splitter component does not support pixel-based panel sizing, requiring a workaround composable (\`useStablePrimeVueSplitterSizer\`) introduced in `#9439`. reka-ui provides native pixel sizing support for its Splitter component and should be used instead.

**Reference:** https://reka-ui.com/docs/components/splitter#pixel-sizing

## Background

In `#9439`, a workaround composable \`src/composables/useStablePrimeVueSplitterSizer.ts\` was added to stabilize PrimeVue Splitter panel widths using pixel-based sizing stored via \`useStorage\`. This was noted as a temporary measure pending an upstream splitter upgrade.

## Files to Update

The following files currently use PrimeVue's \`Splitter\` / \`SplitterPanel\` components and should be migrated:

- \`src/views/LinearView.vue\`
- \`src/components/graph/GraphCanvas.vue\`
- \`src/components/LiteGraphCanvasSplitterOverlay.vue\`

The workaround composable \`src/composables/useStablePrimeVueSplitterSizer.ts\` (and its test file) can be removed once the migration is complete.

## Tasks

- [ ] Upgrade \`reka-ui\` from the current version (\`^2.5.0\`) if a newer version with stable pixel sizing is available
- [ ] Replace PrimeVue \`Splitter\`/\`SplitterPanel\` usage in the files listed above with reka-ui's Splitter component using pixel sizing
- [ ] Remove the \`useStablePrimeVueSplitterSizer\` workaround composable and its test file
- [ ] Verify layout stability across panel toggles and tab switches

## References

- PR introducing the workaround: https://github.com/Comfy-Org/ComfyUI_frontend/pull/9439
- reka-ui Splitter pixel sizing docs: https://reka-ui.com/docs/components/splitter#pixel-sizing

/cc `@pythongosssss`"

Length of output: 57


@pythongosssss: Done! I've created the issue at #9508.

It covers:

  • Upgrading reka-ui from the current ^2.5.0
  • Migrating the three files that use PrimeVue Splitter/SplitterPanel: LinearView.vue, GraphCanvas.vue, and LiteGraphCanvasSplitterOverlay.vue
  • Removing the useStablePrimeVueSplitterSizer workaround composable (and its test file) once the migration is complete
  • A reference back to this PR (#9439) as the origin of the workaround, and a link to the reka-ui pixel sizing docs

🧠 Learnings used
Learnt from: Myestery
Repo: Comfy-Org/ComfyUI_frontend PR: 7422
File: .github/workflows/pr-update-playwright-expectations.yaml:131-135
Timestamp: 2025-12-12T23:02:37.473Z
Learning: In the `.github/workflows/pr-update-playwright-expectations.yaml` workflow in the Comfy-Org/ComfyUI_frontend repository, the snapshot update process is intentionally scoped to only add and update snapshot images. Deletions of snapshot files are handled explicitly outside this workflow and should not be suggested as part of this automation.

@pythongosssss pythongosssss merged commit 4ff14b5 into main Mar 6, 2026
31 checks passed
@pythongosssss pythongosssss deleted the pysssss/app-mode-fixes branch March 6, 2026 20:02
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.

3 participants