Skip to content

Conversation

@DrJKL
Copy link
Contributor

@DrJKL DrJKL commented Jan 21, 2026

Summary

This PR improves keyboard event handling consistency and fixes an issue where pressing Escape in nested input components would unintentionally close parent modals/dialogs.

Changes

Keyboard Event Fixes

TagsInput Escape Key Handling

  • Added @keydown.escape.stop handler to TagsInputInput.vue to prevent Escape from bubbling up and closing parent modals
  • The handler blurs the input and exits editing mode without propagating the event

EditableText keyup → keydown Migration

  • Changed @keyup.enter to @keydown.enter and @keyup.escape to @keydown.escape
  • Using keydown is more consistent with how other UI frameworks handle these events and provides more responsive feedback
  • Updated corresponding unit tests to use keydown triggers

Why keydown over keyup?

  • keydown fires immediately when the key is pressed, providing faster perceived response
  • Better consistency with browser/OS conventions for action triggers
  • Prevents default behaviors (like form submission) more reliably when needed
  • Aligns with other keyboard handlers in the codebase

Testing

  • Updated EditableText.test.ts to use keydown events
  • Updated NodeHeader.test.ts to use keydown.enter
  • Manual testing: Escape in TagsInput no longer closes parent modal

Checklist

  • Unit tests updated
  • Keyboard event handlers consistent
  • No breaking changes to component API

┆Issue is synchronized with this Notion page by Unito

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 21, 2026

📝 Walkthrough

Walkthrough

Swaps keyboard event bindings from keyup to keydown for Enter and Escape in EditableText and NodeHeader tests/components, and adds an Escape handler in TagsInputInput that blurs the input and exits edit mode.

Changes

Cohort / File(s) Summary
Keyup → Keydown Migration
src/components/common/EditableText.vue, src/components/common/EditableText.test.ts, src/renderer/extensions/vueNodes/components/NodeHeader.test.ts
Replaced keyup.enter / keyup.escape with keydown.enter / keydown.escape. Tests updated to fire keydown events. Adjusts when confirm/cancel/blur logic triggers during keyboard interactions.
Escape Handler Added
src/components/ui/tags-input/TagsInputInput.vue
Added handleEscape that blurs the current input and sets isEditing = false; bound to Escape key with stop propagation to exit edit mode.
✨ Finishing touches
  • 📝 Generate docstrings

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 Jan 21, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/21/2026, 07:23:03 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 21, 2026

🎭 Playwright Tests: ✅ Passed

Results: 507 passed, 0 failed, 0 flaky, 8 skipped (Total: 515)

📊 Browser Reports
  • chromium: View Report (✅ 495 / ❌ 0 / ⚠️ 0 / ⏭️ 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)

@DrJKL DrJKL marked this pull request as ready for review January 21, 2026 04:25
@DrJKL DrJKL requested a review from a team as a code owner January 21, 2026 04:25
@dosubot dosubot bot added the size:S This PR changes 10-29 lines, ignoring generated files. label Jan 21, 2026
@github-actions
Copy link

github-actions bot commented Jan 21, 2026

Bundle Size Report

Summary

  • Raw size: 21.4 MB baseline 21.4 MB — 🟢 -24 B
  • Gzip: 4.44 MB baseline 4.44 MB — 🔴 +18 B
  • Brotli: 3.29 MB baseline 3.29 MB — 🟢 -45 B
  • Bundles: 155 current • 155 baseline • 65 added / 65 removed

