Skip to content

A heavy-handed fix for middlemouse pan#8865

Open
AustinMroz wants to merge 2 commits intomainfrom
austin/pan-sledgehammer
Open

A heavy-handed fix for middlemouse pan#8865
AustinMroz wants to merge 2 commits intomainfrom
austin/pan-sledgehammer

Conversation

@AustinMroz
Copy link
Collaborator

@AustinMroz AustinMroz commented Feb 14, 2026

Sometimes, middle mouse clicks would fail to initiate a canvas pan, depending on the target of the initial pan. This PR adds a capturing event handler to the transform pane that forwards the pointer event to canvas if

  • It is a middle mouse click
  • The target element is not a focused text element

Resolves #6911

While testing this, I encountered infrequent cases of "some nodes unintentionally translating continually to the left". Reproduction was too unreliable to properly track down, but did appear unrelated to this PR.

┆Issue is synchronized with this Notion page by Unito

@AustinMroz AustinMroz requested a review from a team as a code owner February 14, 2026 06:18
@dosubot dosubot bot added the size:S This PR changes 10-29 lines, ignoring generated files. label Feb 14, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 14, 2026

📝 Walkthrough

Walkthrough

Added pointer event forwarding to GraphCanvas with a handler that filters out copy-paste target interactions and non-middle-pointer inputs before delegating events to canvasInteractions.forwardEventToCanvas. No public API changes.

Changes

Cohort / File(s) Summary
Pointer event forwarding
src/components/graph/GraphCanvas.vue
Added @pointerdown, @pointerup, @pointermove listeners routed to a new internal forwardPanEvent handler; imported isMiddlePointerInput and shouldIgnoreCopyPaste; forwardPanEvent ignores events when the copy-paste target is active or the input is not a middle-pointer, otherwise calls canvasInteractions.forwardEventToCanvas.

Sequence Diagram(s)

sequenceDiagram
    participant User as User (Pointer)
    participant GC as GraphCanvas
    participant Check as Filter (shouldIgnoreCopyPaste / isMiddlePointerInput)
    participant CI as canvasInteractions

    User->>GC: pointerdown / pointermove / pointerup
    GC->>Check: evaluate target & pointer type
    alt ignore event
        Check-->>GC: ignore
    else forward
        Check->>CI: forwardEventToCanvas(event)
        CI-->>GC: handled
    end
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Poem

🐰
Middle paw taps, then softly sighs,
I push the world where center lies.
No widget grabs, no sudden stop—
The canvas rolls beneath my hop. 🖱️

🚥 Pre-merge checks | ✅ 4 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive The PR description explains the changes but does not follow the template structure with proper section headings (Summary, Changes, Review Focus). It provides context and issue reference but lacks organized formatting. Restructure the description to match the template format with clear sections: Summary, Changes (What/Breaking/Dependencies), and Review Focus.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'A heavy-handed fix for middlemouse pan' clearly and specifically describes the main change: implementing a solution to fix middle mouse button panning issues.
Linked Issues check ✅ Passed The PR addresses issue #6911 by implementing pointer event forwarding for middle mouse clicks while ignoring focused text elements, directly resolving the requirement to prevent middle-mouse from interacting with widgets.
Out of Scope Changes check ✅ Passed All changes are focused on fixing middle mouse panning behavior in GraphCanvas by adding pointer event handlers and conditional forwarding logic, which is directly within the scope of issue #6911.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

✏️ 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 austin/pan-sledgehammer

No actionable comments were generated in the recent review. 🎉

🧹 Recent nitpick comments
src/components/graph/GraphCanvas.vue (1)

548-556: Reorder condition to short-circuit non-middle-button events on the hot pointermove path.

pointermove fires frequently during mouse movement. Currently shouldIgnoreCopyPaste(e.target) is evaluated for all pointer events, but the vast majority are non-middle-button events. Reordering to check isMiddlePointerInput first (a cheap property check) avoids unnecessary instanceof operations in shouldIgnoreCopyPaste:

♻️ Proposed reorder
 function forwardPanEvent(e: PointerEvent) {
   if (
-    (shouldIgnoreCopyPaste(e.target) && document.activeElement === e.target) ||
-    !isMiddlePointerInput(e)
+    !isMiddlePointerInput(e) ||
+    (shouldIgnoreCopyPaste(e.target) && document.activeElement === e.target)
   )
     return

   canvasInteractions.forwardEventToCanvas(e)
 }

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

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/14/2026, 05:55:53 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Feb 14, 2026

Playwright: ✅ 524 passed, 0 failed · 1 flaky

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

@github-actions
Copy link

github-actions bot commented Feb 14, 2026

Bundle Size Report

Summary

  • Raw size: 19.8 MB baseline 19.8 MB — 🔴 +328 B
  • Gzip: 4.24 MB baseline 4.24 MB — 🔴 +89 B
  • Brotli: 3.29 MB baseline 3.29 MB — 🔴 +81 B
  • Bundles: 230 current • 230 baseline • 2 added / 2 removed

Category Glance
Graph Workspace 🔴 +328 B (880 kB) · Vendor & Third-Party ⚪ 0 B (8.69 MB) · Other ⚪ 0 B (7.31 MB) · Data & Services ⚪ 0 B (2.15 MB) · Panels & Settings ⚪ 0 B (427 kB) · Utilities & Hooks ⚪ 0 B (237 kB) · + 5 more

Per-category breakdown
App Entry Points — 21.7 kB (baseline 21.7 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-C45gbIp-.js (new) 21.7 kB 🔴 +21.7 kB 🔴 +7.02 kB 🔴 +6.1 kB
assets/index-DP88Vquv.js (removed) 21.7 kB 🟢 -21.7 kB 🟢 -7.02 kB 🟢 -6.13 kB

Status: 1 added / 1 removed

Graph Workspace — 880 kB (baseline 879 kB) • 🔴 +328 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-1FPq00aF.js (new) 880 kB 🔴 +880 kB 🔴 +190 kB 🔴 +144 kB
assets/GraphView-B9Mwtsqu.js (removed) 879 kB 🟢 -879 kB 🟢 -190 kB 🟢 -144 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudAuthTimeoutView-DIdSLH2c.js 4.96 kB 4.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudForgotPasswordView-DS5VbhjH.js 5.61 kB 5.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLayoutView-BzDbp1d3.js 6.48 kB 6.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLoginView-l77rsOjT.js 10.1 kB 10.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSignupView-nP4-Pt3K.js 7.46 kB 7.46 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSorryContactSupportView-CnbSE1aL.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSubscriptionRedirectView-DojTDDw9.js 4.76 kB 4.76 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSurveyView-DdzPUqdW.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-BN-ntRG8.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserCheckView-D6ecjis0.js 8.38 kB 8.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserSelectView-BWsw177-.js 4.46 kB 4.46 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Panels & Settings — 427 kB (baseline 427 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AboutPanel-CMJCcEbd.js 8.49 kB 8.49 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudRemoteConfig-BLOXFPfA.js 1.49 kB 1.49 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/config-CepyQFhC.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ExtensionPanel-mKbtKhiU.js 9.43 kB 9.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/KeybindingPanel-pDH0Uh6z.js 12.4 kB 12.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LegacyCreditsPanel-BwLAePOT.js 20.7 kB 20.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/refreshRemoteConfig-zTVNTAjE.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SecretsPanel-CyCa80R8.js 21.5 kB 21.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ServerConfigPanel-CEVECqTs.js 6.5 kB 6.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-8z66fa9o.js 29.2 kB 29.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B_EruZyQ.js 27.1 kB 27.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BPuOKZZg.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C5NycgSh.js 31.6 kB 31.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CF6cmuWq.js 37.6 kB 37.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CMSM0-YP.js 28.1 kB 28.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Djbh331J.js 29.8 kB 29.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-emoCO0AT.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-H0rWARzj.js 23.3 kB 23.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-HiOqkizv.js 28 kB 28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-ohqijv3i.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanel-BzMPv5Nk.js 18.7 kB 18.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserPanel-ClR2TRHn.js 6.21 kB 6.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
User & Accounts — 16.1 kB (baseline 16.1 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-Bt2Htthh.js 317 B 317 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auth-DI00dR1_.js 3.4 kB 3.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/firebaseAuthStore-DFpYDjdE.js 837 B 837 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/PasswordFields-CdUdjtQy.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SignUpForm-DPH36X22.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UpdatePasswordContent-BiYEXAny.js 2.42 kB 2.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-BQO-2kig.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Editors & Dialogs — 785 B (baseline 785 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-CcP_fTOK.js 785 B 785 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
UI Components — 36.6 kB (baseline 36.6 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Button-BlbRDbqy.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-hxJOdoys.js 1.24 kB 1.24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudFeedbackTopbarButton-DMWIU4Yk.js 1.64 kB 1.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-BBkYvdEL.js 7.17 kB 7.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-DBtF9-RO.js 842 B 842 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeButton-BJW-VJ-6.js 2.35 kB 2.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-Ds7IqP5Z.js 7.45 kB 7.45 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-DrH_EiZZ.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useTerminalTabs-DRPS9d_P.js 9.89 kB 9.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DgRwIURU.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Data & Services — 2.15 MB (baseline 2.15 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/api-JWNEfX6r.js 646 kB 646 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioService-jlaEg_cQ.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/bootstrapStore-DcIj7mFD.js 2.08 kB 2.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogService-CRHk-j5F.js 774 B 774 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogService-Dkrz4Aeu.js 1.38 MB 1.38 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogStore-D5Kfd1UD.js 4.1 kB 4.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/keybindingService-CltEUyRe.js 6.57 kB 6.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/load3dService-dw4526Mt.js 91 kB 91 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-BP9JLKQu.js 7.96 kB 7.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-CAFc4gjy.js 809 B 809 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-CRmy-NJp.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/systemStatsStore-C6Ro-WIm.js 12.2 kB 12.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/userStore-D-NlDTSd.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/workflowDraftStore-Bp5uJoN7.js 785 B 785 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
Utilities & Hooks — 237 kB (baseline 237 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/_plugin-vue_export-helper-CY4XIWDa.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioUtils-DBS5aDM4.js 858 B 858 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-BiqWg6CN.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-BHmbpOtd.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DKmelI5u.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BputJAFn.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/subscriptionCheckoutUtil-DwUnMiNN.js 2.53 kB 2.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useConflictDetection-Cw6rigMO.js 178 kB 178 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCopyToClipboard-k4nvRIaA.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCurrentUser-C5BOEX6_.js 771 B 771 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useErrorHandling-gmUm5bOy.js 1.34 kB 1.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-DafmtzkT.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useFeatureFlags-BveR4fyW.js 3.32 kB 3.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3d-CEUeVRSY.js 908 B 908 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3d-G5cMgUZH.js 14.6 kB 14.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3dViewer-BwJ7MjWV.js 887 B 887 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3dViewer-CvReDoxK.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useSubscriptionCredits-Cl9dAyKe.js 2.75 kB 2.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useWorkspaceSwitch-D8s5AZFt.js 1.25 kB 1.25 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useWorkspaceUI-DG3LnLG0.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Vendor & Third-Party — 8.69 MB (baseline 8.69 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-C4mPrLmU.js 70.3 kB 70.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-BxkFiWzp.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-BxsQv-KC.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-uorjc_FY.js 102 kB 102 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-CON5ZIHM.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-Bd8j9uVq.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-B82zTENX.js 255 kB 255 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-LBLOE6BD.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-Bi_34iZD.js 625 kB 625 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-BjA-tjXK.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-DcEOrMQz.js 112 kB 112 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-Yc0APIKH.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CBmk8HiD.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.31 MB (baseline 7.31 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AnimationControls-C2PN8K_8.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-bw7NNZ6Z.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/AudioPreviewPlayer-DuxgDiSK.js 10.9 kB 10.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-BTnZwrs2.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-D1Wkn_Pz.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CancelSubscriptionDialogContent-DPK4Bltz.js 4.85 kB 4.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/changeTracker-Db2rxPKa.js 9.38 kB 9.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/changeTracker-vwQ7ZgAV.js 806 B 806 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudBadges-D2YdLqEH.js 1.42 kB 1.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudRunButtonWrapper-lhNmg1IR.js 1.72 kB 1.72 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSessionCookie-CWOcaqM_.js 3.15 kB 3.15 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSubscription-Ckp6E8Zc.js 1.38 kB 1.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-IINhk7dd.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-DAYiT6Xw.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BA_pLDIO.js 14.7 kB 14.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BhzDZEGT.js 15.7 kB 15.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BNvNJ49l.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BrjHW_IV.js 18.4 kB 18.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BuCfvdT4.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BumftKwc.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cq5uT6l1.js 16.6 kB 16.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CxH3xT8b.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D_Nd488H.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D1Ii1DEp.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-uLreJTDW.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-fZH7ZM7u.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/core-_0iypBio.js 72.4 kB 72.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CreateWorkspaceDialogContent-zLIB_b03.js 5.58 kB 5.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CurrentUserPopoverWorkspace-C2FdktpY.js 19.9 kB 19.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/DeleteWorkspaceDialogContent-D-qorzdB.js 4.29 kB 4.29 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/EditWorkspaceDialogContent-CmJ15zMP.js 5.38 kB 5.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/GlobalToast-BF2qoXlT.js 2.91 kB 2.91 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/graphHasMissingNodes-DaTGcOcB.js 761 B 761 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/groupNode--dEItPFz.js 72.1 kB 72.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-AuXKtrt5.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-DUrT_rO-.js 495 kB 495 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeContent-CNb288kC.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeFooter-BHuh5cMc.js 1.88 kB 1.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ImportFailedNodeHeader-LMkGR62F.js 1.08 kB 1.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/InviteMemberDialogContent-De3c_Sbd.js 7.44 kB 7.44 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/InviteMemberUpsellDialogContent-myf4Wlko.js 3.88 kB 3.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-DR-0-yTy.js 12.3 kB 12.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LeaveWorkspaceDialogContent-BuhELGlb.js 4.12 kB 4.12 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/load3d-DrCpdMdy.js 14.8 kB 14.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-DW2IEpyT.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-nC07pg3E.js 1.12 kB 1.12 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3DConfiguration-DhX00jhW.js 6.27 kB 6.27 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3DControls-Cx_CXOYU.js 30.9 kB 30.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3dViewerContent-BJ7-0Hzd.js 1.04 kB 1.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3dViewerContent-DuKID9Mq.js 23.1 kB 23.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B-R2DVaP.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BC8u9oTa.js 119 kB 119 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BEa4i_Uk.js 167 kB 167 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bi9hu7ry.js 141 kB 141 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BSL41NgH.js 187 kB 187 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CJnz49TM.js 154 kB 154 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CPHo6n7Y.js 136 kB 136 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CvjW1B8s.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D6ID2Zcz.js 134 kB 134 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-eGmEf_Hx.js 118 kB 118 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-xI_YpwQv.js 138 kB 138 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-CHdzdEY0.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-aTfN9fO4.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-DwcJSZ5v.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-C7I_Nivi.js 2.23 kB 2.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingModelsWarning-DjsraPXL.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingNodesContent-zv0Lm7px.js 6.18 kB 6.18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingNodesFooter-vB8jImAn.js 6.75 kB 6.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MissingNodesHeader-BAZcszup.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nightlyBadges-CKwGYL9m.js 1.05 kB 1.05 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictDialogContent-Bwfu0Y4G.js 10.5 kB 10.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictFooter-C_mfNHya.js 2.37 kB 2.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NodeConflictHeader-Dw3rwJjr.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-3cab5KeM.js 415 kB 415 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-aLMm0gZm.js 362 kB 362 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BkRL-oJ_.js 454 kB 454 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BNE1oPUr.js 337 kB 337 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BXPcnYpT.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CD0BvEYx.js 370 kB 370 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CiYiQ6D5.js 416 kB 416 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DcpehiUU.js 340 kB 340 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DyWG6Iir.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-hyXgxlxY.js 384 kB 384 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-TCrvxtjI.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeTemplates-BJCHzhU8.js 9.35 kB 9.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Preview3d-DUXBCDMr.js 4.86 kB 4.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DEaITebJ.js 665 B 665 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/RemoveMemberDialogContent-C1M1sP37.js 4.1 kB 4.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/RevokeInviteDialogContent-Bas5XYa-.js 4.01 kB 4.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/saveMesh-CYdiyd0c.js 3.43 kB 3.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-CdzHv1VF.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SignInContent-B4MksLRC.js 19 kB 19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-DFtSLkN0.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-B-nteaB9.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src--CSlktKB.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeToRun-C-pFBECJ.js 2.2 kB 2.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanelContentWorkspace-DBhuYuAb.js 979 B 979 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanelContentWorkspace-Gz-_uajc.js 21.6 kB 21.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionRequiredDialogContent-DC9PeJDI.js 26.2 kB 26.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionRequiredDialogContentWorkspace-Bx2OCl0U.js 45.9 kB 45.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-Db2yG1o2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ValueControlPopover-CRuT3UlW.js 4.97 kB 4.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-BhHc6T04.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-05_iDuzU.js 131 B 131 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-JezhrbLj.js 3.91 kB 3.91 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-B1i-QEjC.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-BUNId5TS.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-DhRGcwZO.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-CV8eZwv_.js 3.1 kB 3.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCrop-c0QuVzjV.js 22.4 kB 22.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputNumber-CJD0Awwz.js 15.8 kB 15.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputNumber-CTF6s-PY.js 392 B 392 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-Ww-Tpbsi.js 1.86 kB 1.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-CLaC3IDH.js 1.95 kB 1.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLegacy-r9ncDiuv.js 794 B 794 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-CnTGrGUn.js 2.88 kB 2.88 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-Cd0O5LPR.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetRecordAudio-CqSp_PCX.js 17.4 kB 17.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetSelect-BWk7_fAV.js 57.8 kB 57.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-bavVor9x.js 3.18 kB 3.18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-CYFSDGXH.js 2.5 kB 2.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-Cp8f93Pk.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetWithControl-BeK-8Q6N.js 7.08 kB 7.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspacePanelContent-D_R7gR70.js 29.3 kB 29.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/components/graph/GraphCanvas.vue`:
- Line 160: The top-level import of forwardMiddlePointerIfNeeded from
useNodePointerInteractions causes module-scoped side effects (it triggers
useCanvasInteractions at module load); to fix, remove the module-scope import in
GraphCanvas.vue and load the helper inside the component lifecycle (e.g.,
dynamically import or import within setup()) so useCanvasInteractions runs only
at runtime, or change the composable to expose a side-effect-free export and
import that instead; reference the forwardMiddlePointerIfNeeded symbol and the
useNodePointerInteractions composable so you can either lazy-import the function
in setup() or refactor useNodePointerInteractions to expose a safe entrypoint.
🧹 Nitpick comments (1)
src/components/graph/GraphCanvas.vue (1)

548-552: The shouldIgnoreCopyPaste check is semantically misaligned with the function's purpose.

shouldIgnoreCopyPaste is designed to check if copy/paste shortcuts should be suppressed (for text inputs). Reusing it here as "is this a focused text element?" works by coincidence but makes the intent opaque to future readers. A more descriptive helper (e.g., isFocusedTextInput) or at minimum a brief comment would clarify why this guard exists.

Also note: forwardMiddlePointerIfNeeded(e) returns a boolean, but the return value is discarded. If you add stopPropagation to prevent double-dispatch (per the comment above), you'd need to use that return value:

 function forwardPanEvent(e: PointerEvent) {
   if (shouldIgnoreCopyPaste(e.target) && document.activeElement === e.target)
     return
-  forwardMiddlePointerIfNeeded(e)
+  if (forwardMiddlePointerIfNeeded(e)) e.stopPropagation()
 }

@AustinMroz AustinMroz force-pushed the austin/pan-sledgehammer branch from e45ae1a to cb08eae Compare February 14, 2026 17:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S This PR changes 10-29 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

v1.33.8 Middle-mouse keeps interacting with widgets instead of panning

1 participant