Skip to content

Conversation

@DrJKL
Copy link
Contributor

@DrJKL DrJKL commented Dec 3, 2025

Summary

  • Code cleanup
  • Copy, padding, color, alignment of components
  • Subgraph Edit mode changes
  • Partial fix for the Node Info location (need to do context menu still)
  • Editing node title

Still to-do

  • Bi-directionality in values

┆Issue is synchronized with this Notion page by Unito

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 3, 2025

📝 Walkthrough

Walkthrough

Reworks splitter overlay positioning and panel visibility, centralizes workspace panel state via Pinia refs, introduces editable properties-panel titles and multi-node settings, adds widgetRegistry.shouldExpand API, updates many right-side panel components and stores for typed tabs and subgraph editing, and adjusts browser tests to target the new properties panel.

Changes

Cohort / File(s) Summary
Layout & Overlay
src/components/LiteGraphCanvasSplitterOverlay.vue, src/components/MenuHamburger.vue
Converts splitter overlay to absolute/fixed positioning with explicit z-index and pointer-event rules; removes legacy gutter/class helpers and scoped CSS; updates hamburger positioning and root classes.
Store wiring & Panel Visibility
src/components/LiteGraphCanvasSplitterOverlay.vue, src/components/TopMenuSection.vue, src/components/graph/selectionToolbox/InfoButton.vue
Replaces direct store access with useWorkspaceStore + storeToRefs; derives focusMode, bottomPanelVisible, rightSidePanelVisible, unifiedWidth refs; gates left/bottom/right panels on focusMode and visibility refs; components call panel store actions directly.
Right-Side Panel — Core & Store
src/components/rightSidePanel/RightSidePanel.vue, src/stores/workspace/rightSidePanelStore.ts
Introduces typed RightSidePanelTab (includes subgraph), makes isEditingSubgraph a computed derived from activeTab, narrows openPanel signature, removes setActiveTab; adds editable title flow, typed tab list, and updated tab activation wiring.
Right-Side Panel — Tabs, Info & Layout
src/components/rightSidePanel/info/TabInfo.vue, src/components/rightSidePanel/layout/PropertiesAccordionItem.vue, src/components/rightSidePanel/layout/SidePanelSearch.vue
TabInfo replaces watcher with whenever; PropertiesAccordionItem adds collapse model and isEmpty prop with named label slot; SidePanelSearch simplifies props using MaybeRefOrGetter for updateKey, reduces debounce to 100ms, and updates styling and search wiring.
Right-Side Panel — Parameters & Settings
src/components/rightSidePanel/parameters/TabParameters.vue, src/components/rightSidePanel/parameters/SectionWidgets.vue, src/components/rightSidePanel/settings/TabSettings.vue
TabParameters adopts typed NodeWidgets structures and destructured props; SectionWidgets swaps wrapper to PropertiesAccordionItem and uses shouldExpand; TabSettings changes from single node prop to nodes[] and updates getters/setters to operate across multiple nodes.
Widget Registry & Node Widgets
src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts, src/renderer/extensions/vueNodes/components/NodeWidgets.vue
Adds export function shouldExpand(type: string): boolean and internal EXPANDING_TYPES; NodeWidgets replaces hard-coded expanding-type logic with shouldExpand predicate for layout.
Graph & MiniMap
src/components/graph/GraphCanvas.vue
Gates MiniMap on comfyAppReady && minimapEnabled && betaMenuEnabled instead of showUI.
Localization
src/locales/en/main.json
Adds pluralized rightSidePanel.title and rightSidePanel.inputsNone* keys; removes legacy rightSidePanel keys (multipleSelection, nodeType, nodeId, description, properties, settings).
Browser tests & Fixtures
browser_tests/helpers/actionbar.ts, browser_tests/fixtures/ComfyPage.ts, browser_tests/tests/nodeHelp.spec.ts, browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
Tests and helpers updated to target data-testid="properties-panel"; added propertiesButton locator and propertiesPanel fixture locator; new properties panel test verifies opening and title updates for multi-node selection; nodeHelp tests updated selectors.

Possibly related PRs

  • feat: right side panel #6952: Modifies splitter and right-side panel components and store wiring, overlapping many of the same files and visibility logic.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch drjkl/cleanup/sidebar

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

@github-actions
Copy link

github-actions bot commented Dec 3, 2025

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 12/05/2025, 09:36:28 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Dec 3, 2025

🎭 Playwright Test Results

⚠️ Tests passed with flaky tests

⏰ Completed at: 12/05/2025, 09:45:38 AM UTC

📈 Summary

  • Total Tests: 494
  • Passed: 479 ✅
  • Failed: 0
  • Flaky: 5 ⚠️
  • Skipped: 10 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 470 / ❌ 0 / ⚠️ 5 / ⏭️ 10
  • chromium-2x: View Report • ✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • chromium-0.5x: View Report • ✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • mobile-chrome: View Report • ✅ 6 / ❌ 0 / ⚠️ 0 / ⏭️ 0

🎉 Click on the links above to view detailed test results for each browser configuration.

@github-actions
Copy link

github-actions bot commented Dec 3, 2025

Bundle Size Report

Summary

  • Raw size: 17 MB baseline 17 MB — 🔴 +295 B
  • Gzip: 3.38 MB baseline 3.38 MB — 🔴 +88 B
  • Brotli: 2.59 MB baseline 2.59 MB — 🔴 +40 B
  • Bundles: 97 current • 97 baseline • 37 added / 37 removed

Category Glance
Graph Workspace 🔴 +560 B (975 kB) · App Entry Points 🟢 -265 B (3.2 MB) · Vendor & Third-Party ⚪ 0 B (8.56 MB) · Other ⚪ 0 B (3.81 MB) · Panels & Settings ⚪ 0 B (298 kB) · UI Components ⚪ 0 B (173 kB) · + 3 more

Per-category breakdown
App Entry Points — 3.2 MB (baseline 3.2 MB) • 🟢 -265 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BgZC6RfB.js (removed) 2.97 MB 🟢 -2.97 MB 🟢 -619 kB 🟢 -470 kB
assets/index-C0AhgKEP.js (new) 2.97 MB 🔴 +2.97 MB 🔴 +619 kB 🔴 +470 kB
assets/index-2CNvFkcv.js (new) 223 kB 🔴 +223 kB 🔴 +47.6 kB 🔴 +39.3 kB
assets/index-sTpaI81d.js (removed) 223 kB 🟢 -223 kB 🟢 -47.6 kB 🟢 -39.3 kB
assets/index-D_nXHsGU.js (new) 345 B 🔴 +345 B 🔴 +245 B 🔴 +235 B
assets/index-DWAgO-8F.js (removed) 345 B 🟢 -345 B 🟢 -245 B 🟢 -202 B

Status: 3 added / 3 removed

Graph Workspace — 975 kB (baseline 975 kB) • 🔴 +560 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-ChwELWD7.js (new) 975 kB 🔴 +975 kB 🔴 +188 kB 🔴 +144 kB
assets/GraphView-BrOtYuzh.js (removed) 975 kB 🟢 -975 kB 🟢 -188 kB 🟢 -144 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/UserSelectView-BoU-N58k.js (removed) 6.54 kB 🟢 -6.54 kB 🟢 -2.14 kB 🟢 -1.9 kB
assets/UserSelectView-CoMCpDE5.js (new) 6.54 kB 🔴 +6.54 kB 🔴 +2.14 kB 🔴 +1.89 kB

Status: 1 added / 1 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CreditsPanel-DPvBtnVw.js (new) 21.4 kB 🔴 +21.4 kB 🔴 +5.14 kB 🔴 +4.5 kB
assets/CreditsPanel-DvSwxRvS.js (removed) 21.4 kB 🟢 -21.4 kB 🟢 -5.15 kB 🟢 -4.5 kB
assets/KeybindingPanel-Dwn8iZxc.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +3.42 kB 🔴 +3.01 kB
assets/KeybindingPanel-ERWnnUjy.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -3.42 kB 🟢 -3.01 kB
assets/ExtensionPanel-BNQM_wZU.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.58 kB 🟢 -2.26 kB
assets/ExtensionPanel-Db5eu_Sj.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.57 kB 🔴 +2.25 kB
assets/AboutPanel-_sPWN2qb.js (removed) 9.16 kB 🟢 -9.16 kB 🟢 -2.46 kB 🟢 -2.21 kB
assets/AboutPanel-C2B-szmC.js (new) 9.16 kB 🔴 +9.16 kB 🔴 +2.46 kB 🔴 +2.21 kB
assets/ServerConfigPanel-BRHLrRxV.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -1.83 kB 🟢 -1.63 kB
assets/ServerConfigPanel-C3KESnJC.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +1.83 kB 🔴 +1.63 kB
assets/UserPanel-DTi_QEgC.js (removed) 6.23 kB 🟢 -6.23 kB 🟢 -1.72 kB 🟢 -1.51 kB
assets/UserPanel-qOwettv6.js (new) 6.23 kB 🔴 +6.23 kB 🔴 +1.72 kB 🔴 +1.51 kB
assets/settings-BhbWhsRg.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BXTtSH4O.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C9Pzn-NG.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCy2fA_h.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CQpqEFfl.js 26.6 kB 26.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DHcnxypw.js 21.7 kB 21.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DhFTK9fY.js 25.1 kB 25.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DlT4t_ui.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRgSrIdD.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-tjkeqiZq.js 21.1 kB 21.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Load3D.vue_vue_type_script_setup_true_lang-0YojZKEe.js (removed) 53.9 kB 🟢 -53.9 kB 🟢 -8.52 kB 🟢 -7.32 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-C_WMm0nJ.js (new) 53.9 kB 🔴 +53.9 kB 🔴 +8.52 kB 🔴 +7.32 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-BQT6t7kE.js (new) 47.6 kB 🔴 +47.6 kB 🔴 +10.3 kB 🔴 +8.91 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-CP6fxMFl.js (removed) 47.6 kB 🟢 -47.6 kB 🟢 -10.3 kB 🟢 -8.9 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-BmAxJeu7.js (new) 43.8 kB 🔴 +43.8 kB 🔴 +9.78 kB 🔴 +8.55 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-CFnzCN8K.js (removed) 43.8 kB 🟢 -43.8 kB 🟢 -9.78 kB 🟢 -8.55 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-CEaJV_Gj.js (new) 12.9 kB 🔴 +12.9 kB 🔴 +3.37 kB 🔴 +2.96 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-CfLBvFaG.js (removed) 12.9 kB 🟢 -12.9 kB 🟢 -3.37 kB 🟢 -2.96 kB
assets/ComfyQueueButton-BFMYSrw7.js (new) 8.44 kB 🔴 +8.44 kB 🔴 +2.47 kB 🔴 +2.21 kB
assets/ComfyQueueButton-D7FtF66-.js (removed) 8.44 kB 🟢 -8.44 kB 🟢 -2.47 kB 🟢 -2.21 kB
assets/MediaTitle.vue_vue_type_script_setup_true_lang-CNyFCa-g.js (new) 897 B 🔴 +897 B 🔴 +502 B 🔴 +432 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-CZi86GQ1.js (removed) 897 B 🟢 -897 B 🟢 -503 B 🟢 -430 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-CDkUGVOA.js 1.34 kB 1.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-CbZj9xHx.js 2.04 kB 2.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-Bb3LZ5y7.js 2.26 kB 2.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

Data & Services — 12.5 kB (baseline 12.5 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/keybindingService-CG_etSV-.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -1.83 kB 🟢 -1.58 kB
assets/keybindingService-CkRZ-b3S.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +1.83 kB 🔴 +1.58 kB
assets/audioService-1B6ad3ro.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +960 B 🔴 +823 B
assets/audioService-zQA-s9H5.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -963 B 🟢 -829 B
assets/serverConfigStore-uprby_D3.js 2.83 kB 2.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 2 added / 2 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioUtils-BGogZFaR.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +651 B 🔴 +543 B
assets/audioUtils-DWk0GtYG.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -652 B 🟢 -549 B
assets/mathUtil-CTARWQ-l.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-CXKCRJ-m.js 460 B 460 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-BhMrpT7H.js 452 kB 452 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-Djvsb6Yg.js 3.98 MB 3.98 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-vP_q3PtU.js 1.96 MB 1.96 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-aR6ntw5X.js 1.37 MB 1.37 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-abEQAgz5.js 232 kB 232 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-abso1wrr.js 160 kB 160 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 3.81 MB (baseline 3.81 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WidgetRecordAudio-BXNjArjp.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +5.23 kB 🔴 +4.63 kB
assets/WidgetRecordAudio-MVSCs-qt.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -5.24 kB 🟢 -4.63 kB
assets/AudioPreviewPlayer-D8IlPbo-.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.4 kB 🔴 +3.05 kB
assets/AudioPreviewPlayer-v4Z9c9Im.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.4 kB 🟢 -3.05 kB
assets/WidgetGalleria-BUF0vcT5.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.44 kB 🟢 -1.3 kB
assets/WidgetGalleria-TvUHDYw1.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.44 kB 🔴 +1.3 kB
assets/WidgetColorPicker-BRIKgLIT.js (new) 3.41 kB 🔴 +3.41 kB 🔴 +1.38 kB 🔴 +1.23 kB
assets/WidgetColorPicker-Cz0cS7zf.js (removed) 3.41 kB 🟢 -3.41 kB 🟢 -1.38 kB 🟢 -1.23 kB
assets/WidgetMarkdown-CkgG8WYj.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.28 kB 🟢 -1.13 kB
assets/WidgetMarkdown-CZ0JMThb.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.28 kB 🔴 +1.13 kB
assets/WidgetTextarea-BRpOz-G6.js (removed) 2.93 kB 🟢 -2.93 kB 🟢 -1.17 kB 🟢 -1.04 kB
assets/WidgetTextarea-CxBNNMwE.js (new) 2.93 kB 🔴 +2.93 kB 🔴 +1.17 kB 🔴 +1.04 kB
assets/WidgetAudioUI-C69MlQMf.js (removed) 2.85 kB 🟢 -2.85 kB 🟢 -1.17 kB 🟢 -1.05 kB
assets/WidgetAudioUI-Cgc7WJiI.js (new) 2.85 kB 🔴 +2.85 kB 🔴 +1.16 kB 🔴 +1.05 kB
assets/WidgetInputText-CETjKQFT.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -919 B 🟢 -845 B
assets/WidgetInputText-DekOLuL1.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +917 B 🔴 +843 B
assets/MediaImageBottom-Bdj6n8Dh.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -740 B 🟢 -651 B
assets/MediaImageBottom-DUVPb_hV.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +740 B 🔴 +650 B
assets/MediaAudioBottom-BHapInNF.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -741 B 🟢 -659 B
assets/MediaAudioBottom-D-7RJuet.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +740 B 🔴 +655 B
assets/MediaVideoBottom-CA1pug6D.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -738 B 🟢 -656 B
assets/MediaVideoBottom-DB60dpgf.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +737 B 🔴 +657 B
assets/Media3DBottom-BxhH-KhL.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +731 B 🔴 +652 B
assets/Media3DBottom-W05ODvs1.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -730 B 🟢 -649 B
assets/Media3DTop-CxOw55Yn.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +763 B 🔴 +650 B
assets/Media3DTop-D8XGMxS7.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -764 B 🟢 -652 B
assets/WidgetSelect-ClUA3CeX.js (removed) 655 B 🟢 -655 B 🟢 -341 B 🟢 -289 B
assets/WidgetSelect-uuCR3qdj.js (new) 655 B 🔴 +655 B 🔴 +342 B 🔴 +289 B
assets/WidgetInputNumber-C4-4Cea0.js (new) 595 B 🔴 +595 B 🔴 +329 B 🔴 +277 B
assets/WidgetInputNumber-DzGVV0cE.js (removed) 595 B 🟢 -595 B 🟢 -330 B 🟢 -276 B
assets/Load3D-Cs-aDBRS.js (removed) 424 B 🟢 -424 B 🟢 -265 B 🟢 -223 B
assets/Load3D-lLHaSjoj.js (new) 424 B 🔴 +424 B 🔴 +267 B 🔴 +223 B
assets/WidgetLegacy-DH7RNddq.js (removed) 364 B 🟢 -364 B 🟢 -237 B 🟢 -194 B
assets/WidgetLegacy-vc6PNMek.js (new) 364 B 🔴 +364 B 🔴 +236 B 🔴 +193 B
assets/commands-_s-RvhJR.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BuUILW6P.js 13 kB 13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BV4R6fLx.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BWp4HdfU.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CLwPdnT6.js 14.2 kB 14.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CWMchBmd.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DazTQhtc.js 12.9 kB 12.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DmWrOe93.js 13.7 kB 13.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwiH7Kr6.js 13.8 kB 13.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-mS3LCNPn.js 14.5 kB 14.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B1JflQcI.js 72.2 kB 72.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B2lyXe48.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B9XEQ-pc.js 94 kB 94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BErKFzc-.js 73.1 kB 73.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bf7Tze-u.js 83.4 kB 83.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BhGMcO4Q.js 84.3 kB 84.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CPZUloNQ.js 99 kB 99 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cw9RZWRY.js 89 B 89 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dva0z-T2.js 86.5 kB 86.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-un0K9wDS.js 81.8 kB 81.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-DCIZ2mdC.js 1.46 kB 1.46 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-Du4uz2Wm.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-59yKN05c.js 2.76 kB 2.76 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-8e6QYQW0.js 283 kB 283 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-A_9dx4yn.js 304 kB 304 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BbD3HDi7.js 307 kB 307 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BOJhIPft.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bw_Jitw_.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C-Pw33mW.js 317 kB 317 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ChLyG0UJ.js 285 kB 285 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CUVPxA4l.js 342 kB 342 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dx5Y4xrW.js 310 kB 310 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-JqO5mNmW.js 306 kB 306 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-Beblk1io.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-CMMfeF2r.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-C8WLR8XC.js 1.58 kB 1.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 17 added / 17 removed

@christian-byrne
Copy link
Contributor

@coderabbitai review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 3, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (4)
src/components/rightSidePanel/layout/PropertiesAccordionItem.vue (1)

12-18: Potential reactivity issue with initial defaultCollapse check.

The if (defaultCollapse) block (lines 12-14) runs once during setup. If defaultCollapse is initially false but changes to true later, the initial check won't set isCollapse. While the watch handles subsequent changes, the { immediate: true } option could unify this logic and eliminate the conditional block.

Consider using immediate: true in the watcher to handle both initial and subsequent values:

-if (defaultCollapse) {
-  isCollapse.value = true
-}
 watch(
   () => defaultCollapse,
-  (value) => (isCollapse.value = value)
+  (value) => {
+    if (value !== undefined) {
+      isCollapse.value = value
+    }
+  },
+  { immediate: true }
 )
src/components/LiteGraphCanvasSplitterOverlay.vue (1)

25-26: Inconsistent use of v-if vs v-show for focus mode gating.

The left sidebar (line 25) and right panel (line 89) use v-if while the bottom panel (line 61) uses v-show. This inconsistency could cause subtle behavioral differences:

  • v-if destroys and recreates the component, losing internal state
  • v-show keeps the component mounted but hidden, preserving state

Consider unifying the approach. If state preservation matters, use v-show consistently:

         <SplitterPanel
-          v-if="sidebarLocation === 'left' && !focusMode"
+          v-show="sidebarLocation === 'left' && !focusMode"

Or if DOM cleanup is preferred, use v-if for the bottom panel as well:

             <SplitterPanel
-              v-show="bottomPanelVisible && !focusMode"
+              v-if="bottomPanelVisible && !focusMode"

Also applies to: 61-62, 88-90

src/components/rightSidePanel/RightSidePanel.vue (2)

86-91: Consider using store action instead of direct ref mutation.

Directly mutating activeTab.value bypasses any centralized logic in rightSidePanelStore.openPanel(). For consistency with the tab click handler at line 142, consider using the store action here as well.

 watchEffect(() => {
   if (!tabs.value.some((tab) => tab.value === activeTab.value)) {
-    activeTab.value = tabs.value[0].value as 'parameters' | 'settings' | 'info'
+    rightSidePanelStore.openPanel(tabs.value[0].value)
   }
 })

104-124: Remove duplicate background classes from static class attribute.

The static class attribute (line 108) includes bg-secondary-background hover:bg-secondary-background-hover which are also conditionally applied in the :class binding (lines 111-115). This creates redundancy and confusion about which classes are active. Keep only the dynamic :class binding for conditional background styling.

           <IconButton
             v-if="isSubgraphNode"
             type="transparent"
             size="sm"
-            class="bg-secondary-background hover:bg-secondary-background-hover text-base-foreground"
+            class="text-base-foreground"
             :class="
               cn(
                 'bg-secondary-background hover:bg-secondary-background-hover',
                 isEditingSubgraph
                   ? 'bg-secondary-background-selected'
                   : 'bg-secondary-background'
               )
             "
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e9d5ce7 and b09ff3d.

📒 Files selected for processing (14)
  • src/components/LiteGraphCanvasSplitterOverlay.vue (8 hunks)
  • src/components/MenuHamburger.vue (1 hunks)
  • src/components/TopMenuSection.vue (4 hunks)
  • src/components/graph/GraphCanvas.vue (1 hunks)
  • src/components/graph/selectionToolbox/InfoButton.vue (2 hunks)
  • src/components/rightSidePanel/RightSidePanel.vue (6 hunks)
  • src/components/rightSidePanel/info/TabInfo.vue (2 hunks)
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue (1 hunks)
  • src/components/rightSidePanel/layout/SidePanelSearch.vue (3 hunks)
  • src/components/rightSidePanel/parameters/SectionWidgets.vue (3 hunks)
  • src/components/rightSidePanel/parameters/TabParameters.vue (2 hunks)
  • src/components/rightSidePanel/settings/TabSettings.vue (8 hunks)
  • src/locales/en/main.json (1 hunks)
  • src/stores/workspace/rightSidePanelStore.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (20)
**/*.vue

📄 CodeRabbit inference engine (.cursorrules)

**/*.vue: Use setup() function for component logic in Vue 3 Composition API
Utilize ref and reactive for reactive state in Vue 3
Implement computed properties with computed() function
Use watch and watchEffect for side effects in Vue 3
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection in Vue 3
Use Vue 3.5 style of default prop declaration with defineProps()
Organize Vue components in <script> <style> order
Use Tailwind CSS for styling Vue components
Implement responsive design with Tailwind CSS
Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively
Implement proper props and emits definitions in Vue components
Utilize Vue 3's Teleport component when needed
Use Suspense for async components in Vue 3
Follow Vue 3 style guide and naming conventions
Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Never use :class="[]" to merge class names - always use import { cn } from '@/utils/tailwindUtil' for class merging in Vue templates

**/*.vue: Use TypeScript with Vue 3 Single File Components (.vue files)
Name Vue components in PascalCase (e.g., MenuHamburger.vue)

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities
Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,js,vue}

📄 CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in .prettierrc
Organize imports by sorting and grouping by plugin, and run pnpm format before committing

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.vue

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.vue: Use the Vue 3 Composition API instead of the Options API when writing Vue components (exception: when overriding or extending PrimeVue components for compatibility)
Use setup() function for component logic
Utilize ref and reactive for reactive state
Implement computed properties with computed()
Use watch and watchEffect for side effects
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection
Use vue 3.5 style of default prop declaration
Use Tailwind CSS for styling
Implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Follow Vue 3 style guide and naming conventions

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,js,jsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

Use camelCase for variable and setting names in TypeScript/Vue files

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{vue,html}

📄 CodeRabbit inference engine (CLAUDE.md)

Never use dark: or dark-theme: Tailwind variants - instead use semantic values from style.css theme, e.g. bg-node-component-surface

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,vue}: Use const settingStore = useSettingStore() and settingStore.get('Comfy.SomeSetting') to retrieve settings in TypeScript/Vue files
Use await settingStore.set('Comfy.SomeSetting', newValue) to update settings in TypeScript/Vue files
Check server capabilities using api.serverSupportsFeature('feature_name') before using enhanced features
Use api.getServerFeature('config_name', defaultValue) to retrieve server feature configuration

Enforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.vue

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.vue: Use setup() function in Vue 3 Composition API
Destructure props using Vue 3.5 style in Vue components
Use ref/reactive for state management in Vue 3 Composition API
Implement computed() for derived state in Vue 3 Composition API
Use provide/inject for dependency injection in Vue components
Prefer emit/@event-name for state changes over other communication patterns
Use defineExpose only for imperative operations (such as form.validate(), modal.open())
Replace PrimeVue Dropdown component with Select
Replace PrimeVue OverlayPanel component with Popover
Replace PrimeVue Calendar component with DatePicker
Replace PrimeVue InputSwitch component with ToggleSwitch
Replace PrimeVue Sidebar component with Drawer
Replace PrimeVue Chips component with AutoComplete with multiple enabled
Replace PrimeVue TabMenu component with Tabs without panels
Replace PrimeVue Steps component with Stepper without panels
Replace PrimeVue InlineMessage component with Message
Extract complex conditionals to computed properties
Implement cleanup for async operations in Vue components
Use lifecycle hooks: onMounted, onUpdated in Vue 3 Composition API
Use Teleport/Suspense when needed for component rendering
Define proper props and emits definitions in Vue components

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.{vue,css}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,css}: Use Tailwind CSS only for styling (no custom CSS)
Use the correct tokens from style.css in the design system package

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.{vue,ts,js}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,ts,js}: Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners
Use useIntersectionObserver for visibility detection instead of custom scroll handlers
Use vue-i18n for ALL UI strings

Files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/graph/GraphCanvas.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursorrules)

Use es-toolkit for utility functions

Files:

  • src/stores/workspace/rightSidePanelStore.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

Use TypeScript for type safety

**/*.{ts,tsx}: Never use any type - use proper TypeScript types
Never use as any type assertions - fix the underlying type issue

Files:

  • src/stores/workspace/rightSidePanelStore.ts
src/**/*.ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.ts: Use es-toolkit for utility functions
Use TypeScript for type safety

Files:

  • src/stores/workspace/rightSidePanelStore.ts
**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.ts: Define dynamic setting defaults using runtime context with functions in settings configuration
Use defaultsByInstallVersion property for gradual feature rollout based on version in settings configuration

Files:

  • src/stores/workspace/rightSidePanelStore.ts
src/**/stores/**/*.{ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/stores/**/*.{ts,tsx}: Maintain clear public interfaces and restrict extension access in stores
Use TypeScript for type safety in state management stores

Files:

  • src/stores/workspace/rightSidePanelStore.ts
🧠 Learnings (45)
📓 Common learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Source code should be organized in `src/` directory with key areas: `components/`, `views/`, `stores/` (Pinia), `composables/`, `services/`, `utils/`, `assets/`, `locales/`
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue TabMenu component with Tabs without panels

Applied to files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:48:23.088Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Applies to **/*.vue : Name Vue components in PascalCase (e.g., `MenuHamburger.vue`)

Applied to files:

  • src/components/MenuHamburger.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Sidebar component with Drawer

Applied to files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue InputSwitch component with ToggleSwitch

Applied to files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue InlineMessage component with Message

Applied to files:

  • src/components/MenuHamburger.vue
  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Applied to files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{vue,ts,tsx} : Follow Vue 3 composition API style guide

Applied to files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue OverlayPanel component with Popover

Applied to files:

  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Follow Vue 3 style guide and naming conventions

Applied to files:

  • src/components/MenuHamburger.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Organize Vue components in <template> <script> <style> order

Applied to files:

  • src/components/MenuHamburger.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Steps component with Stepper without panels

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Dropdown component with Select

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Prefer emit/event-name for state changes over other communication patterns

Applied to files:

  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.{vue,ts,tsx} : Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Applied to files:

  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.{vue,ts} : Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Applied to files:

  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{ts,tsx,vue} : Use `const settingStore = useSettingStore()` and `settingStore.get('Comfy.SomeSetting')` to retrieve settings in TypeScript/Vue files

Applied to files:

  • src/components/TopMenuSection.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use ref/reactive for state management in Vue 3 Composition API

Applied to files:

  • src/components/TopMenuSection.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Utilize ref and reactive for reactive state in Vue 3

Applied to files:

  • src/components/TopMenuSection.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,ts,js} : Use vue-i18n for ALL UI strings

Applied to files:

  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use setup() function in Vue 3 Composition API

Applied to files:

  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/{components,composables}/**/*.{ts,tsx,vue} : Use vue-i18n for ALL user-facing strings by adding them to `src/locales/en/main.json`

Applied to files:

  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize ref and reactive for reactive state

Applied to files:

  • src/components/TopMenuSection.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.{vue,ts,tsx} : Leverage VueUse functions for performance-enhancing utilities

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.{vue,ts} : Leverage VueUse functions for performance-enhancing styles

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Extract complex conditionals to computed properties

Applied to files:

  • src/components/graph/GraphCanvas.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/stores/**/*.{ts,tsx} : Maintain clear public interfaces and restrict extension access in stores

Applied to files:

  • src/stores/workspace/rightSidePanelStore.ts
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/stores/**/*.{ts,tsx} : Use TypeScript for type safety in state management stores

Applied to files:

  • src/stores/workspace/rightSidePanelStore.ts
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{ts,tsx,vue} : Use `await settingStore.set('Comfy.SomeSetting', newValue)` to update settings in TypeScript/Vue files

Applied to files:

  • src/stores/workspace/rightSidePanelStore.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,ts,js} : Use useIntersectionObserver for visibility detection instead of custom scroll handlers

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Implement responsive design with Tailwind CSS

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize Vue 3's Teleport component when needed

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{vue,html} : Never use `dark:` or `dark-theme:` Tailwind variants - instead use semantic values from `style.css` theme, e.g. `bg-node-component-surface`

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use Vue 3.5 style of default prop declaration with defineProps<T>()

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use watch and watchEffect for side effects in Vue 3

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use vue 3.5 style of default prop declaration

Applied to files:

  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Destructure props using Vue 3.5 style in Vue components

Applied to files:

  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Implement proper props and emits definitions in Vue components

Applied to files:

  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use watch and watchEffect for side effects

Applied to files:

  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use setup() function for component logic in Vue 3 Composition API

Applied to files:

  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use setup() function for component logic

Applied to files:

  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,ts,js} : Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners

Applied to files:

  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
🪛 ESLint
src/components/rightSidePanel/parameters/SectionWidgets.vue

[error] 10-10: Unable to resolve path to module '../layout/PropertiesAccordionItem.vue'.

(import-x/no-unresolved)

src/components/TopMenuSection.vue

[error] 65-65: Unable to resolve path to module 'pinia'.

(import-x/no-unresolved)

src/components/graph/selectionToolbox/InfoButton.vue

[error] 17-17: Unable to resolve path to module 'primevue/button'.

(import-x/no-unresolved)


[error] 19-19: Unable to resolve path to module '@/platform/telemetry'.

(import-x/no-unresolved)


[error] 20-20: Unable to resolve path to module '@/stores/workspace/rightSidePanelStore'.

(import-x/no-unresolved)

src/components/rightSidePanel/settings/TabSettings.vue

[error] 81-81: Unable to resolve path to module 'vue'.

(import-x/no-unresolved)

src/stores/workspace/rightSidePanelStore.ts

[error] 2-2: Unable to resolve path to module 'vue'.

(import-x/no-unresolved)

src/components/LiteGraphCanvasSplitterOverlay.vue

[error] 102-102: Unable to resolve path to module '@comfyorg/tailwind-utils'.

(import-x/no-unresolved)


[error] 103-103: Unable to resolve path to module 'pinia'.

(import-x/no-unresolved)


[error] 112-112: Unable to resolve path to module '@/stores/workspaceStore'.

(import-x/no-unresolved)

src/components/rightSidePanel/layout/SidePanelSearch.vue

[error] 6-6: Unable to resolve path to module '@/utils/tailwindUtil'.

(import-x/no-unresolved)

src/components/rightSidePanel/info/TabInfo.vue

[error] 2-2: Unable to resolve path to module '@vueuse/core'.

(import-x/no-unresolved)


[error] 3-3: Unable to resolve path to module 'vue'.

(import-x/no-unresolved)


[error] 5-5: Unable to resolve path to module '@/components/node/NodeHelpContent.vue'.

(import-x/no-unresolved)


[error] 7-7: Unable to resolve path to module '@/stores/nodeDefStore'.

(import-x/no-unresolved)


[error] 8-8: Unable to resolve path to module '@/stores/workspace/nodeHelpStore'.

(import-x/no-unresolved)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: merge-reports
🔇 Additional comments (30)
src/components/graph/GraphCanvas.vue (1)

46-49: LGTM! Minimap now independent of UI visibility.

The minimap now renders based solely on readiness and its own setting, decoupling it from showUI. This allows the minimap to remain visible in focus mode, treating it as a canvas tool rather than UI chrome. The user retains control via the Comfy.Minimap.Visible setting.

src/components/MenuHamburger.vue (1)

4-4: Confirm z-9999 Tailwind utility and stacking behavior

Switching from a custom class to pure utility classes looks good and matches the “Tailwind-only, no custom CSS” guideline. Please double-check that z-9999 is actually defined in your Tailwind/theme config (or intentionally mapped) and that this z-index fits the global overlay stacking order so the hamburger neither hides under nor unintentionally sits above other high-priority overlays.

As per coding guidelines, using Tailwind utilities instead of custom CSS is preferred.

src/components/rightSidePanel/layout/SidePanelSearch.vue (5)

25-25: LGTM!

Using toRef(props, 'updateKey') is cleaner and more idiomatic than the previous conditional function handling approach.


27-44: LGTM!

The watcher implementation correctly handles cleanup to prevent memory leaks, and the void operator properly addresses the floating promise. The finally block ensures isQuerying is reset even if the searcher function throws.


47-74: LGTM!

Template changes follow coding guidelines:

  • Uses semantic design tokens (e.g., bg-secondary-background) without dark: variants
  • Uses cn() utility for class merging
  • Implements i18n for the placeholder text
  • Dynamic icon rendering provides good visual feedback during search

19-21: Verify performance impact of reduced debounce timing.

The debounce delay was reduced from 700ms to 100ms (a 7x reduction). While this improves responsiveness, it may cause significantly more frequent calls to the searcher function. If searcher performs network requests or expensive operations, this could impact performance or overload the backend.

Consider testing the impact with rapid typing, or adjust the debounce value based on the cost of the searcher operation. Alternatively, implement request cancellation in the searcher function to handle rapid successive calls efficiently.


8-14: Props refactoring follows Vue 3.5 style.

The change from withDefaults to direct destructuring with inline defaults is clean and follows the coding guidelines. The updateKey type change to MaybeRefOrGetter<unknown> is more flexible and idiomatic. Existing usages are compatible: TabParameters.vue passes a ComputedRef which is fully supported by MaybeRefOrGetter, and SubgraphEditor.vue relies on the default value. The component correctly uses toRef to convert the prop to a reactive reference, enabling proper reactivity in the watcher.

src/components/rightSidePanel/settings/TabSettings.vue (2)

128-136: LGTM - isPinned multi-node logic is sound.

The getter using some() (any pinned → true) and setter applying to all nodes provides intuitive multi-select behavior. The asymmetry is appropriate for bulk operations.


175-209: LGTM - nodeColor multi-node handling is well-implemented.

Good defensive check for empty array on line 177, and clean use of false as sentinel value to distinguish "mixed colors" from "no color". The iteration in the setter correctly applies to all nodes.

src/locales/en/main.json (2)

2255-2268: LGTM - Locale updates follow vue-i18n conventions.

The pluralization syntax using pipe separators is correct for vue-i18n's $t with count parameter. The three forms handle zero, singular, and plural cases appropriately.


2258-2258: Removed locale keys are safely unused.

Verification confirms that the removed keys (multipleSelection, nodeType, nodeId, description, properties, settings) from rightSidePanel are not referenced anywhere in the codebase. The removal is safe and will not cause runtime translation failures.

src/components/graph/selectionToolbox/InfoButton.vue (1)

20-31: LGTM - Clean migration to store-based panel management.

The refactor from useSelectionState().toggleHelp() to rightSidePanelStore.openPanel('info') properly centralizes panel state in the Pinia store, aligning with the PR's architecture changes.

src/components/rightSidePanel/parameters/SectionWidgets.vue (1)

10-10: LGTM - Component wrapper updated to PropertiesAccordionItem.

The swap from RightPanelSection to PropertiesAccordionItem maintains the same slot interface (#label and default content). This aligns with the broader panel layout refactoring in this PR.

Also applies to: 37-37, 69-69

src/components/rightSidePanel/parameters/TabParameters.vue (3)

10-12: Props destructuring note.

Destructuring nodes from defineProps works correctly here since nodes is an array (reference type). The component will react to changes in the array reference passed by the parent. However, if the parent mutates the array in-place rather than replacing it, the computed properties won't re-trigger.


20-31: LGTM - Data structure refactoring is clean.

The nested structure { node, widgets: [...] } improves data organization for multi-node support. The destructuring with default widgets = [] handles nodes without widgets gracefully.


73-83: LGTM - Section rendering with conditional collapse.

The defaultCollapse logic using reference equality (===) is intentional - when the search query is empty, searchedWidgetsSectionDataList is assigned the same reference as widgetsSectionDataList (line 42), making them equal. This ensures sections are collapsed by default only when there are multiple nodes and no active search filter.

src/components/TopMenuSection.vue (1)

65-65: LGTM! Clean store integration with storeToRefs.

Using storeToRefs to destructure reactive state from the Pinia store is the correct pattern for maintaining reactivity. The direct invocation of rightSidePanelStore.togglePanel (line 51) is cleaner than the previous local wrapper function.

Also applies to: 98-98

src/components/rightSidePanel/layout/PropertiesAccordionItem.vue (1)

39-43: LGTM! Chevron icon and rotation changes.

The switch from chevron-down with rotate-90 to chevron-up with -rotate-180 provides the same visual behavior with cleaner semantics. Using cn() for class merging follows the coding guidelines.

src/components/rightSidePanel/info/TabInfo.vue (2)

23-29: Good use of whenever from VueUse.

Replacing watch with whenever is a cleaner pattern when you only want to react to truthy values. This aligns with the coding guideline to leverage VueUse composables.


10-13: The parent component (RightSidePanel.vue) guarantees a non-empty nodes array before rendering TabInfo. The 'info' tab is only added to the available tabs when isSingleNodeSelected is true (lines 74-82), which means selectedNodes.length === 1. Combined with the watchEffect validation (lines 87-90) that ensures the active tab is always in the valid tabs list, accessing nodes[0] is safe. The template's v-if="nodeInfo" guard (line 33 of TabInfo.vue) provides additional defensive coverage. No change is needed.

Likely an incorrect or invalid review comment.

src/stores/workspace/rightSidePanelStore.ts (3)

4-4: Good addition of typed tab union.

Exporting RightSidePanelTab type provides type safety for components that need to reference tab values, aligning with the guideline to maintain clear public interfaces in stores.


13-13: Clean refactor: deriving isEditingSubgraph from activeTab.

Computing isEditingSubgraph from activeTab instead of maintaining separate state is the right approach - it follows the principle of deriving state rather than duplicating it, reducing the risk of state synchronization bugs.


15-20: Simplified openPanel function.

The simplified signature openPanel(tab?: RightSidePanelTab) with direct tab assignment is cleaner than the previous subgraph-specific branching logic. The optional parameter provides flexibility while keeping the API minimal.

src/components/LiteGraphCanvasSplitterOverlay.vue (3)

48-53: Good use of cn() for conditional class merging.

Using cn() from @comfyorg/tailwind-utils for merging classes with the conditional hidden class follows the coding guideline to never use :class="[]" for class merging.


126-132: Clean store integration with storeToRefs.

Good use of storeToRefs to destructure reactive state from multiple stores while maintaining reactivity. The renamed destructuring (isOpen: rightSidePanelVisible) provides clearer naming in the component context.


134-139: Simplified sidebarStateKey logic.

The refactored computed property is more readable with clear ternary logic. Using nullish coalescing (??) for the fallback to 'default-sidebar' is appropriate.

src/components/rightSidePanel/RightSidePanel.vue (4)

1-27: LGTM!

Imports are well-organized, store refs are properly destructured using storeToRefs, and the type import for RightSidePanelTab is correctly separated from the runtime import.


29-52: LGTM!

The computed property chain is well-structured. The instanceof SubgraphNode check at line 36 is safe even when selectedNode.value is null (returns false), and the panel title correctly falls back to an i18n key with a count for multi-selection scenarios.


58-84: LGTM!

The typed tab list and the computed logic for conditionally including the info tab are well-structured. Using arrow functions for labels ensures i18n translations remain reactive.


158-181: LGTM!

The content rendering logic correctly handles the three states: no selection, subgraph editing mode, and normal tab display. The conditional chain ensures selectedNode is guaranteed to be a SubgraphNode when passed to SubgraphEditor.

@DrJKL DrJKL force-pushed the drjkl/cleanup/sidebar branch from 1b80448 to ef73441 Compare December 4, 2025 00:22
@DrJKL DrJKL marked this pull request as ready for review December 4, 2025 00:56
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Dec 4, 2025
@DrJKL DrJKL changed the title WIP/Cleanup: Properties Panel Cleanup: Properties Panel Dec 4, 2025
@DrJKL DrJKL added the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 4, 2025
@github-actions
Copy link

github-actions bot commented Dec 4, 2025

Updating Playwright Expectations

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
src/components/rightSidePanel/RightSidePanel.vue (1)

106-127: Reduce duplicated background classes on the subgraph toggle IconButton

The first IconButton currently sets background/hover colors both statically and via cn, which is redundant. You can simplify by leaving text color static and moving all background variants into the computed classes.

-          <IconButton
-            v-if="isSubgraphNode"
-            type="transparent"
-            size="sm"
-            class="bg-secondary-background hover:bg-secondary-background-hover text-base-foreground"
-            :class="
-              cn(
-                'bg-secondary-background hover:bg-secondary-background-hover',
-                isEditingSubgraph
-                  ? 'bg-secondary-background-selected'
-                  : 'bg-secondary-background'
-              )
-            "
+          <IconButton
+            v-if="isSubgraphNode"
+            type="transparent"
+            size="sm"
+            class="text-base-foreground"
+            :class="
+              cn(
+                'bg-secondary-background hover:bg-secondary-background-hover',
+                isEditingSubgraph
+                  ? 'bg-secondary-background-selected'
+                  : 'bg-secondary-background'
+              )
+            "

As per coding guidelines, this keeps class merging centralized through cn while avoiding duplication.

Also applies to: 129-137

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b09ff3d and 064f01c.

📒 Files selected for processing (4)
  • src/components/graph/GraphCanvas.vue (1 hunks)
  • src/components/rightSidePanel/RightSidePanel.vue (6 hunks)
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue (1 hunks)
  • src/components/rightSidePanel/settings/TabSettings.vue (8 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
🧰 Additional context used
📓 Path-based instructions (15)
**/*.vue

📄 CodeRabbit inference engine (.cursorrules)

**/*.vue: Use setup() function for component logic in Vue 3 Composition API
Utilize ref and reactive for reactive state in Vue 3
Implement computed properties with computed() function
Use watch and watchEffect for side effects in Vue 3
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection in Vue 3
Use Vue 3.5 style of default prop declaration with defineProps()
Organize Vue components in <script> <style> order
Use Tailwind CSS for styling Vue components
Implement responsive design with Tailwind CSS
Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively
Implement proper props and emits definitions in Vue components
Utilize Vue 3's Teleport component when needed
Use Suspense for async components in Vue 3
Follow Vue 3 style guide and naming conventions
Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Never use :class="[]" to merge class names - always use import { cn } from '@/utils/tailwindUtil' for class merging in Vue templates

**/*.vue: Use TypeScript with Vue 3 Single File Components (.vue files)
Name Vue components in PascalCase (e.g., MenuHamburger.vue)

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities
Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,js,vue}

📄 CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in .prettierrc
Organize imports by sorting and grouping by plugin, and run pnpm format before committing

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.vue

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.vue: Use the Vue 3 Composition API instead of the Options API when writing Vue components (exception: when overriding or extending PrimeVue components for compatibility)
Use setup() function for component logic
Utilize ref and reactive for reactive state
Implement computed properties with computed()
Use watch and watchEffect for side effects
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection
Use vue 3.5 style of default prop declaration
Use Tailwind CSS for styling
Implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Follow Vue 3 style guide and naming conventions

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,js,jsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

Use camelCase for variable and setting names in TypeScript/Vue files

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{vue,html}

📄 CodeRabbit inference engine (CLAUDE.md)

Never use dark: or dark-theme: Tailwind variants - instead use semantic values from style.css theme, e.g. bg-node-component-surface

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,vue}: Use const settingStore = useSettingStore() and settingStore.get('Comfy.SomeSetting') to retrieve settings in TypeScript/Vue files
Use await settingStore.set('Comfy.SomeSetting', newValue) to update settings in TypeScript/Vue files
Check server capabilities using api.serverSupportsFeature('feature_name') before using enhanced features
Use api.getServerFeature('config_name', defaultValue) to retrieve server feature configuration

Enforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.vue

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.vue: Use setup() function in Vue 3 Composition API
Destructure props using Vue 3.5 style in Vue components
Use ref/reactive for state management in Vue 3 Composition API
Implement computed() for derived state in Vue 3 Composition API
Use provide/inject for dependency injection in Vue components
Prefer emit/@event-name for state changes over other communication patterns
Use defineExpose only for imperative operations (such as form.validate(), modal.open())
Replace PrimeVue Dropdown component with Select
Replace PrimeVue OverlayPanel component with Popover
Replace PrimeVue Calendar component with DatePicker
Replace PrimeVue InputSwitch component with ToggleSwitch
Replace PrimeVue Sidebar component with Drawer
Replace PrimeVue Chips component with AutoComplete with multiple enabled
Replace PrimeVue TabMenu component with Tabs without panels
Replace PrimeVue Steps component with Stepper without panels
Replace PrimeVue InlineMessage component with Message
Extract complex conditionals to computed properties
Implement cleanup for async operations in Vue components
Use lifecycle hooks: onMounted, onUpdated in Vue 3 Composition API
Use Teleport/Suspense when needed for component rendering
Define proper props and emits definitions in Vue components

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.{vue,css}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,css}: Use Tailwind CSS only for styling (no custom CSS)
Use the correct tokens from style.css in the design system package

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.{vue,ts,js}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,ts,js}: Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners
Use useIntersectionObserver for visibility detection instead of custom scroll handlers
Use vue-i18n for ALL UI strings

Files:

  • src/components/graph/GraphCanvas.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
🧠 Learnings (14)
📓 Common learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Source code should be organized in `src/` directory with key areas: `components/`, `views/`, `stores/` (Pinia), `composables/`, `services/`, `utils/`, `assets/`, `locales/`
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Extract complex conditionals to computed properties

Applied to files:

  • src/components/graph/GraphCanvas.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue TabMenu component with Tabs without panels

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue InputSwitch component with ToggleSwitch

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Utilize ref and reactive for reactive state in Vue 3

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize ref and reactive for reactive state

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.{vue,ts,tsx} : Leverage VueUse functions for performance-enhancing utilities

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Steps component with Stepper without panels

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.{vue,ts} : Leverage VueUse functions for performance-enhancing styles

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use ref/reactive for state management in Vue 3 Composition API

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
🪛 ESLint
src/components/rightSidePanel/settings/TabSettings.vue

[error] 81-81: Unable to resolve path to module 'vue'.

(import-x/no-unresolved)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: playwright-tests-chromium-sharded (7, 8)
  • GitHub Check: playwright-tests-chromium-sharded (8, 8)
  • GitHub Check: playwright-tests-chromium-sharded (6, 8)
  • GitHub Check: playwright-tests-chromium-sharded (5, 8)
  • GitHub Check: playwright-tests-chromium-sharded (4, 8)
  • GitHub Check: playwright-tests-chromium-sharded (2, 8)
  • GitHub Check: playwright-tests-chromium-sharded (3, 8)
  • GitHub Check: playwright-tests-chromium-sharded (1, 8)
  • GitHub Check: playwright-tests (mobile-chrome)
  • GitHub Check: playwright-tests (chromium-2x)
🔇 Additional comments (5)
src/components/graph/GraphCanvas.vue (1)

45-49: MiniMap now shows even in focus mode — confirm UX intent

Switching the MiniMap condition to comfyAppReady && minimapEnabled && betaMenuEnabled means it will still render when focusMode is active (since it no longer depends on showUI), as long as the minimap and new menu are enabled. This seems reasonable to keep navigation available while panels are hidden, but please confirm that the desired behavior is to show the minimap in focus mode as well.

src/components/rightSidePanel/settings/TabSettings.vue (2)

2-76: Template styling updates and color picker behavior look consistent

The updated container/label styling and the color picker button classes correctly use the project’s semantic Tailwind tokens and keep hit targets and focus areas intact. No functional issues from these template changes.


93-137: Multi-node state derivation for mode, pin, and color is sound

The nodes prop with a default empty array, plus the new computed nodeState, isPinned, and nodeColor all correctly handle 0, 1, and many-node selections (including mixed-state cases) and consistently mark the canvas dirty after mutations. This addresses the earlier empty-array edge case while aligning with the multi-node UX in the rest of the right-side panel.

Also applies to: 176-210

src/components/rightSidePanel/RightSidePanel.vue (2)

13-14: Typed tab model and activeTab guard correctly handle new 'subgraph' flow

Using RightSidePanelTab plus the RightSidePanelTabList alias makes the tab config type-safe, and the tabs computed correctly includes the info tab only when it’s actually relevant. The watchEffect that falls back to the first tab when activeTab is invalid—but still allows 'subgraph' when on a subgraph node—keeps global tab state coherent with the current selection and edit mode.

Also applies to: 31-52, 58-85, 86-94


98-105: Selection gating and subgraph editor routing are coherent with multi-node props

The header + nav layout, hasSelection-gated TabList, noSelection message, and the SubgraphEditor branch (isSubgraphNode && isEditingSubgraph) all line up with the new selectedNodes flow. Passing :nodes="selectedNodes" down to TabParameters, TabInfo, and TabSettings ensures all tabs consume the same multi-node context derived from the canvas store.

Also applies to: 140-159, 162-182

@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 4, 2025
AustinMroz
AustinMroz previously approved these changes Dec 4, 2025
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

Caution

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

⚠️ Outside diff range comments (2)
browser_tests/tests/nodeHelp.spec.ts (2)

98-100: Update selector for consistency.

This test still uses the old .sidebar-content-container selector, while all other tests in this file have been updated to [data-testid="properties-panel"]. This inconsistency could lead to test failures if the component structure has changed.

Apply this diff to align with the selector updates in other tests:

-      const helpPage = comfyPage.page.locator('.sidebar-content-container')
+      const helpPage = comfyPage.page.locator(
+        '[data-testid="properties-panel"]'
+      )

As per coding guidelines: "Prefer specific selectors in browser tests"


127-128: Update selector for consistency.

This test also uses the old .sidebar-content-container selector instead of the updated [data-testid="properties-panel"]. This creates inconsistency with the rest of the test suite.

Apply this diff to align with the selector updates:

-      const helpPage = comfyPage.page.locator('.sidebar-content-container')
+      const helpPage = comfyPage.page.locator(
+        '[data-testid="properties-panel"]'
+      )

As per coding guidelines: "Prefer specific selectors in browser tests"

🧹 Nitpick comments (2)
src/components/rightSidePanel/RightSidePanel.vue (2)

47-52: Hardcoded string 'Node' should be internationalized.

The fallback 'Node' string on line 49 should use t() for consistency with i18n requirements.

 const panelTitle = computed(() => {
   if (isSingleNodeSelected.value && selectedNode.value) {
-    return selectedNode.value.title || selectedNode.value.type || 'Node'
+    return selectedNode.value.title || selectedNode.value.type || t('g.node')
   }
   return t('rightSidePanel.title', { count: selectionCount.value })
 })

Ensure g.node (or similar key) exists in src/locales/en/main.json. As per coding guidelines, use vue-i18n for all user-facing strings.


169-169: Inconsistent i18n function usage.

This line uses $t() while the rest of the component uses t() from useI18n(). Consider using t() for consistency.

-        {{ $t('rightSidePanel.noSelection') }}
+        {{ t('rightSidePanel.noSelection') }}
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 064f01c and f9483c9.

⛔ Files ignored due to path filters (21)
  • browser_tests/tests/domWidget.spec.ts-snapshots/focus-mode-on-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/rerouteNode.spec.ts-snapshots/reroute-inserted-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png is excluded by !**/*.png
📒 Files selected for processing (2)
  • browser_tests/tests/nodeHelp.spec.ts (10 hunks)
  • src/components/rightSidePanel/RightSidePanel.vue (5 hunks)
🧰 Additional context used
📓 Path-based instructions (21)
**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities
Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Files:

  • browser_tests/tests/nodeHelp.spec.ts
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursorrules)

Use es-toolkit for utility functions

Files:

  • browser_tests/tests/nodeHelp.spec.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

Use TypeScript for type safety

**/*.{ts,tsx}: Never use any type - use proper TypeScript types
Never use as any type assertions - fix the underlying type issue

Files:

  • browser_tests/tests/nodeHelp.spec.ts
**/*.{ts,tsx,js,vue}

📄 CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in .prettierrc
Organize imports by sorting and grouping by plugin, and run pnpm format before committing

Files:

  • browser_tests/tests/nodeHelp.spec.ts
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,js,jsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

Use camelCase for variable and setting names in TypeScript/Vue files

Files:

  • browser_tests/tests/nodeHelp.spec.ts
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,vue}: Use const settingStore = useSettingStore() and settingStore.get('Comfy.SomeSetting') to retrieve settings in TypeScript/Vue files
Use await settingStore.set('Comfy.SomeSetting', newValue) to update settings in TypeScript/Vue files
Check server capabilities using api.serverSupportsFeature('feature_name') before using enhanced features
Use api.getServerFeature('config_name', defaultValue) to retrieve server feature configuration

Enforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates

Files:

  • browser_tests/tests/nodeHelp.spec.ts
  • src/components/rightSidePanel/RightSidePanel.vue
**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.ts: Define dynamic setting defaults using runtime context with functions in settings configuration
Use defaultsByInstallVersion property for gradual feature rollout based on version in settings configuration

Files:

  • browser_tests/tests/nodeHelp.spec.ts
browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (browser_tests/CLAUDE.md)

browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}: Test user workflows in browser tests
Use Playwright fixtures for browser tests
Follow naming conventions for browser tests
Check assets/ directory for test data when writing tests
Prefer specific selectors in browser tests
Test across multiple viewports

