Skip to content

App builder exit updates#9218

Merged
pythongosssss merged 8 commits intomainfrom
pysssss/appmode-exit-updates
Feb 27, 2026
Merged

App builder exit updates#9218
pythongosssss merged 8 commits intomainfrom
pysssss/appmode-exit-updates

Conversation

@pythongosssss
Copy link
Member

@pythongosssss pythongosssss commented Feb 25, 2026

Summary

  • remove exit builder button from right panel
  • add builder exit button to bottom of canvas
  • add builder menu with save & exit in top left

Screenshots (if applicable)

image

┆Issue is synchronized with this Notion page by Unito

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 25, 2026

📝 Walkthrough

Walkthrough

Adds two builder UI components (popover menu and bottom exit button), moves builder controls into GraphView when in builder mode, and removes the confirmation prompt from appModeStore.exitBuilder. New i18n keys for the menu were added.

Changes

Cohort / File(s) Summary
View & header update
src/components/builder/AppBuilder.vue, src/views/GraphView.vue
Removed the header exit Button from AppBuilder.vue; GraphView.vue now conditionally renders BuilderToolbar, BuilderMenu.vue, and BuilderExitButton.vue together when in builder mode.
New builder UI components
src/components/builder/BuilderExitButton.vue, src/components/builder/BuilderMenu.vue
Added BuilderExitButton.vue: fixed bottom-centered exit button with Escape-key listener that exits only when no dialogs and in builder mode, calling appModeStore.exitBuilder(). Added BuilderMenu.vue: popover with "Save App" (disabled when no outputs; calls useBuilderSave -> setSaving(true)) and "Exit App Builder" (calls appModeStore.exitBuilder() and closes the popover).
Store behavior change
src/stores/appModeStore.ts
Removed confirmation dialog and i18n usage from exitBuilder; it now immediately resets builder state and switches mode to graph.
Localization
src/locales/en/main.json
Added builderMenu keys: saveApp and exitAppBuilder.
Cosmetic style tweak
src/components/builder/BuilderToolbar.vue
Replaced z-[1000] with z-1000 (Tailwind z-index token).

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant Menu as BuilderMenu.vue
  participant ExitBtn as BuilderExitButton.vue
  participant Dialog as dialogStore
  participant Save as useBuilderSave
  participant AppMode as appModeStore

  User->>Menu: Click "Save App"
  Menu->>Save: setSaving(true)
  Save-->>Menu: saving state set
  Menu-->>User: close popover

  User->>Menu: Click "Exit App Builder"
  Menu->>Dialog: query open dialogs?
  Dialog-->>Menu: no dialogs
  Menu->>AppMode: call exitBuilder()
  AppMode-->>Menu: mode -> 'graph'
  Menu-->>User: builder UI hidden

  User->>ExitBtn: Click "Exit" / Press Escape
  ExitBtn->>Dialog: query open dialogs?
  Dialog-->>ExitBtn: no dialogs
  ExitBtn->>AppMode: call exitBuilder()
  AppMode-->>ExitBtn: mode -> 'graph'
  ExitBtn-->>User: builder UI hidden
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 I nudged the header, found a quieter dock,
A menu up top, an exit by the rock.
Escape tip-taps, no dialogs in sight,
I hop out gentle — the builder sleeps tonight. 🥕✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is incomplete. It lists changes but lacks required template sections: Summary (one sentence explaining what changed and why), Breaking changes, Dependencies, and Review Focus. Fill in the required template sections including a single-sentence summary, note on dependencies/breaking changes, and critical design decisions to review.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title concisely summarizes the main changes: moving exit builder button from right panel to bottom of canvas and adding a builder menu in top left.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ 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/appmode-exit-updates

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 25, 2026

🎭 Playwright: ✅ 547 passed, 0 failed · 5 flaky

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

@github-actions
Copy link

github-actions bot commented Feb 25, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 02/27/2026, 09:41:58 PM UTC

Links

@pythongosssss pythongosssss force-pushed the pysssss/appmode-updates branch from 2214f48 to 46a7108 Compare February 25, 2026 17:11
Base automatically changed from pysssss/appmode-updates to main February 26, 2026 17:55
- add builder exit button to bottom of canvas
- add builder menu with save & exit in top left
@pythongosssss pythongosssss force-pushed the pysssss/appmode-exit-updates branch from ee5315e to e85d92e Compare February 26, 2026 20:59
@github-actions
Copy link

github-actions bot commented Feb 26, 2026

📦 Bundle: 4.46 MB gzip 🔴 +675 B

Details

Summary

  • Raw size: 20.9 MB baseline 20.9 MB — 🔴 +3.65 kB
  • Gzip: 4.46 MB baseline 4.46 MB — 🔴 +675 B
  • Brotli: 3.44 MB baseline 3.44 MB — 🔴 +482 B
  • Bundles: 228 current • 228 baseline • 113 added / 113 removed

