diff --git a/browser_tests/tests/execution.spec.ts-snapshots/execution-error-unconnected-slot-chromium-linux.png b/browser_tests/tests/execution.spec.ts-snapshots/execution-error-unconnected-slot-chromium-linux.png
index 506563afed..4a88d3524e 100644
Binary files a/browser_tests/tests/execution.spec.ts-snapshots/execution-error-unconnected-slot-chromium-linux.png and b/browser_tests/tests/execution.spec.ts-snapshots/execution-error-unconnected-slot-chromium-linux.png differ
diff --git a/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-default-workflow-mobile-chrome-linux.png b/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-default-workflow-mobile-chrome-linux.png
index a14dfc4d6b..17a7fff7da 100644
Binary files a/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-default-workflow-mobile-chrome-linux.png and b/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-default-workflow-mobile-chrome-linux.png differ
diff --git a/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-empty-canvas-mobile-chrome-linux.png b/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-empty-canvas-mobile-chrome-linux.png
index 35fac8689c..f4098746a9 100644
Binary files a/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-empty-canvas-mobile-chrome-linux.png and b/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-empty-canvas-mobile-chrome-linux.png differ
diff --git a/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-settings-dialog-mobile-chrome-linux.png b/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-settings-dialog-mobile-chrome-linux.png
index 71d6ea44e0..956d2e2e02 100644
Binary files a/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-settings-dialog-mobile-chrome-linux.png and b/browser_tests/tests/mobileBaseline.spec.ts-snapshots/mobile-settings-dialog-mobile-chrome-linux.png differ
diff --git a/browser_tests/tests/saveImageAndWebp.spec.ts-snapshots/save-image-and-webm-preview-chromium-linux.png b/browser_tests/tests/saveImageAndWebp.spec.ts-snapshots/save-image-and-webm-preview-chromium-linux.png
index 39234a5709..b6963a1cd1 100644
Binary files a/browser_tests/tests/saveImageAndWebp.spec.ts-snapshots/save-image-and-webm-preview-chromium-linux.png and b/browser_tests/tests/saveImageAndWebp.spec.ts-snapshots/save-image-and-webm-preview-chromium-linux.png differ
diff --git a/browser_tests/tests/viewport.spec.ts-snapshots/viewport-fits-when-saved-offscreen-chromium-linux.png b/browser_tests/tests/viewport.spec.ts-snapshots/viewport-fits-when-saved-offscreen-chromium-linux.png
index 8e8f67cee2..c41a968470 100644
Binary files a/browser_tests/tests/viewport.spec.ts-snapshots/viewport-fits-when-saved-offscreen-chromium-linux.png and b/browser_tests/tests/viewport.spec.ts-snapshots/viewport-fits-when-saved-offscreen-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png b/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png
index 03778cccb1..b8087b567b 100644
Binary files a/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png and b/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png b/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png
index 8895e37df1..62019162f2 100644
Binary files a/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png and b/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png b/browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png
index 91c6538072..2b9604e686 100644
Binary files a/browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png and b/browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png
index c36ce0b6c1..7862099db4 100644
Binary files a/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png
index 0e3459f306..effab2aaed 100644
Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png
index 4b8801f4d9..d80e18360c 100644
Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png
index 3a67371e12..3eec01379a 100644
Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png
index eb2d6d9247..f699300517 100644
Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png
index ef4e15512e..03889dfeda 100644
Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png
index 594b1ca4d8..3dbef995c3 100644
Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png
index 6dbc07661b..a37c0e7f45 100644
Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png
index 0112675529..b801d57556 100644
Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/node/imagePreview.spec.ts-snapshots/vue-node-multiple-promoted-previews-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/node/imagePreview.spec.ts-snapshots/vue-node-multiple-promoted-previews-chromium-linux.png
index 300adad388..2bbe982db4 100644
Binary files a/browser_tests/tests/vueNodes/interactions/node/imagePreview.spec.ts-snapshots/vue-node-multiple-promoted-previews-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/node/imagePreview.spec.ts-snapshots/vue-node-multiple-promoted-previews-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png
index 4b455b17a1..b34c3b59ae 100644
Binary files a/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png b/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png
index cd6f94f1d7..e20d08c9c2 100644
Binary files a/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png and b/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png differ
diff --git a/browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png
index 553d8be658..ee06a246ea 100644
Binary files a/browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png
index f292b44f8a..79961a32f6 100644
Binary files a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png
index f42c964ea6..9885f3faae 100644
Binary files a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-light-all-colors-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-light-all-colors-chromium-linux.png
index 8fd6b3d4be..6517fef9cc 100644
Binary files a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-light-all-colors-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-light-all-colors-chromium-linux.png differ
diff --git a/browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png
index 8f574ab637..da4a792624 100644
Binary files a/browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png differ
diff --git a/src/components/TopMenuSection.test.ts b/src/components/TopMenuSection.test.ts
index f10e4f577f..ac626a400b 100644
--- a/src/components/TopMenuSection.test.ts
+++ b/src/components/TopMenuSection.test.ts
@@ -166,13 +166,22 @@ describe('TopMenuSection', () => {
})
describe('authentication state', () => {
+ function createLegacyTabBarWrapper() {
+ const pinia = createTestingPinia({ createSpy: vi.fn })
+ const settingStore = useSettingStore(pinia)
+ vi.mocked(settingStore.get).mockImplementation((key) =>
+ key === 'Comfy.UI.TabBarLayout' ? 'Legacy' : undefined
+ )
+ return createWrapper({ pinia })
+ }
+
describe('when user is logged in', () => {
beforeEach(() => {
mockData.isLoggedIn = true
})
it('should display CurrentUserButton and not display LoginButton', () => {
- const wrapper = createWrapper()
+ const wrapper = createLegacyTabBarWrapper()
expect(wrapper.findComponent(CurrentUserButton).exists()).toBe(true)
expect(wrapper.findComponent(LoginButton).exists()).toBe(false)
})
@@ -186,7 +195,7 @@ describe('TopMenuSection', () => {
describe('on desktop platform', () => {
it('should display LoginButton and not display CurrentUserButton', () => {
mockData.isDesktop = true
- const wrapper = createWrapper()
+ const wrapper = createLegacyTabBarWrapper()
expect(wrapper.findComponent(LoginButton).exists()).toBe(true)
expect(wrapper.findComponent(CurrentUserButton).exists()).toBe(false)
})
@@ -194,7 +203,7 @@ describe('TopMenuSection', () => {
describe('on web platform', () => {
it('should not display CurrentUserButton and not display LoginButton', () => {
- const wrapper = createWrapper()
+ const wrapper = createLegacyTabBarWrapper()
expect(wrapper.findComponent(CurrentUserButton).exists()).toBe(false)
expect(wrapper.findComponent(LoginButton).exists()).toBe(false)
})
diff --git a/src/components/TopMenuSection.vue b/src/components/TopMenuSection.vue
index b28cd81bb8..f0e54bdc70 100644
--- a/src/components/TopMenuSection.vue
+++ b/src/components/TopMenuSection.vue
@@ -183,7 +183,7 @@ const isActionbarFloating = computed(
() => isActionbarEnabled.value && !isActionbarDocked.value
)
const isIntegratedTabBar = computed(
- () => settingStore.get('Comfy.UI.TabBarLayout') === 'Integrated'
+ () => settingStore.get('Comfy.UI.TabBarLayout') !== 'Legacy'
)
const { isQueuePanelV2Enabled, isRunProgressBarEnabled } =
useQueueFeatureFlags()
diff --git a/src/components/common/UserAvatar.vue b/src/components/common/UserAvatar.vue
index 1eec243d60..8e68f4fc65 100644
--- a/src/components/common/UserAvatar.vue
+++ b/src/components/common/UserAvatar.vue
@@ -1,6 +1,6 @@
@@ -63,7 +60,6 @@ const { isSmall = false } = defineProps<{
const {
isHelpCenterVisible,
- triggerLocation,
sidebarLocation,
closeHelpCenter,
handleWhatsNewDismissed
@@ -101,25 +97,6 @@ const {
right: 1rem;
}
-.help-center-popup.topbar-right {
- top: 2rem;
- right: 1rem;
- bottom: auto;
- animation: slideInDown 0.2s ease-out;
-}
-
-@keyframes slideInDown {
- from {
- opacity: 0;
- transform: translateY(-20px);
- }
-
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
@keyframes slideInUp {
from {
opacity: 0;
diff --git a/src/components/sidebar/ComfyMenuButton.vue b/src/components/sidebar/ComfyMenuButton.vue
index 6f89e1f7b8..4527b7aa1e 100644
--- a/src/components/sidebar/ComfyMenuButton.vue
+++ b/src/components/sidebar/ComfyMenuButton.vue
@@ -11,12 +11,13 @@
}"
@click="onLogoMenuClick($event)"
>
-
diff --git a/src/components/sidebar/SideToolbar.vue b/src/components/sidebar/SideToolbar.vue
index ad166438a6..93721d4f57 100644
--- a/src/components/sidebar/SideToolbar.vue
+++ b/src/components/sidebar/SideToolbar.vue
@@ -41,7 +41,7 @@
v-if="userStore.isMultiUserServer"
:is-small="isSmall"
/>
-
+
@@ -95,9 +95,6 @@ const sidebarLocation = computed<'left' | 'right'>(() =>
settingStore.get('Comfy.Sidebar.Location')
)
const sidebarStyle = computed(() => settingStore.get('Comfy.Sidebar.Style'))
-const isIntegratedTabBar = computed(
- () => settingStore.get('Comfy.UI.TabBarLayout') === 'Integrated'
-)
const isConnected = computed(
() =>
selectedTab.value ||
diff --git a/src/components/sidebar/SidebarHelpCenterIcon.vue b/src/components/sidebar/SidebarHelpCenterIcon.vue
index fda2330182..1035f73757 100644
--- a/src/components/sidebar/SidebarHelpCenterIcon.vue
+++ b/src/components/sidebar/SidebarHelpCenterIcon.vue
@@ -7,7 +7,7 @@
:icon-badge="shouldShowRedDot ? '•' : ''"
badge-class="-top-1 -right-1 min-w-2 w-2 h-2 p-0 rounded-full text-[0px] bg-[#ff3b30]"
:is-small="isSmall"
- @click="toggleHelpCenter"
+ @click="toggleHelpCenter()"
/>
diff --git a/src/components/topbar/CurrentUserButton.vue b/src/components/topbar/CurrentUserButton.vue
index 1b538a6cae..115ce86933 100644
--- a/src/components/topbar/CurrentUserButton.vue
+++ b/src/components/topbar/CurrentUserButton.vue
@@ -30,7 +30,7 @@
diff --git a/src/components/topbar/TopMenuHelpButton.vue b/src/components/topbar/TopMenuHelpButton.vue
deleted file mode 100644
index 0dd24b0939..0000000000
--- a/src/components/topbar/TopMenuHelpButton.vue
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
diff --git a/src/components/topbar/WorkflowTabs.vue b/src/components/topbar/WorkflowTabs.vue
index 21d265662b..c950972169 100644
--- a/src/components/topbar/WorkflowTabs.vue
+++ b/src/components/topbar/WorkflowTabs.vue
@@ -83,13 +83,18 @@
v-if="isIntegratedTabBar"
class="ml-auto flex shrink-0 items-center gap-2 px-2"
>
-
-
+
+
@@ -102,21 +107,20 @@ import ScrollPanel from 'primevue/scrollpanel'
import SelectButton from 'primevue/selectbutton'
import { computed, nextTick, onUpdated, ref, watch } from 'vue'
import type { WatchStopHandle } from 'vue'
-
import CurrentUserButton from '@/components/topbar/CurrentUserButton.vue'
import LoginButton from '@/components/topbar/LoginButton.vue'
-import TopMenuHelpButton from '@/components/topbar/TopMenuHelpButton.vue'
import WorkflowTab from '@/components/topbar/WorkflowTab.vue'
import Button from '@/components/ui/button/Button.vue'
import { useCurrentUser } from '@/composables/auth/useCurrentUser'
import { useOverflowObserver } from '@/composables/element/useOverflowObserver'
import { useSettingStore } from '@/platform/settings/settingStore'
+import { buildFeedbackUrl } from '@/platform/support/config'
import { useWorkflowService } from '@/platform/workflow/core/services/workflowService'
import type { ComfyWorkflow } from '@/platform/workflow/management/stores/workflowStore'
import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore'
import { useCommandStore } from '@/stores/commandStore'
import { useWorkspaceStore } from '@/stores/workspaceStore'
-import { isDesktop } from '@/platform/distribution/types'
+import { isCloud, isDesktop, isNightly } from '@/platform/distribution/types'
import { whileMouseDown } from '@/utils/mouseDownUtil'
import WorkflowOverflowMenu from './WorkflowOverflowMenu.vue'
@@ -138,8 +142,14 @@ const commandStore = useCommandStore()
const { isLoggedIn } = useCurrentUser()
const isIntegratedTabBar = computed(
- () => settingStore.get('Comfy.UI.TabBarLayout') === 'Integrated'
+ () => settingStore.get('Comfy.UI.TabBarLayout') !== 'Legacy'
)
+const showCurrentUser = computed(() => isCloud || isLoggedIn.value)
+
+const feedbackUrl = buildFeedbackUrl()
+function openFeedback() {
+ window.open(feedbackUrl, '_blank', 'noopener,noreferrer')
+}
const containerRef = ref(null)
const showOverflowArrows = ref(false)
diff --git a/src/composables/useHelpCenter.ts b/src/composables/useHelpCenter.ts
index 20a08b9faa..c6fcbdbf10 100644
--- a/src/composables/useHelpCenter.ts
+++ b/src/composables/useHelpCenter.ts
@@ -5,19 +5,15 @@ import { useSettingStore } from '@/platform/settings/settingStore'
import { useTelemetry } from '@/platform/telemetry'
import { useReleaseStore } from '@/platform/updates/common/releaseStore'
import { useHelpCenterStore } from '@/stores/helpCenterStore'
-import type { HelpCenterTriggerLocation } from '@/stores/helpCenterStore'
import { useConflictAcknowledgment } from '@/workbench/extensions/manager/composables/useConflictAcknowledgment'
import { useConflictDetection } from '@/workbench/extensions/manager/composables/useConflictDetection'
import { useNodeConflictDialog } from '@/workbench/extensions/manager/composables/useNodeConflictDialog'
-export function useHelpCenter(
- triggerFrom: HelpCenterTriggerLocation = 'sidebar'
-) {
+export function useHelpCenter() {
const settingStore = useSettingStore()
const releaseStore = useReleaseStore()
const helpCenterStore = useHelpCenterStore()
- const { isVisible: isHelpCenterVisible, triggerLocation } =
- storeToRefs(helpCenterStore)
+ const { isVisible: isHelpCenterVisible } = storeToRefs(helpCenterStore)
const { shouldShowRedDot: showReleaseRedDot } = storeToRefs(releaseStore)
const conflictDetection = useConflictDetection()
@@ -42,9 +38,9 @@ export function useHelpCenter(
*/
const toggleHelpCenter = () => {
useTelemetry()?.trackUiButtonClicked({
- button_id: `${triggerFrom}_help_center_toggled`
+ button_id: 'sidebar_help_center_toggled'
})
- helpCenterStore.toggle(triggerFrom)
+ helpCenterStore.toggle()
}
const closeHelpCenter = () => {
@@ -90,7 +86,6 @@ export function useHelpCenter(
return {
isHelpCenterVisible,
- triggerLocation,
shouldShowRedDot,
sidebarLocation,
toggleHelpCenter,
diff --git a/src/extensions/core/cloudBadges.ts b/src/extensions/core/cloudBadges.ts
index ecf7f0f641..d0a6d0f011 100644
--- a/src/extensions/core/cloudBadges.ts
+++ b/src/extensions/core/cloudBadges.ts
@@ -1,6 +1,7 @@
-import { computed } from 'vue'
-
+import { computed, watch } from 'vue'
import { remoteConfig } from '@/platform/remoteConfig/remoteConfig'
+import { t } from '@/i18n'
+import { useCanvasStore } from '@/renderer/core/canvas/canvasStore'
import { useExtensionService } from '@/services/extensionService'
import type { TopbarBadge } from '@/types/comfy'
@@ -17,16 +18,20 @@ const badges = computed(() => {
tooltip: alert.tooltip
})
}
-
- // Always add cloud badge last (furthest right)
- result.push({
- icon: 'icon-[lucide--cloud]',
- text: 'Comfy Cloud'
- })
-
return result
})
+const canvasStore = useCanvasStore()
+watch(
+ () => canvasStore.canvas,
+ (canvas) => {
+ if (canvas) {
+ canvas.info_text = t('g.comfyCloud')
+ }
+ },
+ { immediate: true }
+)
+
useExtensionService().registerExtension({
name: 'Comfy.Cloud.Badges',
get topbarBadges() {
diff --git a/src/extensions/core/cloudFeedbackTopbarButton.ts b/src/extensions/core/cloudFeedbackTopbarButton.ts
index b19f057a7b..c90e76ad8f 100644
--- a/src/extensions/core/cloudFeedbackTopbarButton.ts
+++ b/src/extensions/core/cloudFeedbackTopbarButton.ts
@@ -1,21 +1,14 @@
import { t } from '@/i18n'
-import { getDistribution, ZENDESK_FIELDS } from '@/platform/support/config'
+import { useSettingStore } from '@/platform/settings/settingStore'
+import { buildFeedbackUrl } from '@/platform/support/config'
import { useExtensionService } from '@/services/extensionService'
import type { ActionBarButton } from '@/types/comfy'
-const ZENDESK_BASE_URL = 'https://support.comfy.org/hc/en-us/requests/new'
-const ZENDESK_FEEDBACK_FORM_ID = '43066738713236'
-
-const distribution = getDistribution()
-const params = new URLSearchParams({
- ticket_form_id: ZENDESK_FEEDBACK_FORM_ID,
- [ZENDESK_FIELDS.DISTRIBUTION]: distribution
-})
-const feedbackUrl = `${ZENDESK_BASE_URL}?${params.toString()}`
+const feedbackUrl = buildFeedbackUrl()
const buttons: ActionBarButton[] = [
{
- icon: 'icon-[lucide--message-circle-question-mark]',
+ icon: 'icon-[lucide--message-square-text]',
label: t('actionbar.feedback'),
tooltip: t('actionbar.feedbackTooltip'),
onClick: () => {
@@ -25,6 +18,10 @@ const buttons: ActionBarButton[] = [
]
useExtensionService().registerExtension({
- name: 'Comfy.Cloud.FeedbackButton',
- actionBarButtons: buttons
+ name: 'Comfy.FeedbackButton',
+ get actionBarButtons() {
+ return useSettingStore().get('Comfy.UI.TabBarLayout') === 'Legacy'
+ ? buttons
+ : []
+ }
})
diff --git a/src/lib/litegraph/src/LGraphCanvas.ts b/src/lib/litegraph/src/LGraphCanvas.ts
index 5974e12934..16295d56ae 100644
--- a/src/lib/litegraph/src/LGraphCanvas.ts
+++ b/src/lib/litegraph/src/LGraphCanvas.ts
@@ -559,6 +559,8 @@ export class LGraphCanvas implements CustomEventDispatcher
clear_background_color: string
render_only_selected: boolean
show_info: boolean
+ /** Additional text appended to the canvas info overlay (rendered by {@link renderInfo}). */
+ info_text: string | undefined
allow_dragcanvas: boolean
allow_dragnodes: boolean
allow_interaction: boolean
@@ -5180,8 +5182,10 @@ export class LGraphCanvas implements CustomEventDispatcher
* draws some useful stats in the corner of the canvas
*/
renderInfo(ctx: CanvasRenderingContext2D, x: number, y: number): void {
+ const lineHeight = 13
+ const lineCount = (this.graph ? 5 : 1) + (this.info_text ? 1 : 0)
x = x || 10
- y = y || this.canvas.offsetHeight - 80
+ y = y || this.canvas.offsetHeight - (lineCount + 1) * lineHeight
ctx.save()
ctx.translate(x, y)
@@ -5189,18 +5193,26 @@ export class LGraphCanvas implements CustomEventDispatcher
ctx.font = `10px ${LiteGraph.DEFAULT_FONT}`
ctx.fillStyle = '#888'
ctx.textAlign = 'left'
+ let line = 1
if (this.graph) {
- ctx.fillText(`T: ${this.graph.globaltime.toFixed(2)}s`, 5, 13 * 1)
- ctx.fillText(`I: ${this.graph.iteration}`, 5, 13 * 2)
+ ctx.fillText(
+ `T: ${this.graph.globaltime.toFixed(2)}s`,
+ 5,
+ lineHeight * line++
+ )
+ ctx.fillText(`I: ${this.graph.iteration}`, 5, lineHeight * line++)
ctx.fillText(
`N: ${this.graph._nodes.length} [${this.visible_nodes.length}]`,
5,
- 13 * 3
+ lineHeight * line++
)
- ctx.fillText(`V: ${this.graph._version}`, 5, 13 * 4)
- ctx.fillText(`FPS:${this.fps.toFixed(2)}`, 5, 13 * 5)
+ ctx.fillText(`V: ${this.graph._version}`, 5, lineHeight * line++)
+ ctx.fillText(`FPS:${this.fps.toFixed(2)}`, 5, lineHeight * line++)
} else {
- ctx.fillText('No graph selected', 5, 13 * 1)
+ ctx.fillText('No graph selected', 5, lineHeight * line++)
+ }
+ if (this.info_text) {
+ ctx.fillText(this.info_text, 5, lineHeight * line++)
}
ctx.restore()
}
diff --git a/src/locales/ar/main.json b/src/locales/ar/main.json
index fc649d931a..edd8989edd 100644
--- a/src/locales/ar/main.json
+++ b/src/locales/ar/main.json
@@ -1855,7 +1855,6 @@
"execute": "تنفيذ",
"fullscreen": "ملء الشاشة",
"help": "مساعدة",
- "helpAndFeedback": "المساعدة والتعليقات",
"hideMenu": "إخفاء القائمة",
"instant": "فوري",
"instantTooltip": "سيتم وضع سير العمل في قائمة الانتظار فور انتهاء التوليد",
diff --git a/src/locales/en/main.json b/src/locales/en/main.json
index 024ef47a2c..9e19cb6de5 100644
--- a/src/locales/en/main.json
+++ b/src/locales/en/main.json
@@ -301,6 +301,7 @@
"1x": "1x",
"2x": "2x",
"beta": "BETA",
+ "comfyCloud": "Comfy Cloud",
"nightly": "NIGHTLY",
"profile": "Profile",
"noItems": "No items",
@@ -968,7 +969,6 @@
"customNodesManager": "Custom Nodes Manager",
"settings": "Settings",
"help": "Help",
- "helpAndFeedback": "Help & Feedback",
"queue": "Queue Panel",
"fullscreen": "Fullscreen"
},
diff --git a/src/locales/es/main.json b/src/locales/es/main.json
index 9d156bfc4a..680d555c76 100644
--- a/src/locales/es/main.json
+++ b/src/locales/es/main.json
@@ -1855,7 +1855,6 @@
"execute": "Ejecutar",
"fullscreen": "Pantalla completa",
"help": "Ayuda",
- "helpAndFeedback": "Ayuda y comentarios",
"hideMenu": "Ocultar menú",
"instant": "Instantáneo",
"instantTooltip": "El flujo de trabajo se encolará instantáneamente después de que finalice una generación",
diff --git a/src/locales/fa/main.json b/src/locales/fa/main.json
index 36dceb7496..ca32e54d98 100644
--- a/src/locales/fa/main.json
+++ b/src/locales/fa/main.json
@@ -1855,7 +1855,6 @@
"execute": "اجرا",
"fullscreen": "تمامصفحه",
"help": "راهنما",
- "helpAndFeedback": "راهنما و بازخورد",
"hideMenu": "مخفی کردن منو",
"instant": "فوری",
"instantTooltip": "workflow بلافاصله پس از پایان تولید در صف قرار میگیرد",
diff --git a/src/locales/fr/main.json b/src/locales/fr/main.json
index 210bacbba9..909db73f2b 100644
--- a/src/locales/fr/main.json
+++ b/src/locales/fr/main.json
@@ -1855,7 +1855,6 @@
"execute": "Exécuter",
"fullscreen": "Plein écran",
"help": "Aide",
- "helpAndFeedback": "Aide et commentaires",
"hideMenu": "Masquer le menu",
"instant": "Instantané",
"instantTooltip": "Le flux de travail sera mis en file d'attente immédiatement après la fin d'une génération",
diff --git a/src/locales/ja/main.json b/src/locales/ja/main.json
index 5e80951b4b..b15483cb04 100644
--- a/src/locales/ja/main.json
+++ b/src/locales/ja/main.json
@@ -1855,7 +1855,6 @@
"execute": "実行",
"fullscreen": "全画面表示",
"help": "ヘルプ",
- "helpAndFeedback": "ヘルプとフィードバック",
"hideMenu": "メニューを隠す",
"instant": "即時",
"instantTooltip": "生成完了後すぐにキューに追加",
diff --git a/src/locales/ko/main.json b/src/locales/ko/main.json
index e4944e4c11..8c0c23753a 100644
--- a/src/locales/ko/main.json
+++ b/src/locales/ko/main.json
@@ -1855,7 +1855,6 @@
"execute": "실행",
"fullscreen": "전체 화면",
"help": "도움말",
- "helpAndFeedback": "도움말 및 피드백",
"hideMenu": "메뉴 숨기기",
"instant": "즉시",
"instantTooltip": "워크플로 실행이 완료되면 즉시 실행 대기열에 추가합니다.",
diff --git a/src/locales/pt-BR/main.json b/src/locales/pt-BR/main.json
index 5a69e6a4c3..9e016e13d1 100644
--- a/src/locales/pt-BR/main.json
+++ b/src/locales/pt-BR/main.json
@@ -1855,7 +1855,6 @@
"execute": "Executar",
"fullscreen": "Tela cheia",
"help": "Ajuda",
- "helpAndFeedback": "Ajuda e feedback",
"hideMenu": "Ocultar menu",
"instant": "Instantâneo",
"instantTooltip": "O fluxo de trabalho será enfileirado instantaneamente após uma geração terminar",
diff --git a/src/locales/ru/main.json b/src/locales/ru/main.json
index e3d10c976d..5f60165232 100644
--- a/src/locales/ru/main.json
+++ b/src/locales/ru/main.json
@@ -1855,7 +1855,6 @@
"execute": "Выполнить",
"fullscreen": "Полноэкранный режим",
"help": "Справка",
- "helpAndFeedback": "Помощь и обратная связь",
"hideMenu": "Скрыть меню",
"instant": "Мгновенно",
"instantTooltip": "Рабочий процесс будет помещён в очередь сразу же после завершения генерации",
diff --git a/src/locales/tr/main.json b/src/locales/tr/main.json
index 0aa836225e..ff1fcb85dd 100644
--- a/src/locales/tr/main.json
+++ b/src/locales/tr/main.json
@@ -1855,7 +1855,6 @@
"execute": "Yürüt",
"fullscreen": "Tam ekran",
"help": "Yardım",
- "helpAndFeedback": "Yardım ve Geri Bildirim",
"hideMenu": "Menüyü Gizle",
"instant": "Anında",
"instantTooltip": "İş akışı, bir oluşturma işlemi bittikten sonra anında kuyruğa alınacak",
diff --git a/src/locales/zh-TW/main.json b/src/locales/zh-TW/main.json
index d192500c38..1d319c576c 100644
--- a/src/locales/zh-TW/main.json
+++ b/src/locales/zh-TW/main.json
@@ -1855,7 +1855,6 @@
"execute": "執行",
"fullscreen": "全螢幕",
"help": "說明",
- "helpAndFeedback": "說明與回饋",
"hideMenu": "隱藏選單",
"instant": "立即",
"instantTooltip": "每次產生完成後,工作流程會立即排入佇列",
diff --git a/src/locales/zh/main.json b/src/locales/zh/main.json
index afd8ef753a..715f09952b 100644
--- a/src/locales/zh/main.json
+++ b/src/locales/zh/main.json
@@ -1855,7 +1855,6 @@
"execute": "执行",
"fullscreen": "全屏",
"help": "说明",
- "helpAndFeedback": "帮助与反馈",
"hideMenu": "隐藏菜单",
"instant": "实时",
"instantTooltip": "工作流将会在生成完成后立即执行",
diff --git a/src/platform/settings/constants/coreSettings.ts b/src/platform/settings/constants/coreSettings.ts
index cc55671f3d..b65c52a3d2 100644
--- a/src/platform/settings/constants/coreSettings.ts
+++ b/src/platform/settings/constants/coreSettings.ts
@@ -570,10 +570,11 @@ export const CORE_SETTINGS: SettingParams[] = [
category: ['Appearance', 'General'],
name: 'Tab Bar Layout',
type: 'combo',
- options: ['Default', 'Integrated'],
- tooltip:
- 'Controls the layout of the tab bar. "Integrated" moves Help and User controls into the tab bar area.',
- defaultValue: 'Default'
+ options: ['Default', 'Legacy'],
+ tooltip: 'Controls the elements contained in the integrated tab bar.',
+ defaultValue: 'Default',
+ migrateDeprecatedValue: (value: unknown) =>
+ value === 'Integrated' ? 'Default' : value
},
{
id: 'Comfy.UseNewMenu',
diff --git a/src/platform/support/config.ts b/src/platform/support/config.ts
index b93690c8a1..349bfb1ec9 100644
--- a/src/platform/support/config.ts
+++ b/src/platform/support/config.ts
@@ -3,7 +3,7 @@ import { isCloud, isNightly } from '@/platform/distribution/types'
/**
* Zendesk ticket form field IDs.
*/
-export const ZENDESK_FIELDS = {
+const ZENDESK_FIELDS = {
/** Distribution tag (cloud vs OSS) */
DISTRIBUTION: 'tf_42243568391700',
/** User email (anonymous requester) */
@@ -18,13 +18,25 @@ export const ZENDESK_FIELDS = {
* Gets the distribution identifier for Zendesk tracking.
* Helps distinguish feedback from different build types.
*/
-export function getDistribution(): 'ccloud' | 'oss-nightly' | 'oss' {
+function getDistribution(): 'ccloud' | 'oss-nightly' | 'oss' {
if (isCloud) return 'ccloud'
if (isNightly) return 'oss-nightly'
return 'oss'
}
const SUPPORT_BASE_URL = 'https://support.comfy.org/hc/en-us/requests/new'
+const ZENDESK_FEEDBACK_FORM_ID = '43066738713236'
+
+/**
+ * Builds the feedback form URL with the appropriate distribution tag.
+ */
+export function buildFeedbackUrl(): string {
+ const params = new URLSearchParams({
+ ticket_form_id: ZENDESK_FEEDBACK_FORM_ID,
+ [ZENDESK_FIELDS.DISTRIBUTION]: getDistribution()
+ })
+ return `${SUPPORT_BASE_URL}?${params.toString()}`
+}
/**
* Builds the support URL with optional user information for pre-filling.
diff --git a/src/platform/workspace/components/WorkspaceProfilePic.vue b/src/platform/workspace/components/WorkspaceProfilePic.vue
index bc147a61c6..416a75e922 100644
--- a/src/platform/workspace/components/WorkspaceProfilePic.vue
+++ b/src/platform/workspace/components/WorkspaceProfilePic.vue
@@ -1,6 +1,6 @@