Files:

  • browser_tests/tests/nodeHelp.spec.ts
**/*.{test,spec}.{ts,tsx,js}

📄 CodeRabbit inference engine (AGENTS.md)

Unit and component tests should be located in tests-ui/ or co-located with components as src/components/**/*.{test,spec}.ts; E2E tests should be in browser_tests/

Files:

  • browser_tests/tests/nodeHelp.spec.ts
browser_tests/**/*.{test,spec}.ts

📄 CodeRabbit inference engine (AGENTS.md)

Playwright E2E tests can use optional tags like @mobile and @2x which are respected by the Playwright configuration

Files:

  • browser_tests/tests/nodeHelp.spec.ts
**/*.vue

📄 CodeRabbit inference engine (.cursorrules)

**/*.vue: Use setup() function for component logic in Vue 3 Composition API
Utilize ref and reactive for reactive state in Vue 3
Implement computed properties with computed() function
Use watch and watchEffect for side effects in Vue 3
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection in Vue 3
Use Vue 3.5 style of default prop declaration with defineProps()
Organize Vue components in <script> <style> order
Use Tailwind CSS for styling Vue components
Implement responsive design with Tailwind CSS
Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively
Implement proper props and emits definitions in Vue components
Utilize Vue 3's Teleport component when needed
Use Suspense for async components in Vue 3
Follow Vue 3 style guide and naming conventions
Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Never use :class="[]" to merge class names - always use import { cn } from '@/utils/tailwindUtil' for class merging in Vue templates

**/*.vue: Use TypeScript with Vue 3 Single File Components (.vue files)
Name Vue components in PascalCase (e.g., MenuHamburger.vue)

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.vue

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.vue: Use the Vue 3 Composition API instead of the Options API when writing Vue components (exception: when overriding or extending PrimeVue components for compatibility)
Use setup() function for component logic
Utilize ref and reactive for reactive state
Implement computed properties with computed()
Use watch and watchEffect for side effects
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection
Use vue 3.5 style of default prop declaration
Use Tailwind CSS for styling
Implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Follow Vue 3 style guide and naming conventions

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{vue,html}

📄 CodeRabbit inference engine (CLAUDE.md)

Never use dark: or dark-theme: Tailwind variants - instead use semantic values from style.css theme, e.g. bg-node-component-surface

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.vue

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.vue: Use setup() function in Vue 3 Composition API
Destructure props using Vue 3.5 style in Vue components
Use ref/reactive for state management in Vue 3 Composition API
Implement computed() for derived state in Vue 3 Composition API
Use provide/inject for dependency injection in Vue components
Prefer emit/@event-name for state changes over other communication patterns
Use defineExpose only for imperative operations (such as form.validate(), modal.open())
Replace PrimeVue Dropdown component with Select
Replace PrimeVue OverlayPanel component with Popover
Replace PrimeVue Calendar component with DatePicker
Replace PrimeVue InputSwitch component with ToggleSwitch
Replace PrimeVue Sidebar component with Drawer
Replace PrimeVue Chips component with AutoComplete with multiple enabled
Replace PrimeVue TabMenu component with Tabs without panels
Replace PrimeVue Steps component with Stepper without panels
Replace PrimeVue InlineMessage component with Message
Extract complex conditionals to computed properties
Implement cleanup for async operations in Vue components
Use lifecycle hooks: onMounted, onUpdated in Vue 3 Composition API
Use Teleport/Suspense when needed for component rendering
Define proper props and emits definitions in Vue components

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.{vue,css}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,css}: Use Tailwind CSS only for styling (no custom CSS)
Use the correct tokens from style.css in the design system package

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.{vue,ts,js}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,ts,js}: Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners
Use useIntersectionObserver for visibility detection instead of custom scroll handlers
Use vue-i18n for ALL UI strings

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
🧠 Learnings (13)
📓 Common learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Source code should be organized in `src/` directory with key areas: `components/`, `views/`, `stores/` (Pinia), `composables/`, `services/`, `utils/`, `assets/`, `locales/`
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Prefer specific selectors in browser tests

Applied to files:

  • browser_tests/tests/nodeHelp.spec.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Write tests for new features

Applied to files:

  • browser_tests/tests/nodeHelp.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Follow naming conventions for browser tests

Applied to files:

  • browser_tests/tests/nodeHelp.spec.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • browser_tests/tests/nodeHelp.spec.ts
  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Follow existing test patterns in the codebase

Applied to files:

  • browser_tests/tests/nodeHelp.spec.ts
📚 Learning: 2025-11-24T19:48:23.088Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Applies to browser_tests/**/*.{test,spec}.ts : Playwright E2E tests can use optional tags like `mobile` and `2x` which are respected by the Playwright configuration

Applied to files:

  • browser_tests/tests/nodeHelp.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Use Playwright fixtures for browser tests

Applied to files:

  • browser_tests/tests/nodeHelp.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Test user workflows in browser tests

Applied to files:

  • browser_tests/tests/nodeHelp.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Check assets/ directory for test data when writing tests

Applied to files:

  • browser_tests/tests/nodeHelp.spec.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Use existing test utilities rather than writing custom utilities

Applied to files:

  • browser_tests/tests/nodeHelp.spec.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue TabMenu component with Tabs without panels

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: deploy-and-comment
  • GitHub Check: test
  • GitHub Check: setup
  • GitHub Check: lint-and-format
  • GitHub Check: collect
🔇 Additional comments (1)
browser_tests/tests/nodeHelp.spec.ts (1)

61-63: LGTM! More stable selector.

The change from .sidebar-content-container to [data-testid="properties-panel"] provides a more specific, stable selector that is less likely to break with DOM structure changes.

As per coding guidelines: "Prefer specific selectors in browser tests"

@DrJKL DrJKL force-pushed the drjkl/cleanup/sidebar branch from f9483c9 to 50c76d9 Compare December 4, 2025 01:52
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

♻️ Duplicate comments (1)
src/components/rightSidePanel/RightSidePanel.vue (1)

143-149: Past review comment remains unaddressed.

The redundant two-way binding with v-model and @update:model-value noted in the previous review has not been resolved. The v-model directly updates activeTab via storeToRefs, while the handler also calls rightSidePanelStore.openPanel(), causing double updates.

As previously suggested, remove the redundant binding:

       <TabList
-        v-model="activeTab"
+        :model-value="activeTab"
         @update:model-value="
           (newTab) => {
             rightSidePanelStore.openPanel(newTab as RightSidePanelTab)
           }
         "
       >
🧹 Nitpick comments (2)
src/components/LiteGraphCanvasSplitterOverlay.vue (1)

3-3: Review z-index value: z-999 is very high.

The z-999 class places this overlay at an extremely high z-index. Ensure this doesn't conflict with other overlays, modals, or tooltips in the application. Consider using a semantic z-index value from your design system.

Verify the z-index hierarchy:

#!/bin/bash
# Find other high z-index values in the codebase
rg -n "z-\[?\d{3,}" --type vue --type css -C 2
src/components/rightSidePanel/settings/TabSettings.vue (1)

176-210: Prefer strict equality.

The multi-node color aggregation logic is correct. However, line 187 uses loose equality (==) for the null check.

Apply this diff to use strict equality:

-    if (colorOption == null || (!colorOption.bgcolor && !colorOption.color))
+    if (colorOption === null || colorOption === undefined || (!colorOption.bgcolor && !colorOption.color))

Or if checking for both null and undefined is intentional:

-    if (colorOption == null || (!colorOption.bgcolor && !colorOption.color))
+    if (colorOption == null || (!colorOption.bgcolor && !colorOption.color)) // intentionally checks null and undefined
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f9483c9 and 50c76d9.

⛔ Files ignored due to path filters (21)
  • browser_tests/tests/domWidget.spec.ts-snapshots/focus-mode-on-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/rerouteNode.spec.ts-snapshots/reroute-inserted-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png is excluded by !**/*.png
📒 Files selected for processing (15)
  • browser_tests/tests/nodeHelp.spec.ts (10 hunks)
  • src/components/LiteGraphCanvasSplitterOverlay.vue (8 hunks)
  • src/components/MenuHamburger.vue (1 hunks)
  • src/components/TopMenuSection.vue (4 hunks)
  • src/components/graph/GraphCanvas.vue (1 hunks)
  • src/components/graph/selectionToolbox/InfoButton.vue (2 hunks)
  • src/components/rightSidePanel/RightSidePanel.vue (5 hunks)
  • src/components/rightSidePanel/info/TabInfo.vue (2 hunks)
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue (1 hunks)
  • src/components/rightSidePanel/layout/SidePanelSearch.vue (3 hunks)
  • src/components/rightSidePanel/parameters/SectionWidgets.vue (3 hunks)
  • src/components/rightSidePanel/parameters/TabParameters.vue (2 hunks)
  • src/components/rightSidePanel/settings/TabSettings.vue (8 hunks)
  • src/locales/en/main.json (1 hunks)
  • src/stores/workspace/rightSidePanelStore.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • browser_tests/tests/nodeHelp.spec.ts
  • src/components/graph/GraphCanvas.vue
  • src/locales/en/main.json
🧰 Additional context used
📓 Path-based instructions (20)
**/*.vue

📄 CodeRabbit inference engine (.cursorrules)

**/*.vue: Use setup() function for component logic in Vue 3 Composition API
Utilize ref and reactive for reactive state in Vue 3
Implement computed properties with computed() function
Use watch and watchEffect for side effects in Vue 3
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection in Vue 3
Use Vue 3.5 style of default prop declaration with defineProps()
Organize Vue components in <script> <style> order
Use Tailwind CSS for styling Vue components
Implement responsive design with Tailwind CSS
Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively
Implement proper props and emits definitions in Vue components
Utilize Vue 3's Teleport component when needed
Use Suspense for async components in Vue 3
Follow Vue 3 style guide and naming conventions
Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Never use :class="[]" to merge class names - always use import { cn } from '@/utils/tailwindUtil' for class merging in Vue templates

**/*.vue: Use TypeScript with Vue 3 Single File Components (.vue files)
Name Vue components in PascalCase (e.g., MenuHamburger.vue)

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities
Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
**/*.{ts,tsx,js,vue}

📄 CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in .prettierrc
Organize imports by sorting and grouping by plugin, and run pnpm format before committing

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/*.vue

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.vue: Use the Vue 3 Composition API instead of the Options API when writing Vue components (exception: when overriding or extending PrimeVue components for compatibility)
Use setup() function for component logic
Utilize ref and reactive for reactive state
Implement computed properties with computed()
Use watch and watchEffect for side effects
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection
Use vue 3.5 style of default prop declaration
Use Tailwind CSS for styling
Implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Follow Vue 3 style guide and naming conventions

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
**/*.{ts,tsx,js,jsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

Use camelCase for variable and setting names in TypeScript/Vue files

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
**/*.{vue,html}

📄 CodeRabbit inference engine (CLAUDE.md)

Never use dark: or dark-theme: Tailwind variants - instead use semantic values from style.css theme, e.g. bg-node-component-surface

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,vue}: Use const settingStore = useSettingStore() and settingStore.get('Comfy.SomeSetting') to retrieve settings in TypeScript/Vue files
Use await settingStore.set('Comfy.SomeSetting', newValue) to update settings in TypeScript/Vue files
Check server capabilities using api.serverSupportsFeature('feature_name') before using enhanced features
Use api.getServerFeature('config_name', defaultValue) to retrieve server feature configuration

Enforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/components/**/*.vue

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.vue: Use setup() function in Vue 3 Composition API
Destructure props using Vue 3.5 style in Vue components
Use ref/reactive for state management in Vue 3 Composition API
Implement computed() for derived state in Vue 3 Composition API
Use provide/inject for dependency injection in Vue components
Prefer emit/@event-name for state changes over other communication patterns
Use defineExpose only for imperative operations (such as form.validate(), modal.open())
Replace PrimeVue Dropdown component with Select
Replace PrimeVue OverlayPanel component with Popover
Replace PrimeVue Calendar component with DatePicker
Replace PrimeVue InputSwitch component with ToggleSwitch
Replace PrimeVue Sidebar component with Drawer
Replace PrimeVue Chips component with AutoComplete with multiple enabled
Replace PrimeVue TabMenu component with Tabs without panels
Replace PrimeVue Steps component with Stepper without panels
Replace PrimeVue InlineMessage component with Message
Extract complex conditionals to computed properties
Implement cleanup for async operations in Vue components
Use lifecycle hooks: onMounted, onUpdated in Vue 3 Composition API
Use Teleport/Suspense when needed for component rendering
Define proper props and emits definitions in Vue components

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/components/**/*.{vue,css}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,css}: Use Tailwind CSS only for styling (no custom CSS)
Use the correct tokens from style.css in the design system package

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/components/**/*.{vue,ts,js}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,ts,js}: Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners
Use useIntersectionObserver for visibility detection instead of custom scroll handlers
Use vue-i18n for ALL UI strings

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/graph/selectionToolbox/InfoButton.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursorrules)

Use es-toolkit for utility functions

Files:

  • src/stores/workspace/rightSidePanelStore.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

Use TypeScript for type safety

**/*.{ts,tsx}: Never use any type - use proper TypeScript types
Never use as any type assertions - fix the underlying type issue

Files:

  • src/stores/workspace/rightSidePanelStore.ts
src/**/*.ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.ts: Use es-toolkit for utility functions
Use TypeScript for type safety

Files:

  • src/stores/workspace/rightSidePanelStore.ts
**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.ts: Define dynamic setting defaults using runtime context with functions in settings configuration
Use defaultsByInstallVersion property for gradual feature rollout based on version in settings configuration

Files:

  • src/stores/workspace/rightSidePanelStore.ts
src/**/stores/**/*.{ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/stores/**/*.{ts,tsx}: Maintain clear public interfaces and restrict extension access in stores
Use TypeScript for type safety in state management stores

Files:

  • src/stores/workspace/rightSidePanelStore.ts
🧠 Learnings (45)
📓 Common learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Source code should be organized in `src/` directory with key areas: `components/`, `views/`, `stores/` (Pinia), `composables/`, `services/`, `utils/`, `assets/`, `locales/`
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Sidebar component with Drawer

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue InputSwitch component with ToggleSwitch

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue OverlayPanel component with Popover

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Steps component with Stepper without panels

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue TabMenu component with Tabs without panels

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/MenuHamburger.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/TabParameters.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Dropdown component with Select

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue InlineMessage component with Message

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,css} : Use Tailwind CSS only for styling (no custom CSS)

Applied to files:

  • src/components/MenuHamburger.vue
📚 Learning: 2025-11-24T19:48:23.088Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Applies to **/*.vue : Name Vue components in PascalCase (e.g., `MenuHamburger.vue`)

Applied to files:

  • src/components/MenuHamburger.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Implement responsive design with Tailwind CSS

Applied to files:

  • src/components/MenuHamburger.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use Tailwind CSS for styling Vue components

Applied to files:

  • src/components/MenuHamburger.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use Tailwind CSS for styling

Applied to files:

  • src/components/MenuHamburger.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/stores/**/*.{ts,tsx} : Maintain clear public interfaces and restrict extension access in stores

Applied to files:

  • src/stores/workspace/rightSidePanelStore.ts
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{ts,tsx,vue} : Use `const settingStore = useSettingStore()` and `settingStore.get('Comfy.SomeSetting')` to retrieve settings in TypeScript/Vue files

Applied to files:

  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use ref/reactive for state management in Vue 3 Composition API

Applied to files:

  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Utilize ref and reactive for reactive state in Vue 3

Applied to files:

  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{ts,tsx,vue} : Use `await settingStore.set('Comfy.SomeSetting', newValue)` to update settings in TypeScript/Vue files

Applied to files:

  • src/stores/workspace/rightSidePanelStore.ts
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize ref and reactive for reactive state

Applied to files:

  • src/stores/workspace/rightSidePanelStore.ts
  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use vue 3.5 style of default prop declaration

Applied to files:

  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Define proper props and emits definitions in Vue components

Applied to files:

  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Implement proper props and emits definitions in Vue components

Applied to files:

  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use Vue 3.5 style of default prop declaration with defineProps<T>()

Applied to files:

  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.{vue,ts,tsx} : Leverage VueUse functions for performance-enhancing utilities

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.{vue,ts} : Leverage VueUse functions for performance-enhancing styles

Applied to files:

  • src/components/rightSidePanel/settings/TabSettings.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Prefer emit/event-name for state changes over other communication patterns

Applied to files:

  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.{vue,ts,tsx} : Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Applied to files:

  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.{vue,ts} : Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Applied to files:

  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,ts,js} : Use vue-i18n for ALL UI strings

Applied to files:

  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use setup() function in Vue 3 Composition API

Applied to files:

  • src/components/TopMenuSection.vue
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/{components,composables}/**/*.{ts,tsx,vue} : Use vue-i18n for ALL user-facing strings by adding them to `src/locales/en/main.json`

Applied to files:

  • src/components/TopMenuSection.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,ts,js} : Use useIntersectionObserver for visibility detection instead of custom scroll handlers

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize Vue 3's Teleport component when needed

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{vue,html} : Never use `dark:` or `dark-theme:` Tailwind variants - instead use semantic values from `style.css` theme, e.g. `bg-node-component-surface`

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use watch and watchEffect for side effects

Applied to files:

  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use watch and watchEffect for side effects in Vue 3

Applied to files:

  • src/components/rightSidePanel/info/TabInfo.vue
  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use setup() function for component logic in Vue 3 Composition API

Applied to files:

  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use setup() function for component logic

Applied to files:

  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,ts,js} : Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners

Applied to files:

  • src/components/rightSidePanel/info/TabInfo.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Destructure props using Vue 3.5 style in Vue components

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Implement proper props and emits definitions

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
🪛 ESLint
src/components/rightSidePanel/parameters/SectionWidgets.vue

[error] 10-10: Unable to resolve path to module '../layout/PropertiesAccordionItem.vue'.

(import-x/no-unresolved)

src/stores/workspace/rightSidePanelStore.ts

[error] 2-2: Unable to resolve path to module 'vue'.

(import-x/no-unresolved)

src/components/graph/selectionToolbox/InfoButton.vue

[error] 17-17: Unable to resolve path to module 'primevue/button'.

(import-x/no-unresolved)


[error] 19-19: Unable to resolve path to module '@/platform/telemetry'.

(import-x/no-unresolved)


[error] 20-20: Unable to resolve path to module '@/stores/workspace/rightSidePanelStore'.

(import-x/no-unresolved)

src/components/rightSidePanel/settings/TabSettings.vue

[error] 81-81: Unable to resolve path to module 'vue'.

(import-x/no-unresolved)

src/components/TopMenuSection.vue

[error] 65-65: Unable to resolve path to module 'pinia'.

(import-x/no-unresolved)

src/components/LiteGraphCanvasSplitterOverlay.vue

[error] 102-102: Unable to resolve path to module '@comfyorg/tailwind-utils'.

(import-x/no-unresolved)


[error] 103-103: Unable to resolve path to module 'pinia'.

(import-x/no-unresolved)


[error] 112-112: Unable to resolve path to module '@/stores/workspaceStore'.

(import-x/no-unresolved)

src/components/rightSidePanel/info/TabInfo.vue

[error] 2-2: Unable to resolve path to module '@vueuse/core'.

(import-x/no-unresolved)


[error] 3-3: Unable to resolve path to module 'vue'.

(import-x/no-unresolved)


[error] 5-5: Unable to resolve path to module '@/components/node/NodeHelpContent.vue'.

(import-x/no-unresolved)


[error] 7-7: Unable to resolve path to module '@/stores/nodeDefStore'.

(import-x/no-unresolved)


[error] 8-8: Unable to resolve path to module '@/stores/workspace/nodeHelpStore'.

(import-x/no-unresolved)

src/components/rightSidePanel/layout/SidePanelSearch.vue

[error] 6-6: Unable to resolve path to module '@/utils/tailwindUtil'.

(import-x/no-unresolved)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: setup
  • GitHub Check: lint-and-format
  • GitHub Check: test
  • GitHub Check: collect
🔇 Additional comments (30)
src/components/MenuHamburger.vue (1)

2-5: Tailwind-only styling migration on container looks good

Switching from the .comfy-menu-hamburger scoped style to inline Tailwind utilities on the root div (fixed z-9999 flex flex-row no-drag top-0 right-0) aligns with the “Tailwind CSS only in components, no custom CSS” guideline and avoids extra scoped rules. Just make sure the new explicit z-9999 still plays nicely with other overlays/modals in the app’s stacking order, but otherwise this change looks solid.

Based on learnings, this matches the project’s preference for Tailwind utilities in src/components/**/*.vue.

src/components/rightSidePanel/layout/PropertiesAccordionItem.vue (2)

4-4: LGTM: Clean v-model pattern with defineModel.

The use of defineModel for the collapse state is idiomatic Vue 3.5 and simplifies the component API by enabling two-way binding.


17-17: Remove this comment — no breaking change exists.

The component only supports label via <slot name="label" /> and has never had a label prop. The single consumer (SectionWidgets.vue) already correctly provides labels through the slot mechanism using <template #label>. No verification needed.

Likely an incorrect or invalid review comment.

src/stores/workspace/rightSidePanelStore.ts (3)

4-4: LGTM: Type-safe tab definitions.

The RightSidePanelTab union type provides clear documentation of available tabs and enables type-safe tab navigation throughout the codebase.


15-20: Simplified API: openPanel signature is cleaner.

The updated signature makes the tab parameter optional and removes the special subgraph handling. This simplification aligns well with the computed isEditingSubgraph approach.


13-13: No action needed. All usages of isEditingSubgraph are read-only—it's only accessed in conditional expressions, template directives, and ternary logic within RightSidePanel.vue. No direct assignments to this computed property exist in the codebase.

src/components/TopMenuSection.vue (2)

65-65: LGTM: Correct use of storeToRefs for reactive state.

Using storeToRefs properly extracts reactive references from the store while maintaining reactivity. This is the recommended pattern for accessing Pinia store state in components.

Also applies to: 98-98


51-51: LGTM: Simplified panel toggle logic.

Directly calling rightSidePanelStore.togglePanel() is cleaner than the previous approach and aligns with store-driven state management.

src/components/LiteGraphCanvasSplitterOverlay.vue (4)

19-19: LGTM: Stable splitter key prevents unnecessary re-renders.

Using a fixed key "main-splitter-stable" eliminates unnecessary component re-initialization and preserves splitter state across updates.


25-25: LGTM: Consistent focusMode gating across panels.

The focusMode check consistently hides all panels (left sidebar, bottom panel, and right panel) when focus mode is active, providing a clean canvas-only view.

Also applies to: 61-61, 89-89


102-103: LGTM: Correct imports for utility functions.

Importing cn from @comfyorg/tailwind-utils and storeToRefs from Pinia follows the project's patterns for class name merging and reactive store access.

As per coding guidelines, using cn for class merging is the correct approach instead of :class="[]".


49-53: Gutter visibility logic is correctly implemented.

The bottomPanelVisible computed property in useBottomPanelStore() properly derives its state from activePanel, which starts as null on initial load. This ensures the gutter is hidden when no panel is active. The state transitions are handled correctly through the reactive computed property and the store's action methods (togglePanel, toggleBottomPanelTab), which safely manage all scenarios including rapid state changes. The gutter correctly applies the hidden class when !bottomPanelVisible and remains visible when a panel is active.

src/components/rightSidePanel/layout/SidePanelSearch.vue (3)

8-14: LGTM: Clean props destructuring with MaybeRefOrGetter.

The updated prop signature using MaybeRefOrGetter<unknown> for updateKey provides better flexibility, allowing consumers to pass refs, getters, or raw values. The destructuring pattern with a default searcher is idiomatic Vue 3.5.


19-21: Verify debounce timing: 100ms is significantly faster.

The debounce interval changed from 700ms to 100ms with maxWait also at 100ms. This makes the search much more responsive but could increase the frequency of searcher calls substantially.

Consider the performance implications:

  • Will the searcher function handle rapid-fire calls efficiently?
  • Is there rate limiting or caching on the backend if this triggers API calls?
  • The maxWait: 100 means it will execute at least every 100ms during continuous typing.

Would you like me to help test the performance impact of this change?


29-41: LGTM: Proper cleanup handling in watch.

The watch callback correctly uses the onCleanup parameter to handle async operation cancellation, preventing stale results from updating the UI after the search query changes.

src/components/graph/selectionToolbox/InfoButton.vue (1)

20-22: LGTM: Clean migration to store-driven panel management.

The refactor from toggleHelp() to rightSidePanelStore.openPanel('info') centralizes panel state management in the store, making the component simpler and the state flow more predictable.

Also applies to: 31-31

src/components/rightSidePanel/parameters/SectionWidgets.vue (1)

10-10: LGTM: Clean component replacement.

Replacing RightPanelSection with PropertiesAccordionItem standardizes the accordion pattern across the properties panel. The component correctly provides the label slot expected by the new wrapper.

Also applies to: 37-37, 69-69

src/components/rightSidePanel/info/TabInfo.vue (3)

2-3: LGTM: whenever is cleaner for conditional reactivity.

Using whenever from VueUse is more idiomatic than watch for triggering effects when a value becomes truthy. This simplifies the logic and makes the intent clearer.

Based on learnings, VueUse functions should be preferred for common reactive patterns.

