## Summary
Fixes missing cloud badges and server health alerts when workflow tabs
are in the second-row position.
## Problem
Badges were only visible when `Comfy.Workflow.WorkflowTabsPosition` was
set to `'Topbar'`, but not when set to `'Topbar (2nd-row)'` which is the
**default for screens < 1536px wide** on rh-test.
The `SecondRowWorkflowTabs.vue` component only rendered `<WorkflowTabs
/>` but was missing `<TopbarBadges />`.
## Changes
- Added `<TopbarBadges />` component to `SecondRowWorkflowTabs.vue`
- Updated container to use flex layout to match other topbar badge
implementations
- Badges now display in both 'Topbar' and 'Topbar (2nd-row)' positions
## Testing
- Cloud badges should now be visible on screens < 1536px wide (default
setting)
- Server health alerts from remote config should display properly in
second-row tabs
## Note
This is an **rh-test only** issue. The main branch removed the 'Topbar
(2nd-row)' option in the Floating Menus PR (#5980).
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6515-fix-add-cloud-badges-and-server-health-alerts-to-second-row-workflow-tabs-29e6d73d365081c4a4defaf97d2e789e)
by [Unito](https://www.unito.io)
Co-authored-by: Christian Byrne <c.byrne@comfy.org>
## Summary
Adds mixpanel telemetry with goal of: "We currently only know when a
user opens a template workflow. But we also want to know if they failed
to find what they want"
Example mixpanel query:
```
app:template_library_closed
WHERE template_selected = false AND time_spent_seconds >= 10
```
But can drill down further into what filters were selected etc to answer what they were looking for but couldn't find.
```
1. Event: app:template_filter_changed
2. Filter:
- Add formula: "Where user also triggered app:template_library_closed
with template_selected = false in same session"
3. Breakdown by: search_query
4. Sort by: Total Count (descending)
Search Query Failed Sessions
-----------------------------------
"flux video" 45 times
"sdxl controlnet" 32 times
"upscaler" 28 times
(empty/just filter) 20 times
```
```
Event: app:template_filter_changed
WHERE filtered_count = 0
AND user did app:template_library_closed
with template_selected = false
Breakdown by: search_query
```
etc.
https://www.notion.so/comfy-org/Number-of-users-who-open-the-template-library-and-where-do-they-click-29b6d73d36508044a595c0fb653ca6dc?source=copy_link
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6489-feat-add-telemetry-to-answer-for-user-failed-to-find-template-29d6d73d365081cdad72fd7c6ada5dc7)
by [Unito](https://www.unito.io)
## Summary
Backport of PR #6378 to `rh-test` branch.
## Changes
- Extract credit calculations into useSubscriptionCredits composable
- Extract action handlers into useSubscriptionActions composable
- Add comprehensive component and unit tests
- Update subscription panel layout to match Figma design exactly
- Add proper design tokens for modal card surfaces
- Update terminology from "API Nodes" to "Partner Nodes"
- Make credit breakdown dynamic with real API data
- Add proper loading states and error handling
- Remove unused tailwindcss eslint dependencies
## Conflicts Resolved
- Resolved merge conflicts in `packages/design-system/src/css/style.css`
related to button surface CSS variables
## Test plan
- Existing tests pass
- New tests for subscription composables and components
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6397-Backport-update-subscription-panel-for-new-designs-29c6d73d3650812aaa12ff242fd5e078)
by [Unito](https://www.unito.io)
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Johnpaul Chiwetelu <49923152+Myestery@users.noreply.github.com>
## Summary
Backport of #6269 to rh-test.
Removes the checkbox from the sign up form to simplify the user
experience.
## Changes
- Removed checkbox field from sign up schema
- Updated `SignUpForm.vue` component
- Kept rh-test-specific auth error display
## Conflict Resolution
Manually resolved merge conflict in `SignUpForm.vue`:
- Removed the checkbox as in main
- Preserved the auth error message section that exists on rh-test
The "By clicking 'Next' or 'Sign Up'..." notice already covers the same
information.
Original commit: b1439be7f0
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6271-backport-rh-test-remove-checkbox-from-sign-up-form-2976d73d36508109ba52eab1c80e787f)
by [Unito](https://www.unito.io)
## Summary
Backport of PR #6144 to the `rh-test` branch.
This adds build time feature flags system starting with a flag that
indicates whether subscription is required to use the app. This is only
used on cloud.
## Changes
- Added build feature flags system via `__BUILD_FLAGS__` global
- Added `REQUIRE_SUBSCRIPTION` flag that can be set via environment
variable
- Conditionally load subscription-related components based on the flag
- Updated run button logic to respect the subscription requirement flag
- Updated settings UI to show subscription panel only when required
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6147-Backport-make-require-subscription-toggleable-in-build-to-rh-test-2916d73d365081e89bcfc4502315a812)
by [Unito](https://www.unito.io)
## Summary
Backport of #6064 (subscription page) to the `rh-test` branch.
This PR manually cherry-picks commit
7e1e8e3b65 to the rh-test branch and
resolves merge conflicts that prevented automatic backporting.
## Conflicts Resolved
### 1. `src/components/actionbar/ComfyActionbar.vue`
- **Conflict**: HEAD (rh-test) used `<ComfyQueueButton />` while the
subscription PR introduced `<ComfyRunButton />`
- **Resolution**: Updated to use `<ComfyRunButton />` to include the
subscription functionality wrapper while maintaining the existing
rh-test template structure
### 2. `src/composables/auth/useFirebaseAuthActions.ts`
- **Conflict**: Simple ordering difference in the return statement
- **Resolution**: Used the subscription PR's ordering: `deleteAccount,
accessError, reportError`
## Testing
The cherry-pick completed successfully and passed all pre-commit hooks:
- ✅ ESLint
- ✅ Prettier formatting
- ⚠️ Note: 2 unused i18n keys detected (informational only, same as
original PR)
## Related
- Original PR: #6064
- Cherry-picked commit: 7e1e8e3b65
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6140-backport-subscription-page-to-rh-test-2916d73d365081f38f00df422004f61a)
by [Unito](https://www.unito.io)
Co-authored-by: Terry Jia <terryjia88@gmail.com>
Co-authored-by: GitHub Action <action@github.com>
## Summary
<!-- One sentence describing what changed and why. -->
## Changes
- **What**: <!-- Core functionality added/modified -->
- **Breaking**: <!-- Any breaking changes (if none, remove this line)
-->
- **Dependencies**: <!-- New dependencies (if none, remove this line)
-->
## Review Focus
<!-- Critical design decisions or edge cases that need attention -->
<!-- If this PR fixes an issue, uncomment and update the line below -->
<!-- Fixes #ISSUE_NUMBER -->
## Screenshots (if applicable)
<!-- Add screenshots or video recording to help explain your changes -->
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6043-Comfy-Cloud-Badge-indicator-28b6d73d365081b8b549ecc3beb2c132)
by [Unito](https://www.unito.io)
- Migrate from object-based to array-based history response format
- Update /history endpoint to /history_v2 with max_items parameter
- Add lazy loading of workflows via /history_v2/:prompt_id endpoint
- Implement comprehensive browser tests for history API functionality
- Add unit tests for API methods and queue store
- Update TaskItemImpl to support history workflow loading
- Add proper error handling and edge case coverage
- Follow established test patterns for better maintainability
This change improves performance by reducing initial payload size
and enables on-demand workflow loading for history items.
* [fix] Correct WhatsNew popup arrow alignment with help center icon
The arrow positioning was not accounting for additional sidebar icons (terminal and shortcuts)
that were added below the help center icon, causing misalignment. Updated the calculation to
properly position the arrow relative to the help center icon's current location.
Fixes#5126
* [fix] Update small sidebar arrow positioning and improve center alignment
- Fixed small sidebar rule to use consistent calculation with normal sidebar
- Updated positioning to use half icon height for better center alignment
- Both normal and small sidebar now use dynamic CSS variable calculations
Addresses feedback from review by viva-jinyi on CSS specificity and positioning accuracy.
* [fix] Make sidebar CSS variables global for teleported components
- Move --sidebar-width CSS variable to :root to make it accessible globally
- This allows teleported components like WhatsNewPopup to reference sidebar dimensions
- Adjust arrow positioning calculations for better alignment with help center icon
- Add explanatory comments about why these variables need to be global
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: icon-size should be variable
---------
Co-authored-by: Jin Yi <jin12cc@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
The FirstTimeUIMessage was introduced in November 2024 when the new UI became default, but after 6+ months it's no longer needed as users have adapted to the new interface. The message was confusing for new users who never experienced the old UI.
Changes:
- Remove FirstTimeUIMessage.vue component
- Remove component usage from SettingDialogContent.vue
- Remove 'firstTimeUIMessage' translation key from all locales
- Keep settingStore.exists() method as it's part of the public API
* fix: [@vue/compiler-sfc] defineModel is a compiler macro and no longer needs to be imported.
* fix: Duplicate name conflict/warning from unplugin-vue-components
* fix: enforce correct line endings for the commonjs and esm variants via git
* [fix] Resolve HoverDissolveThumbnail layering issue preventing dissolve effect
- Fix layer stacking problem where LazyImage containers blocked overlay visibility
- Restructure template with separate positioning containers for base and overlay images
- Use z-index to ensure proper layering of overlay image above base image
- Update CSS classes from absolute positioning on images to container-based positioning
- Update test assertions to match new class structure
- Ensure hover dissolve transition works correctly from opacity-0 to opacity-100
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Address code review feedback
- Use size-full instead of w-full h-full for cleaner Tailwind classes
- Update tests to use classList approach instead of string contains
- Maintain same functionality while improving code quality
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: bymyself <cbyrne@comfy.org>
* Add support for custom iconify using tailwind plugin
- Register svgs from custom icons folder
- Update existing custom icons to remove padding
- Swap component icons for classes in sidebar tabs
- Update browse templates in menu to use custom icon
* Add basic check for custom SVG icons
* Remove unused iconify packages
* 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 <github-actions@github.com>
* 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 <arjan@comfy.org>
* [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 <github-actions@github.com>
Co-authored-by: Christian Byrne <cbyrne@comfy.org>
* [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 <noreply@anthropic.com>
* Update locales [skip ci]
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: github-actions <github-actions@github.com>
* 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 <github-actions@github.com>
* [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 <noreply@anthropic.com>
* [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 <noreply@anthropic.com>
* [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 <noreply@anthropic.com>
* [refactor] Remove ts-expect-error comment from Storybook preview
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* [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 <noreply@anthropic.com>
* [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 <noreply@anthropic.com>
* [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 <noreply@anthropic.com>
* 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 <noreply@anthropic.com>
* [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 <noreply@anthropic.com>
* 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 <noreply@anthropic.com>
* 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 <noreply@anthropic.com>
* 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 <noreply@anthropic.com>
* 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 <noreply@anthropic.com>
* feature: storybook-setting (#5088)
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Jin Yi <jin12cc@gmail.com>
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 <noreply@anthropic.com>
* 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