Skip to content

Conversation

@Myestery
Copy link
Collaborator

@Myestery Myestery commented Nov 7, 2025

This pull request introduces a new extensible system for adding custom action bar buttons to the top menu, and demonstrates its use by adding a cloud feedback button. The changes include defining a new ActionBarButton type, updating the extension system to support action bar buttons, creating a Pinia store to aggregate buttons from extensions, and updating the UI to render these buttons in the top menu. The cloud feedback button is now conditionally loaded for cloud environments.

Extensible Action Bar Button System

  • Defined a new ActionBarButton interface in comfy.ts for describing buttons (icon, label, tooltip, class, click handler) and added an actionBarButtons property to the ComfyExtension interface to allow extensions to contribute buttons. [[1]](diffhunk://#diff-c29886a1b0c982c6fff3545af0ca
Screenshot 2025-11-07 at 01 07 36 8ec269876c2cf3948f867d08c14032c04d66R60-R82) [[2]](https://github.com//pull/6626/files#diff-c29886a1b0c982c6fff3545af0ca8ec269876c2cf3948f867d08c14032c04d66R128-R131) * Created a Pinia store (`actionBarButtonStore.ts`) that collects all action bar buttons from registered extensions for use in the UI.

UI Integration

  • Added a new ActionBarButtons.vue component that renders all action bar buttons using the store, and integrated it into the top menu section (TopMenuSection.vue). [1] [2] [3]

Cloud Feedback Button Extension

  • Implemented a new extension (cloudFeedbackTopbarButton.ts) that registers a "Feedback" button opening the Zendesk feedback page, and ensured it loads only in cloud environments. [1] [2]

┆Issue is synchronized with this Notion page by Unito

Add new ActionBarButton interface with support for:
- Lucide icon integration
- Optional label text
- Custom CSS classes
- Tooltip support
- Click handlers
Create Pinia store to aggregate action bar buttons from all extensions.
Uses computed property to dynamically collect buttons from extension store.
Create component to render action bar buttons with:
- Lucide icon support via template slot
- Optional label display
- Custom styling via class prop
- Secondary severity for neutral colors
- Tooltip support
Add ActionBarButtons component at the start of the action bar container.
Buttons will appear before legacy elements, ComfyActionbar, and user controls.
Add cloud-only extension that registers a feedback button in the action bar.
- Uses message-circle-question-mark Lucide icon
- Opens Zendesk feedback URL in new tab
- Displays 'Feedback' label
Import cloudFeedbackTopbarButton extension.
Extension loads unconditionally to support action bar buttons API.
@github-actions
Copy link

github-actions bot commented Nov 7, 2025

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 11/07/2025, 06:29:46 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Nov 7, 2025

🎭 Playwright Test Results

⚠️ Tests passed with flaky tests

⏰ Completed at: 11/07/2025, 06:46:51 AM UTC

📈 Summary

  • Total Tests: 499
  • Passed: 466 ✅
  • Failed: 0
  • Flaky: 3 ⚠️
  • Skipped: 30 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 457 / ❌ 0 / ⚠️ 3 / ⏭️ 30
  • chromium-2x: View Report • ✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • chromium-0.5x: View Report • ✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • mobile-chrome: View Report • ✅ 6 / ❌ 0 / ⚠️ 0 / ⏭️ 0

🎉 Click on the links above to view detailed test results for each browser configuration.

Replace hardcoded 'Feedback' string with t('g.feedback') translation.
Ensures proper localization support for the feedback button.
@github-actions
Copy link

github-actions bot commented Nov 7, 2025

Bundle Size Report

Summary

  • Raw size: 12.2 MB baseline 12.2 MB — 🔴 +1.72 kB
  • Gzip: 2.49 MB baseline 2.49 MB — 🔴 +281 B
  • Brotli: 1.96 MB baseline 1.96 MB — 🔴 +470 B
  • Bundles: 58 current • 58 baseline • 13 added / 13 removed

Category Glance
Graph Workspace 🔴 +1.66 kB (795 kB) · App Entry Points 🔴 +55 B (3.25 MB) · Panels & Settings 🟢 -2 B (293 kB) · Vendor & Third-Party ⚪ 0 B (5.32 MB) · Other ⚪ 0 B (2.55 MB) · UI Components ⚪ 0 B (12.6 kB) · + 3 more

Per-category breakdown
App Entry Points — 3.25 MB (baseline 3.25 MB) • 🔴 +55 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-D8WwQ-oy.js (new) 2.87 MB 🔴 +2.87 MB 🔴 +594 kB 🔴 +450 kB
assets/index-ClNke0eS.js (removed) 2.87 MB 🟢 -2.87 MB 🟢 -594 kB 🟢 -450 kB
assets/index-Dxx5BdQT.js (new) 382 kB 🔴 +382 kB 🔴 +76.6 kB 🔴 +62.1 kB
assets/index-gDgWDdXR.js (removed) 382 kB 🟢 -382 kB 🟢 -76.6 kB 🟢 -62.1 kB
assets/index-B1j-Scw7.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +574 B 🔴 +486 B
assets/index-CgAcyyB0.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -572 B 🟢 -483 B

Status: 3 added / 3 removed

Graph Workspace — 795 kB (baseline 793 kB) • 🔴 +1.66 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-DMnY-b8Z.js (new) 795 kB 🔴 +795 kB 🔴 +155 kB 🔴 +120 kB
assets/GraphView-DE-9CzoN.js (removed) 793 kB 🟢 -793 kB 🟢 -155 kB 🟢 -119 kB

Status: 1 added / 1 removed

Views & Navigation — 8.18 kB (baseline 8.18 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/UserSelectView-BP9RZOpU.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.48 kB 🟢 -2.17 kB
assets/UserSelectView-CE6pbXsB.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.48 kB 🔴 +2.17 kB

Status: 1 added / 1 removed

Panels & Settings — 293 kB (baseline 293 kB) • 🟢 -2 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CreditsPanel-CfcYivuV.js (new) 23 kB 🔴 +23 kB 🔴 +5.48 kB 🔴 +4.79 kB
assets/CreditsPanel-Chgiemi-.js (removed) 23 kB 🟢 -23 kB 🟢 -5.48 kB 🟢 -4.79 kB
assets/KeybindingPanel-BTITBv1P.js (removed) 15.3 kB 🟢 -15.3 kB 🟢 -3.78 kB 🟢 -3.33 kB
assets/KeybindingPanel-DrnHVB6G.js (new) 15.3 kB 🔴 +15.3 kB 🔴 +3.78 kB 🔴 +3.33 kB
assets/ExtensionPanel-CHNH7Hj4.js (removed) 12.1 kB 🟢 -12.1 kB 🟢 -2.84 kB 🟢 -2.51 kB
assets/ExtensionPanel-BUXSBP9a.js (new) 12.1 kB 🔴 +12.1 kB 🔴 +2.84 kB 🔴 +2.5 kB
assets/AboutPanel-BnB4jRl3.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -2.67 kB 🟢 -2.34 kB
assets/AboutPanel-Dy5Qivlu.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +2.67 kB 🔴 +2.34 kB
assets/ServerConfigPanel-BqgcKN07.js (removed) 8.23 kB 🟢 -8.23 kB 🟢 -2.17 kB 🟢 -1.92 kB
assets/ServerConfigPanel-DC3cfasm.js (new) 8.23 kB 🔴 +8.23 kB 🔴 +2.17 kB 🔴 +1.91 kB
assets/UserPanel-BWgIYUSd.js (new) 7.94 kB 🔴 +7.94 kB 🔴 +2.07 kB 🔴 +1.81 kB
assets/UserPanel-DFX-7tA_.js (removed) 7.94 kB 🟢 -7.94 kB 🟢 -2.07 kB 🟢 -1.81 kB
assets/settings-0O6mq5to.js 24.3 kB 24.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BYaBy7dC.js 20.4 kB 20.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C3vygQN4.js 25.7 kB 25.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CbKYXyH0.js 22.7 kB 22.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCholIsI.js 25 kB 25 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DFX7vRkK.js 19.8 kB 19.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-INJLrcmT.js 31.3 kB 31.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-iR6BKRXe.js 23.7 kB 23.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-YjQmudNE.js 23.5 kB 23.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

UI Components — 12.6 kB (baseline 12.6 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-Djl0izZS.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -2.83 kB 🟢 -2.49 kB
assets/ComfyQueueButton-LJd91Jfs.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +2.83 kB 🔴 +2.49 kB
assets/UserAvatar.vue_vue_type_script_setup_true_lang-D2s8tnS2.js 1.26 kB 1.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

Data & Services — 10.4 kB (baseline 10.4 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/keybindingService-BZ9kWkFH.js (removed) 7.6 kB 🟢 -7.6 kB 🟢 -1.84 kB 🟢 -1.58 kB
assets/keybindingService-C6LsmeyG.js (new) 7.6 kB 🔴 +7.6 kB 🔴 +1.84 kB 🔴 +1.58 kB
assets/serverConfigStore-BOo8M-7s.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

Utilities & Hooks — 1.07 kB (baseline 1.07 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/mathUtil-CTARWQ-l.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Vendor & Third-Party — 5.32 MB (baseline 5.32 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-Bfb5Ofrh.js 3.22 MB 3.22 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-PESgPnbc.js 517 B 517 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-JDoAqkQm.js 1.37 MB 1.37 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-Dvg9y4X0.js 232 kB 232 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-SdQKVoRx.js 92.6 kB 92.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 2.55 MB (baseline 2.55 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/commands-B2KZRBmX.js 15.1 kB 15.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Bw-ckyga.js 13.9 kB 13.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C_NmM85I.js 13.8 kB 13.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CuozCW4W.js 14 kB 14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DGfVUJCR.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-dOJNDogK.js 14.5 kB 14.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwiE551e.js 14.7 kB 14.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Fw7mvqSy.js 13.1 kB 13.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-FXnO1W4Q.js 13.2 kB 13.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B28vuueQ.js 58.7 kB 58.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B5DMAz5p.js 76.3 kB 76.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B9oeRB3u.js 66.2 kB 66.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BfxLm2q9.js 68.4 kB 68.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bqw7zi8p.js 92.9 kB 92.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CxXcIMmb.js 80.3 kB 80.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DbrkzQIr.js 70.6 kB 70.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DwpdJL5U.js 67.5 kB 67.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-mC3TQk_1.js 59.4 kB 59.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-3I1vPgv4.js 181 kB 181 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B2huPGKQ.js 190 kB 190 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BWugyUzd.js 215 kB 215 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-bXqu6Stq.js 194 kB 194 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CtB2M3sY.js 229 kB 229 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D-rCrn-T.js 200 kB 200 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D38DSnl1.js 179 kB 179 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DAsU52ON.js 192 kB 192 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DnGONaA_.js 196 kB 196 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

@Myestery Myestery marked this pull request as ready for review November 7, 2025 05:48
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Nov 7, 2025
@christian-byrne christian-byrne added the claude-review Add to trigger a PR code review from Claude Code label Nov 7, 2025
Copy link

@claude claude bot left a 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: Cloud feedback Extension (#6626)
Impact: 101 additions, 0 deletions across 6 files

Issue Distribution

  • Critical: 0
  • High: 0
  • Medium: 3
  • Low: 3

Category Breakdown

  • Architecture: 1 issue
  • Security: 1 issue
  • Performance: 1 issue
  • Code Quality: 3 issues

Key Findings

Architecture & Design

The PR introduces a clean extensible system for action bar buttons following established patterns in the ComfyUI frontend. The implementation properly leverages the existing extension system and Pinia stores. However, there's a minor inconsistency in using getter patterns instead of direct property assignment which deviates from other similar extensions.

Security Considerations

The implementation uses window.open() with proper security attributes (noopener, noreferrer), which is good. However, as this pattern may be reused in other extensions, consider establishing a centralized URL handling service to ensure consistent security practices across all external link handling.

Performance Impact

The action bar button store uses Vue's computed property with flatMap, which will recreate the buttons array on any extension store change. For the current scale this is acceptable, but consider memoization if the number of extensions grows significantly.

Integration Points

The implementation integrates well with the existing TopMenuSection component and follows the established pattern for extension-contributed UI elements. The cloud-only loading mechanism ensures proper tree-shaking for OSS builds.

Positive Observations

  • Excellent use of TypeScript interfaces for type safety
  • Proper integration with the i18n system
  • Clean separation of concerns with dedicated store
  • Consistent with existing extension architecture patterns
  • Good use of PrimeVue components and styling conventions
  • Proper conditional loading for cloud environments

References

Next Steps

  1. Address medium priority security and accessibility concerns
  2. Consider architectural consistency improvements
  3. Add comprehensive JSDoc documentation for the new interface
  4. Consider adding unit tests for the new store and component

This is a comprehensive automated review. For architectural decisions requiring human judgment, please request additional manual review.

@github-actions github-actions bot removed the claude-review Add to trigger a PR code review from Claude Code label Nov 7, 2025
@JorgeR81
Copy link

JorgeR81 commented Nov 7, 2025

Looks nice !

But can you add an user option to hide the text and show only the icon ?

I mean, not only for this button, but also other future custom buttons, added this way.

If the custom node developer does not provide an icon, maybe just show the first letter in the text.

Otherwise, the top floating panel will get very large, and we lose the benefits ( extra space ) of having a floating panel, instead of a full length Top bar.

@Myestery
Copy link
Collaborator Author

Myestery commented Nov 7, 2025

Looks nice !

But can you add an user option to hide the text and show only the icon ?

I mean, not only for this button, but also other future custom buttons, added this way.

If the custom node developer does not provide an icon, maybe just show the first letter in the text.

Otherwise, the top floating panel will get very large, and we lose the benefits ( extra space ) of having a floating panel, instead of a full length Top bar.

at the moment, you can pass empty string to either icon or label

Copy link
Contributor

@christian-byrne christian-byrne left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

<div
class="actionbar-container pointer-events-auto flex h-12 items-center rounded-lg border border-[var(--interface-stroke)] px-2 shadow-interface"
>
<ActionBarButtons />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit (non-blocking): Is it worth to do v-if on condition !!button.length?

@Myestery Myestery merged commit 5497970 into main Nov 8, 2025
27 checks passed
@Myestery Myestery deleted the cloud-feedback branch November 8, 2025 11:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants