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

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (1)
  • browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png is excluded by !**/*.png

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

📝 Walkthrough

Walkthrough

Centralizes workspace panel state via Pinia refs, refactors splitter overlay positioning and gutter handling, types right-side panel tabs and adds editable titles, centralizes widget expansion logic in widgetRegistry, converts many right-side panel components to multi-node support, and updates browser tests and fixtures to target the new properties panel.

Changes

Cohort / File(s) Summary
Splitter & Overlay
src/components/LiteGraphCanvasSplitterOverlay.vue
Rework overlay container to full-width/absolute positioning, remove legacy gutter helpers/CSS, add onResizestart handler, and simplify gutter classes/visibility logic tied to workspace refs.
Top-level UI / Hamburger
src/components/MenuHamburger.vue, src/components/TopMenuSection.vue
Adjust positioning classes for hamburger, remove scoped CSS; TopMenuSection moves to storeToRefs for right-side panel state and calls store actions directly, simplify button bindings and icon sizing.
Workspace Store & Panel Visibility
src/components/LiteGraphCanvasSplitterOverlay.vue, src/components/TopMenuSection.vue, src/components/graph/selectionToolbox/InfoButton.vue
Replace direct local state with useWorkspaceStore + storeToRefs (focusMode, bottomPanelVisible, rightSidePanelVisible, unifiedWidth), gate panel rendering on these refs, and invoke panel store actions directly.
Right-Side Panel Core & Store
src/components/rightSidePanel/RightSidePanel.vue, src/stores/workspace/rightSidePanelStore.ts
Add typed RightSidePanelTab, make isEditingSubgraph computed, narrow openPanel signature, remove setActiveTab; RightSidePanel gains typed tab list, EditableText title editing, tab wiring via store, and data-testid attributes.
Right-Side Panel — Layout
src/components/rightSidePanel/layout/PropertiesAccordionItem.vue, src/components/rightSidePanel/layout/RightPanelSection.vue, src/components/rightSidePanel/layout/SidePanelSearch.vue
Add PropertiesAccordionItem (collapse model, label slot, isEmpty prop); remove legacy RightPanelSection; refactor SidePanelSearch to accept MaybeRefOrGetter updateKey, shorten debounce to 100ms, and update styling/logic.
Right-Side Panel — Tabs & Content
src/components/rightSidePanel/info/TabInfo.vue, src/components/rightSidePanel/parameters/TabParameters.vue, src/components/rightSidePanel/parameters/SectionWidgets.vue, src/components/rightSidePanel/settings/TabSettings.vue
TabInfo switches to whenever; TabParameters adopts typed NodeWidgetsList data shape; SectionWidgets uses PropertiesAccordionItem and shouldExpand; TabSettings changes prop from node to nodes[] and applies getters/setters across nodes.
Widget Registry & Node Widgets
src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts, src/renderer/extensions/vueNodes/components/NodeWidgets.vue
Introduce export function shouldExpand(type: string) with internal EXPANDING_TYPES; NodeWidgets.vue uses shouldExpand for layout decisions.
Graph & MiniMap
src/components/graph/GraphCanvas.vue
Gate MiniMap visibility on betaMenuEnabled instead of showUI.
Localization
src/locales/en/main.json
Replace several right-side panel keys with pluralized rightSidePanel.title, add inputsNone and inputsNoneTooltip, and remove legacy keys.
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
Update selectors to target data-testid="properties-panel", add propertiesButton locator and propertiesPanel fixture wiring, update nodeHelp selectors, and add a properties-panel test verifying open/title/search behavior.
Misc UI & Small Tweaks
src/components/graph/selectionToolbox/InfoButton.vue, src/components/MenuHamburger.vue, src/components/TopMenuSection.vue
Remove local toggle wrappers, replace toggle calls with store actions, adjust icon sizes/classes, and simplify template bindings.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant TopMenu as TopMenuSection
  participant Workspace as workspaceStore
  participant RightStore as rightSidePanelStore
  participant RightPanel as RightSidePanel

  User->>TopMenu: click "Toggle properties" button
  TopMenu->>Workspace: read storeToRefs (focusMode, rightSidePanelVisible)
  TopMenu->>RightStore: call openPanel('parameters') / togglePanel()
  RightStore->>Workspace: update activeTab / computed isEditingSubgraph (internal)
  RightStore-->>RightPanel: emit state change (activeTab, open)
  RightPanel->>Workspace: read nodes / selection refs (storeToRefs)
  RightPanel-->>User: render panel (title, tabs, editable fields)
Loading

Possibly related PRs

✨ 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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions
Copy link

github-actions bot commented Dec 3, 2025

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 12/06/2025, 12:44:21 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Dec 3, 2025

🎭 Playwright Test Results

Some tests failed

⏰ Completed at: 12/06/2025, 12:53:20 AM UTC

📈 Summary

  • Total Tests: 497
  • Passed: 485 ✅
  • Failed: 1 ❌
  • Flaky: 1 ⚠️
  • Skipped: 10 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 476 / ❌ 1 / ⚠️ 1 / ⏭️ 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 — 🔴 +370 B
  • Gzip: 3.38 MB baseline 3.38 MB — 🔴 +75 B
  • Brotli: 2.59 MB baseline 2.59 MB — 🔴 +182 B
  • Bundles: 97 current • 97 baseline • 37 added / 37 removed

Category Glance
Graph Workspace 🔴 +635 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 (174 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-BtO0AVT-.js (removed) 2.97 MB 🟢 -2.97 MB 🟢 -619 kB 🟢 -470 kB
assets/index-apXaYiEU.js (new) 2.97 MB 🔴 +2.97 MB 🔴 +619 kB 🔴 +470 kB
assets/index-ByJV8WMM.js (removed) 223 kB 🟢 -223 kB 🟢 -47.6 kB 🟢 -39.2 kB
assets/index-DUZGaeCZ.js (new) 223 kB 🔴 +223 kB 🔴 +47.6 kB 🔴 +39.2 kB
assets/index-CxhTh9i6.js (removed) 345 B 🟢 -345 B 🟢 -245 B 🟢 -237 B
assets/index-DteVUAGB.js (new) 345 B 🔴 +345 B 🔴 +243 B 🔴 +239 B

Status: 3 added / 3 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-ClyJAMW0.js (new) 975 kB 🔴 +975 kB 🔴 +189 kB 🔴 +144 kB
assets/GraphView-Dkf-fKjz.js (removed) 974 kB 🟢 -974 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-C44K3Ks5.js (new) 6.54 kB 🔴 +6.54 kB 🔴 +2.13 kB 🔴 +1.89 kB
assets/UserSelectView-CuqzXkzZ.js (removed) 6.54 kB 🟢 -6.54 kB 🟢 -2.14 kB 🟢 -1.9 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-BA0e1BUc.js (removed) 21.4 kB 🟢 -21.4 kB 🟢 -5.15 kB 🟢 -4.5 kB
assets/CreditsPanel-BKcFSTua.js (new) 21.4 kB 🔴 +21.4 kB 🔴 +5.14 kB 🔴 +4.49 kB
assets/KeybindingPanel-BWDlttTj.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -3.42 kB 🟢 -3.01 kB
assets/KeybindingPanel-NFhQnPAP.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +3.42 kB 🔴 +3.01 kB
assets/ExtensionPanel-CqqAuo-1.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.57 kB 🔴 +2.25 kB
assets/ExtensionPanel-D2S_TDkx.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.57 kB 🟢 -2.26 kB
assets/AboutPanel-Ch_iGMsd.js (new) 9.16 kB 🔴 +9.16 kB 🔴 +2.46 kB 🔴 +2.21 kB
assets/AboutPanel-DRp2MAE2.js (removed) 9.16 kB 🟢 -9.16 kB 🟢 -2.46 kB 🟢 -2.21 kB
assets/ServerConfigPanel-D14rXcwg.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +1.83 kB 🔴 +1.62 kB
assets/ServerConfigPanel-vsRkbHyH.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -1.83 kB 🟢 -1.63 kB
assets/UserPanel-CbeQBMzw.js (new) 6.23 kB 🔴 +6.23 kB 🔴 +1.72 kB 🔴 +1.51 kB
assets/UserPanel-QrhKzHFf.js (removed) 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 — 174 kB (baseline 174 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Load3D.vue_vue_type_script_setup_true_lang-BHwfArmr.js (new) 53.9 kB 🔴 +53.9 kB 🔴 +8.52 kB 🔴 +7.31 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-Do4X4IW7.js (removed) 53.9 kB 🟢 -53.9 kB 🟢 -8.52 kB 🟢 -7.32 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-CeWogjHu.js (new) 47.9 kB 🔴 +47.9 kB 🔴 +10.3 kB 🔴 +8.96 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-DSF1XjD6.js (removed) 47.9 kB 🟢 -47.9 kB 🟢 -10.3 kB 🟢 -8.96 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-CN2ua2FF.js (new) 43.8 kB 🔴 +43.8 kB 🔴 +9.78 kB 🔴 +8.54 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-DawPq69P.js (removed) 43.8 kB 🟢 -43.8 kB 🟢 -9.78 kB 🟢 -8.55 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-BD0r2alh.js (removed) 12.9 kB 🟢 -12.9 kB 🟢 -3.37 kB 🟢 -2.96 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-Dvkoyb9s.js (new) 12.9 kB 🔴 +12.9 kB 🔴 +3.37 kB 🔴 +2.97 kB
assets/ComfyQueueButton-BnPmdJjb.js (new) 8.44 kB 🔴 +8.44 kB 🔴 +2.47 kB 🔴 +2.21 kB
assets/ComfyQueueButton-DY4ocB4i.js (removed) 8.44 kB 🟢 -8.44 kB 🟢 -2.47 kB 🟢 -2.21 kB
assets/MediaTitle.vue_vue_type_script_setup_true_lang-4VMvb8AW.js (new) 897 B 🔴 +897 B 🔴 +503 B 🔴 +461 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-Deqj4GDA.js (removed) 897 B 🟢 -897 B 🟢 -503 B 🟢 -435 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-Bd0_Vn_S.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +1.83 kB 🔴 +1.58 kB
assets/keybindingService-Lq4M8Ype.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -1.84 kB 🟢 -1.58 kB
assets/audioService-BMloyafN.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -958 B 🟢 -821 B
assets/audioService-BWrMf8Na.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +959 B 🔴 +820 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-BiJB3wSH.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +651 B 🔴 +547 B
assets/audioUtils-DLEHD0JW.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -652 B 🟢 -548 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-CC_BzIM3.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -5.24 kB 🟢 -4.63 kB
assets/WidgetRecordAudio-COMnloJ_.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +5.23 kB 🔴 +4.63 kB
assets/AudioPreviewPlayer-2qdnWHPD.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.4 kB 🔴 +3.04 kB
assets/AudioPreviewPlayer-BVkL0Kw8.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.4 kB 🟢 -3.05 kB
assets/WidgetGalleria-B8dGAzPW.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.44 kB 🟢 -1.31 kB
assets/WidgetGalleria-CrxC0FHl.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.44 kB 🔴 +1.3 kB
assets/WidgetColorPicker-Ck1x1mIB.js (new) 3.41 kB 🔴 +3.41 kB 🔴 +1.37 kB 🔴 +1.23 kB
assets/WidgetColorPicker-CYDqSz4b.js (removed) 3.41 kB 🟢 -3.41 kB 🟢 -1.38 kB 🟢 -1.23 kB
assets/WidgetMarkdown-BShEUwDI.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.28 kB 🔴 +1.12 kB
assets/WidgetMarkdown-DlrnfAcS.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.28 kB 🟢 -1.12 kB
assets/WidgetTextarea-1plHVZMB.js (removed) 2.93 kB 🟢 -2.93 kB 🟢 -1.17 kB 🟢 -1.04 kB
assets/WidgetTextarea-gxotPTfg.js (new) 2.93 kB 🔴 +2.93 kB 🔴 +1.16 kB 🔴 +1.04 kB
assets/WidgetAudioUI-DtDRpokk.js (new) 2.85 kB 🔴 +2.85 kB 🔴 +1.16 kB 🔴 +1.05 kB
assets/WidgetAudioUI-SNKV68tn.js (removed) 2.85 kB 🟢 -2.85 kB 🟢 -1.17 kB 🟢 -1.05 kB
assets/WidgetInputText-4CXI1y-m.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -917 B 🟢 -850 B
assets/WidgetInputText-Bxe3RnX9.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +914 B 🔴 +846 B
assets/MediaImageBottom-Aziw4B0A.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +739 B 🔴 +651 B
assets/MediaImageBottom-BY2zNC01.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -740 B 🟢 -647 B
assets/MediaAudioBottom-15o7egax.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -740 B 🟢 -657 B
assets/MediaAudioBottom-BWfgIE8U.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +740 B 🔴 +657 B
assets/MediaVideoBottom-BY23Z6Jl.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -740 B 🟢 -656 B
assets/MediaVideoBottom-C0AuJPsY.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +738 B 🔴 +655 B
assets/Media3DBottom-BjbITrCm.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -733 B 🟢 -652 B
assets/Media3DBottom-BWo4k8LZ.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +730 B 🔴 +652 B
assets/Media3DTop-BB2ISQBK.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -763 B 🟢 -646 B
assets/Media3DTop-CmsglpK7.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +761 B 🔴 +652 B
assets/WidgetSelect-BX-IUzCK.js (new) 655 B 🔴 +655 B 🔴 +341 B 🔴 +289 B
assets/WidgetSelect-DKreg2SI.js (removed) 655 B 🟢 -655 B 🟢 -344 B 🟢 -291 B
assets/WidgetInputNumber-C4yJQyI5.js (removed) 595 B 🟢 -595 B 🟢 -329 B 🟢 -275 B
assets/WidgetInputNumber-DlTRlhXe.js (new) 595 B 🔴 +595 B 🔴 +326 B 🔴 +275 B
assets/Load3D-DQg3gx9O.js (removed) 424 B 🟢 -424 B 🟢 -268 B 🟢 -225 B
assets/Load3D-DUX3bknI.js (new) 424 B 🔴 +424 B 🔴 +267 B 🔴 +225 B
assets/WidgetLegacy-CUktil4B.js (new) 364 B 🔴 +364 B 🔴 +234 B 🔴 +192 B
assets/WidgetLegacy-DWw7XfLW.js (removed) 364 B 🟢 -364 B 🟢 -237 B 🟢 -194 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 dc1cb4f to 91fe4b6 Compare December 6, 2025 00:42
@DrJKL DrJKL added the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 6, 2025
@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 6, 2025
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