Skip to content

Conversation

@DrJKL
Copy link
Contributor

@DrJKL DrJKL commented Dec 3, 2025

Summary

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

Still to-do

  • Bi-directionality in values

┆Issue is synchronized with this Notion page by Unito

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 3, 2025

📝 Walkthrough

Walkthrough

Centralizes panel state via workspace and right-side panel stores, reworks the canvas splitter overlay and gutter handling, types and refactors the right-side panel (editable titles, multi-node support), unifies widget expansion logic, updates related UI components and tests, and adds PropertiesAccordionItem and properties-panel tests.

Changes

Cohort / File(s) Summary
Splitter & Overlay
src/components/LiteGraphCanvasSplitterOverlay.vue
Replace root with full-size absolute overlay, remove legacy gutter helpers/CSS, simplify gutter classes/visibility tied to workspace refs, add explicit onResizestart handler.
Top-level UI / Hamburger / Menu
src/components/MenuHamburger.vue, src/components/TopMenuSection.vue
Adjust hamburger positioning classes and remove scoped CSS; TopMenuSection moves to storeToRefs for right-side state, removes local toggle wrappers and calls store actions directly, simplifies button/icon bindings.
Workspace store wiring & panel visibility
src/components/LiteGraphCanvasSplitterOverlay.vue, src/components/TopMenuSection.vue, src/components/graph/selectionToolbox/InfoButton.vue
Add useWorkspaceStore + storeToRefs; derive focusMode, bottomPanelVisible, rightSidePanelVisible, unifiedWidth; gate panel rendering on these refs and use panel store actions directly.
Right-side panel core & store
src/components/rightSidePanel/RightSidePanel.vue, src/stores/workspace/rightSidePanelStore.ts
Add typed RightSidePanelTab (includes 'subgraph'), make isEditingSubgraph computed, narrow openPanel signature, remove setActiveTab, add typed tab list, EditableText title editing, tab wiring via store, add data-testid attributes.
Right-side panel layout primitives
src/components/rightSidePanel/layout/PropertiesAccordionItem.vue, src/components/rightSidePanel/layout/RightPanelSection.vue, src/components/rightSidePanel/layout/SidePanelSearch.vue
Add PropertiesAccordionItem (collapse model, isEmpty prop, label slot); remove legacy RightPanelSection file; refactor SidePanelSearch to destructure props, accept MaybeRefOrGetter updateKey, shorten debounce to 100ms, and use toValue handling.
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 uses whenever and destructured props; TabParameters adopts typed NodeWidgetsListList shape; SectionWidgets uses PropertiesAccordionItem and shouldExpand; TabSettings changes prop from node to nodes[] and applies updates across nodes.
Widget registry & node widgets
src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts, src/renderer/extensions/vueNodes/components/NodeWidgets.vue
Add exported shouldExpand(type: string) (internal EXPANDING_TYPES) and switch NodeWidgets.vue to use shouldExpand for grid row sizing.
Graph & MiniMap gating
src/components/graph/GraphCanvas.vue
Gate MiniMap rendering on betaMenuEnabled instead of showUI.
Localization
src/locales/en/main.json
Add rightSidePanel.title (pluralized form), inputsNone, inputsNoneTooltip; remove several legacy right-side 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
Add propertiesButton locator and ComfyPropertiesPanel fixture wiring, update selectors to [data-testid="properties-panel"], update nodeHelp selectors, and add properties-panel tests for open/title/search behavior.
Misc small UI tweaks & typing
src/components/graph/selectionToolbox/InfoButton.vue, src/components/MenuHamburger.vue, src/components/TopMenuSection.vue, src/components/tab/Tab.vue, src/components/tab/TabList.vue, src/components/tab/TabList.stories.ts
Remove local toggle wrappers, call store actions directly, update icon sizing/classes, simplify template bindings; introduce generics for Tab/TabList and update Story typing.

Sequence Diagram(s)

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

  User->>TopMenu: click properties/properties button
  TopMenu->>RightStore: openPanel('parameters') / togglePanel()
  RightStore->>Workspace: update activeTab (store update)
  RightStore-->>RightPanel: store change observed (activeTab/isEditingSubgraph)
  RightPanel->>Workspace: read selection/nodes refs, unifiedWidth, focusMode
  RightPanel-->>User: render panel (title, tabs, editable title input)
  alt MiniMap gating path
    Graph->>Workspace: read betaMenuEnabled
    Graph-->>User: render or hide MiniMap
  end
Loading

Possibly related PRs

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch drjkl/cleanup/sidebar

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 96e1c04 and e4acaeb.

📒 Files selected for processing (4)
  • src/components/rightSidePanel/RightSidePanel.vue (5 hunks)
  • src/components/tab/Tab.vue (1 hunks)
  • src/components/tab/TabList.stories.ts (1 hunks)
  • src/components/tab/TabList.vue (1 hunks)
🧰 Additional context used
📓 Path-based instructions (14)
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/tab/TabList.stories.ts
  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.vue
src/**/*.ts

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

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

Files:

  • src/components/tab/TabList.stories.ts
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

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

Files:

  • src/components/tab/TabList.stories.ts
  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.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/tab/TabList.stories.ts
  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/components/tab/TabList.stories.ts
  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.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/tab/TabList.stories.ts
  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.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/tab/TabList.stories.ts
  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.vue
**/*.ts

📄 CodeRabbit inference engine (AGENTS.md)

Use TypeScript exclusively; no new JavaScript code

Files:

  • src/components/tab/TabList.stories.ts
**/*.{ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,vue}: Use camelCase for variable and function names
Indent with 2 spaces (see .prettierrc)
Use single quotes for strings (see .prettierrc)
No trailing semicolons (see .prettierrc)
Maximum line width of 80 characters (see .prettierrc)
Sort and group imports by plugin (run pnpm format before committing)
Never use any type; use proper TypeScript types instead
Never use as any type assertions; fix the underlying type issue instead
Avoid code comments unless absolutely necessary; write expressive, self-documenting code instead
When writing new code, ask if there is a simpler way to introduce the same functionality; if yes, choose the simpler approach
Use refactoring to make complex code simpler
Use es-toolkit for utility functions
Use Vite for fast development and building
Implement proper error handling
Write tests for all changes, especially bug fixes to catch future regressions

Files:

  • src/components/tab/TabList.stories.ts
  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.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/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.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/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.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/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.vue
**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

**/*.vue: Use Vue 3 SFCs with Composition API only (use <script setup lang="ts">, not Options API)
Avoid using <style> blocks; use Tailwind 4 for all styling
Use defineProps with TypeScript style default declaration; do not use withDefaults or runtime props declaration
Prefer useModel over separately defining a prop and emit
Use computed instead of a ref and watch if possible
Avoid using ref if a prop would accomplish the design goals; avoid using computed if a ref or prop directly would work
Do not import Vue macros unnecessarily
Never use the dark: Tailwind variant; use semantic values from the style.css theme instead (e.g., bg-node-component-surface)
Never use :class="[]" to merge class names; always use cn() from @/utils/tailwindUtil (e.g., <div :class="cn('text-node-component-header-icon', hasError && 'text-danger')" />)
Leverage VueUse functions for performance-enhancing styles
Avoid new usage of PrimeVue components
Use Vue 3 Teleport component when needed
Use Vue 3 Suspense for async components

Files:

  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.vue
**/components/**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

Name Vue components in PascalCase (e.g., MenuHamburger.vue)

Files:

  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.vue
🧠 Learnings (23)
📚 Learning: 2025-12-06T02:11:00.366Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/rightSidePanel/RightSidePanel.vue:174-180
Timestamp: 2025-12-06T02:11:00.366Z
Learning: PrimeVue components have poor TypeScript typing, so type assertions (like `as RightSidePanelTab`) may be necessary when handling emitted events or prop values from PrimeVue components like TabList.

Applied to files:

  • src/components/tab/TabList.stories.ts
  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.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/tab/TabList.stories.ts
  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Implement proper TypeScript types throughout the codebase

Applied to files:

  • src/components/tab/Tab.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/tab/TabList.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.vue : Use `defineProps` with TypeScript style default declaration; do not use `withDefaults` or runtime props declaration

Applied to files:

  • src/components/tab/Tab.vue
  • src/components/tab/TabList.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.{ts,vue} : Use refactoring to make complex code simpler

Applied to files:

  • src/components/tab/Tab.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/tab/Tab.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 : Use ref/reactive for state management in Vue 3 Composition API

Applied to files:

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

Applied to files:

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

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-12-05T20:35:28.330Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/locales/en/main.json:2257-2272
Timestamp: 2025-12-05T20:35:28.330Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, vue-i18n pluralization uses a two-parameter pattern: `t('key', { count: value })` where the `count` property in the interpolation object automatically triggers plural selection from pipe-separated locale strings (e.g., "no items | 1 item | {count} items"). This is the correct pattern used throughout the codebase, as validated by Playwright tests.

Applied to files:

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

Applied to files:

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

Applied to files:

  • src/components/rightSidePanel/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,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/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.{ts,vue} : Never use `as any` type assertions; fix the underlying type issue instead

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/**/*.{ts,tsx} : Type assertions are an absolute last resort. In almost all cases, they are a crutch that leads to brittle code

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.{ts,vue} : Never use `any` type; use proper TypeScript types instead

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Avoid using ts-expect-error; use proper TypeScript types instead

Applied to files:

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

Applied to files:

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

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.vue : Use `computed` instead of a `ref` and `watch` if possible

Applied to files:

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

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.vue : Use Vue 3 SFCs with Composition API only (use `<script setup lang="ts">`, not Options API)

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.vue : Prefer `useModel` over separately defining a prop and emit

Applied to files:

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

7-16: Generic model typing for TabList looks solid

Using generic="T extends string = string" with defineModel<T> and typing the tabs-update callback as (value: T) => void cleanly wires TabList to consumers like RightSidePanelTab while keeping a sane default (string). This is a good, typesafe refactor with no behavioral risk.

src/components/tab/Tab.vue (1)

15-28: Typed tab value wiring matches TabList generics

The generic T extends string for value, plus typed tabs-value/tabs-update injections, lines up cleanly with the generic TabList model. Optional chaining on currentValue and updateValue keeps standalone usage safe. No issues here.

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

32-54: Selection filtering, pluralized title, and typed tabs/watchEffect look consistent

  • selectedNodes filtering via isLGraphNode and isSingleNodeSelected/selectedNode keeps node vs. non-node selection handling clear.
  • panelTitle using t('rightSidePanel.title', { count: selectionCount.value }) matches the repo’s { count } pluralization pattern from main.json. Based on learnings, this is the correct usage.
  • RightSidePanelTabList and the typed tabs computed (with RightSidePanelTab values) tighten the contract with rightSidePanelStore.openPanel.
  • The watchEffect that normalizes activeTab (while allowing 'subgraph' only for subgraph nodes) is a good safety net and avoids invalid states.

No changes requested here.

Also applies to: 59-85, 87-95


97-116: Title editing workflow is safer and better scoped

  • isEditing is now explicit state, reset on both edit and cancel.
  • handleTitleEdit trims input, bails on empty, resolves the current selectedNode via toValue, and compares against node.title instead of derived labels, so intentional edits are preserved while avoiding redundant writes.
  • Marking canvasStore.canvas dirty after a successful title change is the right integration point.
  • Restricting EditableText usage to isSingleNodeSelected and falling back to plain panelTitle for other cases keeps behavior predictable.

This is a solid, well-contained improvement.

Also applies to: 128-139


173-181: Tab navigation wiring and no-selection content branching look correct

  • TabList is now driven by :model-value="activeTab" and emits RightSidePanelTab into rightSidePanelStore.openPanel, aligning with the new generic tab typing.
  • Guarding the <nav> with v-if="hasSelection" and the content area with v-if="!hasSelection" / v-else-if="isSubgraphNode && isEditingSubgraph" / else tabs cleanly separates “no selection”, “subgraph edit”, and standard tabbed content.
  • Using $t('rightSidePanel.noSelection') for the empty state respects the vue‑i18n guideline for user‑facing strings.

No action needed here.

Also applies to: 197-205

src/components/tab/TabList.stories.ts (1)

6-12: No changes needed—GenericMeta pattern is working correctly

The GenericMeta override with ComponentExposed<C> is already functioning properly in this codebase. The component type is correctly inferred, StoryObj<typeof meta> properly handles args (as shown by the working modelValue prop), and TabList.vue's script-setup generic is compatible with this approach. No type-compatibility issues exist.


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, 02:27:42 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Dec 3, 2025

🎭 Playwright Test Results

⚠️ Tests passed with flaky tests

⏰ Completed at: 12/06/2025, 02:36:29 AM UTC

📈 Summary

  • Total Tests: 496
  • Passed: 483 ✅
  • Failed: 0
  • Flaky: 3 ⚠️
  • Skipped: 10 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 474 / ❌ 0 / ⚠️ 3 / ⏭️ 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 5b4aad6 to 96e1c04 Compare December 6, 2025 01:59
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

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

⚠️ Outside diff range comments (2)
src/components/rightSidePanel/layout/SidePanelSearch.vue (1)

3-45: Fix reactive tracking for updateKey in the search watcher

const updateKeyRef = toRef(() => toValue(updateKey)) does not properly track changes to updateKey. The toRef function with a getter callback doesn't reliably create a reactive reference that updates when the underlying MaybeRefOrGetter changes, so the watcher may not rerun when updateKey is updated.

Replace with computed to ensure changes to updateKey correctly retrigger the search:

- import { ref, toRef, toValue, watch } from 'vue'
+ import { computed, ref, toValue, watch } from 'vue'

 ...

-const updateKeyRef = toRef(() => toValue(updateKey))
+const updateKeyRef = computed(() => toValue(updateKey))

This keeps the debounce and loading logic intact while ensuring the watcher properly responds to updateKey changes.

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

176-210: Consider consolidating the color comparison logic.

The nodeColor getter has a complex flow with colorOption === false for mixed colors and colorOption == null for no-color detection. While functional, the loose equality on line 187 (colorOption == null) differs from the strict equality used elsewhere.

For consistency with the rest of the file, consider using strict equality:

-    if (colorOption == null || (!colorOption.bgcolor && !colorOption.color))
+    if (colorOption === null || (!colorOption.bgcolor && !colorOption.color))
♻️ Duplicate comments (5)
src/renderer/extensions/vueNodes/components/NodeWidgets.vue (1)

85-88: Centralized expansion logic in NodeWidgets looks correct

Importing shouldExpand from the widget registry and using shouldExpand(w.type) in gridTemplateRows cleanly delegates row sizing to a single shared predicate, keeps alias handling consistent, and removes local duplication. No issues from a typing or reactivity standpoint.

Also applies to: 196-202

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

200-208: shouldExpand implementation is type-safe and handles aliases correctly

Defining EXPANDING_TYPES as a typed const tuple and canonicalizing via getCanonicalType before includes gives a simple, type-safe expansion predicate that automatically supports aliases like 'TEXTAREA', 'multiline', 'progressText', and 'LOAD_3D'. This cleanly centralizes expansion behavior for all consumers. As per coding guidelines, TypeScript usage here is solid and avoids any.

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

56-58: Good move to a specific properties-panel selector; consider centralizing the locator

Switching all help assertions to [data-testid="properties-panel"] is an improvement over the old sidebar class and aligns with the “prefer specific selectors in browser tests” guidance. However, the same locator is now repeated across many tests in this file.

To reduce duplication and keep tests resilient to future DOM refactors, consider exposing a propertiesPanel (or helpPanel) locator on the ComfyPage fixture and using that here instead of inlining comfyPage.page.locator('[data-testid="properties-panel"]') everywhere. This keeps the selector definition in a single place while preserving the specificity you just introduced. Based on learnings, this also matches the browser_tests guidance around using shared fixtures/utilities.

Also applies to: 170-172, 202-204, 237-239, 287-289, 362-364, 404-406, 473-475, 498-500, 544-546

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

16-48: Add aria-expanded for accessibility.

The collapsible button should communicate its expanded/collapsed state to assistive technologies.

       <button
         v-tooltip="..."
         type="button"
+        :aria-expanded="!isCollapse && !isEmpty"
         :class="..."
         :disabled="isEmpty"
         @click="isCollapse = !isCollapse"
       >
src/components/rightSidePanel/RightSidePanel.vue (1)

143-160: Add accessible labeling and pressed state to subgraph toggle button.

The subgraph toggle button is icon-only and lacks an accessible name and pressed state. The close panel button (lines 161-170) correctly implements these attributes with aria-pressed and aria-label.

Apply this diff to add accessibility attributes:

 <IconButton
   v-if="isSubgraphNode"
   type="transparent"
   size="sm"
   :class="
     cn(
       'bg-secondary-background hover:bg-secondary-background-hover text-base-foreground',
       isEditingSubgraph && 'bg-secondary-background-selected'
     )
   "
+  :aria-pressed="isEditingSubgraph"
+  :aria-label="$t('rightSidePanel.toggleSubgraphEditing')"
   @click="
     rightSidePanelStore.openPanel(
       isEditingSubgraph ? 'parameters' : 'subgraph'
     )
   "
 >

Then add the translation key to src/locales/en/main.json:

"rightSidePanel": {
  "toggleSubgraphEditing": "Toggle subgraph editing"
}

As per coding guidelines, all UI components must be accessible, and all strings must use vue-i18n.

@DrJKL DrJKL disabled auto-merge December 6, 2025 05:00
@DrJKL DrJKL merged commit f74c176 into main Dec 6, 2025
28 checks passed
@DrJKL DrJKL deleted the drjkl/cleanup/sidebar branch December 6, 2025 05:33
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