Also applies to: 23-29


10-13: LGTM: Clean props destructuring.

Destructuring props directly in defineProps and computing the first node is idiomatic Vue 3.5 and improves code readability.


26-26: No validation needed—the implementation is already safely guarded.

The openHelp method directly assigns the parameter to state without validation, but this is not a concern because:

  1. The whenever() guard in TabInfo.vue ensures nodeInfo is truthy before invoking openHelp(). The fromLGraphNode() method returns ComfyNodeDefImpl | null, but whenever() only executes the callback when the source value is truthy, preventing null values from reaching openHelp()
  2. TypeScript enforces the ComfyNodeDefImpl type on the received parameter, preventing shape mismatches at compile time
  3. The watch in nodeHelpStore safely handles the stored value with explicit null checks (if (!node) return '') before accessing properties

The code is correctly defended at both the call site (truthy guard via whenever()) and type level (TypeScript typing).

src/components/rightSidePanel/parameters/TabParameters.vue (2)

10-18: LGTM! Excellent type safety improvement.

The Vue 3.5 style prop destructuring and explicit type definitions for the nested widget data model improve both type safety and code clarity.


20-31: LGTM! Data model refactor maintains correct behavior.

The refactored widgetsSectionDataList uses a more explicit nested structure while preserving the existing widget filtering logic. The data flow remains correct.

src/components/rightSidePanel/settings/TabSettings.vue (4)

2-2: LGTM! Styling consolidation improves consistency.

The styling updates consolidate text colors using semantic theme tokens and simplify the class structure without changing functionality.

Also applies to: 5-5, 30-30, 34-34, 42-44, 71-71


81-81: LGTM! Props updated for multi-node support.

The props signature correctly migrates to support multiple nodes with proper defaults. The import cleanup removes unused refs.

Note: The ESLint error flagging the 'vue' import is a false positive from the linter configuration.

Also applies to: 93-95


105-126: LGTM! Multi-node state handling is correct.

The nodeState computed properly handles empty arrays, single nodes, and multiple nodes. The aggregation logic correctly returns a common mode or null, and the setter updates all nodes appropriately.


129-137: LGTM! Pinned state properly aggregates across nodes.

The isPinned computed correctly returns true if any node is pinned, and the setter applies the value to all nodes.

src/components/rightSidePanel/RightSidePanel.vue (4)

13-13: LGTM! Proper type usage and selection state derivation.

The import of RightSidePanelTab aligns with the store refactor, and the computed properties correctly derive selection state for the panel.

Also applies to: 29-52


87-94: LGTM! Tab validation correctly handles subgraph editing.

The watchEffect properly validates that activeTab is in the available tabs list, with special handling for the 'subgraph' tab when editing subgraph nodes.


98-141: LGTM! Improved semantic structure and consistent styling.

The template restructuring uses semantic HTML elements and consistent theme-based styling. The subgraph toggle button properly switches between subgraph and parameters views via the store.


164-186: LGTM! Content rendering properly handles all states.

The panel content correctly renders different views based on selection state, subgraph editing mode, and active tab. All tab components properly receive selectedNodes for multi-node support.

@DrJKL DrJKL force-pushed the drjkl/cleanup/sidebar branch from 6e88d4d to df4c23e Compare December 5, 2025 06:23
@dosubot dosubot bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Dec 5, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

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

⚠️ Outside diff range comments (1)
src/components/LiteGraphCanvasSplitterOverlay.vue (1)

69-80: Right sidebar panel still reserves space in focus mode when sidebar is on the right

SplitterPanel for the sidebar on the right is not gated by focusMode, so when sidebarLocation === 'right' and focus mode is enabled, the empty panel can still occupy width (since sidebarPanelVisible is independent of focus mode). That partially defeats the goal of focus mode.

Consider gating the right sidebar panel the same way as the left:

-        <SplitterPanel
-          v-if="sidebarLocation === 'right'"
+        <SplitterPanel
+          v-if="sidebarLocation === 'right' && !focusMode"

This keeps the canvas truly full-width in focus mode regardless of sidebar side.

Also applies to: 132-139

♻️ Duplicate comments (4)
browser_tests/helpers/actionbar.ts (1)

8-8: Scope propertiesButton to the actionbar root for a more specific locator

Using page.getByLabel('Toggle properties panel') can match buttons outside this action bar. Prefer scoping via this.root (like queueButton) to keep the selector resilient:

-    this.queueButton = new ComfyQueueButton(this)
-    this.propertiesButton = page.getByLabel('Toggle properties panel')
+    this.queueButton = new ComfyQueueButton(this)
+    this.propertiesButton = this.root.getByLabel('Toggle properties panel')

This aligns with the “specific selectors in browser tests” guideline.

Also applies to: 13-13

src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts (1)

201-215: Reduce alias duplication in EXPANDING_TYPES by using getCanonicalType

Right now EXPANDING_TYPES lists both canonical types and their aliases (e.g. 'textarea' / 'TEXTAREA', 'markdown' / 'MARKDOWN', 'progressText', 'LOAD_3D'), while coreWidgetDefinitions already encode aliases and getCanonicalType normalizes them. This duplicates mapping and can drift if aliases change.

You can let EXPANDING_TYPES contain only canonical types and rely on getCanonicalType:

-const EXPANDING_TYPES = [
-  'textarea',
-  'TEXTAREA',
-  'multiline',
-  'customtext',
-  'markdown',
-  'MARKDOWN',
-  'progressText',
-  'load3D',
-  'LOAD_3D'
-] as const
-
-export function shouldExpand(type: string): boolean {
-  return EXPANDING_TYPES.includes(type as (typeof EXPANDING_TYPES)[number])
-}
+const EXPANDING_TYPES = ['textarea', 'markdown', 'load3D'] as const
+
+export function shouldExpand(type: string): boolean {
+  const canonicalType = getCanonicalType(type)
+  return EXPANDING_TYPES.includes(
+    canonicalType as (typeof EXPANDING_TYPES)[number]
+  )
+}

This keeps the expanding‑widget list in sync with the registry’s single source of truth.

src/components/rightSidePanel/parameters/SectionWidgets.vue (1)

2-2: Fix inconsistent import path for cn utility.

This file imports cn from '@comfyorg/tailwind-utils', but other files in the codebase import from '@/utils/tailwindUtil'. This inconsistency can lead to bundle duplication and maintenance confusion.

Apply this diff to align with the codebase standard:

-import { cn } from '@comfyorg/tailwind-utils'
+import { cn } from '@/utils/tailwindUtil'
browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts (1)

5-16: Make the properties panel test name and selectors more specific.

The test name 'complex test' doesn't convey intent and the global page.getByText selectors are brittle.

Consider:

  1. Rename to describe behavior: 'shows multi-node selection summary in properties panel'
  2. Scope assertions to properties panel using a test ID:
+const propertiesPanel = page.getByTestId('properties-panel')
-await expect(page.getByText('No node(s) selected')).toBeVisible()
+await expect(propertiesPanel.getByText('No node(s) selected')).toBeVisible()

Based on learnings, prefer specific selectors and clear naming in browser tests.

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: 4

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between df4c23e and 475fe28.

📒 Files selected for processing (5)
  • browser_tests/fixtures/ComfyPage.ts (1 hunks)
  • browser_tests/helpers/actionbar.ts (1 hunks)
  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts (1 hunks)
  • src/components/LiteGraphCanvasSplitterOverlay.vue (8 hunks)
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (22)
**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities
Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Files:

  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/helpers/actionbar.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursorrules)

Use es-toolkit for utility functions

Files:

  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/helpers/actionbar.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

Use TypeScript for type safety

**/*.{ts,tsx}: Never use any type - use proper TypeScript types
Never use as any type assertions - fix the underlying type issue

Files:

  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/helpers/actionbar.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
**/*.{ts,tsx,js,vue}

📄 CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in .prettierrc
Organize imports by sorting and grouping by plugin, and run pnpm format before committing

Files:

  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/helpers/actionbar.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
**/*.{ts,tsx,js,jsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

Use camelCase for variable and setting names in TypeScript/Vue files

Files:

  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/helpers/actionbar.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,vue}: Use const settingStore = useSettingStore() and settingStore.get('Comfy.SomeSetting') to retrieve settings in TypeScript/Vue files
Use await settingStore.set('Comfy.SomeSetting', newValue) to update settings in TypeScript/Vue files
Check server capabilities using api.serverSupportsFeature('feature_name') before using enhanced features
Use api.getServerFeature('config_name', defaultValue) to retrieve server feature configuration

Enforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates

Files:

  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/helpers/actionbar.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.ts: Define dynamic setting defaults using runtime context with functions in settings configuration
Use defaultsByInstallVersion property for gradual feature rollout based on version in settings configuration

Files:

  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/helpers/actionbar.ts
  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
src/**/*.ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.ts: Use es-toolkit for utility functions
Use TypeScript for type safety

Files:

  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
  • src/components/LiteGraphCanvasSplitterOverlay.vue
browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (browser_tests/CLAUDE.md)

browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}: Test user workflows in browser tests
Use Playwright fixtures for browser tests
Follow naming conventions for browser tests
Check assets/ directory for test data when writing tests
Prefer specific selectors in browser tests
Test across multiple viewports

Files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
**/*.{test,spec}.{ts,tsx,js}

📄 CodeRabbit inference engine (AGENTS.md)

Unit and component tests should be located in tests-ui/ or co-located with components as src/components/**/*.{test,spec}.ts; E2E tests should be in browser_tests/

Files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
browser_tests/**/*.{test,spec}.ts

📄 CodeRabbit inference engine (AGENTS.md)

Playwright E2E tests can use optional tags like @mobile and @2x which are respected by the Playwright configuration

Files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
**/*.vue

📄 CodeRabbit inference engine (.cursorrules)

**/*.vue: Use setup() function for component logic in Vue 3 Composition API
Utilize ref and reactive for reactive state in Vue 3
Implement computed properties with computed() function
Use watch and watchEffect for side effects in Vue 3
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection in Vue 3
Use Vue 3.5 style of default prop declaration with defineProps()
Organize Vue components in <script> <style> order
Use Tailwind CSS for styling Vue components
Implement responsive design with Tailwind CSS
Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively
Implement proper props and emits definitions in Vue components
Utilize Vue 3's Teleport component when needed
Use Suspense for async components in Vue 3
Follow Vue 3 style guide and naming conventions
Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Never use :class="[]" to merge class names - always use import { cn } from '@/utils/tailwindUtil' for class merging in Vue templates

**/*.vue: Use TypeScript with Vue 3 Single File Components (.vue files)
Name Vue components in PascalCase (e.g., MenuHamburger.vue)

Files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
src/**/*.vue

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.vue: Use the Vue 3 Composition API instead of the Options API when writing Vue components (exception: when overriding or extending PrimeVue components for compatibility)
Use setup() function for component logic
Utilize ref and reactive for reactive state
Implement computed properties with computed()
Use watch and watchEffect for side effects
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection
Use vue 3.5 style of default prop declaration
Use Tailwind CSS for styling
Implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Follow Vue 3 style guide and naming conventions

Files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
**/*.{vue,html}

📄 CodeRabbit inference engine (CLAUDE.md)

Never use dark: or dark-theme: Tailwind variants - instead use semantic values from style.css theme, e.g. bg-node-component-surface

Files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
src/components/**/*.vue

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.vue: Use setup() function in Vue 3 Composition API
Destructure props using Vue 3.5 style in Vue components
Use ref/reactive for state management in Vue 3 Composition API
Implement computed() for derived state in Vue 3 Composition API
Use provide/inject for dependency injection in Vue components
Prefer emit/@event-name for state changes over other communication patterns
Use defineExpose only for imperative operations (such as form.validate(), modal.open())
Replace PrimeVue Dropdown component with Select
Replace PrimeVue OverlayPanel component with Popover
Replace PrimeVue Calendar component with DatePicker
Replace PrimeVue InputSwitch component with ToggleSwitch
Replace PrimeVue Sidebar component with Drawer
Replace PrimeVue Chips component with AutoComplete with multiple enabled
Replace PrimeVue TabMenu component with Tabs without panels
Replace PrimeVue Steps component with Stepper without panels
Replace PrimeVue InlineMessage component with Message
Extract complex conditionals to computed properties
Implement cleanup for async operations in Vue components
Use lifecycle hooks: onMounted, onUpdated in Vue 3 Composition API
Use Teleport/Suspense when needed for component rendering
Define proper props and emits definitions in Vue components

Files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
src/components/**/*.{vue,css}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,css}: Use Tailwind CSS only for styling (no custom CSS)
Use the correct tokens from style.css in the design system package

Files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
src/components/**/*.{vue,ts,js}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,ts,js}: Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners
Use useIntersectionObserver for visibility detection instead of custom scroll handlers
Use vue-i18n for ALL UI strings

Files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
🧠 Learnings (47)
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Prefer specific selectors in browser tests

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/helpers/actionbar.ts
  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Write tests for new features

Applied to files:

  • browser_tests/fixtures/ComfyPage.ts
  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Implement proper TypeScript types throughout the codebase

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Use Playwright fixtures for browser tests

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:48:23.088Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Applies to browser_tests/**/*.{test,spec}.ts : Playwright E2E tests can use optional tags like `mobile` and `2x` which are respected by the Playwright configuration

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Follow naming conventions for browser tests

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Follow existing test patterns in the codebase

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Test across multiple viewports

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Test user workflows in browser tests

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Use existing test utilities rather than writing custom utilities

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Check tests-ui/README.md for test guidelines

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:48:09.318Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursor/rules/unit-test.mdc:0-0
Timestamp: 2025-11-24T19:48:09.318Z
Learning: Applies to test/**/*.{test,spec}.{js,ts,jsx,tsx} : Prefer the use of `test.extend` over loose variables; import `test as baseTest` from `vitest`

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:48:09.318Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursor/rules/unit-test.mdc:0-0
Timestamp: 2025-11-24T19:48:09.318Z
Learning: Applies to test/**/*.{test,spec}.{js,ts,jsx,tsx} : Mocks should be cleanly written and easy to understand, with reusable mocks where possible

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:48:09.318Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursor/rules/unit-test.mdc:0-0
Timestamp: 2025-11-24T19:48:09.318Z
Learning: Applies to test/**/*.{test,spec}.{js,ts,jsx,tsx} : Use `test` instead of `it` for defining test cases in vitest

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:48:23.088Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Use Vitest (with happy-dom) for unit and component tests, and Playwright for E2E tests

Applied to files:

  • browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue OverlayPanel component with Popover

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Sidebar component with Drawer

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.vue : Never use `:class="[]"` to merge class names - always use `import { cn } from '@/utils/tailwindUtil'` for class merging in Vue templates

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-12-04T22:01:48.124Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/LiteGraphCanvasSplitterOverlay.vue:2-4
Timestamp: 2025-12-04T22:01:48.124Z
Learning: In Tailwind CSS v4, z-index utilities support direct numeric values without brackets. For example, `z-999` generates `z-index: 999;` automatically. This is different from v3 which required bracket syntax `z-[999]` for arbitrary values.

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{vue,html} : Never use `dark:` or `dark-theme:` Tailwind variants - instead use semantic values from `style.css` theme, e.g. `bg-node-component-surface`

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-12-04T21:47:07.800Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/LiteGraphCanvasSplitterOverlay.vue:43-43
Timestamp: 2025-12-04T21:47:07.800Z
Learning: In Vue SFCs with a build step (pre-compilation), kebab-case attribute names in templates are automatically converted to camelCase, so `:sidebar-panel-visible` as a shorthand binding correctly resolves to a variable named `sidebarPanelVisible`. The `.camel` modifier is only needed when using in-DOM templates without a build step.

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-12-03T03:14:48.687Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7121
File: src/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue:3-18
Timestamp: 2025-12-03T03:14:48.687Z
Learning: Vue 3.4+ supports same-name shorthand syntax for attribute bindings where `:id` is equivalent to `:id="id"` when the attribute name matches the variable name in scope. This is valid syntax and should not be flagged as an error.

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Follow Vue 3 style guide and naming conventions

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Follow Vue 3 style guide and naming conventions

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{vue,ts,tsx} : Follow Vue 3 composition API style guide

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Utilize ref and reactive for reactive state in Vue 3

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Implement proper props and emits definitions in Vue components

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Define proper props and emits definitions in Vue components

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{ts,tsx,js,jsx,vue} : Use camelCase for variable and setting names in TypeScript/Vue files

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-12-01T23:42:30.894Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7084
File: src/renderer/extensions/vueNodes/components/SlotConnectionDot.vue:23-26
Timestamp: 2025-12-01T23:42:30.894Z
Learning: In the ComfyUI frontend codebase, Tailwind CSS is configured with Preflight enabled (default), which automatically provides `content: ''` for pseudo-elements when using `after:` or `before:` variants - no need to explicitly add `after:content-['']`.

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use Tailwind CSS for styling

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Implement responsive design with Tailwind CSS

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use Tailwind CSS for styling Vue components

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-12-01T23:41:16.238Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7084
File: src/renderer/extensions/vueNodes/components/SlotConnectionDot.vue:23-26
Timestamp: 2025-12-01T23:41:16.238Z
Learning: Tailwind CSS automatically sets `content: ""` for `::before` and `::after` pseudo-elements when using the `before:` and `after:` variants. No explicit `before:content-['']` or `after:content-['']` is needed.

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-12-05T06:11:09.374Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7177
File: src/platform/assets/components/UploadModelFooter.vue:72-78
Timestamp: 2025-12-05T06:11:09.374Z
Learning: For the ComfyUI_frontend repository, avoid suggesting comments that would be redundant when the code is already self-explanatory through descriptive naming (e.g., filenames, prop names, aria-labels). The project prefers clean code without unnecessary documentation comments.

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,css} : Use Tailwind CSS only for styling (no custom CSS)

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue TabMenu component with Tabs without panels

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize ref and reactive for reactive state

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Steps component with Stepper without panels

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{ts,tsx,vue} : Use `const settingStore = useSettingStore()` and `settingStore.get('Comfy.SomeSetting')` to retrieve settings in TypeScript/Vue files

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use ref/reactive for state management in Vue 3 Composition API

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize Vue 3's Teleport component when needed

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-12-04T21:43:49.343Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/rightSidePanel/parameters/TabParameters.vue:10-0
Timestamp: 2025-12-04T21:43:49.343Z
Learning: Vue 3.5+ supports reactive props destructure in <script setup>. Destructuring props directly (e.g., `const { nodes } = defineProps<{ nodes: LGraphNode[] }>()`) maintains reactivity through compiler transformation. This is the recommended modern approach and does not require using `props.x` or `toRef`/`toRefs`.

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use setup() function in Vue 3 Composition API

Applied to files:

  • src/components/LiteGraphCanvasSplitterOverlay.vue
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: lint-and-format
  • GitHub Check: test
  • GitHub Check: setup
  • GitHub Check: collect
🔇 Additional comments (5)
src/components/LiteGraphCanvasSplitterOverlay.vue (2)

2-4: Overlay container and interaction model look correct

Full-screen flex container with pointer-events-none on the root and pointer-events-auto on interactive children is a good pattern here, and the high z-index utility is valid for this Tailwind v4 setup; no change needed.

Based on learnings, the z-999 utility is acceptable in this project.


102-103: Pinia refs and sidebar state key logic look consistent

Using storeToRefs for focusMode, sidebar/bottom/right-panel visibility, and computing sidebarPanelVisible from activeSidebarTab is clean and reactive-friendly. The updated sidebarStateKey that switches between a unified key and per-tab keys (with a default-sidebar fallback) should give predictable splitter persistence across configurations.

Also applies to: 112-133, 135-138

browser_tests/helpers/actionbar.ts (1)

8-13: LGTM! Properties button is correctly scoped.

The propertiesButton locator is properly scoped to this.root, which makes it specific to the actionbar instance and aligns with the previous review feedback. The label selector is appropriate for accessibility-based targeting.

browser_tests/fixtures/ComfyPage.ts (1)

36-43: LGTM! Clean addition of properties panel locator.

The properties panel locator uses getByTestId, which is the recommended approach for stable, specific selectors in browser tests. This follows the existing patterns in the ComfyMenu class.

browser_tests/tests/propertiesPanel/propertiesPanel.spec.ts (1)

17-17: Clarify or remove the incomplete Vue mode comment.

The comment // Will be 2 in Vue mode suggests this is a known limitation or work in progress. This creates confusion for future maintainers.

Either:

  1. File a TODO/issue to track the Vue mode behavior and reference it in the comment
  2. Remove the comment if this is the expected behavior
  3. Update the test to handle both modes if that's feasible

What is the intended behavior difference between the current mode and Vue mode? Should this test be updated to cover both scenarios?

@DrJKL DrJKL added the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 5, 2025
@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 5, 2025
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Dec 5, 2025
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

♻️ Duplicate comments (1)
src/components/rightSidePanel/RightSidePanel.vue (1)

87-95: Consider guarding against empty tabs array.

While tabs currently always includes at least parameters and settings, accessing tabs.value[0].value without checking array length could fail if future refactoring filters out all tabs. A small guard would future-proof this logic:

 watchEffect(() => {
+  if (tabs.value.length === 0) return
+
   if (
     !tabs.value.some((tab) => tab.value === activeTab.value) &&
     !(activeTab.value === 'subgraph' && isSubgraphNode.value)
   ) {
     rightSidePanelStore.openPanel(tabs.value[0].value)
   }
 })

Based on learnings, this mirrors a previous nitpick suggestion to add defensive checks.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 64bbf20 and f0f59b2.

⛔ Files ignored due to path filters (6)
  • browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png is excluded by !**/*.png
📒 Files selected for processing (1)
  • src/components/rightSidePanel/RightSidePanel.vue (4 hunks)
🧰 Additional context used
📓 Path-based instructions (15)
**/*.vue

📄 CodeRabbit inference engine (.cursorrules)

**/*.vue: Use setup() function for component logic in Vue 3 Composition API
Utilize ref and reactive for reactive state in Vue 3
Implement computed properties with computed() function
Use watch and watchEffect for side effects in Vue 3
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection in Vue 3
Use Vue 3.5 style of default prop declaration with defineProps()
Organize Vue components in <script> <style> order
Use Tailwind CSS for styling Vue components
Implement responsive design with Tailwind CSS
Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively
Implement proper props and emits definitions in Vue components
Utilize Vue 3's Teleport component when needed
Use Suspense for async components in Vue 3
Follow Vue 3 style guide and naming conventions
Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Never use :class="[]" to merge class names - always use import { cn } from '@/utils/tailwindUtil' for class merging in Vue templates

**/*.vue: Use TypeScript with Vue 3 Single File Components (.vue files)
Name Vue components in PascalCase (e.g., MenuHamburger.vue)

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities
Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,js,vue}

📄 CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in .prettierrc
Organize imports by sorting and grouping by plugin, and run pnpm format before committing

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.vue

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.vue: Use the Vue 3 Composition API instead of the Options API when writing Vue components (exception: when overriding or extending PrimeVue components for compatibility)
Use setup() function for component logic
Utilize ref and reactive for reactive state
Implement computed properties with computed()
Use watch and watchEffect for side effects
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection
Use vue 3.5 style of default prop declaration
Use Tailwind CSS for styling
Implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Follow Vue 3 style guide and naming conventions

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,js,jsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

Use camelCase for variable and setting names in TypeScript/Vue files

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{vue,html}

📄 CodeRabbit inference engine (CLAUDE.md)

Never use dark: or dark-theme: Tailwind variants - instead use semantic values from style.css theme, e.g. bg-node-component-surface

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,vue}: Use const settingStore = useSettingStore() and settingStore.get('Comfy.SomeSetting') to retrieve settings in TypeScript/Vue files
Use await settingStore.set('Comfy.SomeSetting', newValue) to update settings in TypeScript/Vue files
Check server capabilities using api.serverSupportsFeature('feature_name') before using enhanced features
Use api.getServerFeature('config_name', defaultValue) to retrieve server feature configuration

Enforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.vue

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.vue: Use setup() function in Vue 3 Composition API
Destructure props using Vue 3.5 style in Vue components
Use ref/reactive for state management in Vue 3 Composition API
Implement computed() for derived state in Vue 3 Composition API
Use provide/inject for dependency injection in Vue components
Prefer emit/@event-name for state changes over other communication patterns
Use defineExpose only for imperative operations (such as form.validate(), modal.open())
Replace PrimeVue Dropdown component with Select
Replace PrimeVue OverlayPanel component with Popover
Replace PrimeVue Calendar component with DatePicker
Replace PrimeVue InputSwitch component with ToggleSwitch
Replace PrimeVue Sidebar component with Drawer
Replace PrimeVue Chips component with AutoComplete with multiple enabled
Replace PrimeVue TabMenu component with Tabs without panels
Replace PrimeVue Steps component with Stepper without panels
Replace PrimeVue InlineMessage component with Message
Extract complex conditionals to computed properties
Implement cleanup for async operations in Vue components
Use lifecycle hooks: onMounted, onUpdated in Vue 3 Composition API
Use Teleport/Suspense when needed for component rendering
Define proper props and emits definitions in Vue components

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.{vue,css}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,css}: Use Tailwind CSS only for styling (no custom CSS)
Use the correct tokens from style.css in the design system package

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
src/components/**/*.{vue,ts,js}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,ts,js}: Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners
Use useIntersectionObserver for visibility detection instead of custom scroll handlers
Use vue-i18n for ALL UI strings

Files:

  • src/components/rightSidePanel/RightSidePanel.vue
🧠 Learnings (12)
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue TabMenu component with Tabs without panels

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-12-04T21:47:07.800Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/LiteGraphCanvasSplitterOverlay.vue:43-43
Timestamp: 2025-12-04T21:47:07.800Z
Learning: In Vue SFCs with a build step (pre-compilation), kebab-case attribute names in templates are automatically converted to camelCase, so `:sidebar-panel-visible` as a shorthand binding correctly resolves to a variable named `sidebarPanelVisible`. The `.camel` modifier is only needed when using in-DOM templates without a build step.

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use watch and watchEffect for side effects in Vue 3

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use watch and watchEffect for side effects

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Utilize ref and reactive for reactive state in Vue 3

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{ts,tsx,vue} : Use `const settingStore = useSettingStore()` and `settingStore.get('Comfy.SomeSetting')` to retrieve settings in TypeScript/Vue files

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize ref and reactive for reactive state

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use ref/reactive for state management in Vue 3 Composition API

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use setup() function in Vue 3 Composition API

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-12-04T21:43:49.343Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/rightSidePanel/parameters/TabParameters.vue:10-0
Timestamp: 2025-12-04T21:43:49.343Z
Learning: Vue 3.5+ supports reactive props destructure in <script setup>. Destructuring props directly (e.g., `const { nodes } = defineProps<{ nodes: LGraphNode[] }>()`) maintains reactivity through compiler transformation. This is the recommended modern approach and does not require using `props.x` or `toRef`/`toRefs`.

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use setup() function for component logic in Vue 3 Composition API

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use setup() function for component logic

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: collect
  • GitHub Check: setup
  • GitHub Check: lint-and-format
  • GitHub Check: test
🔇 Additional comments (6)
src/components/rightSidePanel/RightSidePanel.vue (6)

1-28: LGTM!

The imports and setup follow Vue 3 Composition API best practices. The addition of RightSidePanelTab type import improves type safety, and toValue is appropriately imported for use in the title editing handler.


97-116: LGTM!

The title editing logic correctly compares against node.title (line 108) rather than the computed panelTitle, which addresses the previous concern about missing legitimate edits when titles match default labels. The canvas dirty marking (line 111) ensures proper state tracking.


120-123: LGTM!

The panel container properly uses semantic CSS values from the theme (bg-interface-panel-surface) and includes data-testid for testing, following project guidelines.


173-191: LGTM!

The TabList correctly uses one-way binding with :model-value and an explicit @update:model-value handler (lines 175-180). This ensures a single source of truth through the store, avoiding the double-update issue from earlier feedback.


194-217: LGTM!

The panel content rendering uses appropriate conditional logic and semantic CSS values. The i18n usage for the no-selection message (line 200) follows project guidelines, and the component structure cleanly handles all display states.


59-85: All translation keys are properly configured in src/locales/en/main.json.

The tabs computation correctly implements the vue-i18n requirement with all necessary translation keys present: rightSidePanel.parameters, g.settings, and rightSidePanel.info are all defined. The typed structure and conditional logic for displaying the info tab are properly implemented.

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

♻️ Duplicate comments (1)
src/components/rightSidePanel/parameters/SectionWidgets.vue (1)

13-13: Use @comfyorg/tailwind-utils for cn instead of the local shim

This file is still importing cn from the @/utils/tailwindUtil shim, which is being phased out in favor of the @comfyorg/tailwind-utils package (see prior discussion on this PR about removing the shim). To avoid new shim usages and keep imports consistent, switch to the package here:

-import { cn } from '@/utils/tailwindUtil'
+import { cn } from '@comfyorg/tailwind-utils'
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f0f59b2 and a5675d3.

📒 Files selected for processing (3)
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue (1 hunks)
  • src/components/rightSidePanel/parameters/SectionWidgets.vue (3 hunks)
  • src/locales/en/main.json (1 hunks)
🧰 Additional context used
📓 Path-based instructions (15)
**/*.vue

📄 CodeRabbit inference engine (.cursorrules)

**/*.vue: Use setup() function for component logic in Vue 3 Composition API
Utilize ref and reactive for reactive state in Vue 3
Implement computed properties with computed() function
Use watch and watchEffect for side effects in Vue 3
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection in Vue 3
Use Vue 3.5 style of default prop declaration with defineProps()
Organize Vue components in <script> <style> order
Use Tailwind CSS for styling Vue components
Implement responsive design with Tailwind CSS
Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively
Implement proper props and emits definitions in Vue components
Utilize Vue 3's Teleport component when needed
Use Suspense for async components in Vue 3
Follow Vue 3 style guide and naming conventions
Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Never use :class="[]" to merge class names - always use import { cn } from '@/utils/tailwindUtil' for class merging in Vue templates

**/*.vue: Use TypeScript with Vue 3 Single File Components (.vue files)
Name Vue components in PascalCase (e.g., MenuHamburger.vue)

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities
Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
**/*.{ts,tsx,js,vue}

📄 CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in .prettierrc
Organize imports by sorting and grouping by plugin, and run pnpm format before committing

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
src/**/*.vue

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.vue: Use the Vue 3 Composition API instead of the Options API when writing Vue components (exception: when overriding or extending PrimeVue components for compatibility)
Use setup() function for component logic
Utilize ref and reactive for reactive state
Implement computed properties with computed()
Use watch and watchEffect for side effects
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection
Use vue 3.5 style of default prop declaration
Use Tailwind CSS for styling
Implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Follow Vue 3 style guide and naming conventions

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
**/*.{ts,tsx,js,jsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

Use camelCase for variable and setting names in TypeScript/Vue files

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
**/*.{vue,html}

📄 CodeRabbit inference engine (CLAUDE.md)

Never use dark: or dark-theme: Tailwind variants - instead use semantic values from style.css theme, e.g. bg-node-component-surface

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,vue}: Use const settingStore = useSettingStore() and settingStore.get('Comfy.SomeSetting') to retrieve settings in TypeScript/Vue files
Use await settingStore.set('Comfy.SomeSetting', newValue) to update settings in TypeScript/Vue files
Check server capabilities using api.serverSupportsFeature('feature_name') before using enhanced features
Use api.getServerFeature('config_name', defaultValue) to retrieve server feature configuration

Enforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
src/components/**/*.vue

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.vue: Use setup() function in Vue 3 Composition API
Destructure props using Vue 3.5 style in Vue components
Use ref/reactive for state management in Vue 3 Composition API
Implement computed() for derived state in Vue 3 Composition API
Use provide/inject for dependency injection in Vue components
Prefer emit/@event-name for state changes over other communication patterns
Use defineExpose only for imperative operations (such as form.validate(), modal.open())
Replace PrimeVue Dropdown component with Select
Replace PrimeVue OverlayPanel component with Popover
Replace PrimeVue Calendar component with DatePicker
Replace PrimeVue InputSwitch component with ToggleSwitch
Replace PrimeVue Sidebar component with Drawer
Replace PrimeVue Chips component with AutoComplete with multiple enabled
Replace PrimeVue TabMenu component with Tabs without panels
Replace PrimeVue Steps component with Stepper without panels
Replace PrimeVue InlineMessage component with Message
Extract complex conditionals to computed properties
Implement cleanup for async operations in Vue components
Use lifecycle hooks: onMounted, onUpdated in Vue 3 Composition API
Use Teleport/Suspense when needed for component rendering
Define proper props and emits definitions in Vue components

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
src/components/**/*.{vue,css}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,css}: Use Tailwind CSS only for styling (no custom CSS)
Use the correct tokens from style.css in the design system package

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
src/components/**/*.{vue,ts,js}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,ts,js}: Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners
Use useIntersectionObserver for visibility detection instead of custom scroll handlers
Use vue-i18n for ALL UI strings

Files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
🧠 Learnings (21)
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Sidebar component with Drawer

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue OverlayPanel component with Popover

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/layout/PropertiesAccordionItem.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Steps component with Stepper without panels

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue TabMenu component with Tabs without panels

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue InputSwitch component with ToggleSwitch

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.vue : Never use `:class="[]"` to merge class names - always use `import { cn } from '@/utils/tailwindUtil'` for class merging in Vue templates

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,css} : Use the correct tokens from style.css in the design system package

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Follow Vue 3 style guide and naming conventions

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Use es-toolkit for utility functions instead of other utility libraries

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Follow Vue 3 style guide and naming conventions

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:48:23.088Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Applies to **/*.{ts,tsx,js,vue} : Organize imports by sorting and grouping by plugin, and run `pnpm format` before committing

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/{components,composables}/**/*.{ts,tsx,vue} : Use vue-i18n for ALL user-facing strings by adding them to `src/locales/en/main.json`

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{vue,ts,tsx} : Follow Vue 3 composition API style guide

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-12-04T21:43:49.343Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/rightSidePanel/parameters/TabParameters.vue:10-0
Timestamp: 2025-12-04T21:43:49.343Z
Learning: Vue 3.5+ supports reactive props destructure in <script setup>. Destructuring props directly (e.g., `const { nodes } = defineProps<{ nodes: LGraphNode[] }>()`) maintains reactivity through compiler transformation. This is the recommended modern approach and does not require using `props.x` or `toRef`/`toRefs`.

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.{vue,ts,tsx} : Leverage VueUse functions for performance-enhancing utilities

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.{vue,ts} : Leverage VueUse functions for performance-enhancing styles

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{ts,tsx,vue} : Use `const settingStore = useSettingStore()` and `settingStore.get('Comfy.SomeSetting')` to retrieve settings in TypeScript/Vue files

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Utilize provide/inject for dependency injection in Vue 3

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,ts,js} : Use vue-i18n for ALL UI strings

Applied to files:

  • src/components/rightSidePanel/parameters/SectionWidgets.vue
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: setup
  • GitHub Check: test
  • GitHub Check: lint-and-format
  • GitHub Check: collect
🔇 Additional comments (3)
src/locales/en/main.json (2)

2269-2271: Localization keys properly integrated into Properties Panel components.

All three keys (inputsNone, inputsNoneTooltip, nodeState) are correctly wired up and actively used via vue-i18n in the rightSidePanel components:

  • inputsNone referenced in SectionWidgets.vue
  • inputsNoneTooltip referenced in PropertiesAccordionItem.vue
  • nodeState referenced in TabSettings.vue

Integration is complete and follows vue-i18n conventions.


2260-2260: No action needed. The pipe-separated pluralization format is the standard syntax for vue-i18n and is implemented correctly in your project. The component (RightSidePanel.vue, line 52) properly calls t('rightSidePanel.title', { count: selectionCount.value }), which correctly interpolates the {count} placeholder using vue-i18n's built-in pluralization handling.

Likely an incorrect or invalid review comment.

src/components/rightSidePanel/layout/PropertiesAccordionItem.vue (1)

2-2: Align cn import with @comfyorg/tailwind-utils instead of shim

This new component is introducing a fresh dependency on the @/utils/tailwindUtil shim, while the ongoing migration in this repo is to remove that shim and import cn directly from @comfyorg/tailwind-utils. To avoid backsliding and keep the migration surface small, wire this directly to the package:

-import { cn } from '@/utils/tailwindUtil'
+import { cn } from '@comfyorg/tailwind-utils'

The rest of the collapse/tooltip logic looks good.

⛔ Skipped due to learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.vue : Never use `:class="[]"` to merge class names - always use `import { cn } from '@/utils/tailwindUtil'` for class merging in Vue templates
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7177
File: src/platform/assets/components/UploadModelFooter.vue:72-78
Timestamp: 2025-12-05T06:11:09.374Z
Learning: For the ComfyUI_frontend repository, avoid suggesting comments that would be redundant when the code is already self-explanatory through descriptive naming (e.g., filenames, prop names, aria-labels). The project prefers clean code without unnecessary documentation comments.
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Implement proper props and emits definitions in Vue components
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue OverlayPanel component with Popover
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{vue,ts,tsx} : Follow Vue 3 composition API style guide
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Define proper props and emits definitions in Vue components
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Implement proper props and emits definitions
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7084
File: src/renderer/extensions/vueNodes/components/SlotConnectionDot.vue:23-26
Timestamp: 2025-12-01T23:42:30.894Z
Learning: In the ComfyUI frontend codebase, Tailwind CSS is configured with Preflight enabled (default), which automatically provides `content: ''` for pseudo-elements when using `after:` or `before:` variants - no need to explicitly add `after:content-['']`.
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Implement responsive design with Tailwind CSS
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use Tailwind CSS for styling
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use Tailwind CSS for styling Vue components
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,css} : Use Tailwind CSS only for styling (no custom CSS)

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

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a5675d3 and d8d096d.

📒 Files selected for processing (1)
  • src/components/rightSidePanel/layout/SidePanelSearch.vue (3 hunks)
🧰 Additional context used
📓 Path-based instructions (15)
**/*.vue

📄 CodeRabbit inference engine (.cursorrules)

**/*.vue: Use setup() function for component logic in Vue 3 Composition API
Utilize ref and reactive for reactive state in Vue 3
Implement computed properties with computed() function
Use watch and watchEffect for side effects in Vue 3
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection in Vue 3
Use Vue 3.5 style of default prop declaration with defineProps()
Organize Vue components in <script> <style> order
Use Tailwind CSS for styling Vue components
Implement responsive design with Tailwind CSS
Do not use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage). Use replacements: Select, Popover, DatePicker, ToggleSwitch, Drawer, AutoComplete, Tabs, Stepper, Message respectively
Implement proper props and emits definitions in Vue components
Utilize Vue 3's Teleport component when needed
Use Suspense for async components in Vue 3
Follow Vue 3 style guide and naming conventions
Never use deprecated PrimeVue components (Dropdown, OverlayPanel, Calendar, InputSwitch, Sidebar, Chips, TabMenu, Steps, InlineMessage)

Never use :class="[]" to merge class names - always use import { cn } from '@/utils/tailwindUtil' for class merging in Vue templates

**/*.vue: Use TypeScript with Vue 3 Single File Components (.vue files)
Name Vue components in PascalCase (e.g., MenuHamburger.vue)

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities
Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
**/*.{ts,tsx,js,vue}

📄 CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in .prettierrc
Organize imports by sorting and grouping by plugin, and run pnpm format before committing

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/*.vue

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.vue: Use the Vue 3 Composition API instead of the Options API when writing Vue components (exception: when overriding or extending PrimeVue components for compatibility)
Use setup() function for component logic
Utilize ref and reactive for reactive state
Implement computed properties with computed()
Use watch and watchEffect for side effects
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection
Use vue 3.5 style of default prop declaration
Use Tailwind CSS for styling
Implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Follow Vue 3 style guide and naming conventions

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
**/*.{ts,tsx,js,jsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

Use camelCase for variable and setting names in TypeScript/Vue files

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
**/*.{vue,html}

📄 CodeRabbit inference engine (CLAUDE.md)

Never use dark: or dark-theme: Tailwind variants - instead use semantic values from style.css theme, e.g. bg-node-component-surface

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,vue}: Use const settingStore = useSettingStore() and settingStore.get('Comfy.SomeSetting') to retrieve settings in TypeScript/Vue files
Use await settingStore.set('Comfy.SomeSetting', newValue) to update settings in TypeScript/Vue files
Check server capabilities using api.serverSupportsFeature('feature_name') before using enhanced features
Use api.getServerFeature('config_name', defaultValue) to retrieve server feature configuration

Enforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/components/**/*.vue

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.vue: Use setup() function in Vue 3 Composition API
Destructure props using Vue 3.5 style in Vue components
Use ref/reactive for state management in Vue 3 Composition API
Implement computed() for derived state in Vue 3 Composition API
Use provide/inject for dependency injection in Vue components
Prefer emit/@event-name for state changes over other communication patterns
Use defineExpose only for imperative operations (such as form.validate(), modal.open())
Replace PrimeVue Dropdown component with Select
Replace PrimeVue OverlayPanel component with Popover
Replace PrimeVue Calendar component with DatePicker
Replace PrimeVue InputSwitch component with ToggleSwitch
Replace PrimeVue Sidebar component with Drawer
Replace PrimeVue Chips component with AutoComplete with multiple enabled
Replace PrimeVue TabMenu component with Tabs without panels
Replace PrimeVue Steps component with Stepper without panels
Replace PrimeVue InlineMessage component with Message
Extract complex conditionals to computed properties
Implement cleanup for async operations in Vue components
Use lifecycle hooks: onMounted, onUpdated in Vue 3 Composition API
Use Teleport/Suspense when needed for component rendering
Define proper props and emits definitions in Vue components

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/components/**/*.{vue,css}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,css}: Use Tailwind CSS only for styling (no custom CSS)
Use the correct tokens from style.css in the design system package

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
src/components/**/*.{vue,ts,js}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,ts,js}: Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners
Use useIntersectionObserver for visibility detection instead of custom scroll handlers
Use vue-i18n for ALL UI strings

Files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
🧠 Learnings (15)
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use Vue 3.5 style of default prop declaration with defineProps<T>()

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-12-04T21:43:49.343Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/rightSidePanel/parameters/TabParameters.vue:10-0
Timestamp: 2025-12-04T21:43:49.343Z
Learning: Vue 3.5+ supports reactive props destructure in <script setup>. Destructuring props directly (e.g., `const { nodes } = defineProps<{ nodes: LGraphNode[] }>()`) maintains reactivity through compiler transformation. This is the recommended modern approach and does not require using `props.x` or `toRef`/`toRefs`.

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Destructure props using Vue 3.5 style in Vue components

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Utilize ref and reactive for reactive state in Vue 3

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-12-05T08:52:50.780Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/rightSidePanel/parameters/SectionWidgets.vue:41-49
Timestamp: 2025-12-05T08:52:50.780Z
Learning: In Vue 3.4+ SFCs with a build step, kebab-case prop shorthand (e.g., `:is-empty`) automatically resolves to the corresponding camelCase variable in scope (e.g., `isEmpty`). This is valid syntax combining same-name shorthand with automatic kebab-case-to-camelCase conversion and should not be flagged as an error.

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use vue 3.5 style of default prop declaration

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize ref and reactive for reactive state

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Implement proper props and emits definitions

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{vue,ts,tsx} : Follow Vue 3 composition API style guide

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use ref/reactive for state management in Vue 3 Composition API

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.{vue,ts,tsx} : Leverage VueUse functions for performance-enhancing utilities

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:46:52.279Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursorrules:0-0
Timestamp: 2025-11-24T19:46:52.279Z
Learning: Applies to **/*.vue : Use watch and watchEffect for side effects in Vue 3

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use setup() function in Vue 3 Composition API

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.{vue,ts} : Leverage VueUse functions for performance-enhancing styles

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
📚 Learning: 2025-11-24T19:47:14.779Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:14.779Z
Learning: Applies to **/*.{ts,tsx,vue} : Use `const settingStore = useSettingStore()` and `settingStore.get('Comfy.SomeSetting')` to retrieve settings in TypeScript/Vue files

Applied to files:

  • src/components/rightSidePanel/layout/SidePanelSearch.vue
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: deploy-and-comment
  • GitHub Check: setup
  • GitHub Check: test
  • GitHub Check: collect
  • GitHub Check: lint-and-format
🔇 Additional comments (2)
src/components/rightSidePanel/layout/SidePanelSearch.vue (2)

51-55: Styling and i18n usage in the template look consistent.

Using cn() for class merging, the updated design tokens (bg-secondary-background, focus ring class, etc.), and $t('g.searchPlaceholder') for the placeholder all align with the Tailwind + vue-i18n guidelines. I don’t see any issues in these template changes.

Also applies to: 71-72


3-4: The reactive props destructuring with optional MaybeRefOrGetter is correct as-is.

The pattern of destructuring an optional prop as updateKey?: MaybeRefOrGetter<unknown> and passing it directly to toValue() is correct and aligns with how Vue 3.5 handles optional ref-like props. This exact pattern is already used elsewhere in the codebase (e.g., ConfirmBody.vue), where promptText?: MaybeRefOrGetter<string> is passed directly to toValue() without guards. Vue's type system handles this correctly—toValue() is designed to work with optional MaybeRefOrGetter values and safely returns the unwrapped value or undefined when appropriate.

Likely an incorrect or invalid review comment.

Comment on lines +19 to 24
const debouncedSearchQuery = refDebounced(searchQuery, 100, {
maxWait: 100
})
watch(searchQuery, (value) => {
isQuerying.value = value !== debouncedSearchQuery.value
})
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

🧩 Analysis chain

🏁 Script executed:

cd src/components/rightSidePanel/layout && wc -l SidePanelSearch.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 92


🏁 Script executed:

cat -n src/components/rightSidePanel/layout/SidePanelSearch.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2480


🏁 Script executed:

rg -n "catch|error" src/components/rightSidePanel/layout/SidePanelSearch.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

rg -A5 -B5 "searcher" src/components/rightSidePanel/layout/ | head -60

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1966


🏁 Script executed:

rg "Implement proper error handling" . --type md | head -10

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 119


Add explicit error handling to searcher promise and improve isQuerying lifecycle tracking.

The current implementation has two related issues:

  1. Missing error handler: The searcher promise (line 37) only has .finally() and no .catch(), which means errors will surface as unhandled promise rejections. This violates the error handling requirement in the coding guidelines.

  2. Incomplete loading state: isQuerying is set true based on searchQuery vs debouncedSearchQuery inequality (lines 22–24), but set false only when searcher completes. If searcher takes significant time, the spinner may appear to settle before the actual request finishes, providing inaccurate feedback.

Minimal fix for error handling:

-    void searcher(debouncedSearchQuery.value, (cb) => (cleanupFn = cb)).finally(
-      () => {
-        if (!isCleanup) isQuerying.value = false
-      }
-    )
+    void searcher(debouncedSearchQuery.value, (cb) => (cleanupFn = cb))
+      .catch((error) => {
+        console.error('[SidePanelSearch] searcher failed', error)
+      })
+      .finally(() => {
+        if (!isCleanup) isQuerying.value = false
+      })

For better loading state alignment, consider setting isQuerying.value = true immediately before invoking searcher and relying solely on the finally block to reset it, decoupling the spinner from the debounce timing.

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In src/components/rightSidePanel/layout/SidePanelSearch.vue around lines 19 to
24, the debounced watch currently toggles isQuerying by comparing searchQuery
and debouncedSearchQuery and the downstream searcher promise lacks error
handling; change the logic to set isQuerying.value = true immediately before
calling the searcher (remove or stop relying on the searchQuery vs
debouncedSearchQuery inequality to drive loading state) and ensure the searcher
promise has a .catch(...) that routes errors to your logger/error handler, while
keeping the existing .finally(...) to reset isQuerying.value = false so the
spinner reflects the actual request lifecycle.

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.

6 participants