- Add 'none' direction to path renderer
- Map CENTER/NONE to 'none' in adapter
- Keep start-end offset intentional; end follows cursor exactly
- Preserve spline behavior and arrow rendering
Verified with typecheck; no visual changes outside dragging behavior.
* feat: enhance dragging functionality to support multiple selected nodes
* feat: enhance node selection handling to support drag state detection
* feat: enhance node selection handling to support drag state detection
* fix: update event trigger from pointer down to pointer up in LGraphNode tests
* Fix connection of primitives to subgraphNodes
* Fix loading and nested subgraphs with primitives
Medium hackyness, but this saves ~100 lines.
* Use improved type check
* Remove requirement for type assertion
* Add warning comment
---------
Co-authored-by: filtered <176114999+webfiltered@users.noreply.github.com>
* [release] Increment version to 1.27.3
* fix(i18n): use import attributes for JSON to support Node/Playwright in i18n workflow
* Revert "fix(i18n): use import attributes for JSON to support Node/Playwright in i18n workflow"
This reverts commit b525242c32.
---------
Co-authored-by: benceruleanlu <162923238+benceruleanlu@users.noreply.github.com>
Co-authored-by: Benjamin Lu <benjaminlu1107@gmail.com>
* fix(canvas): make graph canvas block-level to eliminate baseline gap
- Change <canvas id=graph-canvas> to display:block via Tailwind class
- Removes 1–5 px baseline offset between canvas and container
- Aligns canvas and TransformPane origins; fixes link/slot endpoint drift
No behavioral changes beyond layout origin alignment; no dependent CSS relies on inline/baseline.
* switch block to align-top
* Update test expectations [skip ci]
* Revert "Update test expectations [skip ci]"
This reverts commit ee0dfd4e0a.
* empty commit for ci
* Update test expectations [skip ci]
---------
Co-authored-by: github-actions <github-actions@github.com>
Add additional wait after closing the dialog to ensure all async operations
complete before continuing with the test. This prevents race conditions
where the dialog might not be fully closed when the test proceeds.
The test was failing intermittently because closeDialog() waits for the
dialog to be hidden, but there may be additional async state updates that
need to complete after the dialog closes.
Fixes flaky test in dialog.spec.ts:33
Previously, when toggling the mode of multiple nodes, each node would
have its state individually toggled. Now it enables mode if any node is
not currently set to that mode and only disables if all already match.
* feat: Auto-close LoadWorkflowWarning dialog when all missing nodes are installed
- Add computed property to check if all missing nodes are installed
- Watch for completion and automatically close dialog with 500ms delay
- Show success toast notification when installation completes
- Add translation key for success message
This improves UX by automatically dismissing the warning dialog once the user has successfully installed all missing nodes through the manager.
* fix: settimeout to nexttick
* [auto-fix] Apply ESLint and Prettier fixes
---------
Co-authored-by: GitHub Action <action@github.com>
* fix: Forward the scrolling events to the litegraph canvas.
* prior-art: Use the existing event forwarding logic from useCanvasInteractions (h/t Ben)
* fix: Get proper scaling from properties in the original event, fix browser zoom
* tests: Fix missing property on mock
* types: Cleanup type annotations in the test
* cleanup: Initialize the mocks in place.
* tests: extract createMockPointerEvent
* tests: extract createMockWheelEvent
* tests: extract createMockLGraphCanvas
* tests: Add additional assertion for stopPropagation
* tests: Comment pruning, test rename suggested by @arjansingh
* [feat] Improve UX for disabled node packs in Manager dialog
- Hide "Update All" button when only disabled packs have updates
- Add tooltip on "Update All" hover to indicate disabled nodes won't be updated
- Disable version selector and show tooltip for disabled node packs
- Filter updates to only show enabled packs in the update queue
- Add visual indicators (opacity, cursor) for disabled pack cards
- Add comprehensive test coverage for new functionality
This improves the user experience by clearly indicating which packs
can be updated and preventing confusion about disabled packs.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: missing nodes description added
* test: test code modified
---------
Co-authored-by: Claude <noreply@anthropic.com>
* [ci] ignore local browser tests files
this is where i have claude put its one off playwright scripts
* [feat] carve out path to call asset browser in combo widget
* [feat] use buttons on Model Loaders when Asset API setting is on
* tailwind: Migrate out of the js/ts config part 1
* tailwind: Migrate custom variant and utility
* Update test expectations [skip ci]
* tailwind: Use relative colors for alpha variants
* fix: Use the new numbered color tokens
---------
Co-authored-by: github-actions <github-actions@github.com>
- Add missing await for async getProperty call in selectionToolbox test
- Add timestamp to test username generation to prevent duplicate user conflicts
- Test now passes consistently without race conditions
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: Claude <noreply@anthropic.com>
* fix: update Claude PR Review workflow to use correct action parameters
- Changed 'direct_prompt' to 'prompt' (correct parameter name)
- Moved max_turns and timeout to claude_args parameter
- Changed allowed_tools to additional_permissions parameter
The workflow was failing silently because it was using invalid input parameters
that the claude-code-action doesn't recognize.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: pin claude-code-action to v1.0.6 to prevent future breakage
Using @main tag could cause unexpected breakage when the action updates.
Pinning to a specific version ensures stability.
* fix: apply review feedback - correct migration to v1.0 format
- Moved timeout-minutes to job level (not in claude_args)
- Changed additional_permissions to --allowedTools in claude_args
- Fixed tool specification format per migration guide
These changes follow the official v0.x to v1.0 migration guide exactly.
---------
Co-authored-by: Claude <noreply@anthropic.com>
* add component tests for slots
* use `for of` for better error report
* add runtime type check to make assertions valid
* add runtime type check to make assertions valid
* fix z-index on selection for vue nodes
* fix unused export
* refactor to DDD
* Use Tailwind utility for pointer events instead of inline style
Move pointer-events: auto from inline style to Tailwind class
pointer-events-auto as suggested in PR review.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Rename defaultSource to layoutSource parameter
Rename parameter in useNodeZIndex options interface for better
clarity as suggested in PR review.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Improve test mocking pattern with vi.mocked approach
Replace global mock object with per-test vi.mocked pattern
and proper Partial typing instead of as any, as suggested
in PR review.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* [auto-fix] Apply ESLint and Prettier fixes
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: GitHub Action <action@github.com>
* [fix] Consolidate Playwright workflow jobs to fix missing deployment links
The issue in PR #5298 was caused by missing deployment-info artifact
creation. The deploy-reports job was deploying to Cloudflare but wasn't
creating the deployment-info-* artifacts that comment-tests-completed
job expected to download.
This change consolidates the deployment and commenting into a single job,
eliminating the artifact dependency and ensuring links are always available.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: Split PR deployment workflow for forked vs non-forked repos
- Extract deployment logic to reusable script (scripts/cicd/pr-playwright-deploy-and-comment.sh)
- Non-forked PRs: Use direct pull_request event in test-ui.yaml (faster)
- Forked PRs: Use workflow_run in pr-playwright-deploy.yaml (handles permissions)
- Add starting comment for both forked and non-forked PRs
- Make Cloudflare tokens optional for starting status comments
* refactor: Simplify PR deployment workflow and script
- Consolidate workflow into single job with clearer structure
- Reduce script from 200+ to ~140 lines
- Simplify deployment retry logic and comment generation
- Remove redundant checks and unnecessary complexity
* fix: Add debugging and wrangler installation to deployment script
- Add debug output to identify missing reports
- Install wrangler if not available
- Show deployment attempts and failures
- Log available reports before deployment
* chore: Trigger CI to test deployment workflow
* fix: Fix browser artifact name mismatch in deployment script
- Use dot notation (0.5x) for artifact names as Playwright creates them
- Convert to dash notation (0-5x) for Cloudflare project names
- Properly handle browser name display in comments
* refactor: Convert deployment script to POSIX sh for better compatibility
- Replace bash arrays with space-separated strings
- Use while loops instead of bash-specific for syntax
- Remove bash-specific string manipulation features
- Replace local variables (not required in functions)
- Ensure compatibility with standard /bin/sh
* fix: Fix deployment script output to properly capture URLs
- Redirect debug messages to stderr
- Only output URL to stdout for proper capture
- This fixes the missing deployment links in PR comments
* fix: Add input validation to prevent command injection
- Validate PR number is numeric only
- Sanitize branch name at script start
- Validate status parameter values
- Use pre-sanitized branch throughout script
- Addresses high-severity security issue from PR review
* fix: Add null checks and logging to workflow condition
- Add explicit null checks for head_repository and repository
- Add debug logging to help diagnose workflow trigger issues
- Prevents potential failures from undefined repository objects
- Addresses medium-severity issue from PR review
* fix: Pin wrangler to major version 4 with error handling
- Pin wrangler to major version 4 (^4.0.0) for stability
- Add error handling if wrangler installation fails
- Return 'failed' status if installation fails
- Addresses dependency management issue from PR review
* perf: Implement parallel deployments to reduce CI time
- Deploy all browser reports in parallel using background processes
- Use temporary directory to collect deployment results
- Wait for all deployments to complete before generating comment
- Maintains result order for consistent output
- Significantly reduces deployment time from sequential to parallel execution
* fix: Use specific comment ID for updates instead of edit-last
- Use GitHub API to find exact comment ID
- Update specific comment by ID to avoid editing wrong comment
- Prevents race conditions if user posts between finding and editing
- More reliable comment updates
* fix(workflows/test-ui.yaml): change condition to always run deploy job for pull requests to ensure deployment consistency
* fix(workflows/test-ui.yaml): change condition to always run deploy job for pull requests to ensure deployment consistency
* fix(pr-playwright-deploy-and-comment.sh): remove npx prefix from wrangler command for consistency and simplicity
* fix(pr-playwright-deploy-and-comment.sh): remove npx prefix from wrangler command for consistency and simplicity
* Update scripts/cicd/pr-playwright-deploy-and-comment.sh
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix(pr-playwright-deploy-and-comment.sh): improve regex for URL extraction to include valid characters and ensure correct URL format
* chore(pr-playwright-deploy-and-comment.sh): move wrangler installation to the beginning of the script to avoid redundancy and improve efficiency
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* feat: add dynamic icon support for NavItem components
- Created NavIcon component with switch-case based icon rendering
- Added iconName prop to NavItem and NavItemData interface
- Updated LeftSidePanel to pass icon names to nav items
- Added sample icons to SampleModelSelector navigation (download, tag, layers, grid)
- Uses i-lucide syntax without imports for better tree-shaking
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* test: add Storybook stories for navigation components
- Add NavIcon.stories.ts with interactive icon selector and all icons gallery
- Add NavItem.stories.ts with text customization and interactive list examples
- Add LeftSidePanel.stories.ts with various navigation configurations
- Remove old Navigation.stories.ts (replaced with component-specific stories)
- Configure slot visibility and hide update:modelValue event in controls
* refactor: simplify NavIcon component and improve type definitions
* fix: add icon size specification for Lucide icons in Storybook
* feature: NavItem story modified
* fix: disable knip unresolved imports rule for virtual icon modules
Add unresolved: 'off' to knip configuration to ignore virtual module imports
from unplugin-icons (~icons/*). These are generated at build time and cannot
be resolved statically.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: v-if condition added
* chore: knip ignoreUnresolved added based on knip issue PR
* refactor: navItem types added & deleting any type on storybook files
---------
Co-authored-by: Claude <noreply@anthropic.com>
* [feat] Refactor overlay compatibility into reusable composable
- Create useTransformCompatOverlayProps composable for centralized overlay prop management
- Update Select, MultiSelect, TreeSelect, and FileUpload components to use composable
- Provides appendTo='self' for transform inheritance in CSS-transformed parents
- Enables easy future additions of other transform compatibility props
- Fix duplicate v-bind attributes by combining props into single computed object
* fix: Keep the canvas container from being scrolled by children
* types: Align the appendTo type with primevue internals
* Update test expectations [skip ci]
---------
Co-authored-by: bymyself <cbyrne@comfy.org>
Co-authored-by: github-actions <github-actions@github.com>
* Remove COMFY_VUE_NODE_DIMENSIONS
* [refactor] Use getSlotPosition for Vue nodes in link rendering
Replace direct node position calls with getSlotPosition utility when Vue nodes mode is enabled. This ensures consistent slot positioning across the canvas rendering system.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix getSlotPosition readonly return value (#5433)
* Update accordingly to new type
* Fix canvas/screen conversion formulas in useTransformState (#5406)
* Fix conversion formulas
* update test expectations
* Remove unused type import
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: filtered <176114999+webfiltered@users.noreply.github.com>
* switch to schema interface and remove assertions at callsites
* [refactor] improve type safety and code organization - addresses @DrJKL's review feedback
- Remove unnecessary type assertions from REROUTE_DEFAULTS
- Use safer Omit<RerouteData, 'id' < /dev/null | 'parentId'> pattern for defaults to prevent hardcoded ID bugs
- Extract asRerouteId and asLinkId utility functions to module scope as pure functions
- Update getRerouteField to handle partial defaults safely
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* [fix] revert to clean defaults pattern - removes any type usage
Reverted the overcomplicated Omit pattern back to the simple, working approach.
The original pattern was cleaner and didn't introduce unnecessary complexity.
---------
Co-authored-by: Claude <noreply@anthropic.com>
* [feat] add Comfy.Assets.UseAssetAPI to CORE_SETTINGS
* [feat] create AssetService
1. Add service for accessing new Asset API
2. Add fallback model paths logic so empty model directories appear for
the user.
3. Copious tests for them all.
Co-Authored-By: Claude <noreply@anthropic.com>
* [feat] switch between assets and file paths for model data
* [feat] ignore assets with "missing" tag
* [fix] formatting and style
* [fix] call assets API with the correct filters
* [feat] elminate unused modelPath code
* [fix] remove stray comment
* [fix] model manager api was not parsed correctly
---------
Co-authored-by: Claude <noreply@anthropic.com>
* let canvas continue to own selection state management
* fix merge error
* refactor: use computed instead of watcher for selectedNodeIds
Replace watcher pattern with computed for better Vue idioms:
- More reactive and efficient
- Automatically recomputes when dependencies change
- Simpler, more declarative code
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: improve injection error handling for selectedNodeIds
Replace silent fallback with explicit error when SelectedNodeIds
is not provided:
- Fail fast instead of silently using empty Set
- Clear error message for debugging
- Prevents nodes appearing unselected due to missing provider
Addresses DrJKL's concern about injection default behavior.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* test: improve mocking patterns using vi.mockObject
Replace manual mock interfaces with vi.mockObject for better type safety:
- Use Vitest's built-in mocking utilities instead of manual interfaces
- Properly configure mock return values
- Remove unnecessary type assertions
Addresses DrJKL's feedback on test mocking patterns.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* test: extract repeated nodeData for clarity
Extract common test nodeData object to reduce duplication:
- Move repeated VueNodeData object to describe scope
- Replace 6 instances of identical nodeData declarations
- Maintain different nodeData for specific test cases
Addresses DrJKL's suggestion to extract repeated test data.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* add type safety to mocks
---------
Co-authored-by: Claude <noreply@anthropic.com>