Category Glance
Data & Services 🟢 -24 B (3.05 MB) · Vendor & Third-Party ⚪ 0 B (10.4 MB) · Other ⚪ 0 B (6.28 MB) · Graph Workspace ⚪ 0 B (1.02 MB) · Panels & Settings ⚪ 0 B (430 kB) · Views & Navigation ⚪ 0 B (80.7 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CUhmtqUW.js (new) 22.4 kB 🔴 +22.4 kB 🔴 +6.74 kB 🔴 +5.95 kB
assets/index-LW4l_PUK.js (removed) 22.4 kB 🟢 -22.4 kB 🟢 -6.74 kB 🟢 -5.93 kB

Status: 1 added / 1 removed

Graph Workspace — 1.02 MB (baseline 1.02 MB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Cn7As3-M.js (removed) 1.02 MB 🟢 -1.02 MB 🟢 -201 kB 🟢 -153 kB
assets/GraphView-UXzL9sAO.js (new) 1.02 MB 🔴 +1.02 MB 🔴 +201 kB 🔴 +153 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BvqMobXb.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.61 kB 🔴 +3.06 kB
assets/CloudSurveyView-ByPYULbt.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.61 kB 🟢 -3.05 kB
assets/CloudLoginView-B2DFWVnf.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.09 kB 🔴 +2.71 kB
assets/CloudLoginView-CS3hCMH8.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.71 kB
assets/UserCheckView-BEQlmxNt.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.44 kB 🔴 +2.13 kB
assets/UserCheckView-CrIr00ne.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.44 kB 🟢 -2.13 kB
assets/CloudLayoutView-BEm8YWXU.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.25 kB 🟢 -1.96 kB
assets/CloudLayoutView-BZaS0eS3.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.25 kB 🔴 +1.96 kB
assets/CloudSignupView-CqCYcpSl.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.33 kB 🔴 +2.03 kB
assets/CloudSignupView-TWqGfLbs.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.03 kB
assets/CloudForgotPasswordView-BIzs_jlj.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/CloudForgotPasswordView-D7nZUuHA.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/UserSelectView-CWdM93lm.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/UserSelectView-DH1y9FeK.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-B2-dqQWA.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.54 kB
assets/CloudSubscriptionRedirectView-BbaHan_c.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.54 kB
assets/CloudAuthTimeoutView-BlPsILTT.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/CloudAuthTimeoutView-CCOyvhri.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.71 kB 🔴 +1.49 kB
assets/CloudSorryContactSupportView-41RMhsFA.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-DT-CUejm.js 500 B 500 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/LegacyCreditsPanel-C3hUwJT-.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.95 kB 🔴 +5.23 kB
assets/LegacyCreditsPanel-Dc16Ol7T.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.95 kB 🟢 -5.24 kB
assets/SubscriptionPanel-BeJTeMqz.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5 kB 🟢 -4.38 kB
assets/SubscriptionPanel-DP_TlBmJ.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5 kB 🔴 +4.38 kB
assets/KeybindingPanel-BLl5RD4l.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.74 kB 🔴 +3.31 kB
assets/KeybindingPanel-CauMUD3x.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.73 kB 🟢 -3.32 kB
assets/AboutPanel-B061F8w1.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.43 kB
assets/AboutPanel-uFtYVhqg.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.42 kB
assets/ExtensionPanel-Bf8I9aOF.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ExtensionPanel-Lu4Ufdtt.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/ServerConfigPanel-9Kkly9Qv.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.16 kB 🟢 -1.94 kB
assets/ServerConfigPanel-DRbCvei8.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.16 kB 🔴 +1.94 kB
assets/UserPanel-BHUuEhTg.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.91 kB 🟢 -1.67 kB
assets/UserPanel-BZhplPAF.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.91 kB 🔴 +1.67 kB
assets/cloudRemoteConfig-B1nIDqs6.js (removed) 1.82 kB 🟢 -1.82 kB 🟢 -768 B 🟢 -665 B
assets/cloudRemoteConfig-D_IsVB56.js (new) 1.82 kB 🔴 +1.82 kB 🔴 +769 B 🔴 +656 B
assets/remoteConfig-BEkdBLxH.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/remoteConfig-D_gf6SLU.js 188 B 188 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-6DVADt2n.js 34.3 kB 34.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B0j03ezr.js 38.3 kB 38.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BHe-AJJN.js 29.6 kB 29.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BT2lfy0S.js 29.5 kB 29.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cp0lF2Mp.js 31.2 kB 31.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CwdesOpm.js 32.1 kB 32.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D3SeHgho.js 28.6 kB 28.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D42m_JEJ.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-FF_vLB0C.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-reUMVWRn.js 30.4 kB 30.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-s7kHNBdQ.js 28.9 kB 28.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-B7pEL_6a.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.06 kB
assets/auth-gHZxcM21.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.06 kB
assets/firebaseAuthStore-C18lrypx.js (removed) 217 B 🟢 -217 B 🟢 -138 B 🟢 -122 B
assets/firebaseAuthStore-E4olycIT.js (new) 217 B 🔴 +217 B 🔴 +138 B 🔴 +121 B
assets/auth-CDgr5bhh.js (new) 178 B 🔴 +178 B 🔴 +142 B 🔴 +143 B
assets/auth-EaqPBsb5.js (removed) 178 B 🟢 -178 B 🟢 -142 B 🟢 -131 B

Status: 3 added / 3 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-BF1hR5GI.js (removed) 2.62 kB 🟢 -2.62 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/useSubscriptionDialog-mggN0WfS.js (new) 2.62 kB 🔴 +2.62 kB 🔴 +1.24 kB 🔴 +1.09 kB
assets/useSubscriptionDialog-dfsGILgC.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -96 B
assets/useSubscriptionDialog-U2z5orsd.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +97 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SubscribeButton-Dw-dZFFq.js (removed) 12.5 kB 🟢 -12.5 kB 🟢 -3 kB 🟢 -2.69 kB
assets/SubscribeButton-g6ROA4eU.js (new) 12.5 kB 🔴 +12.5 kB 🔴 +3.01 kB 🔴 +2.71 kB
assets/ComfyQueueButton-Cjn4Fn2S.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.69 kB 🟢 -2.42 kB
assets/ComfyQueueButton-YaMxdcuq.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.42 kB
assets/CloudBadge-DLurbiMk.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +728 B 🔴 +652 B
assets/CloudBadge-DPLjhjVa.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -729 B 🟢 -648 B
assets/cloudFeedbackTopbarButton-biLMWw39.js (removed) 866 B 🟢 -866 B 🟢 -524 B 🟢 -440 B
assets/cloudFeedbackTopbarButton-lU99t4kN.js (new) 866 B 🔴 +866 B 🔴 +527 B 🔴 +439 B
assets/ComfyQueueButton-C8gHS-jA.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +106 B
assets/ComfyQueueButton-DjFFZsMT.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -110 B
assets/Button-CKxdX0Yq.js 3.75 kB 3.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-Bj7TTp1S.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DZ-mX5uq.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 3.05 MB (baseline 3.05 MB) • 🟢 -24 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-Dk-ZisFF.js (removed) 1.87 MB 🟢 -1.87 MB 🟢 -398 kB 🟢 -304 kB
assets/dialogService-VEIMEhAP.js (new) 1.87 MB 🔴 +1.87 MB 🔴 +398 kB 🔴 +304 kB
assets/api-_x4Z5UoM.js (removed) 1.15 MB 🟢 -1.15 MB 🟢 -240 kB 🟢 -186 kB
assets/api-BxUs8HI4.js (new) 1.15 MB 🔴 +1.15 MB 🔴 +240 kB 🔴 +186 kB
assets/releaseStore-ButIkao9.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.41 kB 🟢 -2.12 kB
assets/releaseStore-CMG2infS.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.41 kB 🔴 +2.13 kB
assets/keybindingService-DDbhCPk-.js (removed) 6.78 kB 🟢 -6.78 kB 🟢 -1.74 kB 🟢 -1.51 kB
assets/keybindingService-GY0m78k0.js (new) 6.78 kB 🔴 +6.78 kB 🔴 +1.75 kB 🔴 +1.51 kB
assets/userStore-DxJyqiDy.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +813 B 🔴 +727 B
assets/userStore-JkpkFWOo.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -814 B 🟢 -727 B
assets/audioService-91qNbLMJ.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -932 B 🟢 -817 B
assets/audioService-CHMADvUl.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +931 B 🔴 +827 B
assets/releaseStore-Ci8pxAlY.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +106 B
assets/releaseStore-D9piv3Co.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -105 B
assets/serverConfigStore-sopnD88s.js 2.64 kB 2.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 7 added / 7 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useErrorHandling-BPUUz3nj.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.5 kB 🟢 -1.3 kB
assets/useErrorHandling-D3twMt-R.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.5 kB 🔴 +1.31 kB
assets/subscriptionCheckoutUtil-4USBYEtu.js (removed) 1.98 kB 🟢 -1.98 kB 🟢 -862 B 🟢 -752 B
assets/subscriptionCheckoutUtil-CwbFAkG2.js (new) 1.98 kB 🔴 +1.98 kB 🔴 +862 B 🔴 +750 B
assets/audioUtils-DDYBkFeX.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +622 B 🔴 +526 B
assets/audioUtils-DmVyyjrS.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -619 B 🟢 -524 B
assets/useCurrentUser-C3CGhrQZ.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +103 B
assets/useCurrentUser-D81-_U6U.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -104 B
assets/_plugin-vue_export-helper-xVPqUhAl.js 467 B 467 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-BTZOs5h9.js 7.2 kB 7.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-B9qvfWYq.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-BUCOyXf2.js 421 B 421 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tailwindUtil-DTv34axN.js 487 B 487 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 4 added / 4 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-Dr8GmMlH.js 408 kB 408 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-CpOC_out.js 3.92 MB 3.92 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-DvjPM_Lx.js 3.04 MB 3.04 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-BRjoKiJi.js 172 kB 172 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-Dqb1VEds.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BxNhpyUI.js 650 kB 650 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-7XRCqLaG.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-CArXWFIl.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 6.28 MB (baseline 6.28 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-CF9gvVyy.js (removed) 177 kB 🟢 -177 kB 🟢 -42.8 kB 🟢 -35.7 kB
assets/core-DFtqfm4B.js (new) 177 kB 🔴 +177 kB 🔴 +42.8 kB 🔴 +35.8 kB
assets/Load3D-C1V_3BBT.js (removed) 55.7 kB 🟢 -55.7 kB 🟢 -9.18 kB 🟢 -7.92 kB
assets/Load3D-DCFoFTgD.js (new) 55.7 kB 🔴 +55.7 kB 🔴 +9.18 kB 🔴 +7.91 kB
assets/WidgetSelect-CIza4wO0.js (new) 50.5 kB 🔴 +50.5 kB 🔴 +11.1 kB 🔴 +9.68 kB
assets/WidgetSelect-D8nvUZe6.js (removed) 50.5 kB 🟢 -50.5 kB 🟢 -11.1 kB 🟢 -9.69 kB
assets/SubscriptionRequiredDialogContent-Cnpd18Vn.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.78 kB 🔴 +5.9 kB
assets/SubscriptionRequiredDialogContent-DB36EROp.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.78 kB 🟢 -5.91 kB
assets/WidgetRecordAudio-CK5S34BA.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.96 kB 🟢 -4.43 kB
assets/WidgetRecordAudio-DU20geFN.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.96 kB 🔴 +4.42 kB
assets/WidgetInputNumber-CPccnaqQ.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.49 kB 🔴 +4 kB
assets/WidgetInputNumber-DvLZwADh.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.49 kB 🟢 -4 kB
assets/WidgetImageCrop-B0Shxf-5.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.13 kB 🔴 +3.62 kB
assets/WidgetImageCrop-BupTBet7.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.13 kB 🟢 -3.62 kB
assets/PanelTemplate-DwXGhgSl.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.45 kB 🟢 -4.79 kB
assets/PanelTemplate-e0Ml594w.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.79 kB
assets/AudioPreviewPlayer-BIZzXNJO.js (new) 12.7 kB 🔴 +12.7 kB 🔴 +3.48 kB 🔴 +3.12 kB
assets/AudioPreviewPlayer-DbB7g11n.js (removed) 12.7 kB 🟢 -12.7 kB 🟢 -3.47 kB 🟢 -3.13 kB
assets/WidgetWithControl-CKO7AnwF.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.65 kB 🔴 +2.38 kB
assets/WidgetWithControl-Dof5Qd7D.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.65 kB 🟢 -2.38 kB
assets/ValueControlPopover-BWpodvIe.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.55 kB 🟢 -1.37 kB
assets/ValueControlPopover-r1wkNESK.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.55 kB 🔴 +1.38 kB
assets/WidgetAudioUI-CE_fbESl.js (new) 3.22 kB 🔴 +3.22 kB 🔴 +1.19 kB 🔴 +1.08 kB
assets/WidgetAudioUI-DalAziiM.js (removed) 3.22 kB 🟢 -3.22 kB 🟢 -1.19 kB 🟢 -1.06 kB
assets/GlobalToast-DF8-00_3.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +941 B
assets/GlobalToast-Di2R65bB.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -941 B
assets/SubscribeToRun-Bw9coz0w.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.15 kB 🟢 -1.01 kB
assets/SubscribeToRun-D9zIAH0b.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.16 kB 🔴 +1.01 kB
assets/cloudSessionCookie-B-I77RQA.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -918 B 🟢 -795 B
assets/cloudSessionCookie-F3KKtLR5.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +919 B 🔴 +797 B
assets/BaseViewTemplate-CbkSJSuR.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.05 kB 🔴 +926 B
assets/BaseViewTemplate-NQz-WHsq.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -946 B
assets/CloudRunButtonWrapper-B79B2sTS.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -641 B 🟢 -558 B
assets/CloudRunButtonWrapper-DxcbuUVP.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +640 B 🔴 +601 B
assets/cloudBadges-BLFXhknY.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -537 B 🟢 -479 B
assets/cloudBadges-CsbUf6QP.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +536 B 🔴 +477 B
assets/graphHasMissingNodes-DC_I4Qb7.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -460 B 🟢 -426 B
assets/graphHasMissingNodes-xYWu2oAe.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +461 B 🔴 +423 B
assets/cloudSubscription-CgmTN_ux.js (new) 976 B 🔴 +976 B 🔴 +456 B 🔴 +394 B
assets/cloudSubscription-Y_t9iJf9.js (removed) 976 B 🟢 -976 B 🟢 -457 B 🟢 -394 B
assets/AudioPreviewPlayer-DR1NvcQO.js (new) 191 B 🔴 +191 B 🔴 +120 B 🔴 +119 B
assets/AudioPreviewPlayer-uRqjpqGK.js (removed) 191 B 🟢 -191 B 🟢 -120 B 🟢 -121 B
assets/WidgetInputNumber-Bf3Izph8.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +120 B
assets/WidgetInputNumber-C7RvZglX.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -121 B
assets/WidgetLegacy-C_HKiJe4.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +112 B
assets/WidgetLegacy-CtHkkDzg.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -109 B
assets/WidgetSelect-Cs2gNhoM.js (removed) 161 B 🟢 -161 B 🟢 -113 B 🟢 -107 B
assets/WidgetSelect-DZg2SXs_.js (new) 161 B 🔴 +161 B 🔴 +113 B 🔴 +106 B
assets/Load3D-hvifPi2t.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +108 B
assets/Load3D-zkh7YLo6.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -107 B
assets/auto-Bv9cmrEd.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-6dIwsSNi.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BahwM9ZP.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BoJZgy7S.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BQtdp20P.js 20.6 kB 20.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CEMgeOuO.js 18.5 kB 18.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CnxND6sZ.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-coXkrooi.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CZcHDaAg.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DDPGTXy9.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DsGC6118.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-yZ2AjT4s.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-DHuYMTZW.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B_sPkRkB.js 121 kB 121 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BAkXMjmM.js 141 kB 141 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BENvLtOF.js 117 kB 117 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BNsn8_Lr.js 120 kB 120 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C9XUWxrh.js 105 kB 105 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Ch4S7NKM.js 105 kB 105 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DqG_JuMY.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DSqO9eB5.js 124 kB 124 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-F6Zr8qmN.js 118 kB 118 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-kF4hEjF-.js 145 kB 145 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-KWKxelma.js 134 kB 134 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-DEJN4gIz.js 2.38 kB 2.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-D39-6tpk.js 2 kB 2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-CVYh1Dta.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-D7WAsNtO.js 2.84 kB 2.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-DaKz7N-R.js 143 B 143 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-42NP799-.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-5Wl7kJtq.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bfo_nHET.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BIaHseXE.js 334 kB 334 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BqTE0tnV.js 437 kB 437 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CkFt94jg.js 365 kB 365 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-COXALCSv.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Cuv6XdUW.js 332 kB 332 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CyylrXT5.js 355 kB 355 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DN_FfVrO.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dxwvr4db.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/preservedQueryNamespaces-BsMrb3S_.js 3.23 kB 3.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DZ1Jt5wB.js 838 B 838 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-CqTjxoQm.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-Buvb2eP-.js 4.21 kB 4.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-Dneex3J5.js 518 B 518 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BRX2wHPg.js 4.71 kB 4.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BttrDPHP.js 186 B 186 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-Cw5Ye8UP.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-Dv0MELOX.js 3.71 kB 3.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-BwLByoy7.js 4.57 kB 4.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-BpLJ-dSO.js 3.79 kB 3.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-C57tLR52.js 2.58 kB 2.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-BmL9OHU7.js 2.61 kB 2.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-B4aB3N7S.js 3.22 kB 3.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DfR_ZXyS.js 1.31 kB 1.31 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-CZnm93Po.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-B0EfCU8u.js 3.08 kB 3.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 25 added / 25 removed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

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

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

166-179: Inconsistent: Escape test still uses keyup instead of keydown.

Line 172 uses keyup.escape but EditableText.vue now binds to @keydown.escape. This test should be updated to keydown.escape for consistency with the component changes.

Proposed fix
-    await input.trigger('keyup.escape')
+    await input.trigger('keydown.escape')

@DrJKL DrJKL merged commit 7b701ad into main Jan 21, 2026
27 checks passed
@DrJKL DrJKL deleted the drjkl/keyboard-fixes branch January 21, 2026 17:16
@DrJKL DrJKL added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch cloud/1.37 Backport PRs for cloud 1.37 labels Jan 22, 2026
@github-actions
Copy link

⚠️ Backport to cloud/1.37 failed

Reason: Merge conflicts detected during cherry-pick of 7b701ad

📄 Conflicting files
src/components/ui/tags-input/TagsInputInput.vue
🤖 Prompt for AI Agents
Backport PR #8204 (https://github.com/Comfy-Org/ComfyUI_frontend/pull/8204) to cloud/1.37.
Cherry-pick merge commit 7b701ad07b1c34d121448e21d6f8b5c13ef07d73 onto new branch
backport-8204-to-cloud-1.37 from origin/cloud/1.37.
Resolve conflicts in: src/components/ui/tags-input/TagsInputInput.vue .
For test snapshots (browser_tests/**/*-snapshots/), accept PR version if
changed in original PR, else keep target. For package.json versions, keep
target branch. For pnpm-lock.yaml, regenerate with pnpm install.
Ask user for non-obvious conflicts.
Create PR titled "[backport cloud/1.37] <original title>" with label "backport".
See .github/workflows/pr-backport.yaml for workflow details.

cc @DrJKL

1 similar comment
@github-actions
Copy link

⚠️ Backport to cloud/1.37 failed

Reason: Merge conflicts detected during cherry-pick of 7b701ad

📄 Conflicting files
src/components/ui/tags-input/TagsInputInput.vue
🤖 Prompt for AI Agents
Backport PR #8204 (https://github.com/Comfy-Org/ComfyUI_frontend/pull/8204) to cloud/1.37.
Cherry-pick merge commit 7b701ad07b1c34d121448e21d6f8b5c13ef07d73 onto new branch
backport-8204-to-cloud-1.37 from origin/cloud/1.37.
Resolve conflicts in: src/components/ui/tags-input/TagsInputInput.vue .
For test snapshots (browser_tests/**/*-snapshots/), accept PR version if
changed in original PR, else keep target. For package.json versions, keep
target branch. For pnpm-lock.yaml, regenerate with pnpm install.
Ask user for non-obvious conflicts.
Create PR titled "[backport cloud/1.37] <original title>" with label "backport".
See .github/workflows/pr-backport.yaml for workflow details.

cc @DrJKL

@DrJKL DrJKL added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch and removed needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch labels Jan 22, 2026
@github-actions
Copy link

⚠️ Backport to cloud/1.37 failed

Reason: Merge conflicts detected during cherry-pick of 7b701ad

📄 Conflicting files
src/components/ui/tags-input/TagsInputInput.vue
🤖 Prompt for AI Agents
Backport PR #8204 (https://github.com/Comfy-Org/ComfyUI_frontend/pull/8204) to cloud/1.37.
Cherry-pick merge commit 7b701ad07b1c34d121448e21d6f8b5c13ef07d73 onto new branch
backport-8204-to-cloud-1.37 from origin/cloud/1.37.
Resolve conflicts in: src/components/ui/tags-input/TagsInputInput.vue .
For test snapshots (browser_tests/**/*-snapshots/), accept PR version if
changed in original PR, else keep target. For package.json versions, keep
target branch. For pnpm-lock.yaml, regenerate with pnpm install.
Ask user for non-obvious conflicts.
Create PR titled "[backport cloud/1.37] <original title>" with label "backport".
See .github/workflows/pr-backport.yaml for workflow details.

cc @DrJKL

DrJKL added a commit that referenced this pull request Jan 22, 2026
…e key (#8204)

## Summary

This PR improves keyboard event handling consistency and fixes an issue
where pressing Escape in nested input components would unintentionally
close parent modals/dialogs.

## Changes

### Keyboard Event Fixes

**TagsInput Escape Key Handling**
- Added `@keydown.escape.stop` handler to `TagsInputInput.vue` to
prevent Escape from bubbling up and closing parent modals
- The handler blurs the input and exits editing mode without propagating
the event

**EditableText keyup → keydown Migration**
- Changed `@keyup.enter` to `@keydown.enter` and `@keyup.escape` to
`@keydown.escape`
- Using `keydown` is more consistent with how other UI frameworks handle
these events and provides more responsive feedback
- Updated corresponding unit tests to use `keydown` triggers

### Why keydown over keyup?

- `keydown` fires immediately when the key is pressed, providing faster
perceived response
- Better consistency with browser/OS conventions for action triggers
- Prevents default behaviors (like form submission) more reliably when
needed
- Aligns with other keyboard handlers in the codebase

## Testing

- Updated `EditableText.test.ts` to use `keydown` events
- Updated `NodeHeader.test.ts` to use `keydown.enter`
- Manual testing: Escape in TagsInput no longer closes parent modal

## Checklist

- [x] Unit tests updated
- [x] Keyboard event handlers consistent
- [x] No breaking changes to component API

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8204-fix-Consistent-keydown-handling-for-EditableText-and-TagsInput-escape-key-2ef6d73d365081f0ac6bed8bcae57657)
by [Unito](https://www.unito.io)
DrJKL added a commit that referenced this pull request Jan 22, 2026
…xt and TagsInput escape key (#8238)

Backport of #8204 to `cloud/1.37`.

Cherry-picked merge commit `7b701ad07b1c34d121448e21d6f8b5c13ef07d73`.

## Original PR Summary
This PR improves keyboard event handling consistency and fixes an issue
where pressing Escape in nested input components would unintentionally
close parent modals/dialogs.

### Changes
- **EditableText keyup → keydown Migration**: Changed `@keyup.enter` to
`@keydown.enter` and `@keyup.escape` to `@keydown.escape` for more
consistent and responsive feedback
- Updated corresponding unit tests to use `keydown` triggers

> **Note**: The TagsInput escape key handling changes from the original
PR are not included in this backport because the TagsInput component
(#8066) was added after the cloud/1.37 branch was created.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8238-backport-cloud-1-37-fix-Consistent-keydown-handling-for-EditableText-and-TagsInput-esc-2f06d73d365081288e5ed0c656d78412)
by [Unito](https://www.unito.io)
godwiniheuwa pushed a commit to godwiniheuwa/ComfyUI_frontend that referenced this pull request Jan 22, 2026
…e key (Comfy-Org#8204)

## Summary

This PR improves keyboard event handling consistency and fixes an issue
where pressing Escape in nested input components would unintentionally
close parent modals/dialogs.

## Changes

### Keyboard Event Fixes

**TagsInput Escape Key Handling**
- Added `@keydown.escape.stop` handler to `TagsInputInput.vue` to
prevent Escape from bubbling up and closing parent modals
- The handler blurs the input and exits editing mode without propagating
the event

**EditableText keyup → keydown Migration**
- Changed `@keyup.enter` to `@keydown.enter` and `@keyup.escape` to
`@keydown.escape`
- Using `keydown` is more consistent with how other UI frameworks handle
these events and provides more responsive feedback
- Updated corresponding unit tests to use `keydown` triggers

### Why keydown over keyup?

- `keydown` fires immediately when the key is pressed, providing faster
perceived response
- Better consistency with browser/OS conventions for action triggers
- Prevents default behaviors (like form submission) more reliably when
needed
- Aligns with other keyboard handlers in the codebase

## Testing

- Updated `EditableText.test.ts` to use `keydown` events
- Updated `NodeHeader.test.ts` to use `keydown.enter`
- Manual testing: Escape in TagsInput no longer closes parent modal

## Checklist

- [x] Unit tests updated
- [x] Keyboard event handlers consistent
- [x] No breaking changes to component API

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8204-fix-Consistent-keydown-handling-for-EditableText-and-TagsInput-escape-key-2ef6d73d365081f0ac6bed8bcae57657)
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

cloud/1.37 Backport PRs for cloud 1.37 needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch size:S This PR changes 10-29 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants