9.8 KiB
ComfyUI Second Sidebar Implementation Plan
Executive Summary
This plan outlines the implementation of a second sidebar on the right side of the ComfyUI interface, dedicated to in-depth node manipulation. The new sidebar will feature two primary tabs: one for modifying node parameters and another for node settings. This enhancement will complement the existing left sidebar while maintaining a clean separation of concerns.
Current Architecture Analysis
Existing Sidebar System
- Location:
src/components/sidebar/ - Core Component:
SideToolbar.vue- manages sidebar tabs and teleports content to.comfyui-body-leftor.comfyui-body-right - Tab System: Extensible architecture using
SidebarTabExtensiontype - State Management:
sidebarTabStore.tshandles tab registration and active state - Layout: Grid-based layout in
GraphView.vuewith dedicated slots for left/right sidebars
Node System Architecture
- Node Configuration: Currently done inline via widgets directly on nodes
- No Property Inspector: Unlike traditional node editors, ComfyUI lacks a dedicated property panel
- Widget System: Dynamic widgets created from backend node definitions
- Node Properties: Stored in
node.properties(behavioral settings) andnode.widgets_values(parameter values)
Phase 0: Remove Teleport Pattern and Sidebar Location Setting
Current Teleport Issues
The current sidebar implementation uses Vue's teleport feature, which creates architectural problems:
- Split component structure: Navigation is teleported but content isn't
- Complexity: Makes component relationships harder to understand
- Testing challenges: Teleported content is harder to test
- Unnecessary abstraction: Fixed-position sidebars don't need teleportation
Sidebar Location Setting Removal Strategy
Files Requiring Updates:
-
src/constants/coreSettings.ts
- Mark
Comfy.Sidebar.Locationas deprecated (don't delete)
- Mark
-
src/components/sidebar/SideToolbar.vue
- Remove teleport wrapper
- Remove
teleportTargetcomputed property - Render directly without position logic
-
src/components/toast/GlobalToast.vue
- Remove watcher for sidebar location setting
- Toast positioning only needs to consider graph canvas
-
src/components/sidebar/tabs/nodeLibrary/NodeTreeLeaf.vue
- Remove
sidebarLocationcomputed property - Always position preview to the right:
nodePreviewStyle.value.left = targetRect.right + 'px'
- Remove
-
src/components/sidebar/tabs/modelLibrary/ModelTreeLeaf.vue
- Same changes as NodeTreeLeaf.vue
-
src/components/sidebar/SidebarHelpCenterIcon.vue
- Remove position checking logic
- Always position help popup to the right
-
src/components/LiteGraphCanvasSplitterOverlay.vue
- Remove right-side splitter logic
- Only show left-side resize handle
-
src/views/GraphView.vue
- Render
SideToolbardirectly in.comfyui-body-left - No conditional rendering based on settings
- Render
Refactoring Principles
- No hardcoded 'left' values: Remove position checks entirely instead of replacing with constants
- Direct rendering: Components render in their natural DOM position
- Fixed positioning: UI elements always appear in predictable locations
- Simplified logic: Remove conditional code paths based on sidebar position
Implementation Strategy
Phase 1: Foundation Setup (Week 1)
1.1 Remove Teleport and Deprecate Setting
- Complete Phase 0 refactoring
- Update GraphView to render sidebars directly
- Test all affected components
1.2 Create Right Sidebar Infrastructure
New components:
src/components/rightSidebar/RightSideToolbar.vue- Main container for right sidebarsrc/components/rightSidebar/RightSidebarIcon.vue- Icon component for tabssrc/stores/workspace/rightSidebarTabStore.ts- State management for right sidebar
Key differences from left sidebar:
- No teleport - renders directly in
.comfyui-body-right - Different visual styling to distinguish from left sidebar
- Context-aware tabs that appear/disappear based on node selection
Phase 2: Node Inspector Tab (Week 2)
2.1 Node Parameter Editor
Component: src/components/rightSidebar/tabs/NodeParametersTab.vue
Features:
- Display all node widgets in a form layout
- Real-time synchronization with node widget values
- Support for all existing widget types (INT, FLOAT, STRING, COMBO, etc.)
- Collapsible sections for better organization
- Search/filter functionality for nodes with many parameters
Technical considerations:
- Use Vue's
watchto sync withapp.canvas.selected_nodes - Leverage existing widget constructors from
widgetStore - Implement two-way binding with node.widgets_values
- Handle multi-node selection gracefully
2.2 Widget Enhancement
Improvements over inline widgets:
- Better layout for complex widgets (e.g., image upload)
- Tooltips and help text from node definitions
- Validation feedback with clearer error messages
- Undo/redo support for parameter changes
Phase 3: Node Settings Tab (Week 3)
3.1 Node Settings Editor
Component: src/components/rightSidebar/tabs/NodeSettingsTab.vue
Features:
- Node appearance settings (color, shape, size)
- Execution settings (bypass, mute, always execute)
- Display options (show/hide outputs, compact mode)
- Node-specific properties (e.g., reroute node settings)
- Custom node metadata editing
Implementation:
- Create settings schema for common node properties
- Support for node-type-specific settings
- Batch editing for multiple selected nodes
- Preview changes before applying
Phase 4: Integration & Polish (Week 4)
4.1 State Synchronization
Key areas:
- Ensure parameter changes update graph immediately
- Sync with undo/redo system
- Handle node deletion/creation gracefully
- Coordinate with existing context menus
4.2 Responsive Design
Considerations:
- Sidebar resizing functionality
- Collapse/expand animations
- Mobile/tablet responsiveness
- Keyboard shortcuts for sidebar operations
4.3 Performance Optimization
Focus areas:
- Virtual scrolling for long parameter lists
- Debounced updates for real-time changes
- Lazy loading of complex widgets
- Memory management for multi-node selection
Technical Architecture
Component Hierarchy (No Teleport)
GraphView.vue
.comfyui-body-left
SideToolbar.vue
SidebarIcon.vue (per tab)
ExtensionSlot.vue
.comfyui-body-right
RightSideToolbar.vue
RightSidebarIcon.vue (Parameters)
RightSidebarIcon.vue (Settings)
ExtensionSlot.vue
NodeParametersTab.vue
NodeSettingsTab.vue
State Management
// rightSidebarTabStore.ts
interface RightSidebarState {
activeTab: string | null
selectedNodes: LGraphNode[]
parameterValues: Record<string, any>
settingsValues: Record<string, any>
}
Event Flow
- Node selection ’ Update rightSidebarTabStore.selectedNodes
- Parameter change ’ Update node.widgets_values ’ Trigger graph dirty
- Settings change ’ Update node.properties ’ Refresh node appearance
- Tab switch ’ Save current state ’ Load new tab state
Migration Path
Backward Compatibility
- Existing workflows continue to function unchanged
- All node operations remain available via context menus
- Extensions can opt-in to right sidebar integration
Extension API
interface RightSidebarTabExtension {
id: string
title: string
icon: string
nodeTypes?: string[] // Show tab only for specific node types
condition?: (nodes: LGraphNode[]) => boolean
render: () => VNode | (() => HTMLElement)
}
Testing Strategy
Unit Tests
- Widget value synchronization
- Multi-node selection handling
- Settings persistence
- Undo/redo integration
Component Tests
- Tab switching behavior
- Form validation
- Responsive layout
- Keyboard navigation
E2E Tests
- Complete parameter editing workflow
- Settings changes affecting node behavior
- Performance with 100+ nodes selected
- Extension integration
Accessibility Considerations
- ARIA labels for all interactive elements
- Keyboard navigation support
- Screen reader compatibility
- High contrast mode support
- Focus management for tab switches
Performance Targets
- Tab switch: < 100ms
- Parameter update: < 16ms (60fps)
- Initial load with 50 nodes: < 200ms
- Memory overhead: < 50MB for typical workflows
Risk Mitigation
Technical Risks
- Performance degradation with many nodes
- Mitigation: Virtual scrolling, pagination
- State synchronization bugs
- Mitigation: Comprehensive testing, clear data flow
- Extension compatibility
- Mitigation: Gradual rollout, extension API versioning
UX Risks
- Information overload
- Mitigation: Progressive disclosure, search/filter
- Workflow disruption
- Mitigation: Optional feature, preserve existing workflows
- Learning curve
- Mitigation: Intuitive design, inline help
Success Metrics
- User engagement: 80% of users use right sidebar within first week
- Performance: No regression in graph manipulation speed
- Stability: < 0.1% crash rate related to new features
- Adoption: 50% of extensions integrate within 3 months
Timeline
Week 0: Remove teleport pattern, deprecate location setting Week 1: Foundation setup Week 2: Node parameters tab implementation Week 3: Node settings tab implementation Week 4: Integration, testing, and polish Week 5: Beta release and feedback collection Week 6: Final adjustments and production release
Next Steps
- Execute Phase 0 (remove teleport and deprecate setting)
- Review and approve implementation plan
- Create detailed Figma design specifications
- Set up feature branch
feature/right-sidebar - Begin Phase 1 implementation
- Schedule weekly progress reviews