-
Notifications
You must be signed in to change notification settings - Fork 359
Modal Component & Custom UI Components #4908
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
cb4dcc1
to
10b202b
Compare
I think we might want |
0413e35
to
defc605
Compare
Claude finished @viva-jinyi's task —— View job Comprehensive PR Review ✅Completed comprehensive review of PR #4908 "Modal Component & Custom UI Components" Todo List:
Final Review Statistics:
Review Complete ✅8 inline comments posted covering all major issues found Key Issues Identified:
Positive Findings:
The critical lodash dependency issue must be resolved before merge. |
We switched from lodash to es-toolkit |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Comprehensive PR Review
This review is generated by Claude. It may not always be accurate, as with human reviewers. If you believe that any of the comments are invalid or incorrect, please state why for each. For others, please implement the changes in one way or another.
Review Summary
PR: Modal Component & Custom UI Components (#4908)
Impact: 1332 additions, 18 deletions across 52 files
Issue Distribution
- Critical: 1
- High: 1
- Medium: 5
- Low: 1
Category Breakdown
- Architecture: 1 issues
- Security: 0 issues
- Performance: 0 issues
- Code Quality: 7 issues
Key Findings
Architecture & Design
Critical Issue: The PR imports lodash.merge but does not add lodash as a dependency, which will cause runtime errors. This needs to be fixed before merge.
Design Pattern Concern: The components extensively reimplement PrimeVue functionality rather than leveraging the library's built-in capabilities. This increases maintenance burden and bundle size while reducing the benefits of using a component library.
Security Considerations
No security vulnerabilities were identified in this review.
Performance Impact
No significant performance issues were found. The components appear lightweight, though the PrimeVue reimplementation may increase bundle size unnecessarily.
Integration Points
The new design system components integrate well with the existing dialog system. The new showLayoutDialog function provides a clean API for layout-based dialogs.
Positive Observations
- Consistent TypeScript: All components use proper TypeScript interfaces and type definitions
- Responsive Design: Components use Tailwind classes appropriately for responsive layouts
- Component Architecture: Good separation of concerns with focused, single-responsibility components
- Accessibility: Proper use of semantic HTML and ARIA attributes where appropriate
- Internationalization: Proper use of i18n in user-facing text
Code Quality Issues Found
- PrimeVue Reimplementation: Multiple components reimplement PrimeVue functionality instead of using built-in variants
- CSS Override Patterns: Excessive use of !important and deep selectors to force styling overrides
- Debug Code: Console.log statements left in production code
- Code Cleanup: Commented-out code blocks should be removed
References
- ComfyUI Frontend Architecture Guide
- PrimeVue Documentation
Next Steps
- Address critical issue: Add lodash dependency or replace merge with native alternative
- Consider architectural feedback: Evaluate using more PrimeVue built-ins vs custom implementations
- Code cleanup: Remove debug statements and commented code
- CSS improvements: Reduce reliance on !important declarations
This is a comprehensive automated review. The critical dependency issue must be resolved before merge. For architectural decisions requiring human judgment, please request additional manual review.
9a0b303
to
be0e66a
Compare
- Remove debug console.log statements from ModelSelector component - Remove commented-out code blocks for cleaner codebase - Replace empty click handlers for UI placeholder buttons Addresses code quality issues raised in PR #4908 review
- Remove debug console.log statements from ModelSelector component - Remove commented-out code blocks for cleaner codebase - Replace empty click handlers for UI placeholder buttons Addresses code quality issues raised in PR #4908 review
d8f309e
to
af7b2ae
Compare
Basing off this as its very close to completion |
Can we make some changes to file/folder naming?
Some possible final structure:
|
These components are part of the design system and will be used later: - IconGroup.vue - CardTitle.vue - SingleSelect.vue Also added missing @types/lodash dev dependency
- Separated static Tailwind classes and dynamic inline styles - Fixed issue where dynamic pixel values weren't being applied - Added v-for to render 100 cards for testing - Updated ModelSelector layout with contentFilter slot
Added unused design system components: - MoreButton.vue - TextButton.vue - CardDescription.vue
- Remove debug console.log statements from ModelSelector component - Remove commented-out code blocks for cleaner codebase - Replace empty click handlers for UI placeholder buttons Addresses code quality issues raised in PR #4908 review
af7b2ae
to
4217579
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks Good to Me
The ModelSelector has dummy values but since its not being used, its good for documentation
@Myestery I'm working on Storybook. So you can see docs via storybook later 😁 |
@christian-byrne I changed the directory following your review. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
* Revert test PR for backport workflow (#4794) * Scroll templates better (#4584) * [test] Regenerate template test screenshots (#4795) Co-authored-by: Claude <[email protected]> Co-authored-by: github-actions <[email protected]> * [fix] Display dynamic keybinding in minimap tooltip (#4805) * Fix widget display on subgraph nodes (#4798) * [docs] Add feature flags documentation (#4797) * [docs] Create CONTRIBUTING.md and reorganize documentation (#4804) * Add touch screen dragging support to minimap (#4781) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: snomiao <[email protected]> * 1.26.0 (#4812) Co-authored-by: christian-byrne <[email protected]> * Keyboard Shortcut Bottom Panel (#4635) * [docs] Improve icon documentation with practical examples (#4810) * [refactor] Remove 5 unused settings from apiSchema (#4811) Co-authored-by: Claude <[email protected]> * [ci] Merge ESLint and Prettier workflows with auto-fix for faster iteration (#4638) * [fix] Handle fork PRs in lint-and-format workflow (#4819) * Remove subgraphs from add node context menu (#4820) * Rename subgraph widgets when slot is renamed (#4821) * fix: correct branch protection status contexts for RC branches (#4829) * feat: Add smooth slide-up animation to SelectionToolbox (#4832) * Support preview display on subgraphNodes (#4814) * [CI] Exclude `vue-nodes-migration` branch from playwright tests (#4844) * feat: Enable double-click on subgraph slot labels for renaming (#4833) * docs: add AGENTS.md file (#4858) Co-authored-by: github-actions <[email protected]> * [bugfix] Fix subgraph I/O slot rename dialog showing stale label content (#4852) Co-authored-by: Claude <[email protected]> * Fix disconnection from subgraph inputs (#4800) * Fix: Alt+click reroute creation on high-DPI displays (#4831) * Fix Alt+click create reroute (2/2) (#4863) Co-authored-by: github-actions <[email protected]> * Remove unused Litegraph context menu options (#4867) Co-authored-by: github-actions <[email protected]> * Fix execution breaks on multi/any-type slots (#4864) * Fix Simplified Chinese Translation (#4865) * Revert animated-image-preview-saved-webp snapshot change from #4863 (#4873) Co-authored-by: Claude <[email protected]> * [CI] Pin third party GH actions to specific SHAs (#4878) * [ci] Add chromium-0.5x to test matrix (#4880) Co-authored-by: Claude <[email protected]> * Reorder subgraph context menu items (#4870) Co-authored-by: github-actions <[email protected]> * Add preview to workflow tabs (#4290) * fix: hide Desktop User Guide menu item in web builds (#4828) * fix: hide More menu when no submenu items are visible (#4837) * Fix Alt-Click-Drag-Copy of Subgraph Nodes (#4879) * [feat] Replace manual clamp function with lodash (#4874) Co-authored-by: Claude <[email protected]> * [refactor] Remove unused omitBy function (#4886) Co-authored-by: Claude <[email protected]> * 1.26.1 (#4889) Co-authored-by: christian-byrne <[email protected]> * [fix] Add bounds checking for clipspace indices to prevent paste errors (#4849) Co-authored-by: github-actions <[email protected]> * [feat] Add PR creation automation command (#4892) Co-authored-by: Claude <[email protected]> * [3d] initial version of 3d viewer (#3968) Co-authored-by: github-actions <[email protected]> * [feat] Replace removeFromArray with lodash pull (#4906) Co-authored-by: Claude <[email protected]> * [ci] standardize release notes format in release commands (#4912) * [feat] Make hotkey for exiting subgraphs configurable in user keybindings (#4818) Co-authored-by: github-actions <[email protected]> * Fix subgraph reroute serialization (#4911) * [feat] Add red styling to Remove Slot context menu option (#4918) Co-authored-by: Claude <[email protected]> * [refactor] Replace stringOrEmpty with lodash toString (#4917) Co-authored-by: Claude <[email protected]> * fix: Multiple links from reroute create single slot on SubgraphOutputNode (#4915) Co-authored-by: Claude <[email protected]> * minimap improve (#4679) Co-authored-by: github-actions <[email protected]> * [feat] Add knip for unused code detection (#4890) * [fix] Fix link deletion from middle button when connected to reroute nodes deletes wrong link (#4928) Co-authored-by: github-actions <[email protected]> * [fix] ensure consistent link release behavior for subgraph IO nodes (#4931) * [bugfix] Fix queue not updating with completed task images (#4936) Co-authored-by: Jennifer Weber <[email protected]> * Feature/arabic translation (#4916) * 1.26.2 (#4939) Co-authored-by: christian-byrne <[email protected]> Co-authored-by: github-actions <[email protected]> * Add automatic trackpad / mouse sensing (#4913) * [ci] Optimize ESLint performance with caching and generated file excl… (#4926) Co-authored-by: Qwen-Coder <[email protected]> * Feat: add duplicate workflow on sidebar (#4895) * [refactor] Replace lodash with es-toolkit (#4935) * fix: add cleanup for graphChanged listener in useWorkflowPersistence (#4947) * [ci] Add lint:fix:no-cache script for consistency (#4948) Co-authored-by: github-actions <[email protected]> * Implement subgraph unpacking (#4840) * pricing update for MinimaxHailuoVideo node and Kling "kling-v2-1" model (#4938) * gemini-2.5-pro and flash models; corrected prices (#4945) * Trigger updateSelectedItems on subgraph conversion (#4949) Co-authored-by: github-actions <[email protected]> * [feat] Add Linux core dump to .gitignore (#4960) Co-authored-by: Claude <[email protected]> Co-authored-by: github-actions <[email protected]> * [feat] Add alternative package manager lockfiles to .gitignore (#4961) ## Summary - Add bun.lock, bun.lockb, pnpm-lock.yaml, and yarn.lock to .gitignore - Allows users to use faster package managers (Bun, pnpm) without making git status dirty - Maintains npm as the default while supporting developer choice of package manager ## Test plan - [x] Verify .gitignore changes are correct - [ ] Test that creating these lockfiles doesn't show in git status - [ ] Confirm existing npm functionality remains unaffected 🤖 Generated with [Claude Code](https://claude.ai/code) ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-4961-feat-Add-alternative-package-manager-lockfiles-to-gitignore-24e6d73d3650817c8fa4fb8e94df5ac6) by [Unito](https://www.unito.io) Co-authored-by: Claude <[email protected]> * Update side toolbar menu (#4946) Side toolbar menu UI updates ## Summary - Currently the template modal is very hidden. Many users do not find it - The current icons are quite aleatory ## Changes **What**: - Add templates shortcut button - Add item label in normal size - Use custom icon Critical design decisions or edge cases that need attention: - Sidebar tabs registered using custom icons will have their associated command registed with an undefined icon (currently only string icons are accepted, not components). I couldn't see anywhere directly using this icon, but we should consider autogenerating an icon font so we can use classes for our custom icons (or locating and updating locations to support both icon types) ## Screenshots (if applicable) Normal mode: <img width="621" height="1034" alt="image" src="https://github.com/user-attachments/assets/c1d1cee2-004e-4ff8-b3fa-197329b0d2ae" /> Small mode: <img width="176" height="325" alt="image" src="https://github.com/user-attachments/assets/3824b8f6-bc96-4e62-aece-f0265113d2e3" /> ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-4946-Update-side-toolbar-menu-24d6d73d365081c5b2bdc0ee8b61dc50) by [Unito](https://www.unito.io) --------- Co-authored-by: github-actions <[email protected]> * Bundled subgraph fixes (#4964) ### Group support for subgraph unpacking The unpacking code would silently delete groups (the cosmetic colored rectangles). They are now correctly transferred. ### Fix subgraph node position on conversion to subgraph Converting to subgraph will no longer cause nodes to inch upwards  ### Make unpacking use same positioning calcs as conversion Non trivial, but unpacking is now a proper inverse for conversion.  ### Clean up old output links when unpacking Unpacked nodes were left with dangling outputs. This would cause cascading issues later, such as when consecutively unpacking nested subgraphs. ### Minor refactoring for code clarity ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-4964-Bundled-subgraph-fixes-24e6d73d365081d3a043ef1531d9d38a) by [Unito](https://www.unito.io) * show group self color in minimap (#4954) a tiny fix that show group self color in minimap when checking node color ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-4954-show-group-self-color-in-minimap-24e6d73d3650812dbc58e9b134805f2d) by [Unito](https://www.unito.io) * fix: Add guards for _listenerController.abort() calls in SubgraphNode (#4968) This fix adds guards before calling `_listenerController.abort()` to prevent runtime errors when loading workflows. The guards check that `_listenerController` exists and has an `abort` function before calling it, matching the pattern used in Comfy-Org/litegraph.js#1134. Fixes https://github.com/Comfy-Org/ComfyUI_frontend/issues/4907 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-4968-fix-Add-guards-for-_listenerController-abort-calls-in-SubgraphNode-24e6d73d3650813ebeeed69ee676faeb) by [Unito](https://www.unito.io) * [feat] Restore group node conversion menu with deprecated label (#4967) ## Summary - Partially reverts commit c84218d6 to restore group node functionality in context menus - Adds "(Deprecated)" label to indicate the feature is deprecated - Fixes TypeError when right-clicking on group nodes - Re-enables tests that were disabled when the feature was removed ## Changes 1. **Restored context menu options** - Added back "Convert to Group Node (Deprecated)" and "Manage Group Nodes" menu items 2. **Fixed null reference error** - Added null-safe operator to prevent errors when right-clicking group nodes 3. **Re-enabled tests** - Restored 7 tests that were disabled in commit 586f8824 ## Test plan - [x] Right-click on canvas → verify "Convert to Group Node (Deprecated)" appears - [x] Right-click on nodes → verify the same menu option appears - [x] Select multiple nodes and use the menu option → verify conversion works - [x] Right-click on group nodes → verify no errors occur - [x] Run browser tests → verify all re-enabled tests pass ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-4967-feat-Restore-group-node-conversion-menu-with-deprecated-label-24e6d73d36508149a6f2dbef47223e94) by [Unito](https://www.unito.io) --------- Co-authored-by: Claude <[email protected]> Co-authored-by: github-actions <[email protected]> * fix pricing for KlingImage2VideoNode (#4957) ## Summary Following up #4938 where I forgot to add pricing for new model in the `KlingImage2VideoNode`. ## Screenshots (if applicable) <img width="1461" height="1228" alt="Screenshot from 2025-08-13 09-15-21" src="https://github.com/user-attachments/assets/01be8ab9-820b-4112-9a54-1ce4f23de4eb" /> ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-4957-fix-pricing-for-KlingImage2VideoNode-24e6d73d36508122b40ede36fdd50115) by [Unito](https://www.unito.io) * [fix] Prevent incompatible connections to SubgraphInputNode occupied slots (#4984) ## Summary This PR fixes #4681 by building upon the foundation laid in PR #1182 (litegraph.js). It prevents incompatible type connections when dragging from a normal node's output to a SubgraphInputNode's occupied slot. Before: https://github.com/user-attachments/assets/03def938-dccc-4b2c-b65b-745abf02a13b After: https://github.com/user-attachments/assets/7a0a2ed4-9ecd-4147-be56-d643d448d4cb ## Background PR #1182 implemented: - `isValidTarget()` method in SubgraphInput/SubgraphOutput classes for validation - Visual feedback during drag (40% opacity for invalid targets) - Validation at the slot level However, there was a missing piece: while the visual feedback correctly showed invalid targets, the actual connection would still be made when dropped. ## Changes This PR extends PR #1182 by adding the missing connection prevention: 1. **Added `canConnectToSubgraphInput()` method** to render link classes: - `MovingOutputLink` - `ToOutputRenderLink` - `FloatingRenderLink` - All methods use the existing `SubgraphInput.isValidTarget()` from PR #1182 2. **Added validation in `LinkConnector.dropOnIoNode()`**: - Checks `canConnectToSubgraphInput()` before allowing the connection - Logs a warning when rejecting invalid connections - Follows the same pattern as regular node connections 3. **Added `isSubgraphInputValidDrop()` method**: - Provides validation for hover states - Ensures consistent validation across the UI * fix: Handle missing subgraph inputs gracefully during workflow import (#4985) When loading workflows, SubgraphNode would throw an error if an input exists in the serialized data that doesn't exist in the current subgraph definition. This can happen when: - Subgraph definitions change after workflows are saved - Workflows are shared between users with different subgraph versions - Dynamic inputs were added that don't exist in the base definition This change converts the hard error to a warning and continues processing, allowing workflows to load even with mismatched subgraph configurations. Fixes #4905 * Refactor app menu items (#4665) * 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 <[email protected]> * feat: Add GTM feature summary step to release command (#4990) - Adds Step 16 to analyze PRs for marketing-worthy features - Extracts PR data including media assets (images, videos, GIFs) - Claude evaluates which features would interest end users - Generates gtm-summary-VERSION.md for sharing with marketing team - Many releases will correctly identify no marketing features (normal for bug fixes) This helps the GTM team identify demo opportunities without manual PR review. * [release] Increment version to 1.26.3 (#4995) Co-authored-by: christian-byrne <[email protected]> * Fix inconsistency on bypass from context menu (#4988) When a node is bypassed from the selection toolbox or by pressing a keybind for bypass, it will also recursively bypass the contents of a subgraph. This effect was not applied when clicking the bypass button from the context menu. The context menu option has been updated to perform the same action as the others so that behaviour is consistent. * [test] Add tests for --disable-api-nodes release fetch skip functionality (#4799) - Add comprehensive test coverage for the new --disable-api-nodes argument handling - Tests verify release fetching is properly skipped when argument is present - Cover edge cases including multiple args, null argv, and missing system stats - Ensures backward compatibility when argument is not present * fix: Correct traditional Chinese to simplified Chinese in translations (#5005) * Correct some translations that use traditional Chinese to simplified Chinese. * Update locales [skip ci] * Correct the rest of the translations --------- Co-authored-by: github-actions <[email protected]> * [feat] Improve low quality rendering zoom threshold tooltip (#5009) * [docs] Improve low quality rendering zoom threshold tooltip Clarify the behavior of the setting to explain that lower values maintain quality when zoomed out, while higher values enable simplified rendering at normal zoom levels. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Update locales [skip ci] * [docs] Improve low quality rendering zoom threshold tooltip Clarify the behavior of the setting to explain that lower values maintain quality when zoomed out, while higher values enable simplified rendering at normal zoom levels. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Update locales [skip ci] --------- Co-authored-by: Claude <[email protected]> Co-authored-by: github-actions <[email protected]> * Translated Keyboard Shortcuts (#5007) * fix: Update command label rendering to use i18n normalization * fix: Replace deprecated with t for command label rendering * fix: Simplify command rendering check in ShortcutsList tests * fix: Add missing translation for command label in ShortcutsList tests * api_nodes: added prices for gpt-5 series models (#4958) * [fix] Complete traditional to simplified Chinese character conversion (#5013) * [fix] Complete traditional to simplified Chinese character conversion Fixes issue where the automated translation system was incorrectly mixing traditional Chinese characters into simplified Chinese (zh) locale files after PR #4410 added zh-TW support. Changes: - Updated .i18nrc.cjs with explicit guidelines for AI model to distinguish between simplified and traditional Chinese - Fixed 50+ traditional characters in zh locale files: - commands.json: 畫→画, 減→减, 筆→笔 - main.json: 關→关, 刪→删, 複→复, 製→制, 輸→输, etc. - settings.json: 舊→旧, 標→标, 選→选, etc. Completed the systematic conversion work started in PRs #5005 and #4865 without overwriting any human translator decisions. Fixes #5010 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Update locales [skip ci] --------- Co-authored-by: Claude <[email protected]> Co-authored-by: github-actions <[email protected]> * Fix widget disconnection issue in subgraphs #4922 (#5015) * [bugfix] Fix widget disconnection issue in subgraphs When disconnecting a node from a SubgraphInput, the target input's link reference was not being cleared in LLink.disconnect(). This caused widgets to remain greyed out because they still thought they were connected (slot.link was not null). The fix ensures that when a link is disconnected, the target node's input slot is properly cleaned up by setting input.link = null. Fixes #4922 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * [test] Add tests for LLink disconnect fix for widget issue Add comprehensive tests for the LLink.disconnect() method to verify that target input link references are properly cleared when disconnecting. This prevents widgets from remaining greyed out after disconnection. Tests cover: - Basic disconnect functionality with link reference cleanup - Edge cases with invalid target nodes - Preventing interference between different connections Related to #4922 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * fix: improve minimap subgraph navigation with graph UUID callback tracking (#5018) - Replace single callback storage with Map using graph UUIDs as keys - Fix minimap not updating when navigating between subgraphs - Add proper cleanup and error handling for callback management - Switch from app.canvas.graph to reactive workflowStore.activeSubgraph - Prevent callback wrapping recursion by tracking setup state per graph * Deep copy subgraphs to clipboard, update nested ids on paste (#5003) * Deep copy to clipboard, update nested ids on paste The copyToClipboard function wasn't walking subgraphs and leaving nested subgraphs unserialized. This has now been fixed. This requires that equivalent support be added to _pasteFromClipboard to update the ids of nested subgraphs which are pasted. * Add extra advisory comments * [bugfix] Preserve nested subgraph widget values during serialization (#5023) When saving workflows with nested subgraphs, promoted widget values were not being synchronized back to the subgraph definitions before serialization. This caused widget values to revert to their original defaults when reloading the workflow. The fix overrides the serialize() method in SubgraphNode to sync promoted widget values to their corresponding widgets in the subgraph definition before serialization occurs. Fixes the issue where nested subgraph widget values would be lost after save/reload. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * fix: issue #4121 (#5029) * [release] Increment version to 1.26.4 (#5032) Co-authored-by: christian-byrne <[email protected]> * api_nodes: added prices for Vidu Video nodes (#5035) * Improve release command flow and GTM criteria (#5040) - Reorganize steps to complete all analysis before execution - Move Breaking Change Analysis to Step 3 (was Step 6) - Move Dependency Analysis to Step 4 (was Step 7) - Move GTM Feature Summary to Step 5 (was Step 16) - Add stricter GTM criteria to avoid minor features - Simplify PR data extraction to prevent timeouts - Enhance Version Preview to suggest version based on analysis These changes ensure critical analysis steps aren't skipped during execution and provide clearer criteria for marketing-worthy features. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * Update menu items with a active toggle state to not close menu when clicked (#5050) * handle minimap cleanup called before map set (#5038) Co-authored-by: bymyself <[email protected]> * [refactor] Refactor minimap initialization logic (#5052) * move ref initialization to the component * remove redundant init * [bugfix] Allow removeInput/removeOutput on nodes without graph reference (#5053) - Modified removeInput/removeOutput to skip disconnect operations when node has no graph - Both methods now safely handle nodes that aren't part of a graph - Added comprehensive tests for the new behavior - Fixes #5037 * Minor updates to subgraph breadcrumb item (#5060) - change active item text to primary color - change rename action to behave the same as double clicking label * [fix] Resolve group node execution error when connecting to external nodes (#5054) * [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. * Modal Standardization (#4784) * [refactor] Migrate minimap to domain-driven renderer architecture (#5069) * move ref initialization to the component * remove redundant init * [refactor] Move minimap to domain-driven renderer structure - Create new src/renderer/extensions/minimap/ structure following domain-driven design - Add composables: useMinimapGraph, useMinimapViewport, useMinimapRenderer, useMinimapInteraction, useMinimapSettings - Add minimapCanvasRenderer with efficient batched rendering - Add comprehensive type definitions in types.ts - Remove old src/composables/useMinimap.ts composable - Implement proper separation of concerns with dedicated composables for each domain The new structure provides cleaner APIs, better performance through batched rendering, and improved maintainability through domain separation. * [test] Fix minimap tests for new renderer structure - Update all test imports to use new renderer paths - Fix mock implementations to match new composable APIs - Add proper RAF mocking for throttled functions - Fix type assertions to handle strict TypeScript checks - Update test expectations for new implementation behavior - Fix viewport transform calculations in tests - Handle async/throttled behavior correctly in tests All 28 minimap tests now passing with new architecture. * [fix] Remove unused init import in MiniMap component * [refactor] Move useWorkflowThumbnail to renderer/thumbnail structure - Moved useWorkflowThumbnail from src/composables to src/renderer/thumbnail/composables - Updated all imports in components, stores and services - Moved test file to match new structure - This ensures all rendering-related composables live in the renderer directory * [test] Fix minimap canvas renderer test for connections - Fixed mock setup for graph links to match LiteGraph's hybrid Map/Object structure - LiteGraph expects links to be accessible both as a Map and as an object - Test now properly verifies connection rendering functionality * [fix] Restore ability to override onMouseDown in node subclasses (#5079) This fixes a regression where node subclasses could no longer override the onMouseDown method. The issue was introduced when title button support was added by assigning onMouseDown in the constructor, which prevented proper method inheritance. Changes: - Remove onMouseDown assignment from LGraphNode constructor - Move title button click detection to LGraphCanvas before calling node.onMouseDown - This preserves title button functionality while allowing subclasses to override onMouseDown Fixes #5073 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * [refactor] Migrate litegraph tests to centralized location (#5072) * [refactor] Migrate litegraph tests to centralized location - Move all litegraph tests from src/lib/litegraph/test/ to tests-ui/tests/litegraph/ - Organize tests into logical subdirectories (core, canvas, infrastructure, subgraph, utils) - Centralize test fixtures and helpers in tests-ui/tests/litegraph/fixtures/ - Update all import paths to use barrel imports from '@/lib/litegraph/src/litegraph' - Update vitest.config.ts to remove old test path - Add README.md documenting new test structure and migration status - Temporarily skip failing tests with clear TODO comments for future fixes This migration improves test organization and follows project conventions by centralizing all tests in the tests-ui directory. The failing tests are primarily due to circular dependency issues that existed before migration and will be addressed in follow-up PRs. * [refactor] Migrate litegraph tests to centralized location - Move all 45 litegraph tests from src/lib/litegraph/test/ to tests-ui/tests/litegraph/ - Organize tests into logical subdirectories: core/, canvas/, subgraph/, utils/, infrastructure/ - Update barrel export (litegraph.ts) to include all test-required exports: - Test-specific classes: LGraphButton, MovingInputLink, ToInputRenderLink, etc. - Utility functions: truncateText, getWidgetStep, distributeSpace, etc. - Missing types: ISerialisedNode, TWidgetType, IWidgetOptions, UUID, etc. - Subgraph utilities: findUsedSubgraphIds, isSubgraphInput, etc. - Constants: SUBGRAPH_INPUT_ID, SUBGRAPH_OUTPUT_ID - Disable all failing tests with test.skip for now (9 tests were failing due to circular dependencies) - Update all imports to use proper paths (mix of barrel imports and direct imports as appropriate) - Centralize test infrastructure: - Core fixtures: testExtensions.ts with graph fixtures and test helpers - Subgraph fixtures: subgraphHelpers.ts with subgraph-specific utilities - Asset files: JSON test data for complex graph scenarios - Fix import patterns to avoid circular dependency issues while maintaining functionality This migration sets up the foundation for fixing the originally failing tests in follow-up PRs. All tests are now properly located in the centralized test directory with clean import paths and working TypeScript compilation. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Fix toBeOneOf custom matcher usage in LinkConnector test Replace the non-existent toBeOneOf custom matcher with standard Vitest expect().toContain() pattern to fix test failures * Update LGraph test snapshot after migration The snapshot needed updating due to changes in the test environment after migrating litegraph tests to the centralized location. * Remove accidentally committed shell script This temporary script was used during the test migration process and should not have been committed to the repository. * Remove temporary migration note from CLAUDE.md This note was added during the test migration process and is no longer needed as the migration is complete. --------- Co-authored-by: Claude <[email protected]> * [refactor] Organize all browser test assets into logical folders (#5058) * move subgraph test assets into subfolder * [refactor] Organize browser test assets into logical folders Reorganized test assets for better maintainability: - groupnodes/: GroupNode feature tests - groups/: Visual grouping tests - missing/: Missing nodes/models tests - links/: Link-related tests - inputs/: Input widget tests - widgets/: Widget-specific tests - nodes/: Node-related tests - workflowInMedia/: Workflow media files Updated all loadWorkflow references to use new folder structure. Fixed programmatic filename references to prevent test failures. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * [fix] Update mobile test to use new asset path * [fix] Update remaining loadWorkflow calls to use new folder structure * [fix] Fix remaining programmatic filename references * [fix] Run prettier formatting * [fix] Fix setupWorkflowsDirectory references to use correct folder paths * [refactor] Rename subgraph folder to subgraphs for consistency * [fix] Fix breadcrumb name in subgraph DOM widget test * Update test expectations [skip ci] --------- Co-authored-by: Claude <[email protected]> Co-authored-by: github-actions <[email protected]> * [fix] Update title button tests after onMouseDown method refactor (#5082) Fixes unit tests that failed after PR #5079 which moved title button handling logic from LGraphNode.onMouseDown to LGraphCanvas level. - Updated LGraphNode.titleButtons.test.ts to test canvas-level logic instead of calling node.onMouseDown() directly - Updated LGraph.test.ts snapshot to reflect removal of onMouseDown function from node serialization - Tests now mock button.isPointInside() and verify onTitleButtonClick() calls - Removed unused variables to fix TypeScript compilation 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * docs: Clarify extension terminology and dev server limitations (#5042) * docs: Clarify extension terminology and dev server limitations * docs: removed unecessary callout to extension docs in main readme, in favor of the contributions.md * docs: remove key points * docs: change docs structure for better semantics and extensibility * docs: add warning emoji * docs: remove mention of 3D core extensions * docs: add feedback in * [fix] Rename viewer control components to prevent unplug warnings (#5080) Renamed Load3D viewer control components to use ViewerXxxControls naming convention to avoid conflicts with the unplug system's component name detection. This prevents false positive warnings when components are registered in the global scope. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * Add .git-blame-ignore-revs for cleaner git blame (#5078) - Created .git-blame-ignore-revs file to exclude mass formatting commits - Added automatic git config in package.json prepare script - Excluded litegraph migration formatting commit (10k+ line changes) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * Fix widgets added after previews on subgraph nodes (#5084) Image previews are displayed on nodes as a widget. If a new input is added to a subgraph that already has an image preview, that widget is incorrectly placed after the preview. This is fixed by instead counting the number of existing inputs that are already linked to widgets. * fix: Make bottom panel tab titles reactive to language changes (#5077) * computed extraMenuItems * add i18n key option * underline fix * Update locales [skip ci] * restore title * Update locales [skip ci] * refactor: Extract tab title logic to helper method for better readability - Moved complex nested ternary logic from template to getTabDisplayTitle helper - Improves code readability and maintainability - Addresses review feedback about using computed/method for performance --------- Co-authored-by: github-actions <[email protected]> * Modal Component & Custom UI Components (#4908) * [feat] Add Storybook setup and NodePreview story (#4861) * [feat] Add Storybook setup and NodePreview story - Install and configure Storybook v9.1.1 for Vue 3 - Set up Storybook configuration with Vite integration - Add Pinia store support for Storybook environment - Create comprehensive NodePreview.stories.ts with multiple node examples: - KSampler node (complex node with multiple inputs/outputs) - CLIP Text Encode node (simple text input node) - VAE Decode node (image processing node) - Example with long markdown description - Configure project paths and aliases for Storybook - Stories demonstrate various ComfyUI node types with realistic mock data - Update tsconfig.eslint.json to include Storybook files - Fix ESLint issues with imports and number precision - Add Storybook ESLint plugin configuration 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * [feat] Improve Storybook configuration and setup - Add comprehensive PrimeVue theme setup with ComfyUI preset - Configure proper Vue app setup with Pinia stores, i18n, and services - Remove unused onboarding addon from Storybook dependencies - Improve Vite configuration with better chunking and alias resolution - Add proper CSS imports and styling for ComfyUI components 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * [docs] Add comprehensive Storybook documentation - Add README.md explaining Storybook usage, benefits, and comparison with other tools - Add CLAUDE.md with development guidelines for working with Storybook - Include best practices, troubleshooting tips, and integration notes - Address PR review feedback for better developer onboarding 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * [refactor] Remove ts-expect-error comment from Storybook preview 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * [bugfix] Fix TypeScript errors in Load3D components and GLTF test - Fix type mismatches in Load3DScene eventConfig by casting string values to proper enum types (MaterialMode, CameraType, UpDirection) - Fix Uint8Array vs ArrayBuffer type issues in GLTF test by using .buffer property - Remove unused @ts-expect-error comment in Rectangle.ts 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * [feat] Add Chromatic GitHub Action for Storybook visual testing - Add automated visual regression testing for Storybook components - Configure workflow to run on main branch and PRs - Auto-accept changes on main branch for baseline updates - Uses build-storybook script for optimized builds 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * [docs] Add Chromatic documentation to Storybook README - Document Chromatic visual testing integration - Add information about automated testing workflow - Include best practices for visual regression testing - Explain how to view and manage test results 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * chore(chromatic.yaml): restrict push branches to main only for better workflow management * [feat] Rebase branch onto main and update Storybook configuration - Rebase sno-storybook branch onto origin/main with latest changes - Update .storybook/main.ts with additional plugins and component configuration - Add icons and component resolvers for Storybook support - Update .gitignore with new entries - Regenerate package-lock.json after rebase conflicts 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * [bugfix] Fix TypeScript errors in SubgraphNode type checking Add proper type validation for subgraph node selection before calling SubgraphNode-specific methods. This prevents undefined values from being passed to functions expecting SubgraphNode parameters. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * fix(vite.config.mts): correct path alias for src directory to ensure proper resolution in the project refactor(vite.config.mts): adjust templates proxy configuration for better readability and maintainability * [feat] Remove bun.lock as it's now ignored * [bugfix] Fix Storybook builder require() error by converting main.ts to main.mjs - Convert .storybook/main.ts to main.mjs to resolve ES module compatibility - Use dynamic imports instead of static imports to avoid require() errors - Add .storybook directory to tsconfig.json includes - Storybook build and dev server now work correctly 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * chore(storybook): replace main.mjs with main.ts for improved type safety and maintainability fix(storybook): remove unused import map plugins in Storybook configuration to prevent potential issues fix(storybook): update color palette store initialization to streamline code and improve readability * [feat] Optimize Chromatic workflow with automated PR status comments - Replace complex GitHub Script actions with edumserrano/find-create-or-update-comment@v3 - Add comprehensive PR comments showing Storybook build progress and results - Include build metrics: components, stories, visual changes, and errors - Add direct links to Chromatic builds and Storybook previews - Reduce workflow complexity by ~60 lines while maintaining functionality - Use native GitHub Actions expressions for cleaner maintainability 🤖 Generated with Claude Code Co-Authored-By: Claude <[email protected]> * chore(chromatic.yaml): move permissions section inside the chromatic-deployment job for better organization and clarity * [fix] Resolve Vite CJS deprecation warning in Storybook config - Use dynamic import for mergeConfig to avoid CJS build warning - Replace static import with dynamic import in viteFinal function - Maintain type safety with separate type import - Fixes "The CJS build of Vite's Node API is deprecated" warning 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * fix(chromatic.yaml): change edit-mode from replace to append to preserve existing comments in pull request * [fix] Replace __dirname with process.cwd() in Storybook config __dirname is not available in all environments. Using process.cwd() provides better compatibility and resolves path issues in Storybook. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * feature: storybook-setting (#5088) --------- Co-authored-by: Claude <[email protected]> Co-authored-by: Jin Yi <[email protected]> * feat: add a filter and check box to disable (#5014) selected extensions * Convert Group Nodes to Subgraph (#4972) * fix: Convert groupNodes to Subgraph Properly * fix: Use correct positioning with requestAnimationFrame when groupnodes are converted to Subgraph * [feat] Enhanced auto-retry configuration for flaky tests (#5089) - Increased Playwright test retries from 2 to 3 in CI environment - Added Vitest retry configuration (2 retries) for unit tests in CI - Addresses issues #4658 and #4416 with consistently flaky tests 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * [release] Increment version to 1.26.5 (#5094) Co-authored-by: christian-byrne <[email protected]> * Remove PR checks workflows (#5099) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * [feat] Add Cloudflare Pages deployment for Playwright test reports (#5045) * [feat] Add Cloudflare Pages deployment for Playwright test reports - Deploy test reports to separate Cloudflare projects per browser - Add real-time PR comments with progressive test status updates - Use wrangler-action for unified Cloudflare tooling - Support cross-browser testing with individual report links - Document CI/CD integration in browser_tests/README.md 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Fix Cloudflare project name for chromium-0.5x browser * Extract project name transformation to variable for consistent URL formatting * chore(ci): update branch filters for push and pull_request events in test-ui workflow to refine CI triggers * [feat] Improve test-ui deployment with branch isolation and building page - Use Cloudflare Pages --branch flag for proper branch isolation instead of modifying project names - Add auto-refresh building page that shows test progress in real-time - Deploy building page immediately when tests start for instant feedback - Update URL generation to use branch-based Cloudflare Pages URLs format - Maintain clean project names while isolating branches properly 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * chore(test-ui.yaml): increase sleep duration from 5 to 10 seconds for cache propagation and restore cached setup steps for improved workflow efficiency * [refactor] Remove building-page to reduce complexity - Remove auto-refresh building page and related deployment steps - Simplify PR comments to show basic test status without progress page - Keep branch-based deployment for proper isolation while reducing complexity - Maintain clean workflow focused on core functionality 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * chore(test-ui.yaml): add a separator in the workflow file for better readability and organization of the test status section * [feat] Add Cloudflare Pages deployment for Playwright test reports - Deploy test reports to separate Cloudflare projects per browser - Add real-time PR comments with progressive test status updates - Use wrangler-action for unified Cloudflare tooling - Support cross-browser testing with individual report links - Document CI/CD integration in browser_tests/README.md 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Fix Cloudflare project name for chromium-0.5x browser * Extract project name transformation to variable for consistent URL formatting * chore(ci): update branch filters for push and pull_request events in test-ui workflow to refine CI triggers * [feat] Improve test-ui deployment with branch isolation and building page - Use Cloudflare Pages --branch flag for proper branch isolation instead of modifying project names - Add auto-refresh building page that shows test progress in real-time - Deploy building page immediately when tests start for instant feedback - Update URL generation to use branch-based Cloudflare Pages URLs format - Maintain clean project names while isolating branches properly 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * chore(test-ui.yaml): increase sleep duration from 5 to 10 seconds for cache propagation and restore cached setup steps for improved workflow efficiency * [refactor] Remove building-page to reduce complexity - Remove auto-refresh building page and related deployment steps - Simplify PR comments to show basic test status without progress page - Keep branch-based deployment for proper isolation while reducing complexity - Maintain clean workflow focused on core functionality 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * chore(test-ui.yaml): add a separator in the workflow file for better readability and organization of the test status section * [fix] Address PR review feedback - improve workflow architecture and security - [HIGH] Fix continue-on-error masking by adding final test result check that fails CI on test failures - [MEDIUM] Move branch sanitization to setup job to reduce performance overhead - [MEDIUM] Add compatibility-date to Cloudflare deployment for stability - [LOW] Extract date format to environment variable to follow DRY principle - [LOW] Quote shell variables properly to prevent word splitting - [LOW] Update documentation to use dynamic branch-specific URLs Addresses all security, performance, and code quality issues raised in automated PR review. Maintains test report deployment while ensuring CI integrity. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * chore(test-ui.yaml): replace loading emoji with an image for better visual consistency in test logs style(test-ui.yaml): clean up whitespace in the workflow file for improved readability * style(test-ui.yaml): format message to combine two lines into one for better readability * chore(test-ui.yaml): add a blank line for better readability in the workflow file * style(test-ui.yaml): update loading image alt text and format messages for better readability in GitHub Actions workflow * [architecture] Separate test execution from deployment - clean CI design BREAKING: Remove continue-on-error from test execution for proper CI integrity **Clean Architecture Changes:** - Remove `continue-on-error: true` from Playwright test execution - Create separate `deploy-reports` job that always runs for debugging - Test jobs now properly fail when tests fail (maintains CI integrity) - Reports still deploy for debugging via dedicated deployment job - Capture and pass actual exit codes between jobs via artifacts **Benefits:** - ✅ CI fails when tests fail (no longer masked) - ✅ Reports still deploy for debugging regardless of test outcome - ✅ Clean separation of concerns (test vs deploy responsibilities) - ✅ Proper job dependencies and error handling - ✅ Individual browser test results preserved **Job Flow:** 1. `setup` - Cache and prepare environment 2. `playwright-tests` - Run tests, fail if tests fail, upload artifacts 3. `deploy-reports` - Always deploy reports using artifacts (parallel) 4. `comment-summary` - Generate summary and fail workflow if needed This addresses the high-priority architecture concern about continue-on-error masking test failures while maintaining report deployment functionality. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * [refactor] Simplify deployment architecture - remove over-engineering **Reverted to clean, simple approach based on feedback:** 1. ✅ **Faster deployment** - Deploy immediately after each test (no waiting for matrix completion) 2. ✅ **Remove unnecessary GITHUB_OUTPUT** - Don't save exit codes, use step.conclusion instead 3. ✅ **Single job approach** - Use `if: always()` instead of separate deploy-reports job **Key Changes:** - Removed separate `deploy-reports` job (86 lines deleted!) - Deploy in same job with `if: always()` - much faster - Use `steps.playwright.conclusion` instead of captured exit codes - Cleaner, simpler architecture with same functionality **Benefits:** - 🚀 **Much faster** - Reports deploy immediately per browser, not waiting for all tests - 🧹 **Simpler** - One job handles test + deploy, easier to understand - ✅ **Still maintains CI integrity** - Tests fail properly when they should - 📊 **Reports always deploy** - Available for debugging regardless of test outcome The previous approach was over-engineered. This is much cleaner and faster. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * fix(workflow): reorder condition in PR comment step for clarity and consistency * chore(test-ui.yaml): update deployment command to remove compatibility date for better maintainability docs(test-ui.yaml): add note to always() condition for clarity on artifact upload behavior * [performance] Remove redundant branch sanitization - 75% processing reduction **Issue**: Complex bash string operations running 4 times per build in matrix jobs **Solution**: Remove duplicate branch sanitization, use pre-computed value from setup job **Before**: Branch sanitization ran in both setup job AND each matrix job (5 total times) **After**: Branch sanitization runs only once in setup job, reused via outputs **Performance Impact**: - 4 redundant tr/sed operations eliminated (matrix chromium, chromium-2x, chromium-0.5x, mobile-chrome) - 75% reduction in branch name processing overhead - Cleaner, more maintainable code **Implementation**: - Setup job: Computes `sanitized-branch` output once - Matrix jobs: Use `${{ needs.setup.outputs.sanitized-branch }}` directly - No duplicate string processing logic Addresses PR review comment: [performance] medium Priority - Complex bash string operations in GitHub Actions matrix 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * add onRemove invoke to removeWidget method (#5102) * [ci] Add caching support to format and knip commands (#5107) - Enable caching for prettier and knip commands to improve CI performance - Add no-cache variants for consistency with existing lint scripts - Exclude generated type files from prettier formatting - Add .prettiercache to .gitignore for proper cache management Follows the same optimization pattern as ESLint caching from PR #4926. * [chore] ignore ./claude/settings.json (#5110) * refactor readme to suggest deployed reports (#5112) * Update to latest version of workflow icon (#5103) * [refactor] Remove obsolete Kontext Edit Button (#5108) * feat: Remove obsolete Kontext Edit Button Removes the 'Kontext Edit Button' and its associated code, as it has been made obsolete by the new 'Subgraphs + Partial Execution' feature. Fixes #5093 * Update locales [skip ci] --------- Co-authored-by: github-actions <[email protected]> * chore: storybook-doc added (#5122) * [feat] Add enhanced filter UI components with search and clear functionality (#5119) * [feat] Add enhanced filter UI components with search and clear functionality - Add SearchBox, clear all button, and item count to MultiSelect header - Add 'fit-content' size option to button types for flexible sizing - Update SingleSelect and ModelSelector components for consistency - Add localization strings for item selection and clear all functionality Co-Authored-By: Claude <[email protected]> * Update locales [skip ci] --------- Co-authored-by: Claude <[email protected]> Co-authored-by: github-actions <[email protected]> * [ci] Add retry logic to wrangler page deploy step (#5118) - Implement 3-attempt retry mechanism for Cloudflare Pages deployment - Add 10-second delay between retry attempts - Install wrangler globally to ensure CLI availability - Maintain existing functionality while improving stability 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * Remove duplicate semantic labeling from issue templates (#5114) - Remove [Bug] and [Feature] prefixes from titles - Remove enhancement label from feature template Fixes #5100 * [fix] reposition TaskItem info #4996 (#5113) Position sidebar task items at top of tile * Fix/widget ordering consistency (#5106) * 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: Shift+Click+Drag from outputs with Subgraph outputs (#5115) * fix: Handle shift+click+drag to collectively move outputs when connected to a subgraph output * [Bug]: Multiple issues with shift-dragging links to subgraph output node input slots Fixes #4877 When shift clicking, ignore links that are no longer present in the subgraph. * cleanup: Utility function to filter for relevant outputs when shift+clicking * cleanup: Remove some pieces that are redundant in this context. Different enough to warrant not extracting a common function yet. * Add support for high-resolution wheel events (#5092) * Add high res wheel event handling Attempts to resolve high res wheel event handling. First pass. * [Test] Add comprehensive TDD tests for device detection spec * Implement efficient timestamp-based device detection for mouse/trackpad - Add timestamp-based detection without creating timers on every event - Implement 500ms cooldown period to prevent rapid mode switching - Support Linux wheel event buffering with divisibility detection - Maintain backward compatibility with isTrackpadGesture() - All 69 device detection tests passing * Remove magic number and unused code from device detection - Replace hardcoded 500ms with CanvasPointer.trackpadMaxGap constant - Update trackpadMaxGap from 200ms to 500ms for cooldown period - Remove unused lastIntegerDelta property that was only set but never read - Update tests to remove references to removed property * Update old CanvasPointer tests to match new device detection behavior - Update tests to require two-finger panning (deltaX && deltaY) for trackpad detection - Fix expectations to match new default mouse mode behavior - Small values alone no longer automatically mean trackpad - All 15 legacy tests now pass with new implementation * Consolidate CanvasPointer tests and remove redundant test file - Add backward compatibility test to comprehensive test file - Remove old CanvasPointer.test.ts that was created on this branch - Old file had 15 tests, mostly redundant or testing unused features - New comprehensive file now has 70 tests with full coverage - Preserves the only unique test (lastTrackpadEvent backward compatibility) * Simplify conditional assignment with ternary operator * Remove redundant code * Simplify comments to remove redundant explanations for developers * Refactor device detection for improved readability and maintainability * Inline immediately-returned variable for conciseness * Cleanup: Remove redundant code, fix style * Update test expectations * Guard against invalid state in event comparison * Fix node.js setTimeout type issue Caused by node.js types being loaded globally. * Remove any type from unit test * Address PR feedback - Add static value to handle the high-res maximum buffer time. - nits * Fix CopyToClipboard Issue (#5109) * feat: enhance clipboard functionality with fallback support * feat: refactor toast notifications for clipboard copy functionality * refactor: simplify clipboard fallback logic by removing support check * refactor: improve fallback copy textarea styling for better accessibility * [bugfix] Remove empty title field from issue templates (#5136) Removed `title: ''` from bug report and feature request templates 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * [feat] Add comprehensive Storybook stories for custom UI components (#5098) * Allow Macs to zoom with Cmd + wheel (#5143) * Allow Mac to zoom with cmd+wheel * Only zoom when exact modifier pressed * [release] Increment version to 1.26.6 (#5148) Co-authored-by: christian-byrne <[email protected]> * Feature/expanded minimap (#4902) * [feat] Add formatKeySequence function to format keybindings for commands * [feat] Add lock and unlock canvas commands with keybindings and update localization * feat: Implement canvas scale synchronization and zoom level adjustment * feat: Enhance GraphCanvasMenu with zoom controls and improved button functionality * feat: Refactor MiniMap component layout and remove unused bottomPanelStore * feat: Update zoom control shortcuts to use formatted key sequences * feat: Add tests for ZoomControlsModal and enhance GraphCanvasMenu tests * Update locales [skip ci] * Fix browser tests * ui: align minimap properly * Update locales [skip ci] * feat: focus zoom input when zoom modal loads * style: improve styling of zoom controls and add focus effect * fix styling and tests * styling: add divider to graph canvas menu * styling: position minimap properly * styling: add close button for minimap * styling: add horizontal divider to minimap * styling: update minimap toggle button text and remove old styles * Update locales [skip ci] * Update locales [skip ci] * feat: disable canvas menu in viewport settings after zoom adjustments * Update test expectations [skip ci] * fix: update canvas read-only property access to use state object * Update locales [skip ci] * fix: adjust button group and minimap positioning * feat: enhance zoom controls and adjust minimap positioning per PR comments * feat: implement zoom controls composable * feat: add timeout delays for headless tests * fix: update zoom input validation range in applyZoom function * [refactor] Update positioning and styles for GraphCanvasMenu, MiniMap, and ZoomControlsModal components * [refactor] Adjust z-index and positioning for GraphCanvasMenu, MiniMap, and ZoomControlsModal components * [style] Adjust margin for minimap button styles in GraphCanvasMenu component * [refactor] minimap should show on focus mode * [refactor] Update LiteGraphCanvasSplitterOverlay to conditionally render side and bottom panels based on focus mode * [style] Adjust right positioning for MiniMap and ZoomControlsModal components * [style] Adjust right positioning for MiniMap and ZoomControlsModal components --------- Co-authored-by: github-actions <[email protected]> Co-authored-by: Christian Byrne <[email protected]> * [ci] Trigger CI action (#5157) * [ci] Trigger CI action * Update test expectations [skip ci] --------- Co-authored-by: github-actions <[email protected]> * Update SidebarIcon.vue (#5105) Remove the non-wrap nature of text labels for longer labels so they can wrap. * Fix: Search Box Implementation for keyboard shortcut (#5140) * refactor: Move searchbox preference to the searchboxstore * fix: Ensure that the search box uses the preferred implementation. * polish: Open at current mouse location. * [test] add basic unit tests for searchBoxStore * types/testing: Tweak the types and setup for the searchBoxStore tests --------- Co-authored-by: Arjan Singh <[email protected]> * api_nodes: added prices for ByteDance Image nodes (#5152) * [fix] #4468 gracefully handle Firebase auth failure (#5144) * [fix] gracefully handle Firebase auth failure * [test] Add failing tests to reproduce Firebase Auth network issue #4468 Add test cases that demonstrate the current problematic behavior where Firebase Auth makes network requests when offline without graceful error handling, causing toast error messages and degraded offline experience. Tests reproduce: - getIdToken() throwing auth/network-request-failed instead of returning null - getAuthHeader() failing to fallback gracefully when Firebase token refresh fails These tests currently pass by expecting the error to be thrown. After implementing the fix, the tests should be updated to verify graceful handling (returning null instead of throwing). Related to issue #4468: Firebase Auth makes network requests when offline without evicting token 🤖 Generated with Claude Code Co-Authored-By: Claude <[email protected]> * [test] update firebaseAuthStore tests They match the behavior of the implemented solution now * [test] add firebaseAuthStore.getTokenId test for non-network errors * [chore] code review feedback * [test] use FirebaseError Co-authored-by: Alexander Brown <[email protected]> * [fix] remove indentation and fix test --------- Co-authored-by: snomiao <[email protected]> Co-authored-by: Claude <[email protected]> Co-authored-by: Alexander Brown <[email protected]> * [fix] unignore Claude project settings.json (#5171) * Fix/selection toolbox reflow (#5158) * fix: layout perf issue * feat: skip a whole host of transform issues created by the SelectionOverlay and instead allowing the canvas to render the overlay and then injecting props to the SelecitonToolbox itself * refactor: removed unused files/functionality * refactor: removed unused types * fix: z index issue * fix: PR feedback * fix: PR feedback and more perf improvements * Update test expectations [skip ci] --------- Co-authored-by: github-actions <[email protected]> * [ci] Make Chromatic and Playwright comment steps safe to fail (#5156) Add continue-on-error: true to all PR comment steps in both chromatic.yaml and test-ui.yaml workflows to prevent GitHub API permission errors (403) from blocking essential CI processes. Changes: - chromatic.yaml: Added continue-on-error to 2 comment steps - test-ui.yaml: Added continue-on-error to 4 comment steps This ensures that visual testing (Chromatic) and browser testing (Playwright) continue to run even when PR commenting fails due to token permissions. Fixes #5149 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * [ci] Restrict chromatic workflow to version-bump-* PRs and manual triggers (#5167) - Remove automatic trigger on push to main - Add workflow_dispatch for manual triggering - Add conditional to only run for PRs from version-bump-* branches - Reduces unnecessary Chromatic builds on regular PRs 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * [tests] update selection overlay tests after canvas migration (#5173) * [fix] update selection overlay tests after canvas migration Update browser tests to work with canvas-based selection overlay introduced in PR #5158. Replaces DOM-based .selection-overlay-container checks with .selection-toolbox visibility and converts border visibility tests to canvas screenshot comparisons. Fixes #5158 * [chore] remove unused file flagged by knip * [fix] adjust test expectations for canvas-based positioning - Skip animated webp test unrelated to selection overlay changes - Update toolbox position expectations to match canvas-based coordinates - Canvas positioning uses different coordinate system than DOM overlay * [fix] improve positioning test flexibility and revert webp skip - Make toolbox position test more flexible for canvas-based coordinates - Revert animated webp test skip as requested in review - Canvas positioning varies more than DOM, use reasonable bounds instead * Update test expectations…
Summary
Implementation of custom UI components for the design system, including buttons, cards, and input components.
Changes
Button Components
BaseButtonProps
interfaceIconButton
,TextButton
,IconTextButton
componentsMoreButton
with popover functionalityIconGroup
for grouping icon buttonsCard Components
CardContainer
with flexible aspect ratiosCardTop
with overlay slots for corner positioningCardBottom
,CardTitle
,CardDescription
componentsInput Components
SearchBox
with icon supportSingleSelect
dropdown componentMultiSelect
for multiple selectionsOther Components
SquareTag
component for labels/badgesTesting
Components are demonstrated in
ModelSelector
widget with various examples.Next Steps
design-system.webm
🤖 Generated with Claude Code
┆Issue is synchronized with this Notion page by Unito