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 0bfc41ae2..cea0dd1bd 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/nodeStates/lod.spec.ts b/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts deleted file mode 100644 index 96ab721ca..000000000 --- a/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { expect } from '@playwright/test' - -import { comfyPageFixture as test } from '../../../fixtures/ComfyPage' - -test.beforeEach(async ({ comfyPage }) => { - await comfyPage.setSetting('Comfy.UseNewMenu', 'Disabled') -}) - -test.describe('Vue Nodes - LOD', () => { - test.beforeEach(async ({ comfyPage }) => { - await comfyPage.setSetting('Comfy.VueNodes.Enabled', true) - await comfyPage.setup() - await comfyPage.loadWorkflow('default') - await comfyPage.setSetting('LiteGraph.Canvas.MinFontSizeForLOD', 8) - }) - - test('should toggle LOD based on zoom threshold', async ({ comfyPage }) => { - await comfyPage.vueNodes.waitForNodes() - - const initialNodeCount = await comfyPage.vueNodes.getNodeCount() - expect(initialNodeCount).toBeGreaterThan(0) - - await expect(comfyPage.canvas).toHaveScreenshot('vue-nodes-default.png') - - const vueNodesContainer = comfyPage.vueNodes.nodes - const textboxesInNodes = vueNodesContainer.getByRole('textbox') - const comboboxesInNodes = vueNodesContainer.getByRole('combobox') - - await expect(textboxesInNodes.first()).toBeVisible() - await expect(comboboxesInNodes.first()).toBeVisible() - - await comfyPage.zoom(120, 10) - await comfyPage.nextFrame() - - await expect(comfyPage.canvas).toHaveScreenshot('vue-nodes-lod-active.png') - - await expect(textboxesInNodes.first()).toBeHidden() - await expect(comboboxesInNodes.first()).toBeHidden() - - await comfyPage.zoom(-120, 10) - await comfyPage.nextFrame() - - await expect(comfyPage.canvas).toHaveScreenshot( - 'vue-nodes-lod-inactive.png' - ) - await expect(textboxesInNodes.first()).toBeVisible() - await expect(comboboxesInNodes.first()).toBeVisible() - }) -}) diff --git a/browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png b/browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png index 4950f265b..7cc08fbc5 100644 Binary files a/browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png and b/browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png differ diff --git a/packages/design-system/src/css/style.css b/packages/design-system/src/css/style.css index 9c75987f6..082d1baf1 100644 --- a/packages/design-system/src/css/style.css +++ b/packages/design-system/src/css/style.css @@ -1329,57 +1329,6 @@ audio.comfy-audio.empty-audio-widget { will-change: transform; } -/* START LOD specific styles */ -/* LOD styles - Custom CSS avoids 100+ Tailwind selectors that would slow style recalculation when .isLOD toggles */ - -.isLOD .lg-node { - box-shadow: none; - filter: none; - backdrop-filter: none; - text-shadow: none; - mask-image: none; - clip-path: none; - background-image: none; - text-rendering: optimizeSpeed; - border-radius: 0; - contain: layout style; - transition: none; -} - -.isLOD .lg-node-header { - border-radius: 0; - pointer-events: none; -} - -.isLOD .lg-node-widgets { - pointer-events: none; -} - -.lod-toggle { - visibility: visible; -} - -.isLOD .lod-toggle { - visibility: hidden; -} - -.lod-fallback { - display: none; -} - -.isLOD .lod-fallback { - display: block; -} - -.isLOD .image-preview img { - image-rendering: pixelated; -} - -.isLOD .slot-dot { - border-radius: 0; -} -/* END LOD specific styles */ - /* ===================== Mask Editor Styles ===================== */ /* To be migrated to Tailwind later */ #maskEditor_brush { diff --git a/src/composables/graph/useVueNodeLifecycle.ts b/src/composables/graph/useVueNodeLifecycle.ts index 7f1744014..263df3b79 100644 --- a/src/composables/graph/useVueNodeLifecycle.ts +++ b/src/composables/graph/useVueNodeLifecycle.ts @@ -3,7 +3,6 @@ import { shallowRef, watch } from 'vue' import { useGraphNodeManager } from '@/composables/graph/useGraphNodeManager' import type { GraphNodeManager } from '@/composables/graph/useGraphNodeManager' -import { useRenderModeSetting } from '@/composables/settings/useRenderModeSetting' import { useVueFeatureFlags } from '@/composables/useVueFeatureFlags' import { useVueNodesMigrationDismissed } from '@/composables/useVueNodesMigrationDismissed' import type { LGraphNode } from '@/lib/litegraph/src/litegraph' @@ -26,11 +25,6 @@ function useVueNodeLifecycleIndividual() { let hasShownMigrationToast = false - useRenderModeSetting( - { setting: 'LiteGraph.Canvas.MinFontSizeForLOD', vue: 0, litegraph: 8 }, - shouldRenderVueNodes - ) - const initializeNodeManager = () => { // Use canvas graph if available (handles subgraph contexts), fallback to app graph const activeGraph = comfyApp.canvas?.graph diff --git a/src/composables/settings/useRenderModeSetting.ts b/src/composables/settings/useRenderModeSetting.ts deleted file mode 100644 index 6e97471e2..000000000 --- a/src/composables/settings/useRenderModeSetting.ts +++ /dev/null @@ -1,42 +0,0 @@ -import type { ComputedRef } from 'vue' -import { ref, watch } from 'vue' - -import { useSettingStore } from '@/platform/settings/settingStore' -import type { Settings } from '@/schemas/apiSchema' - -interface RenderModeSettingConfig { - setting: TSettingKey - vue: Settings[TSettingKey] - litegraph: Settings[TSettingKey] -} - -export function useRenderModeSetting( - config: RenderModeSettingConfig, - isVueMode: ComputedRef -) { - const settingStore = useSettingStore() - const vueValue = ref(config.vue) - const litegraphValue = ref(config.litegraph) - const lastWasVue = ref(null) - - const load = async (vue: boolean) => { - if (lastWasVue.value === vue) return - - if (lastWasVue.value !== null) { - const currentValue = settingStore.get(config.setting) - if (lastWasVue.value) { - vueValue.value = currentValue - } else { - litegraphValue.value = currentValue - } - } - - await settingStore.set( - config.setting, - vue ? vueValue.value : litegraphValue.value - ) - lastWasVue.value = vue - } - - watch(isVueMode, load, { immediate: true }) -} diff --git a/src/platform/settings/composables/useSettingSearch.ts b/src/platform/settings/composables/useSettingSearch.ts index c2bf3cfe8..a2d29f2a6 100644 --- a/src/platform/settings/composables/useSettingSearch.ts +++ b/src/platform/settings/composables/useSettingSearch.ts @@ -8,9 +8,11 @@ import { } from '@/platform/settings/settingStore' import type { ISettingGroup, SettingParams } from '@/platform/settings/types' import { normalizeI18nKey } from '@/utils/formatUtil' +import { useVueFeatureFlags } from '@/composables/useVueFeatureFlags' export function useSettingSearch() { const settingStore = useSettingStore() + const { shouldRenderVueNodes } = useVueFeatureFlags() const searchQuery = ref('') const filteredSettingIds = ref([]) @@ -54,7 +56,11 @@ export function useSettingSearch() { const allSettings = Object.values(settingStore.settingsById) const filteredSettings = allSettings.filter((setting) => { // Filter out hidden and deprecated settings, just like in normal settings tree - if (setting.type === 'hidden' || setting.deprecated) { + if ( + setting.type === 'hidden' || + setting.deprecated || + (shouldRenderVueNodes.value && setting.hideInVueNodes) + ) { return false } diff --git a/src/platform/settings/composables/useSettingUI.ts b/src/platform/settings/composables/useSettingUI.ts index a49cccf19..cfeb571db 100644 --- a/src/platform/settings/composables/useSettingUI.ts +++ b/src/platform/settings/composables/useSettingUI.ts @@ -10,6 +10,7 @@ import type { SettingParams } from '@/platform/settings/types' import { isElectron } from '@/utils/envUtil' import { normalizeI18nKey } from '@/utils/formatUtil' import { buildTree } from '@/utils/treeUtil' +import { useVueFeatureFlags } from '@/composables/useVueFeatureFlags' interface SettingPanelItem { node: SettingTreeNode @@ -31,10 +32,14 @@ export function useSettingUI( const settingStore = useSettingStore() const activeCategory = ref(null) + const { shouldRenderVueNodes } = useVueFeatureFlags() + const settingRoot = computed(() => { const root = buildTree( Object.values(settingStore.settingsById).filter( - (setting: SettingParams) => setting.type !== 'hidden' + (setting: SettingParams) => + setting.type !== 'hidden' && + !(shouldRenderVueNodes.value && setting.hideInVueNodes) ), (setting: SettingParams) => setting.category || setting.id.split('.') ) diff --git a/src/platform/settings/constants/coreSettings.ts b/src/platform/settings/constants/coreSettings.ts index 66cb9c310..0931733ea 100644 --- a/src/platform/settings/constants/coreSettings.ts +++ b/src/platform/settings/constants/coreSettings.ts @@ -919,7 +919,8 @@ export const CORE_SETTINGS: SettingParams[] = [ step: 1 }, defaultValue: 8, - versionAdded: '1.26.7' + versionAdded: '1.26.7', + hideInVueNodes: true }, { id: 'Comfy.Canvas.SelectionToolbox', diff --git a/src/platform/settings/types.ts b/src/platform/settings/types.ts index b1efbe9a1..9bd48fc8c 100644 --- a/src/platform/settings/types.ts +++ b/src/platform/settings/types.ts @@ -47,6 +47,7 @@ export interface SettingParams extends FormItem { // sortOrder for sorting settings within a group. Higher values appear first. // Default is 0 if not specified. sortOrder?: number + hideInVueNodes?: boolean } /** diff --git a/src/renderer/core/layout/__tests__/TransformPane.test.ts b/src/renderer/core/layout/__tests__/TransformPane.test.ts index ae18ffbac..310294c5c 100644 --- a/src/renderer/core/layout/__tests__/TransformPane.test.ts +++ b/src/renderer/core/layout/__tests__/TransformPane.test.ts @@ -29,12 +29,6 @@ vi.mock('@/renderer/core/layout/transform/useTransformState', () => { } }) -vi.mock('@/renderer/extensions/vueNodes/lod/useLOD', () => ({ - useLOD: vi.fn(() => ({ - isLOD: false - })) -})) - function createMockCanvas(): LGraphCanvas { return { canvas: { diff --git a/src/renderer/core/layout/transform/TransformPane.vue b/src/renderer/core/layout/transform/TransformPane.vue index e1287e599..edc683572 100644 --- a/src/renderer/core/layout/transform/TransformPane.vue +++ b/src/renderer/core/layout/transform/TransformPane.vue @@ -4,8 +4,7 @@ :class=" cn( 'absolute inset-0 w-full h-full pointer-events-none', - isInteracting ? 'transform-pane--interacting' : 'will-change-auto', - isLOD && 'isLOD' + isInteracting ? 'transform-pane--interacting' : 'will-change-auto' ) " :style="transformStyle" @@ -22,7 +21,6 @@ import { computed } from 'vue' import type { LGraphCanvas } from '@/lib/litegraph/src/litegraph' import { useTransformSettling } from '@/renderer/core/layout/transform/useTransformSettling' import { useTransformState } from '@/renderer/core/layout/transform/useTransformState' -import { useLOD } from '@/renderer/extensions/vueNodes/lod/useLOD' import { cn } from '@/utils/tailwindUtil' interface TransformPaneProps { @@ -31,9 +29,7 @@ interface TransformPaneProps { const props = defineProps() -const { camera, transformStyle, syncWithCanvas } = useTransformState() - -const { isLOD } = useLOD(camera) +const { transformStyle, syncWithCanvas } = useTransformState() const canvasElement = computed(() => props.canvas?.canvas) const { isTransforming: isInteracting } = useTransformSettling(canvasElement, { diff --git a/src/renderer/extensions/vueNodes/VideoPreview.vue b/src/renderer/extensions/vueNodes/VideoPreview.vue index df1609e68..e02d9f15d 100644 --- a/src/renderer/extensions/vueNodes/VideoPreview.vue +++ b/src/renderer/extensions/vueNodes/VideoPreview.vue @@ -83,20 +83,17 @@ -
- -
- - {{ $t('g.errorLoadingVideo') }} - - - {{ $t('g.loading') }}... - - - {{ actualDimensions || $t('g.calculatingDimensions') }} - -
- + +
+ + {{ $t('g.errorLoadingVideo') }} + + + {{ $t('g.loading') }}... + + + {{ actualDimensions || $t('g.calculatingDimensions') }} +
@@ -110,8 +107,6 @@ import { useI18n } from 'vue-i18n' import { downloadFile } from '@/base/common/downloadUtil' import { useNodeOutputStore } from '@/stores/imagePreviewStore' -import LODFallback from './components/LODFallback.vue' - interface VideoPreviewProps { /** Array of video URLs to display */ readonly imageUrls: readonly string[] // Named imageUrls for consistency with parent components diff --git a/src/renderer/extensions/vueNodes/components/ImagePreview.vue b/src/renderer/extensions/vueNodes/components/ImagePreview.vue index 9b1020f94..b7b9bd7b4 100644 --- a/src/renderer/extensions/vueNodes/components/ImagePreview.vue +++ b/src/renderer/extensions/vueNodes/components/ImagePreview.vue @@ -93,20 +93,17 @@ -
- -
- - {{ $t('g.errorLoadingImage') }} - - - {{ $t('g.loading') }}... - - - {{ actualDimensions || $t('g.calculatingDimensions') }} - -
- + +
+ + {{ $t('g.errorLoadingImage') }} + + + {{ $t('g.loading') }}... + + + {{ actualDimensions || $t('g.calculatingDimensions') }} +
@@ -122,8 +119,6 @@ import { app } from '@/scripts/app' import { useCommandStore } from '@/stores/commandStore' import { useNodeOutputStore } from '@/stores/imagePreviewStore' -import LODFallback from './LODFallback.vue' - interface ImagePreviewProps { /** Array of image URLs to display */ readonly imageUrls: readonly string[] diff --git a/src/renderer/extensions/vueNodes/components/InputSlot.vue b/src/renderer/extensions/vueNodes/components/InputSlot.vue index 238a60027..9edeacbf8 100644 --- a/src/renderer/extensions/vueNodes/components/InputSlot.vue +++ b/src/renderer/extensions/vueNodes/components/InputSlot.vue @@ -10,14 +10,13 @@ /> -
+
{{ slotData.localized_name || slotData.name || `Input ${index}` }} -
@@ -37,7 +36,6 @@ import { useSlotLinkInteraction } from '@/renderer/extensions/vueNodes/composabl import { useExecutionStore } from '@/stores/executionStore' import { cn } from '@/utils/tailwindUtil' -import LODFallback from './LODFallback.vue' import SlotConnectionDot from './SlotConnectionDot.vue' interface InputSlotProps { diff --git a/src/renderer/extensions/vueNodes/components/LGraphNode.vue b/src/renderer/extensions/vueNodes/components/LGraphNode.vue index 28aa3ac11..72f1e6c49 100644 --- a/src/renderer/extensions/vueNodes/components/LGraphNode.vue +++ b/src/renderer/extensions/vueNodes/components/LGraphNode.vue @@ -99,18 +99,14 @@ /> -
- - -
diff --git a/src/renderer/extensions/vueNodes/components/LODFallback.vue b/src/renderer/extensions/vueNodes/components/LODFallback.vue deleted file mode 100644 index fcf7ae7a0..000000000 --- a/src/renderer/extensions/vueNodes/components/LODFallback.vue +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/src/renderer/extensions/vueNodes/components/NodeHeader.vue b/src/renderer/extensions/vueNodes/components/NodeHeader.vue index b7f4d9ab7..bb1273e81 100644 --- a/src/renderer/extensions/vueNodes/components/NodeHeader.vue +++ b/src/renderer/extensions/vueNodes/components/NodeHeader.vue @@ -18,7 +18,7 @@
-
+
@@ -57,10 +57,9 @@ />
-
-
+
{{ slotData.localized_name || slotData.name || `Output ${index}` }} -
@@ -91,7 +90,6 @@ import { t } from '@/i18n' import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode' import type { IBaseWidget } from '@/lib/litegraph/src/types/widgets' import { useToastStore } from '@/platform/updates/common/toastStore' -import LODFallback from '@/renderer/extensions/vueNodes/components/LODFallback.vue' import { app } from '@/scripts/app' import { useAudioService } from '@/services/audioService' import type { SimplifiedWidget } from '@/types/simplifiedWidget' diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue index 645549f3f..42bf3d77c 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue @@ -3,9 +3,7 @@