Category Glance
Graph Workspace 🔴 +3.57 kB (1.03 MB) · Other 🔴 +84 B (7.86 MB) · Vendor & Third-Party ⚪ 0 B (8.84 MB) · Data & Services ⚪ 0 B (2.55 MB) · Panels & Settings ⚪ 0 B (435 kB) · Views & Navigation ⚪ 0 B (72.1 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-DoSRPAhn.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -6.35 kB 🟢 -5.53 kB
assets/index-y4TpgnaN.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +6.34 kB 🔴 +5.52 kB

Status: 1 added / 1 removed

Graph Workspace — 1.03 MB (baseline 1.02 MB) • 🔴 +3.57 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-B25x9_ic.js (new) 1.03 MB 🔴 +1.03 MB 🔴 +219 kB 🔴 +165 kB
assets/GraphView-DzM_KIpD.js (removed) 1.02 MB 🟢 -1.02 MB 🟢 -218 kB 🟢 -165 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BssbqL7H.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.81 kB
assets/CloudSurveyView-D857eY6z.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.82 kB
assets/CloudLoginView-CR-pljvl.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.19 kB 🔴 +2.82 kB
assets/CloudLoginView-Dle0n_KP.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.19 kB 🟢 -2.82 kB
assets/CloudSignupView-CnSRucTb.js (removed) 9.37 kB 🟢 -9.37 kB 🟢 -2.69 kB 🟢 -2.35 kB
assets/CloudSignupView-wkJdCGhw.js (new) 9.37 kB 🔴 +9.37 kB 🔴 +2.69 kB 🔴 +2.37 kB
assets/UserCheckView-B9DQzsJB.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/UserCheckView-Cr2J_NEH.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/CloudLayoutView-Bcfm59lh.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.1 kB 🟢 -1.82 kB
assets/CloudLayoutView-D2LDXm9Q.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.1 kB 🔴 +1.82 kB
assets/CloudForgotPasswordView-D65PFYwd.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.93 kB 🔴 +1.7 kB
assets/CloudForgotPasswordView-p518pK5o.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/CloudAuthTimeoutView-Bn8RMj9k.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-Qx5kPRPP.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.54 kB
assets/CloudSubscriptionRedirectView-C1gC5oSC.js (removed) 4.75 kB 🟢 -4.75 kB 🟢 -1.78 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-fZunbFSa.js (new) 4.75 kB 🔴 +4.75 kB 🔴 +1.79 kB 🔴 +1.58 kB
assets/UserSelectView-CJSRfda5.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.46 kB
assets/UserSelectView-D5uJ119x.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/CloudSorryContactSupportView-Bypca0av.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-CI4MZk1L.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-DFAagBvb.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.31 kB 🔴 +4.66 kB
assets/SecretsPanel-xjdQd8KR.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.66 kB
assets/LegacyCreditsPanel-B32YwrHB.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.56 kB 🔴 +4.88 kB
assets/LegacyCreditsPanel-DhAX2YK9.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.56 kB 🟢 -4.88 kB
assets/SubscriptionPanel-CwkQDo4g.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.65 kB 🔴 +4.09 kB
assets/SubscriptionPanel-dcqOGA7y.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.65 kB 🟢 -4.09 kB
assets/KeybindingPanel-DT0Um_Ob.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.52 kB 🔴 +3.12 kB
assets/KeybindingPanel-eWgKeRSj.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.51 kB 🟢 -3.12 kB
assets/AboutPanel-B9ND87Tz.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.73 kB 🔴 +2.45 kB
assets/AboutPanel-DHNB0WQb.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.45 kB
assets/ExtensionPanel-CMhdr9QL.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.65 kB 🔴 +2.36 kB
assets/ExtensionPanel-DV8u9Z7D.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.65 kB 🟢 -2.36 kB
assets/ServerConfigPanel-CjsDbZY4.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.13 kB 🔴 +1.92 kB
assets/ServerConfigPanel-FAn_M2tY.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.12 kB 🟢 -1.91 kB
assets/UserPanel-BhHbZAhN.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +1.99 kB 🔴 +1.74 kB
assets/UserPanel-CeoZRvLa.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -1.99 kB 🟢 -1.75 kB
assets/cloudRemoteConfig-CysDxNmp.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +706 B 🔴 +612 B
assets/cloudRemoteConfig-DHMORoIQ.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -703 B 🟢 -612 B
assets/refreshRemoteConfig-Dvw5ahKr.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +520 B 🔴 +471 B
assets/refreshRemoteConfig-nf93uU3t.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -521 B 🟢 -457 B
assets/config-CGn5JFmU.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B5oF6TeI.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BVYOg4dh.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CBEvSL1z.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CGx1t8IZ.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CNcb_4nC.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cx1dZM6H.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dw-QS6Nb.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DXxgnCSn.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-GRFn4guL.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-mgwKIVQ2.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-s83B801I.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-4CC60Z4D.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +992 B
assets/auth-ibUnGMjH.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -990 B
assets/SignUpForm-DDWLo9iP.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/SignUpForm-hIRFmRYN.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/UpdatePasswordContent-BU6SZfjo.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +941 B
assets/UpdatePasswordContent-CkpsQY6R.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.06 kB 🟢 -941 B
assets/firebaseAuthStore-BGMnylt8.js (new) 788 B 🔴 +788 B 🔴 +387 B 🔴 +377 B
assets/firebaseAuthStore-DcVdVSMo.js (removed) 788 B 🟢 -788 B 🟢 -387 B 🟢 -346 B
assets/auth-DIubdryj.js (new) 357 B 🔴 +357 B 🔴 +228 B 🔴 +216 B
assets/auth-UW8q8w1P.js (removed) 357 B 🟢 -357 B 🟢 -226 B 🟢 -192 B
assets/PasswordFields-DLbVLg8O.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-D6ioir1T.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-CTimK0J3.js (removed) 736 B 🟢 -736 B 🟢 -377 B 🟢 -325 B
assets/useSubscriptionDialog-PGqXbo20.js (new) 736 B 🔴 +736 B 🔴 +380 B 🔴 +326 B

Status: 1 added / 1 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-B8KntGtT.js (removed) 9.84 kB 🟢 -9.84 kB 🟢 -3.4 kB 🟢 -3 kB
assets/useTerminalTabs-Czv_js3e.js (new) 9.84 kB 🔴 +9.84 kB 🔴 +3.4 kB 🔴 +3 kB
assets/ComfyQueueButton-BUvLuKLi.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.49 kB 🔴 +2.23 kB
assets/ComfyQueueButton-DCEX2NQ_.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.49 kB 🟢 -2.23 kB
assets/SubscribeButton-Bo-_i-AA.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -1.06 kB 🟢 -940 B
assets/SubscribeButton-C-FpYM40.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +1.07 kB 🔴 +941 B
assets/cloudFeedbackTopbarButton-BgX0P0MI.js (new) 1.59 kB 🔴 +1.59 kB 🔴 +854 B 🔴 +759 B
assets/cloudFeedbackTopbarButton-CNeQ2N3D.js (removed) 1.59 kB 🟢 -1.59 kB 🟢 -851 B 🟢 -761 B
assets/ComfyQueueButton-BMjROD9L.js (new) 793 B 🔴 +793 B 🔴 +392 B 🔴 +349 B
assets/ComfyQueueButton-CoZeWEeS.js (removed) 793 B 🟢 -793 B 🟢 -391 B 🟢 -350 B
assets/Button-D1z3poyI.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-D1z3EKPy.js 1.16 kB 1.16 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-Bg4LklDe.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-DecBFGbM.js 5.94 kB 5.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-CJNpTEnW.js 7.44 kB 7.44 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-CnQQLXB-.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-sg8Jj4MY.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.55 MB (baseline 2.55 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-CSTc6D37.js (new) 1.75 MB 🔴 +1.75 MB 🔴 +393 kB 🔴 +296 kB
assets/dialogService-CU5PN8q1.js (removed) 1.75 MB 🟢 -1.75 MB 🟢 -393 kB 🟢 -296 kB
assets/api-D5p6lSZY.js (removed) 678 kB 🟢 -678 kB 🟢 -153 kB 🟢 -122 kB
assets/api-lWRkYGxN.js (new) 678 kB 🔴 +678 kB 🔴 +153 kB 🔴 +122 kB
assets/load3dService-Cpb9DBlM.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-KrI5Yj4J.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/extensionStore-BhOGwuvi.js (new) 12.1 kB 🔴 +12.1 kB 🔴 +4.21 kB 🔴 +3.7 kB
assets/extensionStore-C-4htqrm.js (removed) 12.1 kB 🟢 -12.1 kB 🟢 -4.21 kB 🟢 -3.7 kB
assets/releaseStore-2e-QEaiH.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/releaseStore-D-3yoy_g.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/keybindingService-_wPmS7n5.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/keybindingService-fTLMJubO.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/bootstrapStore-BphRH-Mv.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -874 B 🟢 -787 B
assets/bootstrapStore-D8nq_MgY.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +873 B 🔴 +792 B
assets/userStore-C1DtABWu.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -722 B 🟢 -671 B
assets/userStore-x1ckEnTu.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +720 B 🔴 +671 B
assets/audioService-BHMiArgY.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +849 B 🔴 +726 B
assets/audioService-HfIJHXb3.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -850 B 🟢 -724 B
assets/releaseStore-Bjh4yqUB.js (removed) 760 B 🟢 -760 B 🟢 -380 B 🟢 -336 B
assets/releaseStore-oaeRCIO9.js (new) 760 B 🔴 +760 B 🔴 +386 B 🔴 +337 B
assets/settingStore-D-BbN-46.js (new) 744 B 🔴 +744 B 🔴 +384 B 🔴 +340 B
assets/settingStore-tw3UTM66.js (removed) 744 B 🟢 -744 B 🟢 -385 B 🟢 -337 B
assets/workflowDraftStore-B_xg-fBQ.js (new) 736 B 🔴 +736 B 🔴 +379 B 🔴 +331 B
assets/workflowDraftStore-CuOgeo-B.js (removed) 736 B 🟢 -736 B 🟢 -376 B 🟢 -332 B
assets/dialogService-Bjc6jttG.js (new) 725 B 🔴 +725 B 🔴 +367 B 🔴 +325 B
assets/dialogService-BXrFlBI4.js (removed) 725 B 🟢 -725 B 🟢 -368 B 🟢 -323 B
assets/serverConfigStore-EPk4OtIK.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-CMp8BfmB.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3d-Csxw2QQN.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3dViewer-BitcgJbM.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useLoad3dViewer-BMVUomq9.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.79 kB
assets/useFeatureFlags-DHU30wUO.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.24 kB 🟢 -1.06 kB
assets/useFeatureFlags-gLH-fKq5.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.24 kB 🔴 +1.06 kB
assets/useWorkspaceUI-b9UiuVgI.js (new) 3 kB 🔴 +3 kB 🔴 +820 B 🔴 +702 B
assets/useWorkspaceUI-L-iBvZk4.js (removed) 3 kB 🟢 -3 kB 🟢 -823 B 🟢 -735 B
assets/subscriptionCheckoutUtil-BLoOBIPR.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -923 B
assets/subscriptionCheckoutUtil-R1iWLb-y.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +925 B
assets/useExternalLink-Cf_cbLlH.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -769 B 🟢 -678 B
assets/useExternalLink-CNiNxmVF.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +770 B 🔴 +677 B
assets/useErrorHandling-bfkpo6ku.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -630 B 🟢 -535 B
assets/useErrorHandling-Ddc-q9Nh.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +630 B 🔴 +534 B
assets/useWorkspaceSwitch-C9_a59G9.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -545 B 🟢 -481 B
assets/useWorkspaceSwitch-w5UuuPd4.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +544 B 🔴 +484 B
assets/useLoad3d-B6qqdQDk.js (new) 859 B 🔴 +859 B 🔴 +425 B 🔴 +381 B
assets/useLoad3d-Cw98U-9d.js (removed) 859 B 🟢 -859 B 🟢 -422 B 🟢 -375 B
assets/audioUtils-BduZi086.js (removed) 858 B 🟢 -858 B 🟢 -500 B 🟢 -402 B
assets/audioUtils-J8sHCHC-.js (new) 858 B 🔴 +858 B 🔴 +500 B 🔴 +401 B
assets/useLoad3dViewer-DrgM47gK.js (removed) 838 B 🟢 -838 B 🟢 -407 B 🟢 -365 B
assets/useLoad3dViewer-hZkb7rqg.js (new) 838 B 🔴 +838 B 🔴 +411 B 🔴 +369 B
assets/useCurrentUser-B6SqWDif.js (new) 722 B 🔴 +722 B 🔴 +374 B 🔴 +325 B
assets/useCurrentUser-DVos7Ckv.js (removed) 722 B 🟢 -722 B 🟢 -372 B 🟢 -323 B
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-CY7QMUhQ.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Clzmwvt4.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-Cddas8Zl.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BputJAFn.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

Vendor & Third-Party — 8.84 MB (baseline 8.84 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-BxkFiWzp.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DNX73mqE.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-DrYd4O-6.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-BnCPTL0g.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-DVmi2O2Z.js 388 kB 388 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-LBLOE6BD.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BnYkbQDM.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-DtiQ1dr9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-D2jVNnmE.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-MKpa1ZAW.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.86 MB (baseline 7.86 MB) • 🔴 +84 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/i18n-Bc_2Xw3B.js (new) 532 kB 🔴 +532 kB 🔴 +103 kB 🔴 +79.9 kB
assets/i18n-DI0OPWoR.js (removed) 531 kB 🟢 -531 kB 🟢 -103 kB 🟢 -79.9 kB
assets/core-BP8wB3VZ.js (removed) 73.4 kB 🟢 -73.4 kB 🟢 -18.9 kB 🟢 -16.2 kB
assets/core-lRNfsSlw.js (new) 73.4 kB 🔴 +73.4 kB 🔴 +18.9 kB 🔴 +16.2 kB
assets/groupNode-BzjZoE9r.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.5 kB
assets/groupNode-CRICvvuo.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.5 kB
assets/WidgetSelect-Du4YCZr2.js (new) 58.1 kB 🔴 +58.1 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/WidgetSelect-xxatP0p0.js (removed) 58.1 kB 🟢 -58.1 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-B_Gavw8M.js (new) 46.3 kB 🔴 +46.3 kB 🔴 +8.65 kB 🔴 +7.49 kB
assets/SubscriptionRequiredDialogContentWorkspace-D54csbDy.js (removed) 46.3 kB 🟢 -46.3 kB 🟢 -8.65 kB 🟢 -7.51 kB
assets/WidgetPainter-D2vG7of7.js (new) 32.5 kB 🔴 +32.5 kB 🔴 +7.96 kB 🔴 +7.07 kB
assets/WidgetPainter-dIYyvdKY.js (removed) 32.5 kB 🟢 -32.5 kB 🟢 -7.96 kB 🟢 -7.06 kB
assets/Load3DControls-CTxU4DDI.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.64 kB
assets/Load3DControls-Dav3iNkk.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.64 kB
assets/WorkspacePanelContent-DgRJ1qiT.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.14 kB 🔴 +5.39 kB
assets/WorkspacePanelContent-u1dqN3WC.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.14 kB 🟢 -5.39 kB
assets/SubscriptionRequiredDialogContent-BxxJN6jl.js (removed) 25.7 kB 🟢 -25.7 kB 🟢 -6.57 kB 🟢 -5.78 kB
assets/SubscriptionRequiredDialogContent-kEasYWIj.js (new) 25.7 kB 🔴 +25.7 kB 🔴 +6.57 kB 🔴 +5.78 kB
assets/Load3dViewerContent-BMtopcRt.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.49 kB
assets/Load3dViewerContent-BU1ZubQW.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.5 kB
assets/WidgetImageCrop-CfxCjJUJ.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.5 kB 🟢 -4.85 kB
assets/WidgetImageCrop-CRsakMb-.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.5 kB 🔴 +4.85 kB
assets/SubscriptionPanelContentWorkspace-DDvkDuBl.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +5.05 kB 🔴 +4.46 kB
assets/SubscriptionPanelContentWorkspace-wq2eRPLZ.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -5.05 kB 🟢 -4.46 kB
assets/CurrentUserPopoverWorkspace-DER-Y1qM.js (new) 19.9 kB 🔴 +19.9 kB 🔴 +4.88 kB 🔴 +4.34 kB
assets/CurrentUserPopoverWorkspace-VICEU8bh.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -4.88 kB 🟢 -4.36 kB
assets/SignInContent-CdNiej5r.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.76 kB 🔴 +4.16 kB
assets/SignInContent-Cq2JhblS.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.76 kB 🟢 -4.16 kB
assets/WidgetInputNumber-B_nGT3ZM.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.75 kB 🟢 -4.22 kB
assets/WidgetInputNumber-DQrBPYdN.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.75 kB 🔴 +4.22 kB
assets/WidgetRecordAudio-B4TGdktF.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.94 kB 🟢 -4.43 kB
assets/WidgetRecordAudio-B6T81Iay.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.94 kB 🔴 +4.42 kB
assets/Load3D-CiVgNjRS.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.52 kB
assets/Load3D-DHvKM2W4.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.51 kB
assets/load3d-C03cnO2R.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.19 kB 🔴 +3.63 kB
assets/load3d-Cr6MeDX3.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.19 kB 🟢 -3.63 kB
assets/AudioPreviewPlayer-BHIt4vJ0.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.2 kB 🔴 +2.85 kB
assets/AudioPreviewPlayer-DlsXJO0T.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.19 kB 🟢 -2.85 kB
assets/changeTracker-C1AcBIL7.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.9 kB 🟢 -2.55 kB
assets/changeTracker-U-ZBN855.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.9 kB 🔴 +2.55 kB
assets/nodeTemplates-Do9owNW-.js (new) 9.29 kB 🔴 +9.29 kB 🔴 +3.26 kB 🔴 +2.86 kB
assets/nodeTemplates-Dx51ET8u.js (removed) 9.29 kB 🟢 -9.29 kB 🟢 -3.25 kB 🟢 -2.86 kB
assets/InviteMemberDialogContent-BP9fcYX-.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.29 kB 🔴 +2 kB
assets/InviteMemberDialogContent-DOLQmDUS.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.29 kB 🟢 -2 kB
assets/Load3DConfiguration-DXz-BD3_.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/Load3DConfiguration-R24FSrKa.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.92 kB 🟢 -1.68 kB
assets/CreateWorkspaceDialogContent-C0eI7_W-.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -1.99 kB 🟢 -1.73 kB
assets/CreateWorkspaceDialogContent-DQYZLA_r.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +1.99 kB 🔴 +1.75 kB
assets/onboardingCloudRoutes-BVXLMkYz.js (removed) 5.41 kB 🟢 -5.41 kB 🟢 -1.84 kB 🟢 -1.59 kB
assets/onboardingCloudRoutes-CuOBr60J.js (new) 5.41 kB 🔴 +5.41 kB 🔴 +1.84 kB 🔴 +1.6 kB
assets/FreeTierDialogContent-DsUEMhW-.js (removed) 5.39 kB 🟢 -5.39 kB 🟢 -1.89 kB 🟢 -1.66 kB
assets/FreeTierDialogContent-RkCeT9LQ.js (new) 5.39 kB 🔴 +5.39 kB 🔴 +1.9 kB 🔴 +1.68 kB
assets/EditWorkspaceDialogContent-BqflGEx2.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.94 kB 🟢 -1.7 kB
assets/EditWorkspaceDialogContent-j9PYhMTs.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.95 kB 🔴 +1.7 kB
assets/ValueControlPopover-ClPdAXvz.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/ValueControlPopover-LHrjMvnw.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/Preview3d-BMyIuYvy.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.56 kB 🟢 -1.36 kB
assets/Preview3d-BukEzyk8.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/CancelSubscriptionDialogContent-DW36Io6P.js (new) 4.79 kB 🔴 +4.79 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/CancelSubscriptionDialogContent-s748CFBK.js (removed) 4.79 kB 🟢 -4.79 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/DeleteWorkspaceDialogContent-Bi_SO4A_.js (new) 4.23 kB 🔴 +4.23 kB 🔴 +1.63 kB 🔴 +1.42 kB
assets/DeleteWorkspaceDialogContent-RIx7e9GU.js (removed) 4.23 kB 🟢 -4.23 kB 🟢 -1.63 kB 🟢 -1.42 kB
assets/WidgetWithControl-Bv6obTiV.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.77 kB 🔴 +1.59 kB
assets/WidgetWithControl-DCY8VKla.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.77 kB 🟢 -1.6 kB
assets/LeaveWorkspaceDialogContent-CfD36JdO.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.58 kB 🔴 +1.37 kB
assets/LeaveWorkspaceDialogContent-D8cZyyT0.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/RemoveMemberDialogContent-B_BOTwx3.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.52 kB 🔴 +1.33 kB
assets/RemoveMemberDialogContent-Bp68umeU.js (removed) 4.04 kB 🟢 -4.04 kB 🟢 -1.52 kB 🟢 -1.32 kB
assets/RevokeInviteDialogContent-C49EAgr4.js (new) 3.95 kB 🔴 +3.95 kB 🔴 +1.54 kB 🔴 +1.35 kB
assets/RevokeInviteDialogContent-D2IVDop_.js (removed) 3.95 kB 🟢 -3.95 kB 🟢 -1.54 kB 🟢 -1.35 kB
assets/InviteMemberUpsellDialogContent-D1MMwqhQ.js (new) 3.82 kB 🔴 +3.82 kB 🔴 +1.4 kB 🔴 +1.23 kB
assets/InviteMemberUpsellDialogContent-Dvyubouw.js (removed) 3.82 kB 🟢 -3.82 kB 🟢 -1.4 kB 🟢 -1.23 kB
assets/tierBenefits-BUej4Ot9.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.3 kB 🔴 +1.16 kB
assets/tierBenefits-DM4zcuLs.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.3 kB 🟢 -1.17 kB
assets/saveMesh--kmXQyDc.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.29 kB
assets/saveMesh-CWbrPf3L.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.46 kB 🔴 +1.29 kB
assets/cloudSessionCookie-DIoevIDH.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.08 kB 🟢 -977 B
assets/cloudSessionCookie-V5t-Y505.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.09 kB 🔴 +943 B
assets/GlobalToast-BgZMXuzj.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.04 kB
assets/GlobalToast-CJ54WY_p.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.03 kB
assets/ApiNodesSignInContent-BKNHRD6l.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.05 kB 🟢 -921 B
assets/ApiNodesSignInContent-Busvz9n5.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.05 kB 🔴 +920 B
assets/SubscribeToRun-Ds6fBl6-.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +887 B
assets/SubscribeToRun-M0psABoy.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -866 B
assets/CloudRunButtonWrapper-DHTAfrou.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +784 B 🔴 +720 B
assets/CloudRunButtonWrapper-VF8qCTJt.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -785 B 🟢 -703 B
assets/signInSchema-_KPgEXdD.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +563 B 🔴 +512 B
assets/signInSchema-CtKEtoXB.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -563 B 🟢 -518 B
assets/previousFullPath-BoELn_gy.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -651 B 🟢 -570 B
assets/previousFullPath-zTktlYyX.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +651 B 🔴 +560 B
assets/cloudBadges-BuklwWKw.js (removed) 1.36 kB 🟢 -1.36 kB 🟢 -703 B 🟢 -610 B
assets/cloudBadges-CAIY3Ylr.js (new) 1.36 kB 🔴 +1.36 kB 🔴 +703 B 🔴 +613 B
assets/cloudSubscription-B7kCFE0I.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +655 B 🔴 +567 B
assets/cloudSubscription-CEUfKJIa.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -654 B 🟢 -563 B
assets/Load3D-C1s_ZIjy.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -498 B 🟢 -439 B
assets/Load3D-Fm9ifRcf.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +499 B 🔴 +444 B
assets/nightlyBadges-1JOrx6Kn.js (removed) 1 kB 🟢 -1 kB 🟢 -528 B 🟢 -472 B
assets/nightlyBadges-DP5zaVem.js (new) 1 kB 🔴 +1 kB 🔴 +530 B 🔴 +474 B
assets/Load3dViewerContent-B9l5dhT-.js (new) 993 B 🔴 +993 B 🔴 +468 B 🔴 +418 B
assets/Load3dViewerContent-DasnEsWT.js (removed) 993 B 🟢 -993 B 🟢 -464 B 🟢 -412 B
assets/SubscriptionPanelContentWorkspace-A4l3zfjp.js (new) 920 B 🔴 +920 B 🔴 +437 B 🔴 +380 B
assets/SubscriptionPanelContentWorkspace-D4tJv3Hp.js (removed) 920 B 🟢 -920 B 🟢 -434 B 🟢 -375 B
assets/graphHasMissingNodes-DFDmai3O.js (new) 761 B 🔴 +761 B 🔴 +374 B 🔴 +324 B
assets/graphHasMissingNodes-IV6I38fM.js (removed) 761 B 🟢 -761 B 🟢 -375 B 🟢 -331 B
assets/changeTracker-BJiIIRNk.js (new) 757 B 🔴 +757 B 🔴 +383 B 🔴 +337 B
assets/changeTracker-Cc5ks2Yu.js (removed) 757 B 🟢 -757 B 🟢 -382 B 🟢 -334 B
assets/WidgetLegacy-bDgfCbSa.js (new) 745 B 🔴 +745 B 🔴 +381 B 🔴 +361 B
assets/WidgetLegacy-D9wrVSov.js (removed) 745 B 🟢 -745 B 🟢 -382 B 🟢 -351 B
assets/WidgetInputNumber-BZ47ZBP3.js (new) 469 B 🔴 +469 B 🔴 +263 B 🔴 +227 B
assets/WidgetInputNumber-CGL9CgeM.js (removed) 469 B 🟢 -469 B 🟢 -264 B 🟢 -228 B
assets/i18n-Bcia7X9c.js (removed) 199 B 🟢 -199 B 🟢 -161 B 🟢 -138 B
assets/i18n-DKrL17dS.js (new) 199 B 🔴 +199 B 🔴 +163 B 🔴 +141 B
assets/AnimationControls-e1OB6oJR.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-BTnZwrs2.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-DQKI7wOs.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-D9MrYETV.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-CuEodz4y.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B-AdR9IA.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CbkxT8K8.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CJGmjcIS.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CMaLgTTb.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cw07MMbJ.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D7EtdE6o.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DknEFpK3.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ds6WuXnw.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Dvq-F-mb.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-pUOay9Eo.js 15.1 kB 15.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-u2AZ8xU4.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-htt0vt7m.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B_Wsy2zX.js 151 kB 151 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BgoL-5j1.js 171 kB 171 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BgP6H8V2.js 178 kB 178 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BHnRTSDV.js 153 kB 153 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BVdfMmEN.js 148 kB 148 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CplVY01V.js 185 kB 185 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D3J6T63F.js 207 kB 207 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D8ud0Hl5.js 130 kB 130 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DEL_HfgI.js 156 kB 156 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DQyIQ6JB.js 148 kB 148 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Y59dVx3K.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-Dqa2c7nZ.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-DLiWNcHw.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-BLQErkwF.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-NQGNpa4H.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-0crUoXWV.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-sJMrm9jB.js 2.77 kB 2.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-4cn4-gG9.js 448 kB 448 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B5k4lNE3.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BJNVnuoz.js 402 kB 402 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-bylbcqSc.js 448 kB 448 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CU0-WQTL.js 489 kB 489 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D1sHTs_-.js 362 kB 362 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DedOJsaf.js 414 kB 414 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-QD8mdHRS.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Rqekep7N.js 397 kB 397 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-rUOYRJo0.js 394 kB 394 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-wEnA0xcT.js 389 kB 389 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-BIYdg9E5.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-C_7cycpB.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-DVkw5nPu.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-CbNGuSYA.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-DVSfLULk.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/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-D-ZhKuWc.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-NeEr3XWN.js 586 B 586 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BYbwNME9.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-GzA4D-L-.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-BtoXUSiF.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-DCbDfd19.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-CIcV8pqy.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-DZSYhGzO.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-oYMwrOjF.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-0CncUIzA.js 1.86 kB 1.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-TvCt3ARa.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-Cqdttdn1.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DN03zIgB.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-B7IIifV6.js 3.96 kB 3.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-CTquGMvp.js 6.8 kB 6.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-Br_tbhcL.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 56 added / 56 removed

@github-actions
Copy link

github-actions bot commented Feb 26, 2026

⚡ Performance Report

Metric Baseline PR Δ
canvas-idle: style recalcs 126 124 -2% ⚪
canvas-idle: layouts 1 0 -100% 🟢
canvas-idle: task duration 460ms 445ms -3% ⚪
canvas-mouse-sweep: style recalcs 181 169 -7% ⚪
canvas-mouse-sweep: layouts 12 12 +0% ⚪
canvas-mouse-sweep: task duration 1021ms 801ms -22% 🟢
dom-widget-clipping: style recalcs 44 41 -7% ⚪
dom-widget-clipping: layouts 0 0 +0% ⚪
dom-widget-clipping: task duration 356ms 361ms +1% ⚪
Raw data
{
  "timestamp": "2026-02-27T21:43:10.626Z",
  "gitSha": "d5e3f1442ffe671cbfb0bed5e0a556bf1178ef18",
  "branch": "pysssss/appmode-exit-updates",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2031.090000000006,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 24.587000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 445.413,
      "heapDeltaBytes": -2047444
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1844.5690000000354,
      "styleRecalcs": 169,
      "styleRecalcDurationMs": 51.761,
      "layouts": 12,
      "layoutDurationMs": 3.878,
      "taskDurationMs": 801.431,
      "heapDeltaBytes": -3721392
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 583.5329999999885,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 13.785,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 360.62300000000005,
      "heapDeltaBytes": 7949304
    }
  ]
}

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.

🧹 Nitpick comments (2)
src/components/builder/BuilderMenu.vue (2)

4-19: Remove redundant aria-label from trigger button.

Per repository guidelines, buttons with visible text content (the span with "App Builder") should not have aria-label as the visible text already provides the accessible name.

♻️ Suggested fix
       <button
         :class="
           cn(
             'absolute left-4 top-[calc(var(--workflow-tabs-height)+16px)] z-[1000] inline-flex h-10 cursor-pointer items-center gap-2.5 rounded-lg py-2 pr-2 pl-3 shadow-interface transition-colors border-none',
             'bg-secondary-background hover:bg-secondary-background-hover',
             'data-[state=open]:bg-secondary-background-hover'
           )
         "
-        :aria-label="t('linearMode.appModeToolbar.appBuilder')"
       >

Based on learnings: "In the ComfyUI_frontend repository, for Vue components, do not add aria-label to buttons that have visible text content."

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

In `@src/components/builder/BuilderMenu.vue` around lines 4 - 19, Remove the
redundant aria-label attribute from the button element in BuilderMenu.vue (the
button that currently has
:aria-label="t('linearMode.appModeToolbar.appBuilder')"); the visible span that
renders {{ t('linearMode.appModeToolbar.appBuilder') }} already provides the
accessible name, so delete the :aria-label attribute on that trigger button and
ensure no other ARIA duplication remains for the same element.

29-51: Consider using the shared Button component for menu items.

The menu item buttons use raw <button> elements. For consistency with the design system, consider using the shared Button component with appropriate variants (e.g., variant="ghost").

Based on learnings: "In the ComfyUI_frontend Vue codebase, replace raw HTML elements with the shared Button component."

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

In `@src/components/builder/BuilderMenu.vue` around lines 29 - 51, Replace the raw
<button> elements in BuilderMenu.vue with the shared Button component to match
the design system: for the save button, use the Button component with
variant="ghost" (or equivalent) and bind :disabled="!hasOutputs", preserve the
dynamic classes/hover behavior currently built with cn and still call
`@click`="onSave" and show the same icon and label; for the exit button, use
Button variant="ghost" with `@click`="onExitBuilder" and the same icon/label and
hover styling. Ensure you import the shared Button component and register it in
the component, and keep references to hasOutputs, onSave, onExitBuilder, and the
cn usage (or move conditional styles into Button props) so behavior remains
identical.

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

Nitpick comments:
In `@src/components/builder/BuilderMenu.vue`:
- Around line 4-19: Remove the redundant aria-label attribute from the button
element in BuilderMenu.vue (the button that currently has
:aria-label="t('linearMode.appModeToolbar.appBuilder')"); the visible span that
renders {{ t('linearMode.appModeToolbar.appBuilder') }} already provides the
accessible name, so delete the :aria-label attribute on that trigger button and
ensure no other ARIA duplication remains for the same element.
- Around line 29-51: Replace the raw <button> elements in BuilderMenu.vue with
the shared Button component to match the design system: for the save button, use
the Button component with variant="ghost" (or equivalent) and bind
:disabled="!hasOutputs", preserve the dynamic classes/hover behavior currently
built with cn and still call `@click`="onSave" and show the same icon and label;
for the exit button, use Button variant="ghost" with `@click`="onExitBuilder" and
the same icon/label and hover styling. Ensure you import the shared Button
component and register it in the component, and keep references to hasOutputs,
onSave, onExitBuilder, and the cn usage (or move conditional styles into Button
props) so behavior remains identical.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9fb93a5 and e85d92e.

📒 Files selected for processing (5)
  • src/components/builder/AppBuilder.vue
  • src/components/builder/BuilderExitButton.vue
  • src/components/builder/BuilderMenu.vue
  • src/locales/en/main.json
  • src/views/GraphView.vue
💤 Files with no reviewable changes (1)
  • src/components/builder/AppBuilder.vue

@pythongosssss pythongosssss marked this pull request as ready for review February 26, 2026 21:06
@pythongosssss pythongosssss requested review from a team as code owners February 26, 2026 21:06
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Feb 26, 2026
@pythongosssss pythongosssss enabled auto-merge (squash) February 26, 2026 21:20
AustinMroz
AustinMroz previously approved these changes Feb 27, 2026
@@ -0,0 +1,43 @@
<template>
<div
class="fixed bottom-4 left-1/2 z-[1000] flex -translate-x-1/2 items-center rounded-2xl border border-border-default bg-base-background p-2 shadow-interface"
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
class="fixed bottom-4 left-1/2 z-[1000] flex -translate-x-1/2 items-center rounded-2xl border border-border-default bg-base-background p-2 shadow-interface"
class="fixed bottom-4 left-1/2 z-1000 flex -translate-x-1/2 items-center rounded-2xl border border-border-default bg-base-background p-2 shadow-interface"

<button
:class="
cn(
'absolute left-4 top-[calc(var(--workflow-tabs-height)+16px)] z-[1000] inline-flex h-10 cursor-pointer items-center gap-2.5 rounded-lg py-2 pr-2 pl-3 shadow-interface transition-colors border-none',
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
'absolute left-4 top-[calc(var(--workflow-tabs-height)+16px)] z-[1000] inline-flex h-10 cursor-pointer items-center gap-2.5 rounded-lg py-2 pr-2 pl-3 shadow-interface transition-colors border-none',
'absolute left-4 top-[calc(var(--workflow-tabs-height)+16px)] z-1000 inline-flex h-10 cursor-pointer items-center gap-2.5 rounded-lg py-2 pr-2 pl-3 shadow-interface transition-colors border-none',

)
"
:disabled="!hasOutputs"
@click="onSave"
Copy link
Collaborator

Choose a reason for hiding this comment

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

Super nit, but this doesn't trigger a close of the popover.

Was there a problem with using the @/components/ui/Popover.vue component directly?

Copy link
Member Author

Choose a reason for hiding this comment

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

No good reason for it, fixed

With the move to always storing builder selection changes, the
confirmation dialogue on builder exit is no longer needed

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9286-Remove-confirmation-from-builder-exit-3146d73d3650815aa1c1dcfb491cc963)
by [Unito](https://www.unito.io)
- use popover component
- use proper tailwind class
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

🤖 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/BuilderExitButton.vue`:
- Around line 25-37: The Escape handler registered via useEventListener
currently calls onExitBuilder whenever isBuilderMode.value is true and
dialogStack is empty; change it to first check document.activeElement and skip
handling if focus is inside an editable element (e.g., HTMLInputElement,
HTMLTextAreaElement, or any element with contentEditable === "true" or true) or
if the active element is inside a rich-text/editor component (check
element.closest for common editor selectors if needed). Update the listener
logic in the same block where useEventListener is used so the conditions include
this focus guard before calling e.preventDefault(), e.stopPropagation(), and
onExitBuilder; keep the existing checks for isBuilderMode.value and
dialogStore.dialogStack.length.

In `@src/components/builder/BuilderMenu.vue`:
- Around line 4-17: In the BuilderMenu component remove the redundant
:aria-label binding on the visible-text button (the button rendering the hammer
icon and the span with {{ t('linearMode.appModeToolbar.appBuilder') }}) so the
accessible name comes from the visible label instead of a duplicated aria
attribute; simply delete the
:aria-label="t('linearMode.appModeToolbar.appBuilder')" from that button (leave
aria-label usage only for icon-only controls elsewhere).

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c02bbdf and 84dff76.

📒 Files selected for processing (5)
  • src/components/builder/AppBuilder.vue
  • src/components/builder/BuilderExitButton.vue
  • src/components/builder/BuilderMenu.vue
  • src/components/builder/BuilderToolbar.vue
  • src/locales/en/main.json
💤 Files with no reviewable changes (1)
  • src/components/builder/AppBuilder.vue
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/locales/en/main.json

Comment on lines +25 to +37
useEventListener(window, 'keydown', (e: KeyboardEvent) => {
if (
e.key === 'Escape' &&
!e.ctrlKey &&
!e.altKey &&
!e.metaKey &&
dialogStore.dialogStack.length === 0 &&
isBuilderMode.value
) {
e.preventDefault()
e.stopPropagation()
onExitBuilder()
}
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 | 🟠 Major

Guard Escape handling while editing text inputs

The global Escape handler exits builder mode even when focus is in editable fields. With direct exit behavior, this can cause accidental mode exits during text entry.

Suggested fix
 useEventListener(window, 'keydown', (e: KeyboardEvent) => {
+  const target = e.target as HTMLElement | null
+  const isEditable =
+    target instanceof HTMLInputElement ||
+    target instanceof HTMLTextAreaElement ||
+    target?.isContentEditable === true
+  if (isEditable) return
+
   if (
     e.key === 'Escape' &&
     !e.ctrlKey &&
     !e.altKey &&
     !e.metaKey &&
+    !e.shiftKey &&
     dialogStore.dialogStack.length === 0 &&
     isBuilderMode.value
   ) {
📝 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
useEventListener(window, 'keydown', (e: KeyboardEvent) => {
if (
e.key === 'Escape' &&
!e.ctrlKey &&
!e.altKey &&
!e.metaKey &&
dialogStore.dialogStack.length === 0 &&
isBuilderMode.value
) {
e.preventDefault()
e.stopPropagation()
onExitBuilder()
}
useEventListener(window, 'keydown', (e: KeyboardEvent) => {
const target = e.target as HTMLElement | null
const isEditable =
target instanceof HTMLInputElement ||
target instanceof HTMLTextAreaElement ||
target?.isContentEditable === true
if (isEditable) return
if (
e.key === 'Escape' &&
!e.ctrlKey &&
!e.altKey &&
!e.metaKey &&
!e.shiftKey &&
dialogStore.dialogStack.length === 0 &&
isBuilderMode.value
) {
e.preventDefault()
e.stopPropagation()
onExitBuilder()
}
})
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/builder/BuilderExitButton.vue` around lines 25 - 37, The
Escape handler registered via useEventListener currently calls onExitBuilder
whenever isBuilderMode.value is true and dialogStack is empty; change it to
first check document.activeElement and skip handling if focus is inside an
editable element (e.g., HTMLInputElement, HTMLTextAreaElement, or any element
with contentEditable === "true" or true) or if the active element is inside a
rich-text/editor component (check element.closest for common editor selectors if
needed). Update the listener logic in the same block where useEventListener is
used so the conditions include this focus guard before calling
e.preventDefault(), e.stopPropagation(), and onExitBuilder; keep the existing
checks for isBuilderMode.value and dialogStore.dialogStack.length.

@pythongosssss pythongosssss merged commit 07dab97 into main Feb 27, 2026
33 checks passed
@pythongosssss pythongosssss deleted the pysssss/appmode-exit-updates branch February 27, 2026 21:55
DrJKL pushed a commit that referenced this pull request Feb 28, 2026
## Summary

- remove exit builder button from right panel
- add builder exit button to bottom of canvas
- add builder menu with save & exit in top left

## Screenshots (if applicable)

<img width="1544" height="998" alt="image"
src="https://github.com/user-attachments/assets/f5deadc5-2bf5-4729-b644-2b6a815b9975"
/>

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9218-App-builder-exit-updates-3126d73d365081a0bf1adf92e1171060)
by [Unito](https://www.unito.io)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants