- Move layout system to renderer/core/layout/
- Store, operations, adapters, and sync modules organized clearly
- Merged layoutTypes.ts and layoutOperations.ts into single types.ts
- Move canvas rendering to renderer/core/canvas/
- LiteGraph-specific code in litegraph/ subdirectory
- PathRenderer at canvas level
- Move spatial indexing to renderer/core/spatial/
- Move Vue node composables to renderer/extensions/vue-nodes/
- Update all import paths throughout codebase
- Apply consistent naming (renderer vs rendering)
This establishes clearer separation between core rendering concerns
and optional extensions, making the architecture more maintainable.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: Claude <noreply@anthropic.com>
* feat: Implement CRDT-based layout system for Vue nodes
Major refactor to solve snap-back issues and create single source of truth for node positions:
- Add Yjs-based CRDT layout store for conflict-free position management
- Implement layout mutations service with clean API
- Create Vue composables for layout access and node dragging
- Add one-way sync from layout store to LiteGraph
- Disable LiteGraph dragging when Vue nodes mode is enabled
- Add z-index management with bring-to-front on node interaction
- Add comprehensive TypeScript types for layout system
- Include unit tests for layout store operations
- Update documentation to reflect CRDT architecture
This provides a solid foundation for both single-user performance and future real-time collaboration features.
Co-Authored-By: Claude <noreply@anthropic.com>
* style: Apply linter fixes to layout system
* fix: Remove unnecessary README files and revert services README
- Remove unnecessary types/README.md file
- Revert unrelated changes to services/README.md
- Keep only relevant documentation for the layout system implementation
These were issues identified during PR review that needed to be addressed.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: Clean up layout store and implement proper CRDT operations
- Created dedicated layoutOperations.ts with production-grade CRDT interfaces
- Integrated existing QuadTree spatial index instead of simple cache
- Split composables into separate files (useLayout, useNodeLayout, useLayoutSync)
- Cleaned up operation handlers using specific types instead of Extract
- Added proper operation interfaces with type guards and extensibility
- Updated all type references to use new operation structure
The layout store now properly uses the existing QuadTree infrastructure for
efficient spatial queries and follows CRDT best practices with well-defined
operation interfaces.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: Extract services and split composables for better organization
- Created SpatialIndexManager to handle QuadTree operations separately
- Added LayoutAdapter interface for CRDT abstraction (Yjs, mock implementations)
- Split GraphNodeManager into focused composables:
- useNodeWidgets: Widget state and callback management
- useNodeChangeDetection: RAF-based geometry change detection
- useNodeState: Node visibility and reactive state management
- Extracted constants for magic numbers and configuration values
- Updated layout store to use SpatialIndexManager and constants
This improves code organization, testability, and makes it easier to swap
CRDT implementations or mock services for testing.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Add node slots to layout tree
* Revert "Add node slots to layout tree"
This reverts commit 460493a620.
* Remove slots from layoutTypes
* Totally not scuffed renderer and adapter
* Revert "Totally not scuffed renderer and adapter"
This reverts commit 2b9d83efb8.
* Revert "Remove slots from layoutTypes"
This reverts commit 18f78ff786.
* Reapply "Add node slots to layout tree"
This reverts commit 236fecb549.
* Revert "Add node slots to layout tree"
This reverts commit 460493a620.
* docs: Replace architecture docs with comprehensive ADR
- Add ADR-0002 for CRDT-based layout system decision
- Follow established ADR template with persuasive reasoning
- Include performance benefits, collaboration readiness, and architectural advantages
- Update ADR index
* Add node slots to layout tree
* Revert "Add node slots to layout tree"
This reverts commit 460493a620.
* Remove slots from layoutTypes
* Totally not scuffed renderer and adapter
* Remove unused methods in LGLA
* Extract slot position calculations to shared utility
- Create slotCalculations.ts utility for centralized slot position logic
- Update LGraphNode to delegate to helper while maintaining compatibility
- Modify LitegraphLinkAdapter to use layout tree positions when available
- Enable link rendering to use layout system coordinates instead of litegraph positions
This allows the layout tree to control link rendering positions, enabling proper
synchronization between Vue components and canvas rendering.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* [fix] Restore original link rendering behavior after refactor
This commit fixes several rendering discrepancies introduced during the link rendering refactor to ensure exact parity with the original litegraph implementation:
Path Shape Fixes:
- STRAIGHT_LINK: Now correctly applies l=10 offset to create innerA/innerB points and uses midX=(innerA.x+innerB.x)*0.5 for elbow placement, matching the original 6-segment path
- LINEAR_LINK: Restored 4-point path with l=15 directional offsets (start → innerA → innerB → end)
Arrow Rendering:
- computeConnectionPoint: Now always uses bezier math with 0.25 factor spline offsets regardless of render mode, ensuring arrow positions match original
- Arrow positions: Fixed to render at 0.25 and 0.75 positions along the path
- Arrow gating: Moved scale>=0.6 and highQuality checks to adapter layer to maintain PathRenderer purity
- Arrow shape: Restored original triangle dimensions (-5,-3) to (0,+7) to (+5,-3)
Center Marker:
- Fixed 'None' option: Center marker now correctly hidden when LinkMarkerShape.None is selected
- Center point calculation: Updated for all render modes to match original positions
- STRAIGHT_LINK center: Uses midX and average of innerA/innerB y-coordinates
- LINEAR_LINK center: Uses midpoint between innerA and innerB control points
These fixes ensure backward compatibility while maintaining the clean separation between the pure PathRenderer and litegraph-specific LitegraphLinkAdapter.
Fixes #Issue-Number
---------
Co-authored-by: bymyself <cbyrne@comfy.org>
Co-authored-by: Claude <noreply@anthropic.com>
- SimplifiedWidget interface for Vue-based node widgets
- widgetPropFilter utility with component-specific exclusion lists
- Removes DOM manipulation and positioning concerns
- Provides clean API for value binding and prop filtering
* feat: input ordered nodes
* fix: ensure node input order upon creation using input_order
* refactor: back to the original state of migrations.ts
* refactor: remove console.logs
* test: fix widget ordering tests
* fix: any types
* [fix] resolve group node execution error when connecting to external nodes
Fixed ExecutableGroupNodeChildDTO.resolveInput to properly handle connections from group node children to external nodes. The method now tries to find nodes by their full ID first (for external nodes) before falling back to the shortened ID (for internal group nodes).
Added comprehensive unit tests to prevent regression.
* [feat] Add error check for unsupported group nodes inside subgraphs
Added validation to detect when group node children are executing within subgraph contexts (execution ID has >2 segments) and provide clear error message directing users to convert to subgraphs instead.
Includes comprehensive test coverage for the new validation.
* Restructures the application menu
- rename Workflow to File
- move new & template items to top level
- add View menu and related sub items
Commands
- add "active" state getter shown as checkmark in the menu
Node side panel
- add refresh node defs
- change reset view icon
Help center
- change to use store for visibility
Fixes
- Fix bug with mouse down where if you drag mouse out, mouse up wasn't caught
- Fix issue with canvas info setting not triggering a redraw on change
* Fix missing translation warnings
* Add separator under new
* tidy
* Update locales [skip ci]
* fix some tests
* fix
* Hide icon if there is an active state within the menu item group
* Update locales [skip ci]
* Fix tests
* Implement feedback
- Remove queue, node lib, model lib, workflows, manager, help center
- Add minimap, link visibility
* Update locales [skip ci]
* Add plus icon on "New" menu item
* Update locales [skip ci]
* Fix test
* Fix translations
* Update locales [skip ci]
* Update locales [skip ci]
---------
Co-authored-by: github-actions <github-actions@github.com>
- Updated all imports from '@comfyorg/litegraph' to '@/lib/litegraph/src/'
- Replaced deep dist imports with direct source paths
- Updated CSS import in main.ts
- All imports now use the @ alias consistently