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 @@ 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 @@