From ff5d0923ca0a45212147a4aaca54e3aba8114aa4 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Tue, 16 Sep 2025 19:28:04 -0700 Subject: [PATCH 01/21] Refactor vue slot tracking (#5463) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add dom element resize observer registry for vue node components * Update src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts Co-authored-by: AustinMroz * refactor(vue-nodes): typed TransformState InjectionKey, safer ResizeObserver sizing, centralized slot tracking, and small readability updates * chore: make TransformState interface non-exported to satisfy knip pre-push * Revert "chore: make TransformState interface non-exported to satisfy knip pre-push" This reverts commit 110ecf31dac3087683d3d53e908dbef3707efa31. * Revert "refactor(vue-nodes): typed TransformState InjectionKey, safer ResizeObserver sizing, centralized slot tracking, and small readability updates" This reverts commit 428752619c2761a6cf10450124a634be7eae667e. * [refactor] Improve resize tracking composable documentation and test utilities - Rename parameters in useVueElementTracking for clarity (appIdentifier, trackingType) - Add comprehensive docstring with examples to prevent DOM attribute confusion - Extract mountLGraphNode test utility to eliminate repetitive mock setup - Add technical implementation notes documenting optimization decisions 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude * remove typo comment * convert to functional bounds collection * remove inline import * add interfaces for bounds mutations * remove change log * fix bounds collection when vue nodes turned off * fix title offset on y * move from resize observer to selection toolbox bounds * refactor(vue-nodes): typed TransformState InjectionKey, safer ResizeObserver sizing, centralized slot tracking, and small readability updates * Fix conversion * Readd padding * revert churn reducings from layoutStore.ts * Rely on RO for resize, and batch * Improve churn * Cache canvas offset * rename from measure * remove unused * address review comments * Update legacy injection * nit * Split into store * nit * perf improvement --------- Co-authored-by: bymyself Co-authored-by: AustinMroz Co-authored-by: Claude --- .../canvas/useSelectionToolboxPosition.ts | 2 + .../element/useCanvasPositionConversion.ts | 17 +- src/composables/useCanvasDrop.ts | 14 +- src/extensions/core/widgetInputs.ts | 4 +- .../workflow/core/services/workflowService.ts | 4 +- src/renderer/core/layout/injectionKeys.ts | 49 ++++ .../layout/slots/useDomSlotRegistration.ts | 229 ------------------ src/renderer/core/layout/store/layoutStore.ts | 84 +++---- .../core/layout/transform/TransformPane.vue | 3 +- src/renderer/core/layout/types.ts | 4 + src/renderer/core/layout/utils/geometry.ts | 15 ++ .../components/InputOutputSlot.test.ts | 25 +- .../vueNodes/components/InputSlot.vue | 21 +- .../vueNodes/components/LGraphNode.vue | 17 +- .../vueNodes/components/OutputSlot.vue | 21 +- .../composables/useSlotElementTracking.ts | 220 +++++++++++++++++ .../composables/useVueNodeResizeTracking.ts | 78 ++++-- .../vueNodes/layout/useNodeLayout.ts | 8 +- .../vueNodes/stores/nodeSlotRegistryStore.ts | 50 ++++ src/services/litegraphService.ts | 4 +- .../utils/migration/migrateReroute.test.ts | 8 +- 21 files changed, 498 insertions(+), 379 deletions(-) create mode 100644 src/renderer/core/layout/injectionKeys.ts delete mode 100644 src/renderer/core/layout/slots/useDomSlotRegistration.ts create mode 100644 src/renderer/core/layout/utils/geometry.ts create mode 100644 src/renderer/extensions/vueNodes/composables/useSlotElementTracking.ts create mode 100644 src/renderer/extensions/vueNodes/stores/nodeSlotRegistryStore.ts diff --git a/src/composables/canvas/useSelectionToolboxPosition.ts b/src/composables/canvas/useSelectionToolboxPosition.ts index 0ea92b92e..963f9c7d2 100644 --- a/src/composables/canvas/useSelectionToolboxPosition.ts +++ b/src/composables/canvas/useSelectionToolboxPosition.ts @@ -102,6 +102,8 @@ export function useSelectionToolboxPosition( worldPosition.value = { x: unionBounds.x + unionBounds.width / 2, + // createBounds() applied a default padding of 10px + // so adjust Y to maintain visual consistency y: unionBounds.y - 10 } diff --git a/src/composables/element/useCanvasPositionConversion.ts b/src/composables/element/useCanvasPositionConversion.ts index e7fb9ad9b..700b64ac4 100644 --- a/src/composables/element/useCanvasPositionConversion.ts +++ b/src/composables/element/useCanvasPositionConversion.ts @@ -1,6 +1,10 @@ import { useElementBounding } from '@vueuse/core' -import type { LGraphCanvas, Vector2 } from '@/lib/litegraph/src/litegraph' +import type { LGraphCanvas, Point } from '@/lib/litegraph/src/litegraph' +import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' + +let sharedConverter: ReturnType | null = + null /** * Convert between canvas and client positions @@ -14,7 +18,7 @@ export const useCanvasPositionConversion = ( ) => { const { left, top, update } = useElementBounding(canvasElement) - const clientPosToCanvasPos = (pos: Vector2): Vector2 => { + const clientPosToCanvasPos = (pos: Point): Point => { const { offset, scale } = lgCanvas.ds return [ (pos[0] - left.value) / scale - offset[0], @@ -22,7 +26,7 @@ export const useCanvasPositionConversion = ( ] } - const canvasPosToClientPos = (pos: Vector2): Vector2 => { + const canvasPosToClientPos = (pos: Point): Point => { const { offset, scale } = lgCanvas.ds return [ (pos[0] + offset[0]) * scale + left.value, @@ -36,3 +40,10 @@ export const useCanvasPositionConversion = ( update } } + +export function useSharedCanvasPositionConversion() { + if (sharedConverter) return sharedConverter + const lgCanvas = useCanvasStore().getCanvas() + sharedConverter = useCanvasPositionConversion(lgCanvas.canvas, lgCanvas) + return sharedConverter +} diff --git a/src/composables/useCanvasDrop.ts b/src/composables/useCanvasDrop.ts index 6d5557bde..cb09207d1 100644 --- a/src/composables/useCanvasDrop.ts +++ b/src/composables/useCanvasDrop.ts @@ -1,5 +1,6 @@ import { Ref } from 'vue' +import { useSharedCanvasPositionConversion } from '@/composables/element/useCanvasPositionConversion' import { usePragmaticDroppable } from '@/composables/usePragmaticDragAndDrop' import { LGraphNode } from '@/lib/litegraph/src/litegraph' import { LiteGraph } from '@/lib/litegraph/src/litegraph' @@ -27,16 +28,19 @@ export const useCanvasDrop = (canvasRef: Ref) => { if (dndData.type === 'tree-explorer-node') { const node = dndData.data as RenderedTreeExplorerNode + const conv = useSharedCanvasPositionConversion() + const basePos = conv.clientPosToCanvasPos([loc.clientX, loc.clientY]) + if (node.data instanceof ComfyNodeDefImpl) { const nodeDef = node.data - const pos = comfyApp.clientPosToCanvasPos([loc.clientX, loc.clientY]) + const pos = [...basePos] // Add an offset on y to make sure after adding the node, the cursor // is on the node (top left corner) pos[1] += LiteGraph.NODE_TITLE_HEIGHT litegraphService.addNodeOnGraph(nodeDef, { pos }) } else if (node.data instanceof ComfyModelDef) { const model = node.data - const pos = comfyApp.clientPosToCanvasPos([loc.clientX, loc.clientY]) + const pos = basePos const nodeAtPos = comfyApp.graph.getNodeOnPos(pos[0], pos[1]) let targetProvider: ModelNodeProvider | null = null let targetGraphNode: LGraphNode | null = null @@ -73,11 +77,7 @@ export const useCanvasDrop = (canvasRef: Ref) => { } } else if (node.data instanceof ComfyWorkflow) { const workflow = node.data - const position = comfyApp.clientPosToCanvasPos([ - loc.clientX, - loc.clientY - ]) - await workflowService.insertWorkflow(workflow, { position }) + await workflowService.insertWorkflow(workflow, { position: basePos }) } } } diff --git a/src/extensions/core/widgetInputs.ts b/src/extensions/core/widgetInputs.ts index 7f772aefc..fdd7146a1 100644 --- a/src/extensions/core/widgetInputs.ts +++ b/src/extensions/core/widgetInputs.ts @@ -8,7 +8,7 @@ import type { INodeOutputSlot, ISlotType, LLink, - Vector2 + Point } from '@/lib/litegraph/src/litegraph' import type { CanvasPointerEvent } from '@/lib/litegraph/src/types/events' import type { IBaseWidget } from '@/lib/litegraph/src/types/widgets' @@ -557,7 +557,7 @@ app.registerExtension({ } ) - function isNodeAtPos(pos: Vector2) { + function isNodeAtPos(pos: Point) { for (const n of app.graph.nodes) { if (n.pos[0] === pos[0] && n.pos[1] === pos[1]) { return true diff --git a/src/platform/workflow/core/services/workflowService.ts b/src/platform/workflow/core/services/workflowService.ts index 943177986..cc41f971e 100644 --- a/src/platform/workflow/core/services/workflowService.ts +++ b/src/platform/workflow/core/services/workflowService.ts @@ -2,7 +2,7 @@ import { toRaw } from 'vue' import { t } from '@/i18n' import { LGraph, LGraphCanvas } from '@/lib/litegraph/src/litegraph' -import type { SerialisableGraph, Vector2 } from '@/lib/litegraph/src/litegraph' +import type { Point, SerialisableGraph } from '@/lib/litegraph/src/litegraph' import { useSettingStore } from '@/platform/settings/settingStore' import { useToastStore } from '@/platform/updates/common/toastStore' import { @@ -346,7 +346,7 @@ export const useWorkflowService = () => { */ const insertWorkflow = async ( workflow: ComfyWorkflow, - options: { position?: Vector2 } = {} + options: { position?: Point } = {} ) => { const loadedWorkflow = await workflow.load() const workflowJSON = toRaw(loadedWorkflow.initialState) diff --git a/src/renderer/core/layout/injectionKeys.ts b/src/renderer/core/layout/injectionKeys.ts new file mode 100644 index 000000000..dd6efda21 --- /dev/null +++ b/src/renderer/core/layout/injectionKeys.ts @@ -0,0 +1,49 @@ +import type { InjectionKey } from 'vue' + +import type { Point } from '@/renderer/core/layout/types' + +/** + * Lightweight, injectable transform state used by layout-aware components. + * + * Consumers use this interface to convert coordinates between LiteGraph's + * canvas space and the DOM's screen space, access the current pan/zoom + * (camera), and perform basic viewport culling checks. + * + * Coordinate mapping: + * - screen = (canvas + offset) * scale + * - canvas = screen / scale - offset + * + * The full implementation and additional helpers live in + * `useTransformState()`. This interface deliberately exposes only the + * minimal surface needed outside that composable. + * + * @example + * const state = inject(TransformStateKey)! + * const screen = state.canvasToScreen({ x: 100, y: 50 }) + */ +interface TransformState { + /** Convert a screen-space point (CSS pixels) to canvas space. */ + screenToCanvas: (p: Point) => Point + /** Convert a canvas-space point to screen space (CSS pixels). */ + canvasToScreen: (p: Point) => Point + /** Current pan/zoom; `x`/`y` are offsets, `z` is scale. */ + camera?: { x: number; y: number; z: number } + /** + * Test whether a node's rectangle intersects the (expanded) viewport. + * Handy for viewport culling and lazy work. + * + * @param nodePos Top-left in canvas space `[x, y]` + * @param nodeSize Size in canvas units `[width, height]` + * @param viewport Screen-space viewport `{ width, height }` + * @param margin Optional fractional margin (e.g. `0.2` = 20%) + */ + isNodeInViewport?: ( + nodePos: ArrayLike, + nodeSize: ArrayLike, + viewport: { width: number; height: number }, + margin?: number + ) => boolean +} + +export const TransformStateKey: InjectionKey = + Symbol('transformState') diff --git a/src/renderer/core/layout/slots/useDomSlotRegistration.ts b/src/renderer/core/layout/slots/useDomSlotRegistration.ts deleted file mode 100644 index 94a1f09e5..000000000 --- a/src/renderer/core/layout/slots/useDomSlotRegistration.ts +++ /dev/null @@ -1,229 +0,0 @@ -/** - * DOM-based slot registration with performance optimization - * - * Measures the actual DOM position of a Vue slot connector and registers it - * into the LayoutStore so hit-testing and link rendering use the true position. - * - * Performance strategy: - * - Cache slot offset relative to node (avoids DOM reads during drag) - * - No measurements during pan/zoom (camera transforms don't change canvas coords) - * - Batch DOM reads via requestAnimationFrame - * - Only remeasure on structural changes (resize, collapse, LOD) - */ -import { - type Ref, - type WatchStopHandle, - nextTick, - onMounted, - onUnmounted, - ref, - watch -} from 'vue' - -import { LiteGraph } from '@/lib/litegraph/src/litegraph' -import { layoutStore } from '@/renderer/core/layout/store/layoutStore' -import type { Point as LayoutPoint } from '@/renderer/core/layout/types' - -import { getSlotKey } from './slotIdentifier' - -export type TransformState = { - screenToCanvas: (p: LayoutPoint) => LayoutPoint -} - -// Shared RAF queue for batching measurements -const measureQueue = new Set<() => void>() -let rafId: number | null = null -// Track mounted components to prevent execution on unmounted ones -const mountedComponents = new WeakSet() - -function scheduleMeasurement(fn: () => void) { - measureQueue.add(fn) - if (rafId === null) { - rafId = requestAnimationFrame(() => { - rafId = null - const batch = Array.from(measureQueue) - measureQueue.clear() - batch.forEach((measure) => measure()) - }) - } -} - -const cleanupFunctions = new WeakMap< - Ref, - { - stopWatcher?: WatchStopHandle - handleResize?: () => void - } ->() - -interface SlotRegistrationOptions { - nodeId: string - slotIndex: number - isInput: boolean - element: Ref - transform?: TransformState -} - -export function useDomSlotRegistration(options: SlotRegistrationOptions) { - const { nodeId, slotIndex, isInput, element: elRef, transform } = options - - // Early return if no nodeId - if (!nodeId || nodeId === '') { - return { - remeasure: () => {} - } - } - const slotKey = getSlotKey(nodeId, slotIndex, isInput) - // Track if this component is mounted - const componentToken = {} - - // Cached offset from node position (avoids DOM reads during drag) - const cachedOffset = ref(null) - const lastMeasuredBounds = ref(null) - - // Measure DOM and cache offset (expensive, minimize calls) - const measureAndCacheOffset = () => { - // Skip if component was unmounted - if (!mountedComponents.has(componentToken)) return - - const el = elRef.value - if (!el || !transform?.screenToCanvas) return - - const rect = el.getBoundingClientRect() - - // Skip if bounds haven't changed significantly (within 0.5px) - if (lastMeasuredBounds.value) { - const prev = lastMeasuredBounds.value - if ( - Math.abs(rect.left - prev.left) < 0.5 && - Math.abs(rect.top - prev.top) < 0.5 && - Math.abs(rect.width - prev.width) < 0.5 && - Math.abs(rect.height - prev.height) < 0.5 - ) { - return // No significant change - skip update - } - } - - lastMeasuredBounds.value = rect - - // Center of the visual connector (dot) in screen coords - const centerScreen = { - x: rect.left + rect.width / 2, - y: rect.top + rect.height / 2 - } - const centerCanvas = transform.screenToCanvas(centerScreen) - - // Cache offset from node position for fast updates during drag - const nodeLayout = layoutStore.getNodeLayoutRef(nodeId).value - if (nodeLayout) { - cachedOffset.value = { - x: centerCanvas.x - nodeLayout.position.x, - y: centerCanvas.y - nodeLayout.position.y - } - } - - updateSlotPosition(centerCanvas) - } - - // Fast update using cached offset (no DOM read) - const updateFromCachedOffset = () => { - if (!cachedOffset.value) { - // No cached offset yet, need to measure - scheduleMeasurement(measureAndCacheOffset) - return - } - - const nodeLayout = layoutStore.getNodeLayoutRef(nodeId).value - if (!nodeLayout) { - return - } - - // Calculate absolute position from node position + cached offset - const centerCanvas = { - x: nodeLayout.position.x + cachedOffset.value.x, - y: nodeLayout.position.y + cachedOffset.value.y - } - - updateSlotPosition(centerCanvas) - } - - // Update slot position in layout store - const updateSlotPosition = (centerCanvas: LayoutPoint) => { - const size = LiteGraph.NODE_SLOT_HEIGHT - const half = size / 2 - - layoutStore.updateSlotLayout(slotKey, { - nodeId, - index: slotIndex, - type: isInput ? 'input' : 'output', - position: { x: centerCanvas.x, y: centerCanvas.y }, - bounds: { - x: centerCanvas.x - half, - y: centerCanvas.y - half, - width: size, - height: size - } - }) - } - - onMounted(async () => { - // Mark component as mounted - mountedComponents.add(componentToken) - - // Initial measure after mount - await nextTick() - measureAndCacheOffset() - - // Subscribe to node position changes for fast cached updates - const nodeRef = layoutStore.getNodeLayoutRef(nodeId) - - const stopWatcher = watch( - nodeRef, - (newLayout) => { - if (newLayout) { - // Node moved/resized - update using cached offset - updateFromCachedOffset() - } - }, - { immediate: false } - ) - - // Store cleanup functions without type assertions - const cleanup = cleanupFunctions.get(elRef) || {} - cleanup.stopWatcher = stopWatcher - - // Window resize - remeasure as viewport changed - const handleResize = () => { - scheduleMeasurement(measureAndCacheOffset) - } - window.addEventListener('resize', handleResize, { passive: true }) - cleanup.handleResize = handleResize - cleanupFunctions.set(elRef, cleanup) - }) - - onUnmounted(() => { - // Mark component as unmounted - mountedComponents.delete(componentToken) - - // Clean up watchers and listeners - const cleanup = cleanupFunctions.get(elRef) - if (cleanup) { - if (cleanup.stopWatcher) cleanup.stopWatcher() - if (cleanup.handleResize) { - window.removeEventListener('resize', cleanup.handleResize) - } - cleanupFunctions.delete(elRef) - } - - // Remove from layout store - layoutStore.deleteSlotLayout(slotKey) - - // Remove from measurement queue if pending - measureQueue.delete(measureAndCacheOffset) - }) - - return { - // Expose for forced remeasure on structural changes - remeasure: () => scheduleMeasurement(measureAndCacheOffset) - } -} diff --git a/src/renderer/core/layout/store/layoutStore.ts b/src/renderer/core/layout/store/layoutStore.ts index 673344086..7daa4523c 100644 --- a/src/renderer/core/layout/store/layoutStore.ts +++ b/src/renderer/core/layout/store/layoutStore.ts @@ -38,6 +38,10 @@ import { type RerouteLayout, type SlotLayout } from '@/renderer/core/layout/types' +import { + isBoundsEqual, + isPointEqual +} from '@/renderer/core/layout/utils/geometry' import { REROUTE_RADIUS, boundsIntersect, @@ -392,12 +396,8 @@ class LayoutStoreImpl implements LayoutStore { // Short-circuit if bounds and centerPos unchanged if ( existing && - existing.bounds.x === layout.bounds.x && - existing.bounds.y === layout.bounds.y && - existing.bounds.width === layout.bounds.width && - existing.bounds.height === layout.bounds.height && - existing.centerPos.x === layout.centerPos.x && - existing.centerPos.y === layout.centerPos.y + isBoundsEqual(existing.bounds, layout.bounds) && + isPointEqual(existing.centerPos, layout.centerPos) ) { // Only update path if provided (for hit detection) if (layout.path) { @@ -436,6 +436,13 @@ class LayoutStoreImpl implements LayoutStore { const existing = this.slotLayouts.get(key) if (existing) { + // Short-circuit if geometry is unchanged + if ( + isPointEqual(existing.position, layout.position) && + isBoundsEqual(existing.bounds, layout.bounds) + ) { + return + } // Update spatial index this.slotSpatialIndex.update(key, layout.bounds) } else { @@ -446,6 +453,34 @@ class LayoutStoreImpl implements LayoutStore { this.slotLayouts.set(key, layout) } + /** + * Batch update slot layouts and spatial index in one pass + */ + batchUpdateSlotLayouts( + updates: Array<{ key: string; layout: SlotLayout }> + ): void { + if (!updates.length) return + + // Update spatial index and map entries (skip unchanged) + for (const { key, layout } of updates) { + const existing = this.slotLayouts.get(key) + + if (existing) { + // Short-circuit if geometry is unchanged + if ( + isPointEqual(existing.position, layout.position) && + isBoundsEqual(existing.bounds, layout.bounds) + ) { + continue + } + this.slotSpatialIndex.update(key, layout.bounds) + } else { + this.slotSpatialIndex.insert(key, layout.bounds) + } + this.slotLayouts.set(key, layout) + } + } + /** * Delete slot layout data */ @@ -554,12 +589,8 @@ class LayoutStoreImpl implements LayoutStore { // Short-circuit if bounds and centerPos unchanged (prevents spatial index churn) if ( existing && - existing.bounds.x === layout.bounds.x && - existing.bounds.y === layout.bounds.y && - existing.bounds.width === layout.bounds.width && - existing.bounds.height === layout.bounds.height && - existing.centerPos.x === layout.centerPos.x && - existing.centerPos.y === layout.centerPos.y + isBoundsEqual(existing.bounds, layout.bounds) && + isPointEqual(existing.centerPos, layout.centerPos) ) { // Only update path if provided (for hit detection) if (layout.path) { @@ -968,9 +999,6 @@ class LayoutStoreImpl implements LayoutStore { // Hit detection queries can run before CRDT updates complete this.spatialIndex.update(operation.nodeId, newBounds) - // Update associated slot positions synchronously - this.updateNodeSlotPositions(operation.nodeId, operation.position) - // Then update CRDT ynode.set('position', operation.position) this.updateNodeBounds(ynode, operation.position, size) @@ -997,9 +1025,6 @@ class LayoutStoreImpl implements LayoutStore { // Hit detection queries can run before CRDT updates complete this.spatialIndex.update(operation.nodeId, newBounds) - // Update associated slot positions synchronously (size changes may affect slot positions) - this.updateNodeSlotPositions(operation.nodeId, position) - // Then update CRDT ynode.set('size', operation.size) this.updateNodeBounds(ynode, position, operation.size) @@ -1280,29 +1305,6 @@ class LayoutStoreImpl implements LayoutStore { } } - /** - * Update slot positions when a node moves - * TODO: This should be handled by the layout sync system (useSlotLayoutSync) - * rather than manually here. For now, we'll mark affected slots as needing recalculation. - */ - private updateNodeSlotPositions(nodeId: NodeId, _nodePosition: Point): void { - // Mark all slots for this node as potentially stale - // The layout sync system will recalculate positions on the next frame - const slotsToRemove: string[] = [] - - for (const [key, slotLayout] of this.slotLayouts) { - if (slotLayout.nodeId === nodeId) { - slotsToRemove.push(key) - } - } - - // Remove from spatial index so they'll be recalculated - for (const key of slotsToRemove) { - this.slotSpatialIndex.remove(key) - this.slotLayouts.delete(key) - } - } - // Helper methods private notifyChange(change: LayoutChange): void { diff --git a/src/renderer/core/layout/transform/TransformPane.vue b/src/renderer/core/layout/transform/TransformPane.vue index 0f88b177d..70ece647e 100644 --- a/src/renderer/core/layout/transform/TransformPane.vue +++ b/src/renderer/core/layout/transform/TransformPane.vue @@ -14,6 +14,7 @@ import { computed, provide } from 'vue' import { LGraphCanvas } from '@/lib/litegraph/src/litegraph' +import { TransformStateKey } from '@/renderer/core/layout/injectionKeys' import { useCanvasTransformSync } from '@/renderer/core/layout/transform/useCanvasTransformSync' import { useTransformSettling } from '@/renderer/core/layout/transform/useTransformSettling' import { useTransformState } from '@/renderer/core/layout/transform/useTransformState' @@ -39,7 +40,7 @@ const { isTransforming: isInteracting } = useTransformSettling(canvasElement, { trackPan: true }) -provide('transformState', { +provide(TransformStateKey, { camera, canvasToScreen, screenToCanvas, diff --git a/src/renderer/core/layout/types.ts b/src/renderer/core/layout/types.ts index 1dbd936d9..ae2b76139 100644 --- a/src/renderer/core/layout/types.ts +++ b/src/renderer/core/layout/types.ts @@ -330,4 +330,8 @@ export interface LayoutStore { batchUpdateNodeBounds( updates: Array<{ nodeId: NodeId; bounds: Bounds }> ): void + + batchUpdateSlotLayouts( + updates: Array<{ key: string; layout: SlotLayout }> + ): void } diff --git a/src/renderer/core/layout/utils/geometry.ts b/src/renderer/core/layout/utils/geometry.ts new file mode 100644 index 000000000..176cb0c98 --- /dev/null +++ b/src/renderer/core/layout/utils/geometry.ts @@ -0,0 +1,15 @@ +import type { Bounds, Point, Size } from '@/renderer/core/layout/types' + +export function isPointEqual(a: Point, b: Point): boolean { + return a.x === b.x && a.y === b.y +} + +export function isBoundsEqual(a: Bounds, b: Bounds): boolean { + return ( + a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height + ) +} + +export function isSizeEqual(a: Size, b: Size): boolean { + return a.width === b.width && a.height === b.height +} diff --git a/src/renderer/extensions/vueNodes/components/InputOutputSlot.test.ts b/src/renderer/extensions/vueNodes/components/InputOutputSlot.test.ts index d10c9c382..d1c886905 100644 --- a/src/renderer/extensions/vueNodes/components/InputOutputSlot.test.ts +++ b/src/renderer/extensions/vueNodes/components/InputOutputSlot.test.ts @@ -4,15 +4,18 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { createI18n } from 'vue-i18n' import enMessages from '@/locales/en/main.json' -import { useDomSlotRegistration } from '@/renderer/core/layout/slots/useDomSlotRegistration' +import { useSlotElementTracking } from '@/renderer/extensions/vueNodes/composables/useSlotElementTracking' import InputSlot from './InputSlot.vue' import OutputSlot from './OutputSlot.vue' // Mock composable used by InputSlot/OutputSlot so we can assert call params -vi.mock('@/renderer/core/layout/slots/useDomSlotRegistration', () => ({ - useDomSlotRegistration: vi.fn(() => ({ remeasure: vi.fn() })) -})) +vi.mock( + '@/renderer/extensions/vueNodes/composables/useSlotElementTracking', + () => ({ + useSlotElementTracking: vi.fn(() => ({ stop: vi.fn() })) + }) +) type InputSlotProps = ComponentMountingOptions['props'] type OutputSlotProps = ComponentMountingOptions['props'] @@ -49,7 +52,7 @@ const mountOutputSlot = (props: OutputSlotProps) => describe('InputSlot/OutputSlot', () => { beforeEach(() => { - vi.mocked(useDomSlotRegistration).mockClear() + vi.mocked(useSlotElementTracking).mockClear() }) it('InputSlot registers with correct options', () => { @@ -59,11 +62,11 @@ describe('InputSlot/OutputSlot', () => { slotData: { name: 'A', type: 'any', boundingRect: [0, 0, 0, 0] } }) - expect(useDomSlotRegistration).toHaveBeenLastCalledWith( + expect(useSlotElementTracking).toHaveBeenLastCalledWith( expect.objectContaining({ nodeId: 'node-1', - slotIndex: 3, - isInput: true + index: 3, + type: 'input' }) ) }) @@ -75,11 +78,11 @@ describe('InputSlot/OutputSlot', () => { slotData: { name: 'B', type: 'any', boundingRect: [0, 0, 0, 0] } }) - expect(useDomSlotRegistration).toHaveBeenLastCalledWith( + expect(useSlotElementTracking).toHaveBeenLastCalledWith( expect.objectContaining({ nodeId: 'node-2', - slotIndex: 1, - isInput: false + index: 1, + type: 'output' }) ) }) diff --git a/src/renderer/extensions/vueNodes/components/InputSlot.vue b/src/renderer/extensions/vueNodes/components/InputSlot.vue index ea6d7db4e..d7424b082 100644 --- a/src/renderer/extensions/vueNodes/components/InputSlot.vue +++ b/src/renderer/extensions/vueNodes/components/InputSlot.vue @@ -32,7 +32,6 @@ import { type ComponentPublicInstance, computed, - inject, onErrorCaptured, ref, watchEffect @@ -41,11 +40,7 @@ import { import { useErrorHandling } from '@/composables/useErrorHandling' import { getSlotColor } from '@/constants/slotColors' import { INodeSlot, LGraphNode } from '@/lib/litegraph/src/litegraph' -// DOM-based slot registration for arbitrary positioning -import { - type TransformState, - useDomSlotRegistration -} from '@/renderer/core/layout/slots/useDomSlotRegistration' +import { useSlotElementTracking } from '@/renderer/extensions/vueNodes/composables/useSlotElementTracking' import SlotConnectionDot from './SlotConnectionDot.vue' @@ -75,11 +70,6 @@ onErrorCaptured((error) => { // Get slot color based on type const slotColor = computed(() => getSlotColor(props.slotData.type)) -const transformState = inject( - 'transformState', - undefined -) - const connectionDotRef = ref | null>(null) @@ -92,11 +82,10 @@ watchEffect(() => { slotElRef.value = el || null }) -useDomSlotRegistration({ +useSlotElementTracking({ nodeId: props.nodeId ?? '', - slotIndex: props.index, - isInput: true, - element: slotElRef, - transform: transformState + index: props.index, + type: 'input', + element: slotElRef }) diff --git a/src/renderer/extensions/vueNodes/components/LGraphNode.vue b/src/renderer/extensions/vueNodes/components/LGraphNode.vue index c2596a1b4..1842d61af 100644 --- a/src/renderer/extensions/vueNodes/components/LGraphNode.vue +++ b/src/renderer/extensions/vueNodes/components/LGraphNode.vue @@ -147,6 +147,7 @@ import type { VueNodeData } from '@/composables/graph/useGraphNodeManager' import { useErrorHandling } from '@/composables/useErrorHandling' import { LiteGraph } from '@/lib/litegraph/src/litegraph' import { SelectedNodeIdsKey } from '@/renderer/core/canvas/injectionKeys' +import { TransformStateKey } from '@/renderer/core/layout/injectionKeys' import { useNodeExecutionState } from '@/renderer/extensions/vueNodes/execution/useNodeExecutionState' import { useNodeLayout } from '@/renderer/extensions/vueNodes/layout/useNodeLayout' import { LODLevel, useLOD } from '@/renderer/extensions/vueNodes/lod/useLOD' @@ -212,19 +213,7 @@ if (!selectedNodeIds) { } // Inject transform state for coordinate conversion -const transformState = inject('transformState') as - | { - camera: { z: number } - canvasToScreen: (point: { x: number; y: number }) => { - x: number - y: number - } - screenToCanvas: (point: { x: number; y: number }) => { - x: number - y: number - } - } - | undefined +const transformState = inject(TransformStateKey) // Computed selection state - only this node re-evaluates when its selection changes const isSelected = computed(() => { @@ -281,7 +270,7 @@ const { } = useNodeLayout(nodeData.id) onMounted(() => { - if (size && transformState) { + if (size && transformState?.camera) { const scale = transformState.camera.z const screenSize = { width: size.width * scale, diff --git a/src/renderer/extensions/vueNodes/components/OutputSlot.vue b/src/renderer/extensions/vueNodes/components/OutputSlot.vue index 51dcc1d22..ae8d4c741 100644 --- a/src/renderer/extensions/vueNodes/components/OutputSlot.vue +++ b/src/renderer/extensions/vueNodes/components/OutputSlot.vue @@ -33,7 +33,6 @@ import { type ComponentPublicInstance, computed, - inject, onErrorCaptured, ref, watchEffect @@ -42,11 +41,7 @@ import { import { useErrorHandling } from '@/composables/useErrorHandling' import { getSlotColor } from '@/constants/slotColors' import type { INodeSlot, LGraphNode } from '@/lib/litegraph/src/litegraph' -// DOM-based slot registration for arbitrary positioning -import { - type TransformState, - useDomSlotRegistration -} from '@/renderer/core/layout/slots/useDomSlotRegistration' +import { useSlotElementTracking } from '@/renderer/extensions/vueNodes/composables/useSlotElementTracking' import SlotConnectionDot from './SlotConnectionDot.vue' @@ -77,11 +72,6 @@ onErrorCaptured((error) => { // Get slot color based on type const slotColor = computed(() => getSlotColor(props.slotData.type)) -const transformState = inject( - 'transformState', - undefined -) - const connectionDotRef = ref | null>(null) @@ -94,11 +84,10 @@ watchEffect(() => { slotElRef.value = el || null }) -useDomSlotRegistration({ +useSlotElementTracking({ nodeId: props.nodeId ?? '', - slotIndex: props.index, - isInput: false, - element: slotElRef, - transform: transformState + index: props.index, + type: 'output', + element: slotElRef }) diff --git a/src/renderer/extensions/vueNodes/composables/useSlotElementTracking.ts b/src/renderer/extensions/vueNodes/composables/useSlotElementTracking.ts new file mode 100644 index 000000000..24f9ee807 --- /dev/null +++ b/src/renderer/extensions/vueNodes/composables/useSlotElementTracking.ts @@ -0,0 +1,220 @@ +/** + * Centralized Slot Element Tracking + * + * Registers slot connector DOM elements per node, measures their canvas-space + * positions in a single batched pass, and caches offsets so that node moves + * update slot positions without DOM reads. + */ +import { type Ref, onMounted, onUnmounted, watch } from 'vue' + +import { useSharedCanvasPositionConversion } from '@/composables/element/useCanvasPositionConversion' +import { LiteGraph } from '@/lib/litegraph/src/litegraph' +import { getSlotKey } from '@/renderer/core/layout/slots/slotIdentifier' +import { layoutStore } from '@/renderer/core/layout/store/layoutStore' +import type { SlotLayout } from '@/renderer/core/layout/types' +import { + isPointEqual, + isSizeEqual +} from '@/renderer/core/layout/utils/geometry' +import { useNodeSlotRegistryStore } from '@/renderer/extensions/vueNodes/stores/nodeSlotRegistryStore' + +// RAF batching +const pendingNodes = new Set() +let rafId: number | null = null + +function scheduleSlotLayoutSync(nodeId: string) { + pendingNodes.add(nodeId) + if (rafId == null) { + rafId = requestAnimationFrame(() => { + rafId = null + flushScheduledSlotLayoutSync() + }) + } +} + +function flushScheduledSlotLayoutSync() { + if (pendingNodes.size === 0) return + const conv = useSharedCanvasPositionConversion() + for (const nodeId of Array.from(pendingNodes)) { + pendingNodes.delete(nodeId) + syncNodeSlotLayoutsFromDOM(nodeId, conv) + } +} + +export function syncNodeSlotLayoutsFromDOM( + nodeId: string, + conv?: ReturnType +) { + const nodeSlotRegistryStore = useNodeSlotRegistryStore() + const node = nodeSlotRegistryStore.getNode(nodeId) + if (!node) return + const nodeLayout = layoutStore.getNodeLayoutRef(nodeId).value + if (!nodeLayout) return + + const batch: Array<{ key: string; layout: SlotLayout }> = [] + + for (const [slotKey, entry] of node.slots) { + const rect = entry.el.getBoundingClientRect() + const screenCenter: [number, number] = [ + rect.left + rect.width / 2, + rect.top + rect.height / 2 + ] + const [x, y] = ( + conv ?? useSharedCanvasPositionConversion() + ).clientPosToCanvasPos(screenCenter) + const centerCanvas = { x, y } + + // Cache offset relative to node position for fast updates later + entry.cachedOffset = { + x: centerCanvas.x - nodeLayout.position.x, + y: centerCanvas.y - nodeLayout.position.y + } + + // Persist layout in canvas coordinates + const size = LiteGraph.NODE_SLOT_HEIGHT + const half = size / 2 + batch.push({ + key: slotKey, + layout: { + nodeId, + index: entry.index, + type: entry.type, + position: { x: centerCanvas.x, y: centerCanvas.y }, + bounds: { + x: centerCanvas.x - half, + y: centerCanvas.y - half, + width: size, + height: size + } + } + }) + } + if (batch.length) layoutStore.batchUpdateSlotLayouts(batch) +} + +function updateNodeSlotsFromCache(nodeId: string) { + const nodeSlotRegistryStore = useNodeSlotRegistryStore() + const node = nodeSlotRegistryStore.getNode(nodeId) + if (!node) return + const nodeLayout = layoutStore.getNodeLayoutRef(nodeId).value + if (!nodeLayout) return + + const batch: Array<{ key: string; layout: SlotLayout }> = [] + + for (const [slotKey, entry] of node.slots) { + if (!entry.cachedOffset) { + // schedule a sync to seed offset + scheduleSlotLayoutSync(nodeId) + continue + } + + const centerCanvas = { + x: nodeLayout.position.x + entry.cachedOffset.x, + y: nodeLayout.position.y + entry.cachedOffset.y + } + const size = LiteGraph.NODE_SLOT_HEIGHT + const half = size / 2 + batch.push({ + key: slotKey, + layout: { + nodeId, + index: entry.index, + type: entry.type, + position: { x: centerCanvas.x, y: centerCanvas.y }, + bounds: { + x: centerCanvas.x - half, + y: centerCanvas.y - half, + width: size, + height: size + } + } + }) + } + + if (batch.length) layoutStore.batchUpdateSlotLayouts(batch) +} + +export function useSlotElementTracking(options: { + nodeId: string + index: number + type: 'input' | 'output' + element: Ref +}) { + const { nodeId, index, type, element } = options + const nodeSlotRegistryStore = useNodeSlotRegistryStore() + + onMounted(() => { + if (!nodeId) return + const stop = watch( + element, + (el) => { + if (!el) return + + // Ensure node entry + const node = nodeSlotRegistryStore.ensureNode(nodeId) + + if (!node.stopWatch) { + const layoutRef = layoutStore.getNodeLayoutRef(nodeId) + + const stopPositionWatch = watch( + () => layoutRef.value?.position, + (newPosition, oldPosition) => { + if (!newPosition) return + if (!oldPosition || !isPointEqual(newPosition, oldPosition)) { + updateNodeSlotsFromCache(nodeId) + } + } + ) + + const stopSizeWatch = watch( + () => layoutRef.value?.size, + (newSize, oldSize) => { + if (!newSize) return + if (!oldSize || !isSizeEqual(newSize, oldSize)) { + scheduleSlotLayoutSync(nodeId) + } + } + ) + + node.stopWatch = () => { + stopPositionWatch() + stopSizeWatch() + } + } + + // Register slot + const slotKey = getSlotKey(nodeId, index, type === 'input') + node.slots.set(slotKey, { el, index, type }) + + // Seed initial sync from DOM + scheduleSlotLayoutSync(nodeId) + + // Stop watching once registered + stop() + }, + { immediate: true, flush: 'post' } + ) + }) + + onUnmounted(() => { + if (!nodeId) return + const node = nodeSlotRegistryStore.getNode(nodeId) + if (!node) return + + // Remove this slot from registry and layout + const slotKey = getSlotKey(nodeId, index, type === 'input') + node.slots.delete(slotKey) + layoutStore.deleteSlotLayout(slotKey) + + // If node has no more slots, clean up + if (node.slots.size === 0) { + // Stop the node-level watcher when the last slot is gone + if (node.stopWatch) node.stopWatch() + nodeSlotRegistryStore.deleteNode(nodeId) + } + }) + + return { + requestSlotLayoutSync: () => scheduleSlotLayoutSync(nodeId) + } +} diff --git a/src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts b/src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts index c6be50285..4ce9f8e62 100644 --- a/src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts +++ b/src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts @@ -10,9 +10,13 @@ */ import { getCurrentInstance, onMounted, onUnmounted } from 'vue' +import { useSharedCanvasPositionConversion } from '@/composables/element/useCanvasPositionConversion' +import { LiteGraph } from '@/lib/litegraph/src/litegraph' import { layoutStore } from '@/renderer/core/layout/store/layoutStore' import type { Bounds, NodeId } from '@/renderer/core/layout/types' +import { syncNodeSlotLayoutsFromDOM } from './useSlotElementTracking' + /** * Generic update item for element bounds tracking */ @@ -54,8 +58,12 @@ const trackingConfigs: Map = new Map([ // Single ResizeObserver instance for all Vue elements const resizeObserver = new ResizeObserver((entries) => { - // Group updates by element type + // Canvas is ready when this code runs; no defensive guards needed. + const conv = useSharedCanvasPositionConversion() + // Group updates by type, then flush via each config's handler const updatesByType = new Map() + // Track nodes whose slots should be resynced after node size changes + const nodesNeedingSlotResync = new Set() for (const entry of entries) { if (!(entry.target instanceof HTMLElement)) continue @@ -76,30 +84,50 @@ const resizeObserver = new ResizeObserver((entries) => { if (!elementType || !elementId) continue - const { inlineSize: width, blockSize: height } = entry.contentBoxSize[0] + // Use contentBoxSize when available; fall back to contentRect for older engines/tests + const contentBox = Array.isArray(entry.contentBoxSize) + ? entry.contentBoxSize[0] + : { + inlineSize: entry.contentRect.width, + blockSize: entry.contentRect.height + } + const width = contentBox.inlineSize + const height = contentBox.blockSize + + // Screen-space rect const rect = element.getBoundingClientRect() - + const [cx, cy] = conv.clientPosToCanvasPos([rect.left, rect.top]) + const topLeftCanvas = { x: cx, y: cy } const bounds: Bounds = { - x: rect.left, - y: rect.top, - width, - height: height + x: topLeftCanvas.x, + y: topLeftCanvas.y + LiteGraph.NODE_TITLE_HEIGHT, + width: Math.max(0, width), + height: Math.max(0, height - LiteGraph.NODE_TITLE_HEIGHT) } - if (!updatesByType.has(elementType)) { - updatesByType.set(elementType, []) + let updates = updatesByType.get(elementType) + if (!updates) { + updates = [] + updatesByType.set(elementType, updates) } - const updates = updatesByType.get(elementType) - if (updates) { - updates.push({ id: elementId, bounds }) + updates.push({ id: elementId, bounds }) + + // If this entry is a node, mark it for slot layout resync + if (elementType === 'node' && elementId) { + nodesNeedingSlotResync.add(elementId) } } - // Process updates by type + // Flush per-type for (const [type, updates] of updatesByType) { const config = trackingConfigs.get(type) - if (config && updates.length > 0) { - config.updateHandler(updates) + if (config && updates.length) config.updateHandler(updates) + } + + // After node bounds are updated, refresh slot cached offsets and layouts + if (nodesNeedingSlotResync.size > 0) { + for (const nodeId of nodesNeedingSlotResync) { + syncNodeSlotLayoutsFromDOM(nodeId) } } }) @@ -134,11 +162,11 @@ export function useVueElementTracking( if (!(element instanceof HTMLElement) || !appIdentifier) return const config = trackingConfigs.get(trackingType) - if (config) { - // Set the appropriate data attribute - element.dataset[config.dataAttribute] = appIdentifier - resizeObserver.observe(element) - } + if (!config) return + + // Set the data attribute expected by the RO pipeline for this type + element.dataset[config.dataAttribute] = appIdentifier + resizeObserver.observe(element) }) onUnmounted(() => { @@ -146,10 +174,10 @@ export function useVueElementTracking( if (!(element instanceof HTMLElement)) return const config = trackingConfigs.get(trackingType) - if (config) { - // Remove the data attribute - delete element.dataset[config.dataAttribute] - resizeObserver.unobserve(element) - } + if (!config) return + + // Remove the data attribute and observer + delete element.dataset[config.dataAttribute] + resizeObserver.unobserve(element) }) } diff --git a/src/renderer/extensions/vueNodes/layout/useNodeLayout.ts b/src/renderer/extensions/vueNodes/layout/useNodeLayout.ts index 995d83d6f..18a085641 100644 --- a/src/renderer/extensions/vueNodes/layout/useNodeLayout.ts +++ b/src/renderer/extensions/vueNodes/layout/useNodeLayout.ts @@ -7,6 +7,7 @@ import { computed, inject } from 'vue' import { SelectedNodeIdsKey } from '@/renderer/core/canvas/injectionKeys' +import { TransformStateKey } from '@/renderer/core/layout/injectionKeys' import { useLayoutMutations } from '@/renderer/core/layout/operations/layoutMutations' import { layoutStore } from '@/renderer/core/layout/store/layoutStore' import { LayoutSource, type Point } from '@/renderer/core/layout/types' @@ -20,12 +21,7 @@ export function useNodeLayout(nodeId: string) { const mutations = useLayoutMutations() // Get transform utilities from TransformPane if available - const transformState = inject('transformState') as - | { - canvasToScreen: (point: Point) => Point - screenToCanvas: (point: Point) => Point - } - | undefined + const transformState = inject(TransformStateKey) // Get the customRef for this node (shared write access) const layoutRef = store.getNodeLayoutRef(nodeId) diff --git a/src/renderer/extensions/vueNodes/stores/nodeSlotRegistryStore.ts b/src/renderer/extensions/vueNodes/stores/nodeSlotRegistryStore.ts new file mode 100644 index 000000000..c5e76d4b4 --- /dev/null +++ b/src/renderer/extensions/vueNodes/stores/nodeSlotRegistryStore.ts @@ -0,0 +1,50 @@ +import { defineStore } from 'pinia' +import { markRaw } from 'vue' + +type SlotEntry = { + el: HTMLElement + index: number + type: 'input' | 'output' + cachedOffset?: { x: number; y: number } +} + +type NodeEntry = { + nodeId: string + slots: Map + stopWatch?: () => void +} + +export const useNodeSlotRegistryStore = defineStore('nodeSlotRegistry', () => { + const registry = markRaw(new Map()) + + function getNode(nodeId: string) { + return registry.get(nodeId) + } + + function ensureNode(nodeId: string) { + let node = registry.get(nodeId) + if (!node) { + node = { + nodeId, + slots: markRaw(new Map()) + } + registry.set(nodeId, node) + } + return node + } + + function deleteNode(nodeId: string) { + registry.delete(nodeId) + } + + function clear() { + registry.clear() + } + + return { + getNode, + ensureNode, + deleteNode, + clear + } +}) diff --git a/src/services/litegraphService.ts b/src/services/litegraphService.ts index 0579429da..2149bb378 100644 --- a/src/services/litegraphService.ts +++ b/src/services/litegraphService.ts @@ -12,10 +12,10 @@ import { LGraphEventMode, LGraphNode, LiteGraph, + type Point, RenderShape, type Subgraph, SubgraphNode, - type Vector2, createBounds } from '@/lib/litegraph/src/litegraph' import type { @@ -994,7 +994,7 @@ export const useLitegraphService = () => { return node } - function getCanvasCenter(): Vector2 { + function getCanvasCenter(): Point { const dpi = Math.max(window.devicePixelRatio ?? 1, 1) const [x, y, w, h] = app.canvas.ds.visible_area return [x + w / dpi / 2, y + h / dpi / 2] diff --git a/tests-ui/tests/utils/migration/migrateReroute.test.ts b/tests-ui/tests/utils/migration/migrateReroute.test.ts index 767eb0a2c..ce7b62a2e 100644 --- a/tests-ui/tests/utils/migration/migrateReroute.test.ts +++ b/tests-ui/tests/utils/migration/migrateReroute.test.ts @@ -19,7 +19,7 @@ describe('migrateReroute', () => { 'single_connected.json', 'floating.json', 'floating_branch.json' - ])('should correctly migrate %s', (fileName) => { + ])('should correctly migrate %s', async (fileName) => { // Load the legacy workflow const legacyWorkflow = loadWorkflow( `workflows/reroute/legacy/${fileName}` @@ -29,9 +29,9 @@ describe('migrateReroute', () => { const migratedWorkflow = migrateLegacyRerouteNodes(legacyWorkflow) // Compare with snapshot - expect(JSON.stringify(migratedWorkflow, null, 2)).toMatchFileSnapshot( - `workflows/reroute/native/${fileName}` - ) + await expect( + JSON.stringify(migratedWorkflow, null, 2) + ).toMatchFileSnapshot(`workflows/reroute/native/${fileName}`) }) }) }) From 6866e1277a175e32fd58df294924046c6cb545b8 Mon Sep 17 00:00:00 2001 From: Terry Jia Date: Tue, 16 Sep 2025 23:11:17 -0400 Subject: [PATCH 02/21] new design for left click and wheel (#5566) * new design for left click and wheel * update snap * fix import * fix test * default value * fix test * Update test expectations [skip ci] --------- Co-authored-by: github-actions --- browser_tests/tests/interaction.spec.ts | 2 + ...-shift-wheel-pan-center-chromium-linux.png | Bin 100274 -> 99438 bytes ...rd-shift-wheel-pan-left-chromium-linux.png | Bin 99438 -> 98303 bytes ...d-shift-wheel-pan-right-chromium-linux.png | Bin 100274 -> 104502 bytes src/lib/litegraph/src/LGraphCanvas.ts | 11 +- src/lib/litegraph/src/LiteGraphGlobal.ts | 7 +- .../__snapshots__/ConfigureGraph.test.ts.snap | 328 ------------------ src/locales/en/settings.json | 2 +- .../composables/useLitegraphSettings.ts | 15 + .../settings/constants/coreSettings.ts | 105 +++++- src/schemas/apiSchema.ts | 2 + .../core/__snapshots__/litegraph.test.ts.snap | 2 + 12 files changed, 123 insertions(+), 351 deletions(-) diff --git a/browser_tests/tests/interaction.spec.ts b/browser_tests/tests/interaction.spec.ts index de46bca2e..c3754ed3b 100644 --- a/browser_tests/tests/interaction.spec.ts +++ b/browser_tests/tests/interaction.spec.ts @@ -1012,6 +1012,8 @@ test.describe('Canvas Navigation', () => { test('Shift + mouse wheel should pan canvas horizontally', async ({ comfyPage }) => { + await comfyPage.setSetting('Comfy.Canvas.MouseWheelScroll', 'panning') + await comfyPage.page.click('canvas') await comfyPage.nextFrame() diff --git a/browser_tests/tests/interaction.spec.ts-snapshots/standard-shift-wheel-pan-center-chromium-linux.png b/browser_tests/tests/interaction.spec.ts-snapshots/standard-shift-wheel-pan-center-chromium-linux.png index 57b6438aeb00eec7ccbc329e4782f344a22f1e4f..a9d0efb74912f01837906e2c4e079e0070239241 100644 GIT binary patch literal 99438 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�gI9hK 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%0Aa-XtXjB=Fxl z)|hxD;LcV}*1%25Diox$7w@J(R}(vxC5V2sCR4i3#rn+n_qTMuWp?_j*D6rO`=#=d z#;oa=nW9Z3h8zz4|0@&bn8q52k^jYuRgdF#GCc8b^E^6`fZm2gL^Go8`vK4%JIt?&uk@RPW; zY38bK_s6L^8K{wvA}>v3KEBe+Wk_CvAAyCA7GP{WahwysJ7%rr>6Ey)9!U-oG*0r>%BBl{nYq4DgKt1vW{vbhEcLljpLUsKGcZMxXPzeGTU|~kEIXfCqSql zvbI4(?d^Quq( z?*7T{;e)k;i~O%nKayUN;We|*u8D#18x=T$8Fp+IVmrWxHrB>pr8A5ujbjIki;65C z2j;Q(#FJ$GF^x|;TWy;8_U+*VZPQoje`ix=quZ~Wa@{}E|5XuJnYN$_{ozQcbQj$WD={1bjLbDGG#{% zrO120eW&@Mn#19Q`zkNou$z|J?ekD&lfsLn7!e)v0n$&2FV?wDV!?jk;GmR7|9K)D zv{sIJ!U0`ce(5ZnIx$ZX+!mmKY@%mp_X=*@NMfasW+NOiE>vyxiHD30?QHCzUB^gR zkd`Z@?R;LyvX^S=iK@vu^Q`UM*(lIZ+xnl@)NBHYFo4O|Nek7!B@fv*fj^`la75SH zM|{;|lKuuZ?7t;hge5yWH<}uqjUMKc4OayW7?DpvV|SNc7iDBq?>0IntYTlFt4G8LzJcWUJ1LZ|cQ1ZuyLNd|}77{n#01 zc_!()DQS%}4_Jd7L;MZq7z;mE9?zF}+OjLOsN;-BS^>Qe#ZXKL>5<8!u@Kv^fd~7@ zly`$EjPsuIZ?LIWJ;ThA^qZMfxSAUZZf;0_!fuz}9BzrxJ-`b6u|c6`EGsJmH4riF z{-@2%2E13MIAaI5Za6+@uV0$cM3L97qXtZ^g!%u%3f6kb74D8kdrFw7ZalwyKwxa? z^Vb=YoQr*-2f2MNT-gw-25BLoKlf#!I%}Yb{&bzhfctgTtt7cs?o!1w%wA>V^K8UAlK%tah~ysZ#y#s;u<6Ij`3c*-(CID@kdu z^t;+DRkB$V5Y>|NKjcJ%R{(1bhNe zhS2ipGmb-t#KiI#d|=ZBWynFFLzIa-7YDy= zgwOc;`5g&?r!}}|5`3)CWn)+fZ$hvv;JsGg*w{C3hz-^NGaPWe;5Guk2I#kuK?x&Z zD1t92I66*4l>gwQnTN+BFdEzBF_3;iB?UbTR|G2BTJt8W9I#~ZyFXS}tH3?%)~#}r z31v>tuZ47UO6xRE#g|KMxlLhfxc<2KV7|l(Xeu0Ts1}J=hxk*OGMs6H=Ub>648E}g zd!XfTeTuMRg0kkla$QYL&D4}n0W7DhAc0{F(vJBQ&Hx-1CMSUgiJcnnESv);*I@Q^ z^?*HSjF|cyVQ~E^F@~!pv2dJxDn>FVJKGWcr(}#ZPM3roOvbcQogjOy3MJwjK{Kgr z)`PSiR~WSoZZB-J@>KzgaL@n%=K=a22$HdbSX4nhg04*T;6ciD>n>foWT)H;pijuK zXdV^`NXyx;oBa_6fN$P`x%o&WzMxJL!96LPoJ6qci;L+>4J&Nwu42p@E0druvh^ z8@bOR+7cdXA3i8$wSq7eP@x;n2gnp*-qs?lJ9h2_R4B!Q0beka)zzzxlh09 z130AEA%q^%Qd9q(pEor(-$5UU$R0pPFrK3h`gHBuHK>gd{R=<^va3CSJ7L%BjuVG} z#`q}jLO35N1*UHkdp%zev0}`!^jMbDc%VKUWtn{8W-A4 zD)vk4UVrIG06n+A;Nf##PXK9o4Mb=cNUtDSu$=ec+UF**o~ZEJ$rr5D^zGa3mG6y> z2f@^1GbB-{b!VxD?2%HGl&oU40H^D85 zS6};jUnDQ=VUUFAn!Cylx51Xs-1gCJcc@D-)(OG48yTeogvgG95kG+pR1r$Js) zkG%R8pDen)fhH%ye@mAX#K-p%NFo&1w26<`j?p-KgzU3DaCnT&qNASg60K(W=0ZVx ze)|Fc5#El{$Km0iGGQ%gt*@7BnuZ*7FGr920SoD^N4U7kDmQD!$nKSA!i9ij)G;gE zK0mr&0ujE*K1Uj8^v$`9(nRi@Z7i(cYK*4>RE`<^y38h4HRL9oSg2T0wp*@((F}=$FhS&qVaXa&jbv7dbgI03RXyw#wNN zH{eyR4uiU;Vb`K{>g9v)#CiUK__8X=|AF|&N6)k$HO`M|pN&7A8XqNPm9dqotjv$b zkpYoKLkH{A($Yp}HrK=U95)qK3b3)>`LD+?6~JKL4RBYh6mMel_-q%AlukFpKt%V51UTrO@rvVgPO? zIUYT=jm zA_R5axdT!~Ip;(OJdp{uG-YxaCweYAYiep58$W&ckY%jvs-nDn%Vf{Ph|dw3vf>0JXkaM z;RZ{`L0z~zZSigd&FA~f3meh`<*LDFRpU(xf_IKC+%~?@2N5_Ji)3!-F<}@)JHF*G zDPj{<`SL7!5WMalK1P%;eeGt>8bNZ43k$OvGRh@{V)NOvvh?G|T(JE<%e*V%OxZEq`kv5sQmG&n}wV?k79wm0^W>NJe?+RkWE zyu8fUwNSM!I>&o;1>87aF6olZJ40Nr9p1@MsuHeyFT3x?-%wgwe{TN^vkZmGYlq}> zhK>?Y**HevdqrFCiryS-nD*y{txVsvwxJuf%c{H8pp`t+g~-a7;zuWk*;(9N;Qko6 zeO2%27t_&!@IPz6#rVA+hEnw&d9)H@-@SSz!%r}$wyaPm+ra6kpa9_W*tTCon_>sA zVc#&Xm^^%{scFxiFHefEYEAoAi&8QvkcT%Z1lJx?7Ild$m_I)>f3Ku;@4r*#2Atu# zUh6JmuXxRUh*UvWWjCMkXwWVB{L{|A?SpQyCal6+jm~j%`TvxexSe5y1uP{6`n6MR zRk)vp#2Fp3&TlHbUa64XMUmpb@mSo$?cS_+3y|9^vBJ_N*gF2B( zm%*S6=feOxExXBNth;5SX?pV5ab?A^ArR8jDM$MRN%})%pF%zFqU3h28O4og-vDO7 zY<08B_*?nR3xdqYcU6AZZ41jiEcQ3nsJBBF=4dcf+kM|De=b96mje;(_S;#?`aIv} z;m_MK#xdlO*?)^?@1(IjljETzw@Q}Pw*$gtZuuURh{_AmU}1dcRtbN8Sz3+e-_(?S zy7p>;f9~w$$Ks)zb?iAUkOTI}i%{(#)vMB1kbQg7%$XGKXqTL7+U#GCaUAIHDre3; zY{A29St;(tEuL<(_@iPab z=u0-O-F0#^q%$N>s=Rhw-)MkFd(xW(MAPy7DZ>Tq%V{KxYl zwA#(gaV1ML!>Y8Ox2@yoN8T^W9EEr!ifhuHBH|8#<&?LIA%m2k!od&vSt=xlAGc1{*(Rhor zUpz%aVk+U#e_*l6^{K}&7_U6WK)H1!_q+WPg`MeVZSU`~+$OZVMg2OK+qE%x_{k)L zSl>mDQD-R*_ESuzrmpW^4N;3G{`~7sE6E{9R*vSABF8pcPe{F`nswo?jtCR4l>uDBVyQ-uib^`I2fe8Vioa-9DKNo)M zdjMgQEnD(we$YvpttzKHbRxI5m`18b*fovEZa*Y@_+om~lA-@;gTyhbmFm>L$#*_w zc(=%^eKgJF*#De*?TCG@tR3+OtDH>1kwL}uzm@9I_CG%l6Aqr6Z}|`Y1;P|*R{7$5 z(!|M|k7f6nm*1_<+O>Hwz9IMJoyBsRGokGUJowmfq0*ac^j<<{fx*KZ=FbGdD2bJPe3X%aJnSP1b z!O7Bj>MA>!fHL{VNagN(V1;R_=V*(Op*z>iWYCz$r^~dwpRGg(w;AL;cKPLQ^1RaO zo#$IugMGJ-QTAh9!mCUUV24lGtE41q?jLZ$>tkgbxqU+@#0dp{(ZYjH>y{VSy{6}X zJ#d@reK6WS8$cBh6dcpXy8QTaV7Oj>q{yCCD9Ow&p z`AGR-TVaHvY!CWttfLwSb_odlxXESK?0w=t?(UJ;bpvyXA4@E5pT`x!~h{d@5dCdQEv?^k6uT zk(-B;=lwD7N}d}D{0ma*cZ~ln93mHRHR2zj&W9Ean3mRIvro(&@jJF}*8!kYp>R6^{A$h9r+ZwNFw%?;6u$%R z`)>8@sTGBV?%1Du4}4Zlb;;0sq@aCN$mFWygvAM zWc!tsZh>fzzwg4>rCe;;xF6P_##Ks$E)gIVwg&yW?Q6&46Hnt#TxSRy^z;ZhFe+)7 zxkhL;b(i!OfD05&j~0wC#6@1ljCTpsJQ$;?_N$GmudLEJFF%Ngefda z|5i?8OFXEgP$((x-n^OTxd{D2N?KawE!X(H0Sd72c+Y!iM{u?2uS_QR>*VN8j&#*h zAo{u3cEECQnyw`T_AHXmf6FXs$oIJ27%3uet8#E%5UR;!KAr|MOu(2DBNJV5=g++r zd8MDGrSNacL<$Up(zLSRRrQI&00X}QylSX%?FLH+sTREcagnUXO=2M$ca zTG~;q4sNWcP7Sz~JbeleI;g1Y9v$e1dxL{?AlFU6=kMPid;B~rD{Jw>{ig>?S_6_F zrnNS_+1Qwqo-2t%P%* z3fsTrDvv6K+M|Bf^avhMY8iBIy?a39&{ z1}!n>lO6_Y1&e4`Z{7wpO4|cf)YT1N8&j-R%FwpJVE98mPy*qi2}&=hH2y-U-D_C; z#lZ*W5Ww|f8VQ3ZQ1!nYTEC;8MeIXHd=eY?53xTwKQ877M4F{(?W>!DVK(Hr6}Jkz z_0G80XkCbZ$`8~3*@?D)52eUQV!>Dk6~vaM1YCEv)g|1rw`rj!b3XDUx2WhkO7`>` zN6}(cpt9C%11P1W=iPt>Xh=^|sdp^OFO2H7Fj{=twR!!R*x2#vf4`QV2g6#@gbWy+ z^fdBJ_?&aOrOO-l7)s_R^|TFIq&I3Q1uCCnbUyT7!E=Bpcvg9pN-=cunEhSeS#;hk zs{49={M)dPd$sQIVPb2X{10LkVIv5%LuFG%4VFLLyZ~Adto|$dhgw+17Y5Hp_G{>C zoo0s3jPZo%+R?B+HzurBjwqFahKpX1U=DIC>eYU!P0>Y%Hv-uFzaT*Tv)i>gU^-Cz=~abD~jFGs#US4eOt>pvw?_v7U`eX`y$|nt?JfJ=D8PU6Iaul zCn+S&Ph2 z4rt&t=dVo&Yq``E_jRK)eZQ`UWs^@Yp2?-4rKPF5RYC>-WM>rpMo#PeicIT>a4@Y6i4u@V{r-vi+10hBgYe(`#x2jN2dH&2rmp!8NykRHabM~$s ziJ4BmK9M3#GYG{`sh>d&OsV{s5FiCnvMBvwN_IL5ZXZ=XMZzVP=i z!mfZfqv(MkW;4~~2sq;y&E^_ru!K&}%y?p6wKn{}v&AhIgB?hp^?|%S9LPPiHS!#* zc84OD|E#y(VY7s`D%r;2M-chldNcWEb)|bi)28{*rl7j&ncYWJc!HJs`{e(_lq(oI zIw?iSA41p{Kk|kG^4`YGY?;#r&LV!=6LKGjY(ob7CN9LE{){0A&?C6y##UamlYCyB zZ+rRnWSSp2K7>M{uGB>OfzHtAAlo`#e`{^SPxI3@X{UBYwK}T5x%+$KV&KQg8TxR{F^dWTBoM8F2M%ii0Dj3GefF0cZj2`t z&Fq{G4ZVBIt6Np<$z#z_ueNgz`9*;Og7@uw)dZ57tqz@PqOX{q6#Z|=^c7Y~Wpcda zi(s;&jIvYv{N;=D8`n!NuCe3M0MIl03>AJaZcWR3_%Y4WE}F4u?tbalLt&?`oduHG zl&!!GJ0zL3wH6cXKWeHn61`Zkl4AHXV4teo8v=Na9yR0%8*(f#WC_<(gJsbDYUT~p z9J3t{1^%m~-j^>6k=6lhZ{cnUOYm+GhiXQ#FBo)Tzb`2XK>3LC(Gt7 zrMYZG8&@*`cJFvp!<|q6ZWEEa7^@5YT+EN%F!YFS(T<{rp|G>->sQQHoW?qi9I%62 z9c(|>7M_;qZ#TypzpDHi>=r4Rd9s=$y-M>~Qf1Wf(K&%#WM4BKd8QNLjyslquXL}- z{gh<)aXH2ej>e6(M{QENE>rMSlVD9aUv;Kn-BgU;SCfXfjA2BJ(cqS5%n2ZZa8%Os zoV6UW!j@Tf3Uh-(%z|_xVRbz%*&{DAZCPz-aC z!A%CVqDY3bh!-FVxIG0ub-gG0)_c{?KR~-+khy+Fg zc*Sg{mj9l8S#!{jc$`@Bg(TAdg4l~!89yz-WdBj7*+WyfZS9|oZxY3o$X)nxOcga- zndyA9&fP*qao>0CfB#`8^m}}{Uc+5Ou*wdkdxNJF5OZk!nN^>dbK%ed4TX3q5M6Vi zBsAZzYV4w$tp?mUgdJ{QPHMChXdcI1?&;YNG3O8a!2Yp<>u#r0{~b^uKe4ANk{Mjs zC#8jd{*mTPIJcXM=EL8=mBgQgg}UflObWHNemW3O;3cAld!EFqCS4~LSV-&wqx*KG zp6l!ClrZX+kS!$zygPmw;cx*93o99i)_#ID5-41tNrBY6 zRo26WgY&%8YUpZ*hs8nF-PKf?w3{>KDEat!_vWlz`9T zbk`j0DKA7O&Fp8dP-}py*l}+1!?EKH3gWUt)9A7=ejSfK9gSbuv? zD{`0r)fX@A<62Yi(vog6L5{I^GvDU*o}V*cwdA;SwamtYRsF4eL1@Qp!_C^Q8;n_x zvBD>8dGP!|BQ1{j3acphv3DXz-n?l&aG+J-ytTf*_0_A+YHC)Fju{#a7sXJHO8k-JzpPVh-MeKZB@I$O-@R3R3x9%ZPp2F^^!?(I#AYpLr{>E! z76pZ=1%-vz4!eBqwXHW~24Zk?b8 zC`K4d18SI=2d6i?9$ErjaHVa35EG9}3D8bc9czmSvG*!ODgK zGB@9W0}U7j1%Eh`s6^OL7gvD!lhicquaVkpX{~5?7n`doO0Hpzb!}>xk;7ANV`@~ZR#j}d?QIGundy*5fnx?#Z zq8~kSj1Z7IeE3w#-AP&6M2&}P&ug}+*31Q1XH`3vTV6d7wPV`dyCQjepovbTSu2Pg zx?_#r?qf|OZH&YjAT0+{vT~IHalkF1N=H~_jd$eVX9|Dv!~>#g$-(5KM~dw!~tk!<=0-koOR)PSIWpw zA;-Ni&}Xj}Eb94JgVf7Y&@&ka2M0^nS(uw6DmBt<=gytO^Mk0;h4kLu9pimi(@AZc zF-HnzJ#caA%_W&!8*9r)l1?uNBXjGb!))0qG8tmUrDAp`H}yF--kadNFecEF`Yj3T z&PjdZBas!fHyGbA33|u7Stjv|An16A!(ZLt};rEN3Q(LS$&!>7QnJui2?SD}C&1to1aH?_U{(@uY z(3P)OXdm;;Z388eZWHO)?gFKlV?6N=i&AV14{MsIZc94049XY1rBzAw72Oe)|7Xe8 zB}0$fmf6P#YhUTuj^6UyhG&+zDW^5y-2#^-m_kFFev%v|VV9tkXy?_vy=H0&3aCA& z9y@;4E=||4+rGVB>~Uj@VPPiySw+7(vwO@N0)BWnKF#zf88})z7qtJRH|0df4QI`! z{nHopZ<4r(`CQluGB>c{qvkr_MsDvAXqh#(Ja4PSdsv&_$Arm*EGE|jMb7Yy`+`rp zzax|^b?h*HfccmbopGIq&w6gKMcRlY28WlT2cMgpo^y2GtWczMw6Gx|*J5Uk^vV=@ znzW880I3w+%k$u;Ox^wlZ0hS*CIupa?r6+6hcD2yU?Ct6E-E2peeG)zKf-{Nc=1qf zFkbtDbd!vgV(m*Vo~Ib;5ig&cOpaM{qV%8>%RB%KZEFWS(vcG;|u9-6MrR+XPye`)d-nG|-*Ob2B!JgWJo57cBD zYJWYQ|CUyfxR2iCD^Sq;@$-*S2*Gd9+FEIbu71z9JA^BLQj%HYGnE_GYu5zE4NEd* zXi>l{b;{SjVNI4hVFeP6jg9c$y(y50JL;{SJ6~NN4<8&a^gE}QDe3(ydO?8s^6?|t zQSrb3=c4O@BXv-P9n|xNbLUc<;pwqGQfZUIM>HkyTDSuq<1{_qX>@v`QB`=OUTV>G zRE8Li-*9(U_z3Ipd5{aAwRCzx#SV9B0tK1LRjj*;m|e_5&7hJ8{V}eoscEs{Fz6XD zR)WB9UTsrN=0#l&zUOLD30kQhooR5h8?dkZ@PR=!aqY+y&T<9G?cw8_mb63)5)9vO z?fU{k%d>F#Q2qM=%zNk;qxP?W+#J>xnUb|D8d zMqT{wzb=Kmi(((>Hwb8<%rczOT`;$>AYA7#ItPAEqxr?$YrF=KO>g2sV0~D_3~^k@>cauQ?I!1j3pDe2Su?&>VHa_6@2b)uhHfao6q9 zl(AKL;wlmD5ZupT6au;!Sb(q$JQ`PwzXIg%bu&zDPS?$OSy;FTs*xs&cL)(-j|Sw* zEfx{G2qMoY`tu1?F?=S190$9{Koh8wreM>uSplAU@G20vUo8=WfR#Gu-`~R^f6NM) z-VQIj^-*d{SI$M8oB`I}4c+6I|I5pucy z_h2mIRxAfRpfBlxmf;;JrHMO`O2k?Ru|`<&m<9fE_rCJgH4eO2Qpu^xC)_KBw!s z@x(xisgCZkPHT*KvO%=V}E(KapnMi|yU%dbwk__QYCV zxpKc|z;F=r5SV(h7~)*vJ?8Nd;j6;e85;d89r~4JC%A8x}9Xf##&D>Qt+O6?{5Cww5utZ4ROg zbbqk}t@v3-{Dm-aLGd~h6&2h1rMh}}XlNel-b`F?@h;a(07zpS@T;LY0$)*B@9pPd zNB9(}?7lBE`~4E(Dg?6+JdWE0FFb7-0fPo%ezDj8s05l6*lMux6un;j}+^0CS5e2<7LlCifU6 zTqrI%1d|EacRfJtBVJ_L8-hL_AOw;x*mIb=t38q< zM;*AN1eS0{(1djN*RR=bQ$OLMgwr5{2;-v~st;crflH&hIzwk39O!POUwTsOjF3fz z6P}*SH#hNGdK_JuzvON+h>Hxed_+`K%4vSfmJuMcmurVFW6XtJ93t1<{@3SwgT^?i z!GVlXw*WKqoPZ26BDf)R7CL$~c5D`Ek*;1_F>&!G!&;QyaMSmmY1Vc;F$!MtpQ$O& zxA!DH7qZKZA073Sf$SWn}AyO0J`8Q~)`Nd@z-)a~IncxqfVA|3aOD zhnv={p$CqO#LVN(8#{2Ri9BP^u`H~K2pPN2ghnS0!We>I>$nINH>@vGfv@2~@{!TW7Gy{!cOO*c%d+Tcuo=1gzKu~vA?U^^MU z|2!!PtRg&jjbld_+@?^JyN->QFp5e_77UI)7J7ImayxvS1Oz@ARb=aqVr56ZV22*^ zS2_~)P^Ym|j<&uf(zHK@@e*-LEhk+Hw-L^Jei13=N@YI^LUH+YuY-|1^GICqpQ8nmzw5n145*+Jhs~OJKdF9wa z$N{`3{5Ykt_@GP&S}MEH5Gw70554Wu9XOVIakawsMY|b!jDK@W8jUha1 z-95L3QH@cB1P5Qce0h_%KnN^j5JbRM<+ioV(|w##@4?FB{`_^zM*^+mtNONVBJpgg z$wc|i#1nR6=u)Ivar%pR`)iDWTGSR|7aam9S!vFc1eOIjM!8xbCtpbeEnT-R9@KY@Y;R< zG6p7uK?5k%8e|>ZzenDxYJ14pH~EBK3pOMAh3i$LUV-mMuZ=ndRCwExqo zQ>QTM#7+kW!_zD)aNcjOgoz!(I{X}jPJ96`9(d%zRiLrXOFZt#o7St2;$hqIa3mB@ zIu{m09B+DX=5bQ&=>%VH`a*N!;W~NZ-%Sq^g1eIb z5Gkb)Ha9RHpjL2Gs=B)!(Tk1WzQOjfy9*ALQRxN0UP8&SASi)k2I9@(jyE+Ohw(f@ zOqsc#J$-77S_JM;&vV_+0wRxRk3}8-@}*Vt%kwfCu2{@42B@s6g304}dv4vn0^HGX zhx`&JOQhnVud&ckCli*T*z2kh?yZ;Hglw&E&CLyq=T;|zWU)xZ!?)=V?ZK!})C0*z_5THdJb+>QqT zZCxSurQS|=^A8qpQ8rc*d$B=5c1cOBRxAee#EOHb8CLPLm}b1v&$q`yj|m2__R!#9 zWL0;KWRzOJxj=jaLa2xoDVP!G$*BW*K-A(Sy2n+*9Q6Jh+#^_LVIKJ&%7x0x28ynC zI=@=K7_RD(w`9?WE5z52%&fc4LtGypkq`AZ-XDzmY>}6t_;kzW&F^Jh^!4>2(EuGh z!=v%wcY|iCEZ9*EBN{$F^TTiBC~zn?ig!$)tl98;OH|bMJox8N>n@yy3_&;Tt;Prm z^B;RQtkPR`6`#svXitAw1f{{9;l{QSCMQQn@-YgM?>8(n)Cq9Jdgh|~X}~_x437#T zN#{H~#ezQN$gt{ejRw3JQO8{$yQPqHlLhtQ^kMBtGpJwOJMYiZFsdd#twTkFisdz; z4CTc6q}O-T^(c+M7}xx-rM^t5L)xMMdXE44Ek$GP{!D)eg%+IdBoMf@NMp?E1*$5f z54iWy+Y#qN?lj%?0f>+c&z?Pt6v?)>9Yb&FeY=;(Ty9vudrerye>_tg78zx7A4U>! zaT+Zb{x#SXH-ypU4J4)neW8aHy)f)# z2=X)2399I|&v!RGquAHR!I!q-i>2w$PlJN>l*$z3ytAamC*DOFHC!7{K0$ie)9d-P zB$NMeWyLGo`Rdp$XVi1^9?Ji5ks!&jUebyDA|McU;zFdE&fC<~n*R%sP`hq}SHX?E z>woRNyh>V>p44u8`jbSWy4#W@4DpMl7)?4<&+;3nMM(ayQ8&ONJR_JPh*z$bf<&g5 z?1^GhsQM#9e?KOs^ZR$!A!iB_RgAol&+xJ4UNyo@~P`CF5*)% z1)FdPJ{kZ}c+P!iE(4wjfmN*Dkc+%pCfk9KCl;i0tS<^8?%yVyPfn>$+h23j8qk)vQ*w zyyp}odhRE+1Wwf0s381vjM5eQ9A2fn-}4$L-YB0NCuj~uLs4*g$6njWsOx1 z(v<4T?c)vCLAB(BbrM9VS7~Wx1W|F}7bc6pfB$fcO?Oq({x}Wz=FO{aPAWyQlP%O6 z-(tUH&fm;=JpH|LxP`w`7_OL?gS*WO(c<=pN6 zHTTe~)@6YT5kt+6xgRTgo6xTp;_(IH0lil(S8+(MPwBo%p2OO)oZVx${j?5{Je`tc z-x~#`by~9w)r@XW@(vSv2+1wByNHvZ_G4R>2-*2Na-Giwd@%DYoir`Ka^oCb2cU70`rL?@~=j`2i2Fnkmt5y)i!>te()9+)LzRqlQ>#wjEd zG=-$!9}vU=N!;;j+^J&A*1Wg0*Peu>nuII}`Yf|kb6vd`B&V6}aEl>p`nShqN7b<7 zhI5tW+mjsh7Z)#5UJ)|vIWBAZ>^if!p|Gk>P8o?T@ zNZvt(bTo4^f+&)J3jM#zzC0Yt{(bvK%M>xuBBhK_B18$legAkJ-{a_b`c53DHkqu&3sCygg)j6$W&w1CY>7_d1$?JUvycf(qSg81Q0~|fl=k2dz9~VElb3nGc zqLsHVe$nLly+{VEcimeQ9<_FpGSek8D{ZdAUk|L(Nr(;IA?geqa^MSSP>&xw_AoJV z;i-ECasg)#8#byrmOWp_oIkbJMO1a2tg(Iq(0|_OThUQFDUYkxS0vjXX6x#A4zfXg zgNhsQ8XT+!7&wr-kLtuhkUtPs0;FtC5vtZD6nrbwp^ds=jT+!S0Z z`Z-NU_UC=Vx*8NXP$I>`ln%RPz!6AwZ+K5n4S7tjpvv!Q3f_C>X-U!kzHL_|e(d?d zbYWWPC&($v-`EwtQ1hW!vwgGbAEuuhM%oZ($O%~8II3BsNr-7pZo;%Fn`;MK*I@bm z(p4H~&#j(g|4AiG_D|$v@{4TT&72=taha|d^Bx!mBwEG{vg#O7QSDA`jVlCY`hxfR zypQ8c`}=XZPzno6%w{CMsTezVD`*yZdpDRr?OY7uW~cdw?|j&9U&RhVTmA>^QS;x^ zcJPmFQf7UO5c7gMyGs6x(b)oL-}PyczX(3v&?hC$EV;OKoxY^7ktXGf_Yo^&eNFm)3L- zg@%SQ_T3s;{nHDmWY@{@SihmKtL0XS(6e*xyL}UW9UJzgUv5?i*5d7x_~@)tI9{!q!K$;^s~YwY z1;RaZMF@YPm;KqA@#=$|RG^XY3_|2Fh*)oI0E#si#)FnVmV05Sstygj@G*wv+7T z>u%art@3T)m~bz##MqJ8x&SF#y|Jms%76EZClB$Vr-pkUKHmJYXg@uS^T5*Y)!$E$ zAG^B{#(*gBB!g_`n2haBBXZq88nmmasXV@Ma{6l<(mw6%N^88rU)6bO{-ji(C&NQw zg=As<-c$F8`n^A9zgFWQxHw2s96hM2stTI1nLU4&9D=3B=MFbp?rd0|AX#P0qfZ$? zs#~V2=)f?K2&+p!CLGOF6NRE6iphCUzX0H4W;VUhzt-yFZj~nRfj(vgP zI&kM`z5BTgKI^q*Jq^pglsAX}aGP-Tbe$bzr^KogTrrsQq7Cg3S`Tu>}q722GF9u#g68)iFOg&>~T zeeqqCkAZ_Kr?vl!RyU=NnzANm8Lrhbhrcw`G(f5?=6%gYKb>i2N6Qk7d<@q5SZC-I z{;XEj`cU*&c-!38xQ7J`u5{_LbvYGRvV3{1fC9Pp@9l*h%Vt#?jvX|#(85E7=n_WBlZ@VofYPe%zHUGli1nLd9Evb1)*{^ zmQewU04l;?qE|;~$K3d~T_5%tAt``GMO?yL`t}gg0A>LM@X(=eSm5*k-UM+Z(8JNS zMTCdnOGv+V?V-^1@D`xq-vYIKbDE zL;cC=^0H;%E=&;pJd<9Vx>cNsK z(H2rzN`*olU;if%-O$1fkmDwd4M1v$yndak$-PR|XKG>;VvD5REj@x@Y=N)C|^g0Y>3Vu^3kku1?YaEiMeha zyxl{qRKk4%}IVvgU(S1~4W*O(24h0`~FAjFE~= zjWay2`}6kuBP&{DQRNeKK)247vYBvlUq)U3E!90m}%DI-kz2~~Db2v*1J0OqYo3SQ zbu|`pVd*Oh6$IStzwTP3EjLXxM5s@D`V@uU)vF&}SAl7M?JdS`?P{XDZ)IvNqobmr z9)PDp!)p89y}Wgf8wIf7=Dm41?kFanwl68eC##RDd^!|B6Z~A^q!PAu&=S$ry}ddjIyzdAdv3QU%8L7&X`ODF zfN7ykVA?WZ>?X9fw4Vi5Vm%wNGtp4DR|=&oOC7=r!mUrA_Tw5Q>~94@`@Vk6I%oZB zZ$%=D@x|4}_^>DH!c>-*kFbdXu7gf)OaM>GUJP;i`%NQaHahSMKHo)2#E2WbnzwIl zOi$wKBDP2f-d#|}C)hTf< zMsTONPU((EklM&NUL$|yT&$A&5kx2ib-W0H>rP!f#4S8(PrSkTX>V^B8yiDL1(-Lk z9H=GiiRo|MbXQLgX;llUT9Pvls)tpEvke?bp#PDBahm+GDrdYU{+=B4f&5!fV%s>s zI6@7_%(84W<Uz`@MQxyHzwV-rT6y z_pH9(**z$;3xmkYain8IW0LRe{nw|QFIof#|7vNFE74$=Zb;L>a_;2M$h<`+MwM8? z7Xe`bGr+=%G$N}rB?~$oGBvITl{|WY&u|rjgwy2i55NsZG_YRXG#WbH%h*hzbq5Uv z`(?iCNrQ^KSIO5Ue^n;MpAYJMc6#mYh0zkRokW(?9=7&t5-RyBZS`(^6m9F@MFr~a z508-E+q}+W7zQVbS`5oL>cVJ?mM--GZVDOCoaE&7n>QOL8{t}RC<{5056@ZU(w!o_ z(Iu~CF6DP;^`z$&w_-3WStynBLp-xJJk@Hmc?oau%O>Xxd%IrGxITwMF@cE6A=(8n zLb6rYdNO$6FiyD+icjfmk@i&)dBsYT#r+<2Jg?SH`tY6y-Kpi>0w(V=5{Uo_N3~{! zCd?b)F==IFq?7P;zA<7ldi-U5N1;R0a9AX$9U-JOiUv*|SU$C5j@_$~{IKk!0j z_(!JYjgmtc>Tc?eWbR0o{Je+O?JfOEo-`&WW5qBNR>f%N*d%^1wwQazrO4Z6@9=+{6# z&etqT{PwO?-%*UdHvFA>IyWK23uYx=#_z-0OwlZwEce~8zSB(ed|}6_0jue)lwb$} zDPD$*8rP;BaZr_q_bPRWa4@KJOzl)ntiPK0&Z^z`TSA*yeqK5K=~5$+Re$p6q&+B$sk~ zGl%q8qfJ7wI4tE|n01akZp+yS;ZNc2{y%o!<(G=&Wb)2q^71fwr7c`v_4|NQ7-!B# z*kbexy6ctg3Zb1$?ni}9G6EpPHOLM2r1wlNuN$e2P|JSYyDP{Bst_XwUd~x-k=nhL zX6xGODrjx?iWsN}Uuo^f_hYWlm(I8gAFW)kNU)l1^5I`li4k22hk74oOZqkdf^z0t zCzLxpGgAzWRyp~(p~pAeaU$ENGkUz?n}U9#;m0h$z|jjEC;q;(txt&|k4646Tmh_$ zGYg2GwM?I~-&V)B+wy#k3wE?;ZsYMAP>2~_=4u5*a|MgQ< zT)e8aP*b2Gb%Ja_jzYsnRwM*5eUHqX zvPgrmd$Q`@KY6GpoYhNEqq2SP4r~(uKv#bR&LjS1;RTy0 z%y39w77TDCu180YH?NvLg?<2Mn;r)GL3L-(7nntmB`W9%gGzl+>Ve3}1g1Aw%=PH1 z(%Ag1wRQ25C8UCyYUxwo$uY+9&fKa4l@=Z~EwQ|s@~diOr)+*xuDVm1_q=}C7l+2E=^HCw-QKsDlMv!Rz*Hi8ZEp%)Smt+3Ab~v-GK>cZ z62iLZ22uEelcUbrh()(@MiqQg{4myZTcs4^QaX0Sh97=ssBog9sy=`Iw(O@TgORqr zI(p5-sghL^b>LS=qz;YtWmI&E>YO#=2H_Dn|0AeLG5?q<5&bx_Ck= z1?v~ZofTAVGIq0CGttwRF6;l7ExwTdnOSmCco7L#k>5AyXiA?rw>q4ip%@Rfoe3a9 zC@ka!LQbo26hE2EvoagTvk3oHm*;%4{4?3J>3UnlCXYOe%=TxAiTh6Xq;BqPsL$)^ zojd)(?)z6*cw}JQsnn%tk!rkk;jcK&B1`V|#XY3VhcXJLB=j)MQFdGt8*Jv1EQX6~ zQR`1+`k}$9_wV(Uets!Fe$7wUY2J`wo!5Q0;iSss+@|T1Q_qS&y^_(xB>LDfNyo9- z1jQvogIw)DQvlOKC{yWD5+6RyMs|csjmV>ZIDNPH9%J!sJEz(JCi{Zl0Lw(KJzHWM zhR$5`;MD{nJf;i4$p!Ae<^cUT$2tY<(li=PT-*URI6dpp7^D808X8tSx5ORmDrBt% z1v0SMd^mJ2@jo7|ieS`i_Di?>{%Kl({kTW9X#{u#Xm}t~aSzWfW#-upFg7tc)z|m} ze2X$ah;OP&Kzw3_(36w5@Xm5$W@d1B|(vtuQ7(pl+}qm@ri+N6L4%OmtwLgSA8Jq&7L$bV%ROelmKr z_h#OZ)S)ZK@ZUN2{qL`i9j{!6TcBX^0-&Q1q3rY(UnmE7>rgpgu)Tp|6;Uj6ht@=R-WG+`XT@?kW`# zEllFdFBEMPP_zU{;bbl*gkTOP2oz|6NQB+#`af5spoH%mK?{c2Z-((pC zLh&7fu3gKs9S;+Js5fTPDNrLVR={oYx8Xla8qv>seU(j1HmlB&)QpkS(Pt;LWXZ4= zzbn~@wBWtBcNy0l;0E$2m4yARMXtR?^^7fS%hcZX_Oc_-0vwTBXAvZ5MvZ`Dw6g*p zKFK9J<7(Kc0#Jm<0Mf$Zmd>4dB*D}=gS_4TyWyAhskZjg_oZUe)nr$9sBw zHRDadY=Xq>JQ~<^VC-Uy)Bu_o*dynDwrVOsmO$)UV%reuKlSO)Jw5DE%^BchIevNa zs>2OLDQC1iFhRf~!}6ki7sUfX64$*aQ1le1fD)Xs5LOPfUGcm5x#q;u#ty*B%`mQc z7+l9YIw8Vzl5~P3J8;6wE7ShQiQ@I?@TDDwEJS688_BXVtVj~SKX7lOz=9kH;Nh)6j!1(`I&j4pH9tm=40wV! z^o*>m3@D>LS-tHF2GS&bWLOV6UT!fOsizoDFiivD6tqZ$SJ+N1Ynp@~5rk5IpmPSA zuW>9WzeX#y5+)29KH$1j%t+q7a1j`Qz+h3tVk+?pOg^B)1G%!*rfn;&y4{pc8wvF^ zJ;Y$4t?n|xz(z$R=6aw;;jH38!WJ#G4902{;T?*~fTVQ54ftI0*^C=hLdeCsU4T$u z3#3ye;Zn-OhZYbMjS5c1K*Vre$@}+?$B$PWd3NL(sD&TEXz0Nx@)`tcE<>j#zgC10 z1}k@l9+qjJI+%XO*w*$d^Z>Hpjs)JPhEq^}Og zny)hLAabTa$o)Ha3fmYMj}`}C}@zhxHOH{eEbI^-v(c>iCZs{Ee z2PsrdFdxyOFkwyztYV`;NZTmS3I%7-W| zPkO(F#X~Ggq;We#C*_|my|DLRA;49z5xu?NTy~OuQSR-c&YxqCe&^rux3tFVtlhzb zIOu85pL3huA%r#21-ZC9X*=F$3l8_MKB(WAIM+FNWUY|#SM6gdK1=fd&Wn=+ynPMc zXV&TZxnpkrd!mM{SaEsTVO(mAKfS%P3Y*$H9~0_`vY=`sh7Sy?BU#S3!P++z)Fx8? zspc>!@B>}sV#ca4f+*OEgalXzLbh?s*{N5N?_dl3;qrH!N=*T=7wiOO|G()mm?xB# zuu&FZ30YeDvJJms9ziUmkfR(5_B;MdkWo_SCbFU61jlv&XqBBcH8tZKJ0ZhEUoew& zK|6eg?iF8=TyGIBThC6>0VNH(Kb`0}v=qo!*%TairRD)aoegF{1Z#TGS zG0Ea18*fg<#HXZy!x*fE#ns{`*Z{9xLzc~K=ys7F6rBTAzj-ods0wqd8p0H_>ZD|D zN`1WTc4A?RuHJ8`rf`$-z^0L=;meRXoK_CdVlcG&)0b^d zL6b8?iQ(EdE0ac+7-Y#rk76ym&-!|JnX9T!z&q zI}CE_ zSbD(h5_>r#<+F+NE65#Gsx5?@y#&)tckk|l4(EAsVgfYbU9m&4%AP+lH+NS$kQckK zU_WN}Fv?Z)%WZoNybfdqPmog~Oz+}k@!0kiS_GqHGn88cP=6pTnSjds8R+^=qOGt< zcRT(A5A3#zvjF`8PK<^-?v%rv`Q#Pr1=ZWqd;Yya!2oj-*@smDtKfq zu+~9|uI8A)76Uf#@fs`d?q`ta0m_fsoz%eW@N@(pA9U!?pFg9hmR+-E4TOwfg#sob zmRAm2D$(&tm?3*P`e7$QCq$rC%3m?G2AL;fz4?{NF_IhIGP?Es6BG(sw z{-n_Gi-OO@$ig%c!y&~Oea-D~7b@+C)OFxTf6E4eIe{99hTQL50WO4XB}c%z7}k_N zzA3!Z>O$M-lP9vE^kWEU#sx$8-0bXH+s6QB@v-G&bfD3Qh}c(y0x!lAJ>7Uyz{l_< zG+=M!5j1^-66&9Ifr9ZhqN2$rkH2C}0OjDoDz1R^V9Qi&zXXn80g{?VY8DDT!T5hz z_yUMb+?nXMBCcOA6GU%RyG0^gH?vEmTh!IbLKI7YJNS)nF$8!Zf!z=i|7wgnA1?J?BKxx{2|lcgbG;_bhiovBh9Var&2I z`nz@wR-2fblDW^NMnN-^)p<4BousCW`gHa5NRLtD z6bneIZ)q=~X7DNC*|~R5dm^!2;dro?ZF&usSovQ!Fq%Aa1a7m6U~;oE&TTqK;@4*7 z-&^Gi`R~;Uk$jkcaDp*2Vq8LN{Jo3{ukkd-7OuQ@7o2|eFH`03kUpITYA+Awy4>7U|+%x;a?=#7A9(AYzy3s zirOBjisKXk#Aai1{Tkh^OzSLPO8f)y7KzuD`k=sZEhlN<#`oZnn!U$)Iip=NFKOd8yo2f{|YsBvc4PpaVAj$Oy^h{By49Rq-AeNiizpq*%}7Qu9jU{rETQ-B^Y^tCw&+CM4yR-Rp00ok7cgaA=c zHB#gDelB&Z108Hb>4b5<@#OpmYXwct|ECUo*Y7GwoLTiNyY?yl_ZFEF<6Gvd^OGu^ zbdDgK_7VF4C*FUp;P#gM|I`}fQZK~@8JPPV$cY8EkICjfUPCGprt(OS;FYMSqrM3; ze_6MchoH*i48pVocVHm+m94n6w3CCwjg1a_fi(b2T|gED{1z;v-v1$!RX z#rG+vBke20s?L@nx@8OY>;Fmn+Udj7kr5GMKflmyOK!-uVZ${FGdZGkpP8B2?%idb zj@Sc3o751igp~E`18B7P=g*B!tuhIwMKHgYKe)?P2(gC% z(^M$lI69`N*I|Pk)d)-*;Yy2k3`&yoXqdehm6V_y#n;4QYU_UE1L0S$EL^_a9Q&Qd z#^h4!t{bx87c)?Kw12oWpp1E;_n|{#b$JMWZG1aKu992nA|e?UDafASIe^6rrb;VF z8eQ?R5!gik2VKV?_Uo@Y z0o%BH5w;FJ9qmqUAb%-b--c7oAy7d=KmdspEipEB+K`H|l0e#Ofb)cfl(6XNEwFCA ztU7kyCJOM#xs(-Pemq44M*hdnVfGA-X9Cu$_bv<<@Xg24*rsYJuV3iLy^~A2MX#vQm;HCKU zS3gA32VI&8kQ*4)tM)|%^;rcw0=m5 zbazF$iv?D5^BTY}pR22NDGqox5)+#|r%=xT=T(g@I`mW&!k2Ara$Nh2jKIonc~*!! zk6maCYT%)F z>WD0E#rDVjXh)3M-vpb>#42@&e)UbH@%6Oej_1#q(odH2q%T^B2^s1_et{jLIpfu}Vdjzd>089<)##v6t%)B|YrrdrMI0=ZVVpA=|X@fS1o3Obz{7+qh3xwzW&%KEgfR@NJaP_M2{X}GZwUHM*j#=H$(aC1j0z(E-~EW)x5$*RP6Ues_CW#qYWEA6W!(e{0XKCeep~PLrxT&)lx$Sv>Zr&Dwlm8P7Fp9ifIIJ>Vl2GWG!B5+gdjzTU?mZq zq>9(CUfsKUH^V7z@EjI&jI)R{MP#MX_4iT^jm6e%hY%?M25>yEK<(BVZu6Og9b-k~)mD2o_v;~wISjSg4awB8XymZ)d)k{Ymj$kOx? zq;$JdHo|%=_1Qbp6u}ojSisSR^he+|sFoN{UckUKiqr)#K5^IY$dpv)fOKhtyV{~V zbSkJXRClGAqVVM|qO#=G(gAkz-1HJsAQ&`ghR_GAChO0lLLf~W9z}&RlRe{hrV;gH z#WGyU0p2})DU}iyHCK}SwNBS_boGa`4}8~Ule{vrk`pR~lV{H~1&!E*e!R&2pPP{s z;B(>V#+x7%;weQ(C&Leut{CCj{~PU?>(U^-9{WXm6F)VGm^69)Q~i-T7L;MK<({d3 z=Fxs{2dSr1g!oz8K}#NzRZmS0 z8UGsskt_yzDt_xcp(3V53Xt?IG5Rd9gG9qdeA<8(^2#$EU=VhM&6WJoIy4Up{`0X!1h~RK-(UU>|)%~Pf+*NO9+qH?qk(*_Hszt zuX6u(?=BBEy|&z+9{9Gik_mlG@6r2M^&3fQe`JKnQzp$xCz zW=JALA^8>`j>OjY6#JH*9+rNGuN_8;#|W*>IBLB)7|SNxCk6@5(p%&RX|TC!`$g6k z#Nq(f7R1=SJtROkbJHKiZFvvl?mRx;c4(G$Cn&)ii$G-XJmD(x0$Jl4x8h>N!KQ-#dK~!F$JwCqs;SOAUVu!ZA KR*I(eng0QaTZvNu literal 100274 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�N2!|{MJ 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 diff --git a/browser_tests/tests/interaction.spec.ts-snapshots/standard-shift-wheel-pan-left-chromium-linux.png b/browser_tests/tests/interaction.spec.ts-snapshots/standard-shift-wheel-pan-left-chromium-linux.png index a9d0efb74912f01837906e2c4e079e0070239241..57a92edc5242e2d33a3d339c8aacadf10fa3a4e0 100644 GIT binary patch literal 98303 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 UX6dU@a%bvl>F-F>usrww05%-b`Tzg` literal 99438 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�gI9hK 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%0Aa-XtXjB=Fxl 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 KR*I(eng0QaTZvNu diff --git a/browser_tests/tests/interaction.spec.ts-snapshots/standard-shift-wheel-pan-right-chromium-linux.png b/browser_tests/tests/interaction.spec.ts-snapshots/standard-shift-wheel-pan-right-chromium-linux.png index 57b6438aeb00eec7ccbc329e4782f344a22f1e4f..e607294e32236e5620278121c7972de953e65feb 100644 GIT binary patch literal 104502 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

^y>S6Q0RFK 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�N2!|{MJ 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 diff --git a/src/lib/litegraph/src/LGraphCanvas.ts b/src/lib/litegraph/src/LGraphCanvas.ts index fade868c2..e351ce722 100644 --- a/src/lib/litegraph/src/LGraphCanvas.ts +++ b/src/lib/litegraph/src/LGraphCanvas.ts @@ -2348,7 +2348,7 @@ export class LGraphCanvas if ( ctrlOrMeta && !e.altKey && - LiteGraph.canvasNavigationMode === 'legacy' + LiteGraph.leftMouseClickBehavior === 'panning' ) { this.#setupNodeSelectionDrag(e, pointer, node) @@ -2616,8 +2616,8 @@ export class LGraphCanvas !pointer.onDrag && this.allow_dragcanvas ) { - // allow dragging canvas if canvas is not in standard, or read-only (pan mode in standard) - if (LiteGraph.canvasNavigationMode !== 'standard' || this.read_only) { + // allow dragging canvas based on leftMouseClickBehavior or read-only mode + if (LiteGraph.leftMouseClickBehavior === 'panning' || this.read_only) { pointer.onClick = () => this.processSelect(null, e) pointer.finally = () => (this.dragging_canvas = false) this.dragging_canvas = true @@ -3629,8 +3629,8 @@ export class LGraphCanvas e.ctrlKey || (e.metaKey && navigator.platform.includes('Mac')) const isZoomModifier = isCtrlOrMacMeta && !e.altKey && !e.shiftKey - if (isZoomModifier || LiteGraph.canvasNavigationMode === 'legacy') { - // Legacy mode or standard mode with ctrl - use wheel for zoom + if (isZoomModifier || LiteGraph.mouseWheelScroll === 'zoom') { + // Zoom mode or modifier key pressed - use wheel for zoom if (isTrackpad) { // Trackpad gesture - use smooth scaling scale *= 1 + e.deltaY * (1 - this.zoom_speed) * 0.18 @@ -3645,7 +3645,6 @@ export class LGraphCanvas this.ds.changeScale(scale, [e.clientX, e.clientY]) } } else { - // Standard mode without ctrl - use wheel / gestures to pan // Trackpads and mice work on significantly different scales const factor = isTrackpad ? 0.18 : 0.008_333 diff --git a/src/lib/litegraph/src/LiteGraphGlobal.ts b/src/lib/litegraph/src/LiteGraphGlobal.ts index 85911e5b9..5d762799a 100644 --- a/src/lib/litegraph/src/LiteGraphGlobal.ts +++ b/src/lib/litegraph/src/LiteGraphGlobal.ts @@ -304,9 +304,14 @@ export class LiteGraphGlobal { /** * "standard": change the dragging on left mouse button click to select, enable middle-click or spacebar+left-click dragging * "legacy": Enable dragging on left-click (original behavior) + * "custom": Use leftMouseClickBehavior and mouseWheelScroll settings * @default "legacy" */ - canvasNavigationMode: 'standard' | 'legacy' = 'legacy' + canvasNavigationMode: 'standard' | 'legacy' | 'custom' = 'legacy' + + leftMouseClickBehavior: 'panning' | 'select' = 'panning' + + mouseWheelScroll: 'panning' | 'zoom' = 'panning' /** * If `true`, widget labels and values will both be truncated (proportionally to size), diff --git a/src/lib/litegraph/test/__snapshots__/ConfigureGraph.test.ts.snap b/src/lib/litegraph/test/__snapshots__/ConfigureGraph.test.ts.snap index 80e344d5b..a90c8d3de 100644 --- a/src/lib/litegraph/test/__snapshots__/ConfigureGraph.test.ts.snap +++ b/src/lib/litegraph/test/__snapshots__/ConfigureGraph.test.ts.snap @@ -1,333 +1,5 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`LGraph configure() > LGraph matches previous snapshot (normal configure() usage) > configuredBasicGraph 1`] = ` -LGraph { - "_groups": [ - LGraphGroup { - "_bounding": Float32Array [ - 20, - 20, - 1, - 3, - ], - "_children": Set {}, - "_nodes": [], - "_pos": Float32Array [ - 20, - 20, - ], - "_size": Float32Array [ - 1, - 3, - ], - "color": "#6029aa", - "flags": {}, - "font": undefined, - "font_size": 14, - "graph": [Circular], - "id": 123, - "isPointInside": [Function], - "selected": undefined, - "setDirtyCanvas": [Function], - "title": "A group to test with", - }, - ], - "_input_nodes": undefined, - "_last_trigger_time": undefined, - "_links": Map {}, - "_nodes": [ - LGraphNode { - "_collapsed_width": undefined, - "_level": undefined, - "_pos": Float32Array [ - 10, - 10, - ], - "_posSize": Float32Array [ - 10, - 10, - 140, - 60, - ], - "_relative_id": undefined, - "_shape": undefined, - "_size": Float32Array [ - 140, - 60, - ], - "action_call": undefined, - "action_triggered": undefined, - "badgePosition": "top-left", - "badges": [], - "bgcolor": undefined, - "block_delete": undefined, - "boxcolor": undefined, - "clip_area": undefined, - "clonable": undefined, - "color": undefined, - "console": undefined, - "exec_version": undefined, - "execute_triggered": undefined, - "flags": {}, - "freeWidgetSpace": undefined, - "gotFocusAt": undefined, - "graph": [Circular], - "has_errors": undefined, - "id": 1, - "ignore_remove": undefined, - "inputs": [], - "last_serialization": undefined, - "locked": undefined, - "lostFocusAt": undefined, - "mode": 0, - "mouseOver": undefined, - "order": 0, - "outputs": [], - "progress": undefined, - "properties": {}, - "properties_info": [], - "redraw_on_mouse": undefined, - "removable": undefined, - "resizable": undefined, - "selected": undefined, - "serialize_widgets": undefined, - "showAdvanced": undefined, - "strokeStyles": { - "error": [Function], - "selected": [Function], - }, - "title": "LGraphNode", - "title_buttons": [], - "type": "mustBeSet", - "widgets": undefined, - "widgets_start_y": undefined, - "widgets_up": undefined, - }, - ], - "_nodes_by_id": { - "1": LGraphNode { - "_collapsed_width": undefined, - "_level": undefined, - "_pos": Float32Array [ - 10, - 10, - ], - "_posSize": Float32Array [ - 10, - 10, - 140, - 60, - ], - "_relative_id": undefined, - "_shape": undefined, - "_size": Float32Array [ - 140, - 60, - ], - "action_call": undefined, - "action_triggered": undefined, - "badgePosition": "top-left", - "badges": [], - "bgcolor": undefined, - "block_delete": undefined, - "boxcolor": undefined, - "clip_area": undefined, - "clonable": undefined, - "color": undefined, - "console": undefined, - "exec_version": undefined, - "execute_triggered": undefined, - "flags": {}, - "freeWidgetSpace": undefined, - "gotFocusAt": undefined, - "graph": [Circular], - "has_errors": undefined, - "id": 1, - "ignore_remove": undefined, - "inputs": [], - "last_serialization": undefined, - "locked": undefined, - "lostFocusAt": undefined, - "mode": 0, - "mouseOver": undefined, - "order": 0, - "outputs": [], - "progress": undefined, - "properties": {}, - "properties_info": [], - "redraw_on_mouse": undefined, - "removable": undefined, - "resizable": undefined, - "selected": undefined, - "serialize_widgets": undefined, - "showAdvanced": undefined, - "strokeStyles": { - "error": [Function], - "selected": [Function], - }, - "title": "LGraphNode", - "title_buttons": [], - "type": "mustBeSet", - "widgets": undefined, - "widgets_start_y": undefined, - "widgets_up": undefined, - }, - }, - "_nodes_executable": [], - "_nodes_in_order": [ - LGraphNode { - "_collapsed_width": undefined, - "_level": undefined, - "_pos": Float32Array [ - 10, - 10, - ], - "_posSize": Float32Array [ - 10, - 10, - 140, - 60, - ], - "_relative_id": undefined, - "_shape": undefined, - "_size": Float32Array [ - 140, - 60, - ], - "action_call": undefined, - "action_triggered": undefined, - "badgePosition": "top-left", - "badges": [], - "bgcolor": undefined, - "block_delete": undefined, - "boxcolor": undefined, - "clip_area": undefined, - "clonable": undefined, - "color": undefined, - "console": undefined, - "exec_version": undefined, - "execute_triggered": undefined, - "flags": {}, - "freeWidgetSpace": undefined, - "gotFocusAt": undefined, - "graph": [Circular], - "has_errors": undefined, - "id": 1, - "ignore_remove": undefined, - "inputs": [], - "last_serialization": undefined, - "locked": undefined, - "lostFocusAt": undefined, - "mode": 0, - "mouseOver": undefined, - "order": 0, - "outputs": [], - "progress": undefined, - "properties": {}, - "properties_info": [], - "redraw_on_mouse": undefined, - "removable": undefined, - "resizable": undefined, - "selected": undefined, - "serialize_widgets": undefined, - "showAdvanced": undefined, - "strokeStyles": { - "error": [Function], - "selected": [Function], - }, - "title": "LGraphNode", - "title_buttons": [], - "type": "mustBeSet", - "widgets": undefined, - "widgets_start_y": undefined, - "widgets_up": undefined, - }, - ], - "_subgraphs": Map {}, - "_version": 3, - "catch_errors": true, - "config": {}, - "elapsed_time": 0.01, - "errors_in_execution": undefined, - "events": CustomEventTarget {}, - "execution_time": undefined, - "execution_timer_id": undefined, - "extra": {}, - "filter": undefined, - "fixedtime": 0, - "fixedtime_lapse": 0.01, - "globaltime": 0, - "id": "ca9da7d8-fddd-4707-ad32-67be9be13140", - "iteration": 0, - "last_update_time": 0, - "links": Map {}, - "list_of_graphcanvas": null, - "nodes_actioning": [], - "nodes_executedAction": [], - "nodes_executing": [], - "revision": 0, - "runningtime": 0, - "starttime": 0, - "state": { - "lastGroupId": 123, - "lastLinkId": 0, - "lastNodeId": 1, - "lastRerouteId": 0, - }, - "status": 1, - "vars": {}, - "version": 1, -} -`; - -exports[`LGraph configure() > LGraph matches previous snapshot (normal configure() usage) > configuredMinGraph 1`] = ` -LGraph { - "_groups": [], - "_input_nodes": undefined, - "_last_trigger_time": undefined, - "_links": Map {}, - "_nodes": [], - "_nodes_by_id": {}, - "_nodes_executable": [], - "_nodes_in_order": [], - "_subgraphs": Map {}, - "_version": 0, - "catch_errors": true, - "config": {}, - "elapsed_time": 0.01, - "errors_in_execution": undefined, - "events": CustomEventTarget {}, - "execution_time": undefined, - "execution_timer_id": undefined, - "extra": {}, - "filter": undefined, - "fixedtime": 0, - "fixedtime_lapse": 0.01, - "globaltime": 0, - "id": "d175890f-716a-4ece-ba33-1d17a513b7be", - "iteration": 0, - "last_update_time": 0, - "links": Map {}, - "list_of_graphcanvas": null, - "nodes_actioning": [], - "nodes_executedAction": [], - "nodes_executing": [], - "revision": 0, - "runningtime": 0, - "starttime": 0, - "state": { - "lastGroupId": 0, - "lastLinkId": 0, - "lastNodeId": 0, - "lastRerouteId": 0, - }, - "status": 1, - "vars": {}, - "version": 1, -} -`; -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - exports[`LGraph configure() > LGraph matches previous snapshot (normal configure() usage) > configuredBasicGraph 1`] = ` LGraph { "_groups": [ diff --git a/src/locales/en/settings.json b/src/locales/en/settings.json index 7c7cec305..09335e18a 100644 --- a/src/locales/en/settings.json +++ b/src/locales/en/settings.json @@ -30,7 +30,7 @@ "tooltip": "Image URL for the canvas background. You can right-click an image in the outputs panel and select \"Set as Background\" to use it, or upload your own image using the upload button." }, "Comfy_Canvas_NavigationMode": { - "name": "Canvas Navigation Mode", + "name": "Navigation Mode", "options": { "Standard (New)": "Standard (New)", "Drag Navigation": "Drag Navigation" diff --git a/src/platform/settings/composables/useLitegraphSettings.ts b/src/platform/settings/composables/useLitegraphSettings.ts index 347e0289e..468c7d339 100644 --- a/src/platform/settings/composables/useLitegraphSettings.ts +++ b/src/platform/settings/composables/useLitegraphSettings.ts @@ -131,11 +131,26 @@ export const useLitegraphSettings = () => { const navigationMode = settingStore.get('Comfy.Canvas.NavigationMode') as | 'standard' | 'legacy' + | 'custom' LiteGraph.canvasNavigationMode = navigationMode LiteGraph.macTrackpadGestures = navigationMode === 'standard' }) + watchEffect(() => { + const leftMouseBehavior = settingStore.get( + 'Comfy.Canvas.LeftMouseClickBehavior' + ) as 'panning' | 'select' + LiteGraph.leftMouseClickBehavior = leftMouseBehavior + }) + + watchEffect(() => { + const mouseWheelScroll = settingStore.get( + 'Comfy.Canvas.MouseWheelScroll' + ) as 'panning' | 'zoom' + LiteGraph.mouseWheelScroll = mouseWheelScroll + }) + watchEffect(() => { LiteGraph.saveViewportWithGraph = settingStore.get( 'Comfy.EnableWorkflowViewRestore' diff --git a/src/platform/settings/constants/coreSettings.ts b/src/platform/settings/constants/coreSettings.ts index cdb2fe709..127229044 100644 --- a/src/platform/settings/constants/coreSettings.ts +++ b/src/platform/settings/constants/coreSettings.ts @@ -1,4 +1,5 @@ import { LinkMarkerShape, LiteGraph } from '@/lib/litegraph/src/litegraph' +import { useSettingStore } from '@/platform/settings/settingStore' import type { SettingParams } from '@/platform/settings/types' import type { ColorPalettes } from '@/schemas/colorPaletteSchema' import type { Keybinding } from '@/schemas/keyBindingSchema' @@ -138,6 +139,95 @@ export const CORE_SETTINGS: SettingParams[] = [ type: 'boolean', defaultValue: false }, + { + id: 'Comfy.Canvas.NavigationMode', + category: ['LiteGraph', 'Canvas Navigation', 'NavigationMode'], + name: 'Navigation Mode', + defaultValue: 'legacy', + type: 'combo', + sortOrder: 100, + options: [ + { value: 'standard', text: 'Standard (New)' }, + { value: 'legacy', text: 'Drag Navigation' }, + { value: 'custom', text: 'Custom' } + ], + versionAdded: '1.25.0', + defaultsByInstallVersion: { + '1.25.0': 'legacy' + }, + onChange: async (newValue: string) => { + const settingStore = useSettingStore() + + if (newValue === 'standard') { + // Update related settings to match standard mode - select + panning + await settingStore.set('Comfy.Canvas.LeftMouseClickBehavior', 'select') + await settingStore.set('Comfy.Canvas.MouseWheelScroll', 'panning') + } else if (newValue === 'legacy') { + // Update related settings to match legacy mode - panning + zoom + await settingStore.set('Comfy.Canvas.LeftMouseClickBehavior', 'panning') + await settingStore.set('Comfy.Canvas.MouseWheelScroll', 'zoom') + } + } + }, + { + id: 'Comfy.Canvas.LeftMouseClickBehavior', + category: ['LiteGraph', 'Canvas Navigation', 'LeftMouseClickBehavior'], + name: 'Left Mouse Click Behavior', + defaultValue: 'panning', + type: 'radio', + sortOrder: 50, + options: [ + { value: 'panning', text: 'Panning' }, + { value: 'select', text: 'Select' } + ], + versionAdded: '1.27.4', + onChange: async (newValue: string) => { + const settingStore = useSettingStore() + + const navigationMode = settingStore.get('Comfy.Canvas.NavigationMode') + + if (navigationMode !== 'custom') { + if ( + (newValue === 'select' && navigationMode === 'standard') || + (newValue === 'panning' && navigationMode === 'legacy') + ) { + return + } + + // only set to custom if it doesn't match the preset modes + await settingStore.set('Comfy.Canvas.NavigationMode', 'custom') + } + } + }, + { + id: 'Comfy.Canvas.MouseWheelScroll', + category: ['LiteGraph', 'Canvas Navigation', 'MouseWheelScroll'], + name: 'Mouse Wheel Scroll', + defaultValue: 'zoom', + type: 'radio', + options: [ + { value: 'panning', text: 'Panning' }, + { value: 'zoom', text: 'Zoom in/out' } + ], + versionAdded: '1.27.4', + onChange: async (newValue: string) => { + const settingStore = useSettingStore() + + const navigationMode = settingStore.get('Comfy.Canvas.NavigationMode') + + if (navigationMode !== 'custom') { + if ( + (newValue === 'panning' && navigationMode === 'standard') || + (newValue === 'zoom' && navigationMode === 'legacy') + ) { + return + } + + // only set to custom if it doesn't match the preset modes + await settingStore.set('Comfy.Canvas.NavigationMode', 'custom') + } + } + }, { id: 'Comfy.Graph.CanvasInfo', category: ['LiteGraph', 'Canvas', 'CanvasInfo'], @@ -813,21 +903,6 @@ export const CORE_SETTINGS: SettingParams[] = [ defaultValue: 8, versionAdded: '1.26.7' }, - { - id: 'Comfy.Canvas.NavigationMode', - category: ['LiteGraph', 'Canvas', 'CanvasNavigationMode'], - name: 'Canvas Navigation Mode', - defaultValue: 'legacy', - type: 'combo', - options: [ - { value: 'standard', text: 'Standard (New)' }, - { value: 'legacy', text: 'Drag Navigation' } - ], - versionAdded: '1.25.0', - defaultsByInstallVersion: { - '1.25.0': 'legacy' - } - }, { id: 'Comfy.Canvas.SelectionToolbox', category: ['LiteGraph', 'Canvas', 'SelectionToolbox'], diff --git a/src/schemas/apiSchema.ts b/src/schemas/apiSchema.ts index d761133ff..007b3e58d 100644 --- a/src/schemas/apiSchema.ts +++ b/src/schemas/apiSchema.ts @@ -469,6 +469,8 @@ const zSettings = z.object({ 'Comfy.Minimap.RenderBypassState': z.boolean(), 'Comfy.Minimap.RenderErrorState': z.boolean(), 'Comfy.Canvas.NavigationMode': z.string(), + 'Comfy.Canvas.LeftMouseClickBehavior': z.string(), + 'Comfy.Canvas.MouseWheelScroll': z.string(), 'Comfy.VueNodes.Enabled': z.boolean(), 'Comfy.Assets.UseAssetAPI': z.boolean(), 'Comfy-Desktop.AutoUpdate': z.boolean(), diff --git a/tests-ui/tests/litegraph/core/__snapshots__/litegraph.test.ts.snap b/tests-ui/tests/litegraph/core/__snapshots__/litegraph.test.ts.snap index d45626827..5302edcbc 100644 --- a/tests-ui/tests/litegraph/core/__snapshots__/litegraph.test.ts.snap +++ b/tests-ui/tests/litegraph/core/__snapshots__/litegraph.test.ts.snap @@ -155,9 +155,11 @@ LiteGraphGlobal { "do_add_triggers_slots": false, "highlight_selected_group": true, "isInsideRectangle": [Function], + "leftMouseClickBehavior": "panning", "macGesturesRequireMac": true, "macTrackpadGestures": false, "middle_click_slot_add_default_node": false, + "mouseWheelScroll": "panning", "node_box_coloured_by_mode": false, "node_box_coloured_when_on": false, "node_images_path": "", From fb079417002cb305a67b2f2aad61f0823b38a7e1 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Tue, 16 Sep 2025 20:33:03 -0700 Subject: [PATCH 03/21] Bump vite-plugin-dts (#5618) --- package.json | 2 +- pnpm-lock.yaml | 244 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 164 insertions(+), 82 deletions(-) diff --git a/package.json b/package.json index f8d72daeb..82c3ac45f 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "unplugin-vue-components": "^0.28.0", "uuid": "^11.1.0", "vite": "^5.4.19", - "vite-plugin-dts": "^4.3.0", + "vite-plugin-dts": "^4.5.4", "vite-plugin-html": "^3.2.2", "vite-plugin-vue-devtools": "^7.7.6", "vitest": "^3.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c16baf940..75fc42327 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -320,7 +320,7 @@ importers: version: 0.22.0(@vue/compiler-sfc@3.5.13) unplugin-vue-components: specifier: ^0.28.0 - version: 0.28.0(@babel/parser@7.28.3)(rollup@4.22.4)(vue@3.5.13(typescript@5.9.2)) + version: 0.28.0(@babel/parser@7.28.4)(rollup@4.22.4)(vue@3.5.13(typescript@5.9.2)) uuid: specifier: ^11.1.0 version: 11.1.0 @@ -328,8 +328,8 @@ importers: specifier: ^5.4.19 version: 5.4.19(@types/node@20.14.10)(lightningcss@1.30.1)(terser@5.39.2) vite-plugin-dts: - specifier: ^4.3.0 - version: 4.3.0(@types/node@20.14.10)(rollup@4.22.4)(typescript@5.9.2)(vite@5.4.19(@types/node@20.14.10)(lightningcss@1.30.1)(terser@5.39.2)) + specifier: ^4.5.4 + version: 4.5.4(@types/node@20.14.10)(rollup@4.22.4)(typescript@5.9.2)(vite@5.4.19(@types/node@20.14.10)(lightningcss@1.30.1)(terser@5.39.2)) vite-plugin-html: specifier: ^3.2.2 version: 3.2.2(vite@5.4.19(@types/node@20.14.10)(lightningcss@1.30.1)(terser@5.39.2)) @@ -547,6 +547,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} engines: {node: '>=6.9.0'} @@ -981,6 +986,10 @@ packages: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -1721,11 +1730,11 @@ packages: '@types/react': '>=16' react: '>=16' - '@microsoft/api-extractor-model@7.30.0': - resolution: {integrity: sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug==} + '@microsoft/api-extractor-model@7.30.7': + resolution: {integrity: sha512-TBbmSI2/BHpfR9YhQA7nH0nqVmGgJ0xH0Ex4D99/qBDAUpnhA2oikGmdXanbw9AWWY/ExBYIpkmY8dBHdla3YQ==} - '@microsoft/api-extractor@7.48.0': - resolution: {integrity: sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ==} + '@microsoft/api-extractor@7.52.13': + resolution: {integrity: sha512-K6/bBt8zZfn9yc06gNvA+/NlBGJC/iJlObpdufXHEJtqcD4Dln4ITCLZpwP3DNZ5NyBFeTkKdv596go3V72qlA==} hasBin: true '@microsoft/tsdoc-config@0.17.1': @@ -2067,6 +2076,15 @@ packages: rollup: optional: true + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.22.4': resolution: {integrity: sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==} cpu: [arm] @@ -2147,8 +2165,8 @@ packages: cpu: [x64] os: [win32] - '@rushstack/node-core-library@5.10.0': - resolution: {integrity: sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw==} + '@rushstack/node-core-library@5.14.0': + resolution: {integrity: sha512-eRong84/rwQUlATGFW3TMTYVyqL1vfW9Lf10PH+mVGfIb9HzU3h5AASNIw+axnBLjnD0n3rT5uQBwu9fvzATrg==} peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -2158,16 +2176,16 @@ packages: '@rushstack/rig-package@0.5.3': resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - '@rushstack/terminal@0.14.3': - resolution: {integrity: sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw==} + '@rushstack/terminal@0.16.0': + resolution: {integrity: sha512-WEvNuKkoR1PXorr9SxO0dqFdSp1BA+xzDrIm/Bwlc5YHg2FFg6oS+uCTYjerOhFuqCW+A3vKBm6EmKWSHfgx/A==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/ts-command-line@4.23.1': - resolution: {integrity: sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA==} + '@rushstack/ts-command-line@5.0.3': + resolution: {integrity: sha512-bgPhQEqLVv/2hwKLYv/XvsTWNZ9B/+X1zJ7WgQE9rO5oiLzrOZvkIW4pk13yOQBhHyjcND5qMOa6p83t+Z66iQ==} '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -2789,9 +2807,15 @@ packages: '@vue/compiler-core@3.5.13': resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.21': + resolution: {integrity: sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==} + '@vue/compiler-dom@3.5.13': resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-dom@3.5.21': + resolution: {integrity: sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==} + '@vue/compiler-sfc@3.5.13': resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} @@ -2815,8 +2839,8 @@ packages: '@vue/devtools-shared@7.7.6': resolution: {integrity: sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==} - '@vue/language-core@2.1.6': - resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -2856,6 +2880,9 @@ packages: '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/shared@3.5.21': + resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} + '@vue/test-utils@2.4.6': resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} @@ -2974,6 +3001,9 @@ packages: resolution: {integrity: sha512-hexLq2lSO1K5SW9j21Ubc+q9Ptx7dyRTY7se19U8lhIlVMLCNXWCyQ6C22p9ez8ccX0v7QVmwkl2l1CnuGoO2Q==} engines: {node: '>= 14.0.0'} + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + alien-signals@1.0.13: resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} @@ -3330,9 +3360,6 @@ packages: compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -3455,6 +3482,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} @@ -3996,9 +4032,9 @@ packages: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + engines: {node: '>=14.14'} fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} @@ -4512,12 +4548,12 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonify@0.0.1: resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} @@ -4738,6 +4774,9 @@ packages: magic-string@0.30.18: resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -4941,9 +4980,6 @@ packages: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} - minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -4985,6 +5021,9 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -6001,8 +6040,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true @@ -6022,6 +6061,9 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + uint8array-extras@1.5.0: resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} @@ -6067,10 +6109,6 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -6167,9 +6205,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite-plugin-dts@4.3.0: - resolution: {integrity: sha512-LkBJh9IbLwL6/rxh0C1/bOurDrIEmRE7joC+jFdOEEciAFPbpEKOLSAr5nNh5R7CJ45cMbksTrFfy52szzC5eA==} - engines: {node: ^14.18.0 || >=16.0.0} + vite-plugin-dts@4.5.4: + resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} peerDependencies: typescript: '*' vite: '*' @@ -6851,6 +6888,10 @@ snapshots: dependencies: '@babel/types': 7.28.2 + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 @@ -7410,6 +7451,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@bcoe/v8-coverage@1.0.2': {} '@comfyorg/comfyui-electron-types@0.4.73-0': {} @@ -8204,29 +8250,29 @@ snapshots: '@types/react': 19.1.9 react: 19.1.1 - '@microsoft/api-extractor-model@7.30.0(@types/node@20.14.10)': + '@microsoft/api-extractor-model@7.30.7(@types/node@20.14.10)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.10.0(@types/node@20.14.10) + '@rushstack/node-core-library': 5.14.0(@types/node@20.14.10) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.48.0(@types/node@20.14.10)': + '@microsoft/api-extractor@7.52.13(@types/node@20.14.10)': dependencies: - '@microsoft/api-extractor-model': 7.30.0(@types/node@20.14.10) + '@microsoft/api-extractor-model': 7.30.7(@types/node@20.14.10) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.10.0(@types/node@20.14.10) + '@rushstack/node-core-library': 5.14.0(@types/node@20.14.10) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.3(@types/node@20.14.10) - '@rushstack/ts-command-line': 4.23.1(@types/node@20.14.10) + '@rushstack/terminal': 0.16.0(@types/node@20.14.10) + '@rushstack/ts-command-line': 5.0.3(@types/node@20.14.10) lodash: 4.17.21 - minimatch: 3.0.8 + minimatch: 10.0.3 resolve: 1.22.10 semver: 7.5.4 source-map: 0.6.1 - typescript: 5.4.2 + typescript: 5.8.2 transitivePeerDependencies: - '@types/node' @@ -8640,6 +8686,14 @@ snapshots: optionalDependencies: rollup: 4.22.4 + '@rollup/pluginutils@5.3.0(rollup@4.22.4)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.22.4 + '@rollup/rollup-android-arm-eabi@4.22.4': optional: true @@ -8688,12 +8742,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.22.4': optional: true - '@rushstack/node-core-library@5.10.0(@types/node@20.14.10)': + '@rushstack/node-core-library@5.14.0(@types/node@20.14.10)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 7.0.1 + fs-extra: 11.3.2 import-lazy: 4.0.0 jju: 1.4.0 resolve: 1.22.10 @@ -8706,16 +8760,16 @@ snapshots: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.3(@types/node@20.14.10)': + '@rushstack/terminal@0.16.0(@types/node@20.14.10)': dependencies: - '@rushstack/node-core-library': 5.10.0(@types/node@20.14.10) + '@rushstack/node-core-library': 5.14.0(@types/node@20.14.10) supports-color: 8.1.1 optionalDependencies: '@types/node': 20.14.10 - '@rushstack/ts-command-line@4.23.1(@types/node@20.14.10)': + '@rushstack/ts-command-line@5.0.3(@types/node@20.14.10)': dependencies: - '@rushstack/terminal': 0.14.3(@types/node@20.14.10) + '@rushstack/terminal': 0.16.0(@types/node@20.14.10) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -9448,11 +9502,24 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-core@3.5.21': + dependencies: + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.21 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + '@vue/compiler-dom@3.5.13': dependencies: '@vue/compiler-core': 3.5.13 '@vue/shared': 3.5.13 + '@vue/compiler-dom@3.5.21': + dependencies: + '@vue/compiler-core': 3.5.21 + '@vue/shared': 3.5.21 + '@vue/compiler-sfc@3.5.13': dependencies: '@babel/parser': 7.28.3 @@ -9503,13 +9570,13 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/language-core@2.1.6(typescript@5.9.2)': + '@vue/language-core@2.2.0(typescript@5.9.2)': dependencies: - '@volar/language-core': 2.4.15 - '@vue/compiler-dom': 3.5.13 + '@volar/language-core': 2.4.23 + '@vue/compiler-dom': 3.5.21 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.13 - computeds: 0.0.1 + '@vue/shared': 3.5.21 + alien-signals: 0.4.14 minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 @@ -9566,6 +9633,8 @@ snapshots: '@vue/shared@3.5.13': {} + '@vue/shared@3.5.21': {} + '@vue/test-utils@2.4.6': dependencies: js-beautify: 1.15.1 @@ -9710,6 +9779,8 @@ snapshots: '@algolia/requester-fetch': 5.21.0 '@algolia/requester-node-http': 5.21.0 + alien-signals@0.4.14: {} + alien-signals@1.0.13: {} alien-signals@2.0.7: {} @@ -10065,8 +10136,6 @@ snapshots: compare-versions@6.1.1: {} - computeds@0.0.1: {} - concat-map@0.0.1: {} conf@13.1.0: @@ -10187,6 +10256,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decimal.js@10.6.0: {} decode-named-character-reference@1.2.0: @@ -10808,11 +10881,11 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@7.0.1: + fs-extra@11.3.2: dependencies: graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 + jsonfile: 6.2.0 + universalify: 2.0.1 fsevents@2.3.2: optional: true @@ -11297,11 +11370,13 @@ snapshots: chalk: 5.6.0 diff-match-patch: 1.0.5 - jsonfile@4.0.0: + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -11458,7 +11533,7 @@ snapshots: local-pkg@1.1.2: dependencies: - mlly: 1.7.4 + mlly: 1.8.0 pkg-types: 2.3.0 quansync: 0.2.11 @@ -11521,6 +11596,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.3.5: dependencies: '@babel/parser': 7.28.3 @@ -11912,10 +11991,6 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 - minimatch@3.0.8: - dependencies: - brace-expansion: 1.1.11 - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -11955,6 +12030,13 @@ snapshots: pkg-types: 1.3.1 ufo: 1.5.4 + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + mrmime@2.0.1: {} ms@2.1.3: {} @@ -13133,7 +13215,7 @@ snapshots: transitivePeerDependencies: - supports-color - typescript@5.4.2: {} + typescript@5.8.2: {} typescript@5.8.3: {} @@ -13143,6 +13225,8 @@ snapshots: ufo@1.5.4: {} + ufo@1.6.1: {} + uint8array-extras@1.5.0: {} undici-types@5.26.5: {} @@ -13193,8 +13277,6 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - universalify@0.1.2: {} - universalify@2.0.1: {} unplugin-icons@0.22.0(@vue/compiler-sfc@3.5.13): @@ -13211,7 +13293,7 @@ snapshots: transitivePeerDependencies: - supports-color - unplugin-vue-components@0.28.0(@babel/parser@7.28.3)(rollup@4.22.4)(vue@3.5.13(typescript@5.9.2)): + unplugin-vue-components@0.28.0(@babel/parser@7.28.4)(rollup@4.22.4)(vue@3.5.13(typescript@5.9.2)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.4(rollup@4.22.4) @@ -13225,7 +13307,7 @@ snapshots: unplugin: 2.3.5 vue: 3.5.13(typescript@5.9.2) optionalDependencies: - '@babel/parser': 7.28.3 + '@babel/parser': 7.28.4 transitivePeerDependencies: - rollup - supports-color @@ -13308,17 +13390,17 @@ snapshots: - supports-color - terser - vite-plugin-dts@4.3.0(@types/node@20.14.10)(rollup@4.22.4)(typescript@5.9.2)(vite@5.4.19(@types/node@20.14.10)(lightningcss@1.30.1)(terser@5.39.2)): + vite-plugin-dts@4.5.4(@types/node@20.14.10)(rollup@4.22.4)(typescript@5.9.2)(vite@5.4.19(@types/node@20.14.10)(lightningcss@1.30.1)(terser@5.39.2)): dependencies: - '@microsoft/api-extractor': 7.48.0(@types/node@20.14.10) - '@rollup/pluginutils': 5.1.4(rollup@4.22.4) - '@volar/typescript': 2.4.15 - '@vue/language-core': 2.1.6(typescript@5.9.2) + '@microsoft/api-extractor': 7.52.13(@types/node@20.14.10) + '@rollup/pluginutils': 5.3.0(rollup@4.22.4) + '@volar/typescript': 2.4.23 + '@vue/language-core': 2.2.0(typescript@5.9.2) compare-versions: 6.1.1 - debug: 4.4.1 + debug: 4.4.3 kolorist: 1.8.0 - local-pkg: 0.5.1 - magic-string: 0.30.18 + local-pkg: 1.1.2 + magic-string: 0.30.19 typescript: 5.9.2 optionalDependencies: vite: 5.4.19(@types/node@20.14.10)(lightningcss@1.30.1)(terser@5.39.2) From 045232a99bbdbbc06ed3de4802776847ff012fbb Mon Sep 17 00:00:00 2001 From: Comfy Org PR Bot Date: Wed, 17 Sep 2025 11:41:55 +0800 Subject: [PATCH 04/21] [release] Increment version to 1.27.5 (#5619) Co-authored-by: benceruleanlu <162923238+benceruleanlu@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 82c3ac45f..9acc66aa6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@comfyorg/comfyui-frontend", "private": true, - "version": "1.27.4", + "version": "1.27.5", "type": "module", "repository": "https://github.com/Comfy-Org/ComfyUI_frontend", "homepage": "https://comfy.org", From 08220d50d9502ec32bd76642641bedca82ca4968 Mon Sep 17 00:00:00 2001 From: Alexander Brown Date: Tue, 16 Sep 2025 22:03:41 -0700 Subject: [PATCH 05/21] Lint: Turn on rules that should allow for verbatimModuleSyntax (#5616) * lint: turn on type import rules setting up for verbatimModuleSyntax * lint: --fix for type imports --- eslint.config.ts | 2 ++ src/components/MenuHamburger.vue | 3 ++- src/components/actionbar/ComfyActionbar.vue | 3 ++- .../bottomPanel/tabs/terminal/BaseTerminal.vue | 3 ++- .../bottomPanel/tabs/terminal/CommandTerminal.vue | 5 +++-- .../bottomPanel/tabs/terminal/LogsTerminal.vue | 5 +++-- .../breadcrumb/SubgraphBreadcrumbItem.vue | 3 ++- src/components/common/ExtensionSlot.vue | 2 +- src/components/common/FormItem.vue | 2 +- src/components/common/RefreshButton.vue | 2 +- src/components/common/TreeExplorerTreeNode.spec.ts | 6 ++---- .../content/ManagerProgressDialogContent.test.ts | 3 ++- src/components/dialog/content/SignInContent.vue | 2 +- .../dialog/content/UpdatePasswordContent.vue | 3 ++- .../content/manager/ManagerDialogContent.vue | 2 +- .../content/manager/NodeConflictDialogContent.vue | 2 +- .../dialog/content/manager/PackStatusMessage.vue | 2 +- .../content/manager/PackVersionBadge.test.ts | 3 ++- .../manager/PackVersionSelectorPopover.test.ts | 3 ++- .../content/manager/PackVersionSelectorPopover.vue | 4 ++-- .../manager/button/PackEnableToggle.test.ts | 3 ++- .../content/manager/button/PackEnableToggle.vue | 2 +- .../content/manager/button/PackInstallButton.vue | 10 ++++------ .../content/manager/button/PackUninstallButton.vue | 4 ++-- .../dialog/content/manager/infoPanel/InfoPanel.vue | 2 +- .../content/manager/infoPanel/InfoPanelHeader.vue | 2 +- .../manager/infoPanel/InfoPanelMultiItem.vue | 2 +- .../dialog/content/manager/infoPanel/InfoTabs.vue | 2 +- .../infoPanel/tabs/DescriptionTabPanel.test.ts | 2 +- .../manager/infoPanel/tabs/DescriptionTabPanel.vue | 2 +- .../manager/infoPanel/tabs/NodesTabPanel.vue | 2 +- .../manager/infoPanel/tabs/WarningTabPanel.vue | 4 ++-- .../content/manager/packBanner/PackBanner.vue | 2 +- .../dialog/content/manager/packIcon/PackIcon.vue | 2 +- .../content/manager/packIcon/PackIconStacked.vue | 2 +- .../registrySearchBar/RegistrySearchBar.vue | 7 +++---- .../manager/skeleton/PackCardGridSkeleton.test.ts | 3 ++- .../dialog/content/setting/UsageLogsTable.vue | 2 +- .../content/setting/keybinding/KeyComboDisplay.vue | 2 +- .../dialog/content/signin/ApiKeyForm.vue | 3 ++- .../dialog/content/signin/SignInForm.spec.ts | 3 ++- .../dialog/content/signin/SignInForm.vue | 3 ++- .../dialog/content/signin/SignUpForm.vue | 3 ++- src/components/graph/modals/ZoomControlsModal.vue | 3 ++- .../graph/selectionToolbox/ColorPickerButton.vue | 3 ++- .../graph/selectionToolbox/DeleteButton.vue | 2 +- .../selectionToolbox/ExtensionCommandButton.vue | 3 ++- .../graph/selectionToolbox/SubmenuPopover.vue | 6 +++--- src/components/graph/widgets/ChatHistoryWidget.vue | 2 +- src/components/graph/widgets/DomWidget.vue | 5 +++-- src/components/graph/widgets/TextPreviewWidget.vue | 2 +- .../helpcenter/HelpCenterMenuContent.vue | 2 +- .../input/MultiSelect.accessibility.stories.ts | 2 +- src/components/input/MultiSelect.stories.ts | 2 +- src/components/input/MultiSelect.vue | 7 +++---- src/components/input/SingleSelect.vue | 5 +++-- src/components/install/MirrorsConfiguration.vue | 12 ++++++------ src/components/install/mirror/MirrorItem.vue | 2 +- src/components/load3d/Load3D.vue | 2 +- src/components/load3d/Load3DAnimation.vue | 2 +- src/components/load3d/Load3DAnimationScene.vue | 6 +++--- src/components/load3d/Load3DControls.vue | 2 +- src/components/load3d/Load3DScene.vue | 8 ++++---- src/components/load3d/Load3dViewerContent.vue | 2 +- src/components/load3d/controls/CameraControls.vue | 2 +- src/components/load3d/controls/ModelControls.vue | 5 ++++- .../load3d/controls/RecordingControls.vue | 2 +- src/components/load3d/controls/ViewerControls.vue | 2 +- .../controls/viewer/ViewerCameraControls.vue | 2 +- .../load3d/controls/viewer/ViewerModelControls.vue | 5 ++++- src/components/maintenance/TaskListItem.vue | 2 +- src/components/maintenance/TaskListStatusIcon.vue | 3 ++- .../maintenance/TerminalOutputDrawer.vue | 5 +++-- src/components/searchbox/NodeSearchBox.vue | 7 ++----- src/components/searchbox/NodeSearchBoxPopover.vue | 14 ++++++-------- src/components/searchbox/NodeSearchFilter.vue | 5 +++-- src/components/searchbox/NodeSearchItem.vue | 3 ++- .../sidebar/tabs/ModelLibrarySidebarTab.vue | 8 ++------ .../sidebar/tabs/NodeLibrarySidebarTab.vue | 10 ++++++---- src/components/sidebar/tabs/QueueSidebarTab.vue | 9 +++------ .../sidebar/tabs/WorkflowsSidebarTab.vue | 2 +- .../sidebar/tabs/modelLibrary/ModelTreeLeaf.vue | 14 ++++---------- .../tabs/nodeLibrary/NodeBookmarkTreeExplorer.vue | 2 +- .../sidebar/tabs/nodeLibrary/NodeTreeFolder.vue | 2 +- .../sidebar/tabs/nodeLibrary/NodeTreeLeaf.vue | 14 ++++---------- src/components/sidebar/tabs/queue/ResultAudio.vue | 2 +- .../sidebar/tabs/queue/ResultGallery.vue | 2 +- src/components/sidebar/tabs/queue/ResultItem.vue | 2 +- src/components/sidebar/tabs/queue/ResultVideo.vue | 2 +- src/components/sidebar/tabs/queue/TaskItem.vue | 2 +- .../sidebar/tabs/workflows/WorkflowTreeLeaf.vue | 6 ++---- .../templates/TemplateWorkflowCard.spec.ts | 2 +- src/components/templates/TemplateWorkflowCard.vue | 2 +- .../templates/TemplateWorkflowView.spec.ts | 2 +- src/components/topbar/CurrentUserButton.spec.ts | 3 ++- src/components/topbar/CurrentUserPopover.spec.ts | 3 ++- src/components/topbar/WorkflowTab.vue | 2 +- src/components/topbar/WorkflowTabs.vue | 6 ++---- src/components/widget/SampleModelSelector.vue | 2 +- src/components/widget/nav/NavIcon.vue | 2 +- src/components/widget/nav/NavItem.vue | 2 +- src/components/widget/panel/LeftSidePanel.vue | 2 +- .../bottomPanelTabs/useCommandSubcategories.ts | 2 +- src/composables/bottomPanelTabs/useShortcutsTab.ts | 2 +- src/composables/bottomPanelTabs/useTerminal.ts | 3 ++- src/composables/bottomPanelTabs/useTerminalTabs.ts | 2 +- src/composables/canvas/useCanvasTransformSync.ts | 2 +- .../canvas/useSelectedLiteGraphItems.ts | 8 ++------ src/composables/element/useAbsolutePosition.ts | 3 ++- src/composables/element/useDomClipping.ts | 3 ++- src/composables/graph/useMoreOptionsMenu.ts | 2 +- src/composables/graph/useSelectionState.ts | 7 ++----- .../manager/useManagerStatePersistence.ts | 7 ++----- src/composables/node/useNodeBadge.ts | 3 ++- src/composables/node/useNodeChatHistory.ts | 2 +- src/composables/node/useNodeProgressText.ts | 2 +- src/composables/nodePack/useInstalledPacks.ts | 2 +- src/composables/nodePack/useMissingNodes.ts | 4 ++-- src/composables/nodePack/useNodePacks.ts | 4 ++-- src/composables/nodePack/useWorkflowPacks.ts | 6 +++--- src/composables/useCanvasDrop.ts | 8 ++++---- src/composables/useCoreCommands.ts | 2 +- src/composables/useLoad3dViewer.ts | 4 ++-- src/composables/useManagerQueue.ts | 5 +++-- src/composables/usePaste.ts | 2 +- src/composables/useServerLogs.ts | 4 ++-- src/composables/useTreeExpansion.ts | 2 +- src/config/firebase.ts | 2 +- src/constants/serverConfig.ts | 2 +- src/lib/litegraph/src/CurveEditor.ts | 2 +- src/lib/litegraph/src/LGraphCanvas.ts | 6 +++--- src/lib/litegraph/src/interfaces.ts | 2 +- .../litegraph/src/subgraph/EmptySubgraphInput.ts | 2 +- .../litegraph/src/subgraph/EmptySubgraphOutput.ts | 2 +- .../litegraph/src/subgraph/ExecutableNodeDTO.ts | 2 +- src/lib/litegraph/src/subgraph/SubgraphNode.ts | 12 ++++++------ .../litegraph/test/LGraphNode.titleButtons.test.ts | 2 +- .../test/LinkConnector.integration.test.ts | 3 +-- src/lib/litegraph/test/NodeSlot.test.ts | 5 ++++- .../LinkConnectorSubgraphInputValidation.test.ts | 2 +- .../test/subgraph/SubgraphConversion.test.ts | 3 +-- .../test/subgraph/SubgraphNode.titleButton.test.ts | 2 +- .../test/subgraph/SubgraphSlotConnections.test.ts | 4 ++-- .../test/subgraph/SubgraphWidgetPromotion.test.ts | 3 ++- .../test/subgraph/fixtures/subgraphFixtures.ts | 5 +++-- .../settings/components/SettingDialogContent.vue | 4 ++-- src/platform/settings/components/SettingGroup.vue | 2 +- src/platform/settings/components/SettingsPanel.vue | 2 +- .../settings/composables/useSettingSearch.ts | 4 ++-- src/platform/settings/composables/useSettingUI.ts | 6 ++---- src/platform/updates/common/releaseService.ts | 3 ++- .../workflow/core/services/workflowService.ts | 2 +- .../workflow/management/stores/workflowStore.ts | 2 +- .../core/canvas/litegraph/litegraphLinkAdapter.ts | 2 +- .../core/layout/operations/layoutMutations.ts | 14 +++++++------- src/renderer/core/layout/sync/useSlotLayoutSync.ts | 5 +++-- .../core/layout/transform/TransformPane.vue | 2 +- .../core/thumbnail/useWorkflowThumbnail.ts | 2 +- .../extensions/minimap/minimapCanvasRenderer.ts | 3 ++- .../extensions/vueNodes/components/InputSlot.vue | 2 +- .../extensions/vueNodes/components/LGraphNode.vue | 2 +- .../widgets/components/WidgetInputNumber.vue | 2 +- .../widgets/components/WidgetInputNumberInput.vue | 2 +- .../components/layout/WidgetLayoutField.vue | 2 +- .../widgets/composables/useBooleanWidget.ts | 2 +- .../vueNodes/widgets/composables/useComboWidget.ts | 2 +- .../vueNodes/widgets/composables/useFloatWidget.ts | 2 +- .../widgets/composables/useImagePreviewWidget.ts | 2 +- .../widgets/composables/useImageUploadWidget.ts | 2 +- .../widgets/composables/useMarkdownWidget.ts | 4 ++-- .../widgets/composables/useRemoteWidget.ts | 4 ++-- .../widgets/composables/useStringWidget.ts | 2 +- src/router.ts | 3 +-- src/schemas/nodeDef/migration.ts | 8 +++++--- src/services/colorPaletteService.ts | 7 ++----- src/services/comfyManagerService.ts | 5 +++-- src/services/comfyRegistryService.ts | 3 ++- src/services/customerEventsService.ts | 6 ++++-- src/services/dialogService.ts | 2 +- src/services/load3dService.ts | 2 +- src/services/nodeOrganizationService.ts | 3 ++- src/services/nodeSearchService.ts | 7 ++++--- src/services/subgraphService.ts | 8 ++++---- src/stores/aboutPanelStore.ts | 2 +- src/stores/apiKeyAuthStore.ts | 4 ++-- src/stores/comfyManagerStore.ts | 4 ++-- src/stores/executionStore.ts | 6 ++---- src/stores/firebaseAuthStore.ts | 4 ++-- src/stores/imagePreviewStore.ts | 9 +++------ src/stores/keybindingStore.ts | 5 +++-- src/stores/menuItemStore.ts | 2 +- src/stores/modelToNodeStore.ts | 3 ++- src/stores/nodeBookmarkStore.ts | 3 ++- src/stores/serverConfigStore.ts | 2 +- src/stores/subgraphStore.ts | 4 ++-- src/stores/userFileStore.ts | 4 ++-- src/stores/widgetStore.ts | 3 ++- src/stores/workspace/bottomPanelStore.ts | 2 +- src/stores/workspace/sidebarTabStore.ts | 2 +- src/types/algoliasearch-lite.d.ts | 5 ++++- src/types/comfy.ts | 2 +- src/types/extensionTypes.ts | 2 +- src/types/index.ts | 2 +- src/types/widgetTypes.ts | 2 +- src/utils/envUtil.ts | 2 +- src/utils/formatUtil.ts | 2 +- src/utils/fuseUtil.ts | 3 ++- src/utils/litegraphUtil.ts | 3 ++- src/utils/mapperUtil.ts | 6 +++--- src/utils/nodeDefOrderingUtil.ts | 2 +- src/utils/typeGuardUtil.ts | 9 +++------ src/views/GraphView.vue | 2 +- src/views/MaintenanceView.vue | 2 +- src/views/ServerStartView.vue | 5 +++-- src/views/UserSelectView.vue | 3 ++- 215 files changed, 390 insertions(+), 381 deletions(-) diff --git a/eslint.config.ts b/eslint.config.ts index 191e07ba9..b92d6bbf7 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -75,6 +75,8 @@ export default defineConfig([ '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-unused-vars': 'off', '@typescript-eslint/prefer-as-const': 'off', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/no-import-type-side-effects': 'error', 'unused-imports/no-unused-imports': 'error', 'vue/no-v-html': 'off', // Enforce dark-theme: instead of dark: prefix diff --git a/src/components/MenuHamburger.vue b/src/components/MenuHamburger.vue index b46c27e27..d0856362f 100644 --- a/src/components/MenuHamburger.vue +++ b/src/components/MenuHamburger.vue @@ -21,7 +21,8 @@ diff --git a/src/platform/assets/components/AssetBrowserModal.stories.ts b/src/platform/assets/components/AssetBrowserModal.stories.ts new file mode 100644 index 000000000..acc93181d --- /dev/null +++ b/src/platform/assets/components/AssetBrowserModal.stories.ts @@ -0,0 +1,178 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' + +import AssetBrowserModal from '@/platform/assets/components/AssetBrowserModal.vue' +import { + createMockAssets, + mockAssets +} from '@/platform/assets/fixtures/ui-mock-assets' + +// Story arguments interface +interface StoryArgs { + nodeType: string + inputName: string + currentValue: string + showLeftPanel?: boolean +} + +const meta: Meta = { + title: 'Platform/Assets/AssetBrowserModal', + component: AssetBrowserModal, + parameters: { + layout: 'fullscreen' + }, + argTypes: { + nodeType: { + control: 'select', + options: ['CheckpointLoaderSimple', 'VAELoader', 'ControlNetLoader'], + description: 'ComfyUI node type for context' + }, + inputName: { + control: 'select', + options: ['ckpt_name', 'vae_name', 'control_net_name'], + description: 'Widget input name' + }, + currentValue: { + control: 'text', + description: 'Current selected asset value' + }, + showLeftPanel: { + control: 'boolean', + description: 'Whether to show the left panel with categories' + } + } +} + +export default meta +type Story = StoryObj + +// Modal Layout Stories +export const Default: Story = { + args: { + nodeType: 'CheckpointLoaderSimple', + inputName: 'ckpt_name', + currentValue: '', + showLeftPanel: false + }, + render: (args) => ({ + components: { AssetBrowserModal }, + setup() { + const onAssetSelect = (asset: any) => { + console.log('Selected asset:', asset) + } + const onClose = () => { + console.log('Modal closed') + } + + return { + ...args, + onAssetSelect, + onClose, + assets: mockAssets + } + }, + template: ` +

+ +
+ ` + }) +} + +// Story demonstrating single asset type (auto-hides left panel) +export const SingleAssetType: Story = { + args: { + nodeType: 'CheckpointLoaderSimple', + inputName: 'ckpt_name', + currentValue: '', + showLeftPanel: false + }, + render: (args) => ({ + components: { AssetBrowserModal }, + setup() { + const onAssetSelect = (asset: any) => { + console.log('Selected asset:', asset) + } + const onClose = () => { + console.log('Modal closed') + } + + // Create assets with only one type (checkpoints) + const singleTypeAssets = createMockAssets(15).map((asset) => ({ + ...asset, + type: 'checkpoint' + })) + + return { ...args, onAssetSelect, onClose, assets: singleTypeAssets } + }, + template: ` +
+ +
+ ` + }), + parameters: { + docs: { + description: { + story: + 'Modal with assets of only one type (checkpoint) - left panel auto-hidden.' + } + } + } +} + +// Story with left panel explicitly hidden +export const NoLeftPanel: Story = { + args: { + nodeType: 'CheckpointLoaderSimple', + inputName: 'ckpt_name', + currentValue: '', + showLeftPanel: false + }, + render: (args) => ({ + components: { AssetBrowserModal }, + setup() { + const onAssetSelect = (asset: any) => { + console.log('Selected asset:', asset) + } + const onClose = () => { + console.log('Modal closed') + } + + return { ...args, onAssetSelect, onClose, assets: mockAssets } + }, + template: ` +
+ +
+ ` + }), + parameters: { + docs: { + description: { + story: + 'Modal with left panel explicitly disabled via showLeftPanel=false.' + } + } + } +} diff --git a/src/platform/assets/components/AssetBrowserModal.vue b/src/platform/assets/components/AssetBrowserModal.vue new file mode 100644 index 000000000..de05f437d --- /dev/null +++ b/src/platform/assets/components/AssetBrowserModal.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/platform/assets/components/AssetCard.stories.ts b/src/platform/assets/components/AssetCard.stories.ts new file mode 100644 index 000000000..2b3532a05 --- /dev/null +++ b/src/platform/assets/components/AssetCard.stories.ts @@ -0,0 +1,182 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' + +import AssetCard from '@/platform/assets/components/AssetCard.vue' +import type { AssetDisplayItem } from '@/platform/assets/composables/useAssetBrowser' +import { mockAssets } from '@/platform/assets/fixtures/ui-mock-assets' + +// Use the first mock asset as base and transform it to display format +const baseAsset = mockAssets[0] +const createAssetData = ( + overrides: Partial = {} +): AssetDisplayItem => ({ + ...baseAsset, + description: + 'High-quality realistic images with perfect detail and natural lighting effects for professional photography', + formattedSize: '2.1 GB', + badges: [ + { label: 'checkpoints', type: 'type' }, + { label: '2.1 GB', type: 'size' } + ], + stats: { + formattedDate: '3/15/25', + downloadCount: '1.8k', + stars: '4.2k' + }, + ...overrides +}) + +const meta: Meta = { + title: 'Platform/Assets/AssetCard', + component: AssetCard, + parameters: { + layout: 'centered' + }, + decorators: [ + () => ({ + template: + '
' + }) + ] +} + +export default meta +type Story = StoryObj + +export const Interactive: Story = { + args: { + asset: createAssetData(), + interactive: true + }, + decorators: [ + () => ({ + template: + '
' + }) + ], + parameters: { + docs: { + description: { + story: + 'Default AssetCard with complete data including badges and all stats.' + } + } + } +} + +export const NonInteractive: Story = { + args: { + asset: createAssetData(), + interactive: false + }, + decorators: [ + () => ({ + template: + '
' + }) + ], + parameters: { + docs: { + description: { + story: + 'AssetCard in non-interactive mode - renders as div without button semantics.' + } + } + } +} + +export const EdgeCases: Story = { + render: () => ({ + components: { AssetCard }, + setup() { + const edgeCases = [ + // Default case for comparison + createAssetData({ + name: 'Complete Data', + description: 'Asset with all data present for comparison' + }), + // No badges + createAssetData({ + id: 'no-badges', + name: 'No Badges', + description: 'Testing graceful handling when badges are not provided', + badges: [] + }), + // No stars + createAssetData({ + id: 'no-stars', + name: 'No Stars', + description: 'Testing missing stars data gracefully', + stats: { + downloadCount: '1.8k', + formattedDate: '3/15/25' + } + }), + // No downloads + createAssetData({ + id: 'no-downloads', + name: 'No Downloads', + description: 'Testing missing downloads data gracefully', + stats: { + stars: '4.2k', + formattedDate: '3/15/25' + } + }), + // No date + createAssetData({ + id: 'no-date', + name: 'No Date', + description: 'Testing missing date data gracefully', + stats: { + stars: '4.2k', + downloadCount: '1.8k' + } + }), + // No stats at all + createAssetData({ + id: 'no-stats', + name: 'No Stats', + description: 'Testing when all stats are missing', + stats: {} + }), + // Long description + createAssetData({ + id: 'long-desc', + name: 'Long Description', + description: + 'This is a very long description that should demonstrate how the component handles text overflow and truncation with ellipsis. The description continues with even more content to ensure we test the 2-line clamp behavior properly and see how it renders when there is significantly more text than can fit in the allocated space.' + }), + // Minimal data + createAssetData({ + id: 'minimal', + name: 'Minimal', + description: 'Basic model', + tags: ['models'], + badges: [], + stats: {} + }) + ] + + return { edgeCases } + }, + template: ` +
+ +
+ ` + }), + parameters: { + layout: 'fullscreen', + docs: { + description: { + story: + 'All AssetCard edge cases in a grid layout to test graceful handling of missing data, badges, stats, and long descriptions.' + } + } + } +} diff --git a/src/platform/assets/components/AssetCard.vue b/src/platform/assets/components/AssetCard.vue new file mode 100644 index 000000000..e379099c1 --- /dev/null +++ b/src/platform/assets/components/AssetCard.vue @@ -0,0 +1,111 @@ + + + diff --git a/src/platform/assets/components/AssetFilterBar.vue b/src/platform/assets/components/AssetFilterBar.vue new file mode 100644 index 000000000..1f3295b43 --- /dev/null +++ b/src/platform/assets/components/AssetFilterBar.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/platform/assets/components/AssetGrid.vue b/src/platform/assets/components/AssetGrid.vue new file mode 100644 index 000000000..35122fd52 --- /dev/null +++ b/src/platform/assets/components/AssetGrid.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/platform/assets/composables/useAssetBrowser.ts b/src/platform/assets/composables/useAssetBrowser.ts new file mode 100644 index 000000000..22af0cf4e --- /dev/null +++ b/src/platform/assets/composables/useAssetBrowser.ts @@ -0,0 +1,188 @@ +import { computed, ref } from 'vue' + +import { t } from '@/i18n' +import type { UUID } from '@/lib/litegraph/src/utils/uuid' +import type { AssetItem } from '@/platform/assets/schemas/assetSchema' +import { + getAssetBaseModel, + getAssetDescription +} from '@/platform/assets/utils/assetMetadataUtils' +import { formatSize } from '@/utils/formatUtil' + +type AssetBadge = { + label: string + type: 'type' | 'base' | 'size' +} + +// Display properties for transformed assets +export interface AssetDisplayItem extends AssetItem { + description: string + formattedSize: string + badges: AssetBadge[] + stats: { + formattedDate?: string + downloadCount?: string + stars?: string + } +} + +/** + * Asset Browser composable + * Manages search, filtering, asset transformation and selection logic + */ +export function useAssetBrowser(assets: AssetItem[] = []) { + // State + const searchQuery = ref('') + const selectedCategory = ref('all') + const sortBy = ref('name') + + // Transform API asset to display asset + function transformAssetForDisplay(asset: AssetItem): AssetDisplayItem { + // Extract description from metadata or create from tags + const typeTag = asset.tags.find((tag) => tag !== 'models') + const description = + getAssetDescription(asset) || + `${typeTag || t('assetBrowser.unknown')} model` + + // Format file size + const formattedSize = formatSize(asset.size) + + // Create badges from tags and metadata + const badges: AssetBadge[] = [] + + // Type badge from non-root tag + if (typeTag) { + badges.push({ label: typeTag, type: 'type' }) + } + + // Base model badge from metadata + const baseModel = getAssetBaseModel(asset) + if (baseModel) { + badges.push({ + label: baseModel, + type: 'base' + }) + } + + // Size badge + badges.push({ label: formattedSize, type: 'size' }) + + // Create display stats from API data + const stats = { + formattedDate: new Date(asset.created_at).toLocaleDateString(), + downloadCount: undefined, // Not available in API + stars: undefined // Not available in API + } + + return { + ...asset, + description, + formattedSize, + badges, + stats + } + } + + // Extract available categories from assets + const availableCategories = computed(() => { + const categorySet = new Set() + + assets.forEach((asset) => { + // Second tag is the category (after 'models' root tag) + if (asset.tags.length > 1 && asset.tags[0] === 'models') { + categorySet.add(asset.tags[1]) + } + }) + + return [ + { + id: 'all', + label: t('assetBrowser.allModels'), + icon: 'icon-[lucide--folder]' + }, + ...Array.from(categorySet) + .sort() + .map((category) => ({ + id: category, + label: category.charAt(0).toUpperCase() + category.slice(1), + icon: 'icon-[lucide--package]' + })) + ] + }) + + // Compute content title from selected category + const contentTitle = computed(() => { + if (selectedCategory.value === 'all') { + return t('assetBrowser.allModels') + } + + const category = availableCategories.value.find( + (cat) => cat.id === selectedCategory.value + ) + return category?.label || t('assetBrowser.assets') + }) + + // Filter functions + const filterByCategory = (category: string) => (asset: AssetItem) => { + if (category === 'all') return true + return asset.tags.includes(category) + } + + const filterByQuery = (query: string) => (asset: AssetItem) => { + if (!query) return true + const lowerQuery = query.toLowerCase() + const description = getAssetDescription(asset) + return ( + asset.name.toLowerCase().includes(lowerQuery) || + (description && description.toLowerCase().includes(lowerQuery)) || + asset.tags.some((tag) => tag.toLowerCase().includes(lowerQuery)) + ) + } + + // Computed filtered and transformed assets + const filteredAssets = computed(() => { + const filtered = assets + .filter(filterByCategory(selectedCategory.value)) + .filter(filterByQuery(searchQuery.value)) + + // Sort assets + filtered.sort((a, b) => { + switch (sortBy.value) { + case 'date': + return ( + new Date(b.created_at).getTime() - new Date(a.created_at).getTime() + ) + case 'name': + default: + return a.name.localeCompare(b.name) + } + }) + + // Transform to display format + return filtered.map(transformAssetForDisplay) + }) + + // Actions + function selectAsset(asset: AssetDisplayItem): UUID { + if (import.meta.env.DEV) { + console.log('Asset selected:', asset.id, asset.name) + } + return asset.id + } + + return { + // State + searchQuery, + selectedCategory, + sortBy, + + // Computed + availableCategories, + contentTitle, + filteredAssets, + + // Actions + selectAsset, + transformAssetForDisplay + } +} diff --git a/src/platform/assets/composables/useAssetBrowserDialog.stories.ts b/src/platform/assets/composables/useAssetBrowserDialog.stories.ts new file mode 100644 index 000000000..e0095b619 --- /dev/null +++ b/src/platform/assets/composables/useAssetBrowserDialog.stories.ts @@ -0,0 +1,203 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import { ref } from 'vue' + +import AssetBrowserModal from '@/platform/assets/components/AssetBrowserModal.vue' +import { mockAssets } from '@/platform/assets/fixtures/ui-mock-assets' + +// Component that simulates the useAssetBrowserDialog functionality with working close +const DialogDemoComponent = { + components: { AssetBrowserModal }, + setup() { + const isDialogOpen = ref(false) + const currentNodeType = ref('CheckpointLoaderSimple') + const currentInputName = ref('ckpt_name') + const currentValue = ref('') + + const handleOpenDialog = ( + nodeType: string, + inputName: string, + value = '' + ) => { + currentNodeType.value = nodeType + currentInputName.value = inputName + currentValue.value = value + isDialogOpen.value = true + } + + const handleCloseDialog = () => { + isDialogOpen.value = false + } + + const handleAssetSelected = (assetPath: string) => { + console.log('Asset selected:', assetPath) + alert(`Selected asset: ${assetPath}`) + isDialogOpen.value = false // Auto-close like the real composable + } + + const handleOpenWithCurrentValue = () => { + handleOpenDialog( + 'CheckpointLoaderSimple', + 'ckpt_name', + 'realistic_vision_v5.safetensors' + ) + } + + return { + isDialogOpen, + currentNodeType, + currentInputName, + currentValue, + handleOpenDialog, + handleOpenWithCurrentValue, + handleCloseDialog, + handleAssetSelected, + mockAssets + } + }, + template: ` +
+
+

Asset Browser Dialog Demo

+ +
+
+

Different Node Types

+
+ + + +
+
+ +
+

With Current Value

+ +

+ Opens with "realistic_vision_v5.safetensors" as current value +

+
+ +
+

Instructions:

+
    +
  • • Click any button to open the Asset Browser dialog
  • +
  • • Select an asset to see the callback in action
  • +
  • • Check the browser console for logged events
  • +
  • • Try toggling the left panel with different asset types
  • +
  • • Close button will work properly in this demo
  • +
+
+
+
+ + +
+
+ +
+
+
+ ` +} + +const meta: Meta = { + title: 'Platform/Assets/useAssetBrowserDialog', + parameters: { + layout: 'fullscreen', + docs: { + description: { + component: + 'Demonstrates the AssetBrowserModal functionality as used by the useAssetBrowserDialog composable.' + } + } + } +} + +export default meta +type Story = StoryObj + +export const Demo: Story = { + render: () => ({ + components: { DialogDemoComponent }, + template: ` +
+ + + +
+

Code Example

+

+ This is how you would use the composable in your component: +

+
+
import { useAssetBrowserDialog } from '@/platform/assets/composables/useAssetBrowserDialog'
+
+export default {
+  setup() {
+    const assetBrowserDialog = useAssetBrowserDialog()
+
+    const openBrowser = () => {
+      assetBrowserDialog.show({
+        nodeType: 'CheckpointLoaderSimple',
+        inputName: 'ckpt_name',
+        currentValue: '',
+        onAssetSelected: (assetPath) => {
+          console.log('Selected:', assetPath)
+          // Update your component state
+        }
+      })
+    }
+
+    return { openBrowser }
+  }
+}
+
+
+

+ 💡 Try it: Use the interactive buttons above to see this code in action! +

+
+
+
+ ` + }), + parameters: { + docs: { + description: { + story: + 'Complete demo showing both interactive functionality and code examples for using useAssetBrowserDialog to open the Asset Browser modal programmatically.' + } + } + } +} diff --git a/src/platform/assets/composables/useAssetBrowserDialog.ts b/src/platform/assets/composables/useAssetBrowserDialog.ts new file mode 100644 index 000000000..e5f63eead --- /dev/null +++ b/src/platform/assets/composables/useAssetBrowserDialog.ts @@ -0,0 +1,66 @@ +import AssetBrowserModal from '@/platform/assets/components/AssetBrowserModal.vue' +import { useDialogStore } from '@/stores/dialogStore' + +interface AssetBrowserDialogProps { + /** ComfyUI node type for context (e.g., 'CheckpointLoaderSimple') */ + nodeType: string + /** Widget input name (e.g., 'ckpt_name') */ + inputName: string + /** Current selected asset value */ + currentValue?: string + /** Callback for when an asset is selected */ + onAssetSelected?: (assetPath: string) => void +} + +export const useAssetBrowserDialog = () => { + const dialogStore = useDialogStore() + const dialogKey = 'global-asset-browser' + + function hide() { + dialogStore.closeDialog({ key: dialogKey }) + } + + function show(props: AssetBrowserDialogProps) { + const handleAssetSelected = (assetPath: string) => { + props.onAssetSelected?.(assetPath) + hide() // Auto-close on selection + } + + const handleClose = () => { + hide() + } + + // Default dialog configuration for AssetBrowserModal + const dialogComponentProps = { + headless: true, + modal: true, + closable: false, + pt: { + root: { + class: 'rounded-2xl overflow-hidden' + }, + header: { + class: 'p-0 hidden' + }, + content: { + class: 'p-0 m-0 h-full w-full' + } + } + } + + dialogStore.showDialog({ + key: dialogKey, + component: AssetBrowserModal, + props: { + nodeType: props.nodeType, + inputName: props.inputName, + currentValue: props.currentValue, + onSelect: handleAssetSelected, + onClose: handleClose + }, + dialogComponentProps + }) + } + + return { show, hide } +} diff --git a/src/platform/assets/composables/useAssetFilterOptions.ts b/src/platform/assets/composables/useAssetFilterOptions.ts new file mode 100644 index 000000000..30572d8c9 --- /dev/null +++ b/src/platform/assets/composables/useAssetFilterOptions.ts @@ -0,0 +1,56 @@ +import { uniqWith } from 'es-toolkit' +import { computed } from 'vue' + +import type { SelectOption } from '@/components/input/types' +import type { AssetItem } from '@/platform/assets/schemas/assetSchema' + +/** + * Composable that extracts available filter options from asset data + * Provides reactive computed properties for file formats and base models + */ +export function useAssetFilterOptions(assets: AssetItem[] = []) { + /** + * Extract unique file formats from asset names + * Returns sorted SelectOption array with extensions + */ + const availableFileFormats = computed(() => { + const extensions = assets + .map((asset) => { + const extension = asset.name.split('.').pop() + return extension && extension !== asset.name ? extension : null + }) + .filter((extension): extension is string => extension !== null) + + const uniqueExtensions = uniqWith(extensions, (a, b) => a === b) + + return uniqueExtensions.sort().map((format) => ({ + name: `.${format}`, + value: format + })) + }) + + /** + * Extract unique base models from asset user metadata + * Returns sorted SelectOption array with base model names + */ + const availableBaseModels = computed(() => { + const models = assets + .map((asset) => asset.user_metadata?.base_model) + .filter( + (baseModel): baseModel is string => + baseModel !== undefined && typeof baseModel === 'string' + ) + + const uniqueModels = uniqWith(models, (a, b) => a === b) + + return uniqueModels.sort().map((model) => ({ + name: model, + value: model + })) + }) + + return { + availableFileFormats, + availableBaseModels + } +} diff --git a/src/platform/assets/fixtures/ui-mock-assets.ts b/src/platform/assets/fixtures/ui-mock-assets.ts new file mode 100644 index 000000000..6c7284386 --- /dev/null +++ b/src/platform/assets/fixtures/ui-mock-assets.ts @@ -0,0 +1,128 @@ +import type { AssetItem } from '@/platform/assets/schemas/assetSchema' + +// 🎭 OBVIOUSLY FAKE MOCK DATA - DO NOT USE IN PRODUCTION! 🎭 +const fakeFunnyModelNames = [ + '🎯_totally_real_model_v420.69', + '🚀_definitely_not_fake_v999', + '🎪_super_legit_checkpoint_pro_max', + '🦄_unicorn_dreams_totally_real.model', + '🍕_pizza_generator_supreme', + '🎸_rock_star_fake_data_v1337', + '🌮_taco_tuesday_model_deluxe', + '🦖_dino_nugget_generator_v3', + '🎮_gamer_fuel_checkpoint_xl', + '🍄_mushroom_kingdom_diffusion', + '🏴‍☠️_pirate_treasure_model_arr', + '🦋_butterfly_effect_generator', + '🎺_jazz_hands_checkpoint_pro', + '🥨_pretzel_logic_model_v2', + '🌙_midnight_snack_generator', + '🎭_drama_llama_checkpoint', + '🧙‍♀️_wizard_hat_diffusion_xl', + '🎪_circus_peanut_model_v4', + '🦒_giraffe_neck_generator', + '🎲_random_stuff_checkpoint_max' +] + +const obviouslyFakeDescriptions = [ + '⚠️ FAKE DATA: Generates 100% authentic fake images with premium mock quality', + '🎭 MOCK ALERT: This totally real model creates absolutely genuine fake content', + '🚨 NOT REAL: Professional-grade fake imagery for your mock data needs', + '🎪 DEMO ONLY: Circus-quality fake generation with extra mock seasoning', + '🍕 FAKE FOOD: Generates delicious fake pizzas (not edible in reality)', + "🎸 MOCK ROCK: Creates fake rock stars who definitely don't exist", + '🌮 TACO FAKERY: Tuesday-themed fake tacos for your mock appetite', + '🦖 PREHISTORIC FAKE: Generates extinct fake dinosaurs for demo purposes', + '🎮 FAKE GAMING: Level up your mock data with obviously fake content', + '🍄 FUNGI FICTION: Magical fake mushrooms from the demo dimension', + '🏴‍☠️ FAKE TREASURE: Arr! This be mock data for ye demo needs, matey!', + '🦋 DEMO EFFECT: Small fake changes create big mock differences', + '🎺 JAZZ FAKERY: Smooth fake jazz for your mock listening pleasure', + '🥨 MOCK LOGIC: Twisted fake reasoning for your demo requirements', + '🌙 MIDNIGHT MOCK: Late-night fake snacks for your demo hunger', + '🎭 FAKE DRAMA: Over-the-top mock emotions for demo entertainment', + '🧙‍♀️ WIZARD MOCK: Magically fake spells cast with demo ingredients', + '🎪 CIRCUS FAKE: Big top mock entertainment under the demo tent', + '🦒 TALL FAKE: Reaches new heights of obviously fake content', + '🎲 RANDOM MOCK: Generates random fake stuff for your demo pleasure' +] + +// API-compliant tag structure: first tag must be root (models/input/output), second is category +const modelCategories = ['checkpoints', 'loras', 'embeddings', 'vae'] +const baseModels = ['sd15', 'sdxl', 'sd35'] +const fileExtensions = ['.safetensors', '.ckpt', '.pt'] +const mimeTypes = [ + 'application/octet-stream', + 'application/x-pytorch', + 'application/x-safetensors' +] + +function getRandomElement(array: T[]): T { + return array[Math.floor(Math.random() * array.length)] +} + +function getRandomNumber(min: number, max: number): number { + return Math.floor(Math.random() * (max - min + 1)) + min +} + +function getRandomISODate(): string { + const start = new Date('2024-01-01').getTime() + const end = new Date('2024-12-31').getTime() + const randomTime = start + Math.random() * (end - start) + return new Date(randomTime).toISOString() +} + +function generateFakeAssetHash(): string { + const chars = '0123456789abcdef' + let hash = 'blake3:' + for (let i = 0; i < 64; i++) { + hash += chars[Math.floor(Math.random() * chars.length)] + } + return hash +} + +// 🎭 CREATES OBVIOUSLY FAKE ASSETS FOR DEMO/TEST PURPOSES ONLY! 🎭 +export function createMockAssets(count: number = 20): AssetItem[] { + return Array.from({ length: count }, (_, index) => { + const category = getRandomElement(modelCategories) + const baseModel = getRandomElement(baseModels) + const extension = getRandomElement(fileExtensions) + const mimeType = getRandomElement(mimeTypes) + const sizeInBytes = getRandomNumber( + 500 * 1024 * 1024, + 8 * 1024 * 1024 * 1024 + ) // 500MB to 8GB + const createdAt = getRandomISODate() + const updatedAt = createdAt + const lastAccessTime = getRandomISODate() + + const fakeFileName = `${fakeFunnyModelNames[index]}${extension}` + + return { + id: `mock-asset-uuid-${(index + 1).toString().padStart(3, '0')}-fake`, + name: fakeFileName, + asset_hash: generateFakeAssetHash(), + size: sizeInBytes, + mime_type: mimeType, + tags: [ + 'models', // Root tag (required first) + category, // Category tag (required second for models) + 'fake-data', // Obviously fake tag + ...(Math.random() > 0.5 ? ['demo-mode'] : ['test-only']), + ...(Math.random() > 0.7 ? ['obviously-mock'] : []) + ], + preview_url: `/api/assets/mock-asset-uuid-${(index + 1).toString().padStart(3, '0')}-fake/content`, + created_at: createdAt, + updated_at: updatedAt, + last_access_time: lastAccessTime, + user_metadata: { + description: obviouslyFakeDescriptions[index], + base_model: baseModel, + original_name: fakeFunnyModelNames[index], + warning: '🚨 THIS IS FAKE DEMO DATA - NOT A REAL MODEL! 🚨' + } + } + }) +} + +export const mockAssets = createMockAssets(20) diff --git a/src/platform/assets/schemas/assetSchema.ts b/src/platform/assets/schemas/assetSchema.ts index 277efcbb0..fab41649a 100644 --- a/src/platform/assets/schemas/assetSchema.ts +++ b/src/platform/assets/schemas/assetSchema.ts @@ -1,12 +1,19 @@ import { z } from 'zod' -// Zod schemas for asset API validation +// Zod schemas for asset API validation matching ComfyUI Assets REST API spec const zAsset = z.object({ id: z.string(), name: z.string(), - tags: z.array(z.string()), + asset_hash: z.string(), size: z.number(), - created_at: z.string().optional() + mime_type: z.string(), + tags: z.array(z.string()), + preview_url: z.string().optional(), + created_at: z.string(), + updated_at: z.string(), + last_access_time: z.string(), + user_metadata: z.record(z.unknown()).optional(), // API allows arbitrary key-value pairs + preview_id: z.string().nullable().optional() }) const zAssetResponse = z.object({ @@ -20,19 +27,22 @@ const zModelFolder = z.object({ folders: z.array(z.string()) }) +// Zod schema for ModelFile to align with interface +const zModelFile = z.object({ + name: z.string(), + pathIndex: z.number() +}) + // Export schemas following repository patterns export const assetResponseSchema = zAssetResponse // Export types derived from Zod schemas +export type AssetItem = z.infer export type AssetResponse = z.infer export type ModelFolder = z.infer +export type ModelFile = z.infer -// Common interfaces for API responses -export interface ModelFile { - name: string - pathIndex: number -} - +// Legacy interface for backward compatibility (now aligned with Zod schema) export interface ModelFolderInfo { name: string folders: string[] diff --git a/src/platform/assets/services/assetService.ts b/src/platform/assets/services/assetService.ts index 344209bf7..74b20a753 100644 --- a/src/platform/assets/services/assetService.ts +++ b/src/platform/assets/services/assetService.ts @@ -67,7 +67,7 @@ function createAssetService() { ) // Blacklist directories we don't want to show - const blacklistedDirectories = ['configs'] + const blacklistedDirectories = new Set(['configs']) // Extract directory names from assets that actually exist, exclude missing assets const discoveredFolders = new Set( @@ -75,7 +75,7 @@ function createAssetService() { ?.filter((asset) => !asset.tags.includes(MISSING_TAG)) ?.flatMap((asset) => asset.tags) ?.filter( - (tag) => tag !== MODELS_TAG && !blacklistedDirectories.includes(tag) + (tag) => tag !== MODELS_TAG && !blacklistedDirectories.has(tag) ) ?? [] ) diff --git a/src/platform/assets/utils/assetMetadataUtils.ts b/src/platform/assets/utils/assetMetadataUtils.ts new file mode 100644 index 000000000..2d32fa07f --- /dev/null +++ b/src/platform/assets/utils/assetMetadataUtils.ts @@ -0,0 +1,27 @@ +import type { AssetItem } from '@/platform/assets/schemas/assetSchema' + +/** + * Type-safe utilities for extracting metadata from assets + */ + +/** + * Safely extracts string description from asset metadata + * @param asset - The asset to extract description from + * @returns The description string or null if not present/not a string + */ +export function getAssetDescription(asset: AssetItem): string | null { + return typeof asset.user_metadata?.description === 'string' + ? asset.user_metadata.description + : null +} + +/** + * Safely extracts string base_model from asset metadata + * @param asset - The asset to extract base_model from + * @returns The base_model string or null if not present/not a string + */ +export function getAssetBaseModel(asset: AssetItem): string | null { + return typeof asset.user_metadata?.base_model === 'string' + ? asset.user_metadata.base_model + : null +} diff --git a/tailwind.config.ts b/tailwind.config.ts index e5e39987b..98c7c4ea0 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -6,6 +6,16 @@ import { iconCollection } from './build/customIconCollection' export default { content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], + safelist: [ + 'icon-[lucide--folder]', + 'icon-[lucide--package]', + 'icon-[lucide--image]', + 'icon-[lucide--video]', + 'icon-[lucide--box]', + 'icon-[lucide--audio-waveform]', + 'icon-[lucide--message-circle]' + ], + plugins: [ addDynamicIconSelectors({ iconSets: { diff --git a/tests-ui/platform/assets/components/AssetBrowserModal.test.ts b/tests-ui/platform/assets/components/AssetBrowserModal.test.ts new file mode 100644 index 000000000..4e96dd902 --- /dev/null +++ b/tests-ui/platform/assets/components/AssetBrowserModal.test.ts @@ -0,0 +1,304 @@ +import { mount } from '@vue/test-utils' +import { createPinia, setActivePinia } from 'pinia' +import { describe, expect, it, vi } from 'vitest' +import { nextTick } from 'vue' + +import AssetBrowserModal from '@/platform/assets/components/AssetBrowserModal.vue' +import type { AssetDisplayItem } from '@/platform/assets/composables/useAssetBrowser' +import type { AssetItem } from '@/platform/assets/schemas/assetSchema' + +// Mock external dependencies with minimal functionality needed for business logic tests +vi.mock('@/components/input/SearchBox.vue', () => ({ + default: { + name: 'SearchBox', + props: ['modelValue', 'size', 'placeholder', 'class'], + emits: ['update:modelValue'], + template: ` + + ` + } +})) + +vi.mock('@/components/widget/layout/BaseModalLayout.vue', () => ({ + default: { + name: 'BaseModalLayout', + props: ['contentTitle'], + emits: ['close'], + template: ` +
+
+ +
+
+ +
+
+ +
+
+ ` + } +})) + +vi.mock('@/components/widget/panel/LeftSidePanel.vue', () => ({ + default: { + name: 'LeftSidePanel', + props: ['modelValue', 'navItems'], + emits: ['update:modelValue'], + template: ` +
+ +
+ ` + } +})) + +vi.mock('@/platform/assets/components/AssetGrid.vue', () => ({ + default: { + name: 'AssetGrid', + props: ['assets'], + emits: ['asset-select'], + template: ` +
+
+ {{ asset.name }} +
+
+ No assets found +
+
+ ` + } +})) + +vi.mock('vue-i18n', () => ({ + useI18n: () => ({ + t: (key: string) => key + }) +})) + +describe('AssetBrowserModal', () => { + const createTestAsset = ( + id: string, + name: string, + category: string + ): AssetItem => ({ + id, + name, + asset_hash: `blake3:${id.padEnd(64, '0')}`, + size: 1024000, + mime_type: 'application/octet-stream', + tags: ['models', category, 'test'], + preview_url: `/api/assets/${id}/content`, + created_at: '2024-01-01T00:00:00Z', + updated_at: '2024-01-01T00:00:00Z', + last_access_time: '2024-01-01T00:00:00Z', + user_metadata: { + description: `Test ${name}`, + base_model: 'sd15' + } + }) + + const createWrapper = ( + assets: AssetItem[] = [], + props: Record = {} + ) => { + const pinia = createPinia() + setActivePinia(pinia) + + return mount(AssetBrowserModal, { + props: { + assets: assets, + ...props + }, + global: { + plugins: [pinia], + stubs: { + 'i-lucide:folder': { + template: '
' + } + }, + mocks: { + $t: (key: string) => key + } + } + }) + } + + describe('Search Functionality', () => { + it('filters assets when search query changes', async () => { + const assets = [ + createTestAsset('asset1', 'Checkpoint Model A', 'checkpoints'), + createTestAsset('asset2', 'Checkpoint Model B', 'checkpoints'), + createTestAsset('asset3', 'LoRA Model C', 'loras') + ] + const wrapper = createWrapper(assets) + + const searchBox = wrapper.find('[data-testid="search-box"]') + + // Search for "Checkpoint" + await searchBox.setValue('Checkpoint') + await nextTick() + + // Should filter to only checkpoint assets + const assetGrid = wrapper.findComponent({ name: 'AssetGrid' }) + const filteredAssets = assetGrid.props('assets') as AssetDisplayItem[] + + expect(filteredAssets.length).toBe(2) + expect( + filteredAssets.every((asset: AssetDisplayItem) => + asset.name.includes('Checkpoint') + ) + ).toBe(true) + }) + + it('search is case insensitive', async () => { + const assets = [ + createTestAsset('asset1', 'LoRA Model C', 'loras'), + createTestAsset('asset2', 'Checkpoint Model', 'checkpoints') + ] + const wrapper = createWrapper(assets) + + const searchBox = wrapper.find('[data-testid="search-box"]') + + // Search with different case + await searchBox.setValue('lora') + await nextTick() + + const assetGrid = wrapper.findComponent({ name: 'AssetGrid' }) + const filteredAssets = assetGrid.props('assets') as AssetDisplayItem[] + + expect(filteredAssets.length).toBe(1) + expect(filteredAssets[0].name).toContain('LoRA') + }) + + it('shows empty state when search has no results', async () => { + const assets = [ + createTestAsset('asset1', 'Checkpoint Model', 'checkpoints') + ] + const wrapper = createWrapper(assets) + + const searchBox = wrapper.find('[data-testid="search-box"]') + + // Search for something that doesn't exist + await searchBox.setValue('nonexistent') + await nextTick() + + expect(wrapper.find('[data-testid="empty-state"]').exists()).toBe(true) + }) + }) + + describe('Category Navigation', () => { + it('filters assets by selected category', async () => { + const assets = [ + createTestAsset('asset1', 'Checkpoint Model A', 'checkpoints'), + createTestAsset('asset2', 'LoRA Model C', 'loras'), + createTestAsset('asset3', 'VAE Model D', 'vae') + ] + const wrapper = createWrapper(assets, { showLeftPanel: true }) + + // Wait for Vue reactivity and component mounting + await nextTick() + + // Check if left panel exists first (since we have multiple categories) + const leftPanel = wrapper.find('[data-testid="left-panel"]') + expect(leftPanel.exists()).toBe(true) + + // Check if the nav item exists before clicking + const lorasNavItem = wrapper.find('[data-testid="nav-item-loras"]') + expect(lorasNavItem.exists()).toBe(true) + + // Click the loras category + await lorasNavItem.trigger('click') + await nextTick() + + // Should filter to only LoRA assets + const assetGrid = wrapper.findComponent({ name: 'AssetGrid' }) + const filteredAssets = assetGrid.props('assets') as AssetDisplayItem[] + + expect(filteredAssets.length).toBe(1) + expect(filteredAssets[0].name).toContain('LoRA') + }) + }) + + describe('Asset Selection', () => { + it('emits asset-select event when asset is selected', async () => { + const assets = [createTestAsset('asset1', 'Test Model', 'checkpoints')] + const wrapper = createWrapper(assets) + + // Click on first asset + await wrapper.find('[data-testid="asset-asset1"]').trigger('click') + + const emitted = wrapper.emitted('asset-select') + expect(emitted).toBeDefined() + expect(emitted).toHaveLength(1) + + const emittedAsset = emitted![0][0] as AssetDisplayItem + expect(emittedAsset.id).toBe('asset1') + }) + + it('executes onSelect callback when provided', async () => { + const onSelectSpy = vi.fn() + const assets = [createTestAsset('asset1', 'Test Model', 'checkpoints')] + const wrapper = createWrapper(assets, { onSelect: onSelectSpy }) + + // Click on first asset + await wrapper.find('[data-testid="asset-asset1"]').trigger('click') + + expect(onSelectSpy).toHaveBeenCalledWith('Test Model') + }) + }) + + describe('Left Panel Conditional Logic', () => { + it('hides left panel by default when showLeftPanel prop is undefined', () => { + const singleCategoryAssets = [ + createTestAsset('single1', 'Asset 1', 'checkpoints'), + createTestAsset('single2', 'Asset 2', 'checkpoints') + ] + const wrapper = createWrapper(singleCategoryAssets) + + expect(wrapper.find('[data-testid="left-panel"]').exists()).toBe(false) + }) + + it('shows left panel when showLeftPanel prop is explicitly true', () => { + const singleCategoryAssets = [ + createTestAsset('single1', 'Asset 1', 'checkpoints') + ] + + // Force show even with single category + const wrapper = createWrapper(singleCategoryAssets, { + showLeftPanel: true + }) + expect(wrapper.find('[data-testid="left-panel"]').exists()).toBe(true) + + // Force hide even with multiple categories + wrapper.unmount() + const multiCategoryAssets = [ + createTestAsset('asset1', 'Checkpoint', 'checkpoints'), + createTestAsset('asset2', 'LoRA', 'loras') + ] + const wrapper2 = createWrapper(multiCategoryAssets, { + showLeftPanel: false + }) + expect(wrapper2.find('[data-testid="left-panel"]').exists()).toBe(false) + }) + }) +}) diff --git a/tests-ui/platform/assets/components/AssetFilterBar.test.ts b/tests-ui/platform/assets/components/AssetFilterBar.test.ts new file mode 100644 index 000000000..db24070e1 --- /dev/null +++ b/tests-ui/platform/assets/components/AssetFilterBar.test.ts @@ -0,0 +1,138 @@ +import { mount } from '@vue/test-utils' +import { describe, expect, it, vi } from 'vitest' +import { nextTick } from 'vue' + +import AssetFilterBar from '@/platform/assets/components/AssetFilterBar.vue' +import type { FilterState } from '@/platform/assets/components/AssetFilterBar.vue' + +// Mock components with minimal functionality for business logic testing +vi.mock('@/components/input/MultiSelect.vue', () => ({ + default: { + name: 'MultiSelect', + props: { + modelValue: Array, + label: String, + options: Array, + class: String + }, + emits: ['update:modelValue'], + template: ` +
+ +
+ ` + } +})) + +vi.mock('@/components/input/SingleSelect.vue', () => ({ + default: { + name: 'SingleSelect', + props: { + modelValue: String, + label: String, + options: Array, + class: String + }, + emits: ['update:modelValue'], + template: ` +
+ +
+ ` + } +})) + +// Test factory functions + +describe('AssetFilterBar', () => { + describe('Filter State Management', () => { + it('maintains correct initial state', () => { + const wrapper = mount(AssetFilterBar) + + // Test initial state through component props + const multiSelects = wrapper.findAllComponents({ name: 'MultiSelect' }) + const singleSelect = wrapper.findComponent({ name: 'SingleSelect' }) + + expect(multiSelects[0].props('modelValue')).toEqual([]) + expect(multiSelects[1].props('modelValue')).toEqual([]) + expect(singleSelect.props('modelValue')).toBe('name-asc') + }) + + it('handles multiple simultaneous filter changes correctly', async () => { + const wrapper = mount(AssetFilterBar) + + // Update file formats + const fileFormatSelect = wrapper.findAllComponents({ + name: 'MultiSelect' + })[0] + await fileFormatSelect.vm.$emit('update:modelValue', [ + { name: '.ckpt', value: 'ckpt' }, + { name: '.safetensors', value: 'safetensors' } + ]) + + await nextTick() + + // Update base models + const baseModelSelect = wrapper.findAllComponents({ + name: 'MultiSelect' + })[1] + await baseModelSelect.vm.$emit('update:modelValue', [ + { name: 'SD XL', value: 'sdxl' } + ]) + + await nextTick() + + // Update sort + const sortSelect = wrapper.findComponent({ name: 'SingleSelect' }) + await sortSelect.vm.$emit('update:modelValue', 'popular') + + await nextTick() + + const emitted = wrapper.emitted('filterChange') + expect(emitted).toHaveLength(3) + + // Check final state + const finalState: FilterState = emitted![2][0] as FilterState + expect(finalState.fileFormats).toEqual(['ckpt', 'safetensors']) + expect(finalState.baseModels).toEqual(['sdxl']) + expect(finalState.sortBy).toBe('popular') + }) + + it('ensures FilterState interface compliance', async () => { + const wrapper = mount(AssetFilterBar) + + const fileFormatSelect = wrapper.findAllComponents({ + name: 'MultiSelect' + })[0] + await fileFormatSelect.vm.$emit('update:modelValue', [ + { name: '.ckpt', value: 'ckpt' } + ]) + + await nextTick() + + const emitted = wrapper.emitted('filterChange') + const filterState = emitted![0][0] as FilterState + + // Type and structure assertions + expect(Array.isArray(filterState.fileFormats)).toBe(true) + expect(Array.isArray(filterState.baseModels)).toBe(true) + expect(typeof filterState.sortBy).toBe('string') + + // Value type assertions + expect(filterState.fileFormats.every((f) => typeof f === 'string')).toBe( + true + ) + expect(filterState.baseModels.every((m) => typeof m === 'string')).toBe( + true + ) + }) + }) +}) diff --git a/tests-ui/platform/assets/composables/useAssetBrowser.test.ts b/tests-ui/platform/assets/composables/useAssetBrowser.test.ts new file mode 100644 index 000000000..d7d4f74dc --- /dev/null +++ b/tests-ui/platform/assets/composables/useAssetBrowser.test.ts @@ -0,0 +1,323 @@ +import { describe, expect, it } from 'vitest' +import { nextTick } from 'vue' + +import { useAssetBrowser } from '@/platform/assets/composables/useAssetBrowser' +import type { AssetItem } from '@/platform/assets/schemas/assetSchema' + +describe('useAssetBrowser', () => { + // Test fixtures - minimal data focused on functionality being tested + const createApiAsset = (overrides: Partial = {}): AssetItem => ({ + id: 'test-id', + name: 'test-asset.safetensors', + asset_hash: 'blake3:abc123', + size: 1024, + mime_type: 'application/octet-stream', + tags: ['models', 'checkpoints'], + created_at: '2024-01-01T00:00:00Z', + updated_at: '2024-01-01T00:00:00Z', + last_access_time: '2024-01-01T00:00:00Z', + ...overrides + }) + + describe('Asset Transformation', () => { + it('transforms API asset to include display properties', () => { + const apiAsset = createApiAsset({ + size: 2147483648, // 2GB + user_metadata: { description: 'Test model' } + }) + + const { transformAssetForDisplay } = useAssetBrowser([apiAsset]) + const result = transformAssetForDisplay(apiAsset) + + // Preserves API properties + expect(result.id).toBe(apiAsset.id) + expect(result.name).toBe(apiAsset.name) + + // Adds display properties + expect(result.description).toBe('Test model') + expect(result.formattedSize).toBe('2 GB') + expect(result.badges).toContainEqual({ + label: 'checkpoints', + type: 'type' + }) + expect(result.badges).toContainEqual({ label: '2 GB', type: 'size' }) + }) + + it('creates fallback description from tags when metadata missing', () => { + const apiAsset = createApiAsset({ + tags: ['models', 'loras'], + user_metadata: undefined + }) + + const { transformAssetForDisplay } = useAssetBrowser([apiAsset]) + const result = transformAssetForDisplay(apiAsset) + + expect(result.description).toBe('loras model') + }) + + it('formats various file sizes correctly', () => { + const { transformAssetForDisplay } = useAssetBrowser([]) + + const testCases = [ + { size: 512, expected: '512 B' }, + { size: 1536, expected: '1.5 KB' }, + { size: 2097152, expected: '2 MB' }, + { size: 3221225472, expected: '3 GB' } + ] + + testCases.forEach(({ size, expected }) => { + const asset = createApiAsset({ size }) + const result = transformAssetForDisplay(asset) + expect(result.formattedSize).toBe(expected) + }) + }) + }) + + describe('Tag-Based Filtering', () => { + it('filters assets by category tag', async () => { + const assets = [ + createApiAsset({ id: '1', tags: ['models', 'checkpoints'] }), + createApiAsset({ id: '2', tags: ['models', 'loras'] }), + createApiAsset({ id: '3', tags: ['models', 'checkpoints'] }) + ] + + const { selectedCategory, filteredAssets } = useAssetBrowser(assets) + + selectedCategory.value = 'checkpoints' + await nextTick() + + expect(filteredAssets.value).toHaveLength(2) + expect( + filteredAssets.value.every((asset) => + asset.tags.includes('checkpoints') + ) + ).toBe(true) + }) + + it('returns all assets when category is "all"', async () => { + const assets = [ + createApiAsset({ id: '1', tags: ['models', 'checkpoints'] }), + createApiAsset({ id: '2', tags: ['models', 'loras'] }) + ] + + const { selectedCategory, filteredAssets } = useAssetBrowser(assets) + + selectedCategory.value = 'all' + await nextTick() + + expect(filteredAssets.value).toHaveLength(2) + }) + }) + + describe('Search Functionality', () => { + it('searches across asset name', async () => { + const assets = [ + createApiAsset({ name: 'realistic_vision.safetensors' }), + createApiAsset({ name: 'anime_style.ckpt' }), + createApiAsset({ name: 'photorealistic_v2.safetensors' }) + ] + + const { searchQuery, filteredAssets } = useAssetBrowser(assets) + + searchQuery.value = 'realistic' + await nextTick() + + expect(filteredAssets.value).toHaveLength(2) + expect( + filteredAssets.value.every((asset) => + asset.name.toLowerCase().includes('realistic') + ) + ).toBe(true) + }) + + it('searches in user metadata description', async () => { + const assets = [ + createApiAsset({ + name: 'model1.safetensors', + user_metadata: { description: 'fantasy artwork model' } + }), + createApiAsset({ + name: 'model2.safetensors', + user_metadata: { description: 'portrait photography' } + }) + ] + + const { searchQuery, filteredAssets } = useAssetBrowser(assets) + + searchQuery.value = 'fantasy' + await nextTick() + + expect(filteredAssets.value).toHaveLength(1) + expect(filteredAssets.value[0].name).toBe('model1.safetensors') + }) + + it('handles empty search results', async () => { + const assets = [createApiAsset({ name: 'test.safetensors' })] + + const { searchQuery, filteredAssets } = useAssetBrowser(assets) + + searchQuery.value = 'nonexistent' + await nextTick() + + expect(filteredAssets.value).toHaveLength(0) + }) + }) + + describe('Combined Search and Filtering', () => { + it('applies both search and category filter', async () => { + const assets = [ + createApiAsset({ + name: 'realistic_checkpoint.safetensors', + tags: ['models', 'checkpoints'] + }), + createApiAsset({ + name: 'realistic_lora.safetensors', + tags: ['models', 'loras'] + }), + createApiAsset({ + name: 'anime_checkpoint.safetensors', + tags: ['models', 'checkpoints'] + }) + ] + + const { searchQuery, selectedCategory, filteredAssets } = + useAssetBrowser(assets) + + searchQuery.value = 'realistic' + selectedCategory.value = 'checkpoints' + await nextTick() + + expect(filteredAssets.value).toHaveLength(1) + expect(filteredAssets.value[0].name).toBe( + 'realistic_checkpoint.safetensors' + ) + }) + }) + + describe('Sorting', () => { + it('sorts assets by name', async () => { + const assets = [ + createApiAsset({ name: 'zebra.safetensors' }), + createApiAsset({ name: 'alpha.safetensors' }), + createApiAsset({ name: 'beta.safetensors' }) + ] + + const { sortBy, filteredAssets } = useAssetBrowser(assets) + + sortBy.value = 'name' + await nextTick() + + const names = filteredAssets.value.map((asset) => asset.name) + expect(names).toEqual([ + 'alpha.safetensors', + 'beta.safetensors', + 'zebra.safetensors' + ]) + }) + + it('sorts assets by creation date', async () => { + const assets = [ + createApiAsset({ created_at: '2024-03-01T00:00:00Z' }), + createApiAsset({ created_at: '2024-01-01T00:00:00Z' }), + createApiAsset({ created_at: '2024-02-01T00:00:00Z' }) + ] + + const { sortBy, filteredAssets } = useAssetBrowser(assets) + + sortBy.value = 'date' + await nextTick() + + const dates = filteredAssets.value.map((asset) => asset.created_at) + expect(dates).toEqual([ + '2024-03-01T00:00:00Z', + '2024-02-01T00:00:00Z', + '2024-01-01T00:00:00Z' + ]) + }) + }) + + describe('Asset Selection', () => { + it('returns selected asset UUID for efficient handling', () => { + const asset = createApiAsset({ + id: 'test-uuid-123', + name: 'selected_model.safetensors' + }) + const { selectAsset, transformAssetForDisplay } = useAssetBrowser([asset]) + + const displayAsset = transformAssetForDisplay(asset) + const result = selectAsset(displayAsset) + + expect(result).toBe('test-uuid-123') + }) + }) + + describe('Dynamic Category Extraction', () => { + it('extracts categories from asset tags', () => { + const assets = [ + createApiAsset({ tags: ['models', 'checkpoints'] }), + createApiAsset({ tags: ['models', 'loras'] }), + createApiAsset({ tags: ['models', 'checkpoints'] }) // duplicate + ] + + const { availableCategories } = useAssetBrowser(assets) + + expect(availableCategories.value).toEqual([ + { id: 'all', label: 'All Models', icon: 'icon-[lucide--folder]' }, + { + id: 'checkpoints', + label: 'Checkpoints', + icon: 'icon-[lucide--package]' + }, + { id: 'loras', label: 'Loras', icon: 'icon-[lucide--package]' } + ]) + }) + + it('handles assets with no category tag', () => { + const assets = [ + createApiAsset({ tags: ['models'] }), // No second tag + createApiAsset({ tags: ['models', 'vae'] }) + ] + + const { availableCategories } = useAssetBrowser(assets) + + expect(availableCategories.value).toEqual([ + { id: 'all', label: 'All Models', icon: 'icon-[lucide--folder]' }, + { id: 'vae', label: 'Vae', icon: 'icon-[lucide--package]' } + ]) + }) + + it('ignores non-models root tags', () => { + const assets = [ + createApiAsset({ tags: ['input', 'images'] }), + createApiAsset({ tags: ['models', 'checkpoints'] }) + ] + + const { availableCategories } = useAssetBrowser(assets) + + expect(availableCategories.value).toEqual([ + { id: 'all', label: 'All Models', icon: 'icon-[lucide--folder]' }, + { + id: 'checkpoints', + label: 'Checkpoints', + icon: 'icon-[lucide--package]' + } + ]) + }) + + it('computes content title from selected category', () => { + const assets = [createApiAsset({ tags: ['models', 'checkpoints'] })] + const { selectedCategory, contentTitle } = useAssetBrowser(assets) + + // Default + expect(contentTitle.value).toBe('All Models') + + // Set specific category + selectedCategory.value = 'checkpoints' + expect(contentTitle.value).toBe('Checkpoints') + + // Unknown category + selectedCategory.value = 'unknown' + expect(contentTitle.value).toBe('Assets') + }) + }) +}) diff --git a/tests-ui/platform/assets/composables/useAssetBrowserDialog.test.ts b/tests-ui/platform/assets/composables/useAssetBrowserDialog.test.ts new file mode 100644 index 000000000..fefeeceac --- /dev/null +++ b/tests-ui/platform/assets/composables/useAssetBrowserDialog.test.ts @@ -0,0 +1,89 @@ +import { describe, expect, it, vi } from 'vitest' + +import { useAssetBrowserDialog } from '@/platform/assets/composables/useAssetBrowserDialog' +import { useDialogStore } from '@/stores/dialogStore' + +// Mock the dialog store +vi.mock('@/stores/dialogStore') + +// Test factory functions +interface AssetBrowserProps { + nodeType: string + inputName: string + onAssetSelected?: ReturnType +} + +function createAssetBrowserProps( + overrides: Partial = {} +): AssetBrowserProps { + return { + nodeType: 'CheckpointLoaderSimple', + inputName: 'ckpt_name', + ...overrides + } +} + +describe('useAssetBrowserDialog', () => { + describe('Asset Selection Flow', () => { + it('auto-closes dialog when asset is selected', () => { + // Create fresh mocks for this test + const mockShowDialog = vi.fn() + const mockCloseDialog = vi.fn() + + vi.mocked(useDialogStore).mockReturnValue({ + showDialog: mockShowDialog, + closeDialog: mockCloseDialog + } as Partial> as ReturnType< + typeof useDialogStore + >) + + const assetBrowserDialog = useAssetBrowserDialog() + const onAssetSelected = vi.fn() + const props = createAssetBrowserProps({ onAssetSelected }) + + assetBrowserDialog.show(props) + + // Get the onSelect handler that was passed to the dialog + const dialogCall = mockShowDialog.mock.calls[0][0] + const onSelectHandler = dialogCall.props.onSelect + + // Simulate asset selection + onSelectHandler('selected-asset-path') + + // Should call the original callback and close dialog + expect(onAssetSelected).toHaveBeenCalledWith('selected-asset-path') + expect(mockCloseDialog).toHaveBeenCalledWith({ + key: 'global-asset-browser' + }) + }) + + it('closes dialog when close handler is called', () => { + // Create fresh mocks for this test + const mockShowDialog = vi.fn() + const mockCloseDialog = vi.fn() + + vi.mocked(useDialogStore).mockReturnValue({ + showDialog: mockShowDialog, + closeDialog: mockCloseDialog + } as Partial> as ReturnType< + typeof useDialogStore + >) + + const assetBrowserDialog = useAssetBrowserDialog() + const props = createAssetBrowserProps() + + assetBrowserDialog.show(props) + + // Get the onClose handler that was passed to the dialog + const dialogCall = mockShowDialog.mock.calls[0][0] + const onCloseHandler = dialogCall.props.onClose + + // Simulate dialog close + onCloseHandler() + + expect(mockCloseDialog).toHaveBeenCalledWith({ + key: 'global-asset-browser' + }) + }) + }) +}) diff --git a/tests-ui/platform/assets/composables/useAssetFilterOptions.test.ts b/tests-ui/platform/assets/composables/useAssetFilterOptions.test.ts new file mode 100644 index 000000000..8cec2ab12 --- /dev/null +++ b/tests-ui/platform/assets/composables/useAssetFilterOptions.test.ts @@ -0,0 +1,159 @@ +import { describe, expect, it } from 'vitest' + +import { useAssetFilterOptions } from '@/platform/assets/composables/useAssetFilterOptions' +import type { AssetItem } from '@/platform/assets/schemas/assetSchema' + +// Test factory functions +function createTestAsset(overrides: Partial = {}): AssetItem { + return { + id: 'test-uuid', + name: 'test-model.safetensors', + asset_hash: 'blake3:test123', + size: 123456, + mime_type: 'application/octet-stream', + tags: ['models', 'checkpoints'], + created_at: '2024-01-01T00:00:00Z', + updated_at: '2024-01-01T00:00:00Z', + last_access_time: '2024-01-01T00:00:00Z', + user_metadata: { + base_model: 'sd15' + }, + ...overrides + } +} + +describe('useAssetFilterOptions', () => { + describe('File Format Extraction', () => { + it('extracts file formats from asset names', () => { + const assets = [ + createTestAsset({ name: 'model1.safetensors' }), + createTestAsset({ name: 'model2.ckpt' }), + createTestAsset({ name: 'model3.pt' }) + ] + + const { availableFileFormats } = useAssetFilterOptions(assets) + + expect(availableFileFormats.value).toEqual([ + { name: '.ckpt', value: 'ckpt' }, + { name: '.pt', value: 'pt' }, + { name: '.safetensors', value: 'safetensors' } + ]) + }) + + it('handles duplicate file formats', () => { + const assets = [ + createTestAsset({ name: 'model1.safetensors' }), + createTestAsset({ name: 'model2.safetensors' }), + createTestAsset({ name: 'model3.ckpt' }) + ] + + const { availableFileFormats } = useAssetFilterOptions(assets) + + expect(availableFileFormats.value).toEqual([ + { name: '.ckpt', value: 'ckpt' }, + { name: '.safetensors', value: 'safetensors' } + ]) + }) + + it('handles assets with no file extension', () => { + const assets = [ + createTestAsset({ name: 'model_no_extension' }), + createTestAsset({ name: 'model.safetensors' }) + ] + + const { availableFileFormats } = useAssetFilterOptions(assets) + + expect(availableFileFormats.value).toEqual([ + { name: '.safetensors', value: 'safetensors' } + ]) + }) + + it('handles empty asset list', () => { + const { availableFileFormats } = useAssetFilterOptions([]) + + expect(availableFileFormats.value).toEqual([]) + }) + }) + + describe('Base Model Extraction', () => { + it('extracts base models from user metadata', () => { + const assets = [ + createTestAsset({ user_metadata: { base_model: 'sd15' } }), + createTestAsset({ user_metadata: { base_model: 'sdxl' } }), + createTestAsset({ user_metadata: { base_model: 'sd35' } }) + ] + + const { availableBaseModels } = useAssetFilterOptions(assets) + + expect(availableBaseModels.value).toEqual([ + { name: 'sd15', value: 'sd15' }, + { name: 'sd35', value: 'sd35' }, + { name: 'sdxl', value: 'sdxl' } + ]) + }) + + it('handles duplicate base models', () => { + const assets = [ + createTestAsset({ user_metadata: { base_model: 'sd15' } }), + createTestAsset({ user_metadata: { base_model: 'sd15' } }), + createTestAsset({ user_metadata: { base_model: 'sdxl' } }) + ] + + const { availableBaseModels } = useAssetFilterOptions(assets) + + expect(availableBaseModels.value).toEqual([ + { name: 'sd15', value: 'sd15' }, + { name: 'sdxl', value: 'sdxl' } + ]) + }) + + it('handles assets with missing user_metadata', () => { + const assets = [ + createTestAsset({ user_metadata: undefined }), + createTestAsset({ user_metadata: { base_model: 'sd15' } }) + ] + + const { availableBaseModels } = useAssetFilterOptions(assets) + + expect(availableBaseModels.value).toEqual([ + { name: 'sd15', value: 'sd15' } + ]) + }) + + it('handles assets with missing base_model field', () => { + const assets = [ + createTestAsset({ user_metadata: { description: 'A test model' } }), + createTestAsset({ user_metadata: { base_model: 'sdxl' } }) + ] + + const { availableBaseModels } = useAssetFilterOptions(assets) + + expect(availableBaseModels.value).toEqual([ + { name: 'sdxl', value: 'sdxl' } + ]) + }) + + it('handles empty asset list', () => { + const { availableBaseModels } = useAssetFilterOptions([]) + + expect(availableBaseModels.value).toEqual([]) + }) + }) + + describe('Reactivity', () => { + it('returns computed properties that can be reactive', () => { + const assets = [createTestAsset({ name: 'model.safetensors' })] + + const { availableFileFormats, availableBaseModels } = + useAssetFilterOptions(assets) + + // These should be computed refs + expect(availableFileFormats.value).toBeDefined() + expect(availableBaseModels.value).toBeDefined() + expect(typeof availableFileFormats.value).toBe('object') + expect(typeof availableBaseModels.value).toBe('object') + expect(Array.isArray(availableFileFormats.value)).toBe(true) + expect(Array.isArray(availableBaseModels.value)).toBe(true) + }) + }) +}) diff --git a/tests-ui/tests/platform/assets/utils/assetMetadataUtils.test.ts b/tests-ui/tests/platform/assets/utils/assetMetadataUtils.test.ts new file mode 100644 index 000000000..54551f595 --- /dev/null +++ b/tests-ui/tests/platform/assets/utils/assetMetadataUtils.test.ts @@ -0,0 +1,65 @@ +import { describe, expect, it } from 'vitest' + +import type { AssetItem } from '@/platform/assets/schemas/assetSchema' +import { + getAssetBaseModel, + getAssetDescription +} from '@/platform/assets/utils/assetMetadataUtils' + +describe('assetMetadataUtils', () => { + const mockAsset: AssetItem = { + id: 'test-id', + name: 'test-model', + asset_hash: 'hash123', + size: 1024, + mime_type: 'application/octet-stream', + tags: ['models', 'checkpoints'], + created_at: '2024-01-01T00:00:00Z', + updated_at: '2024-01-01T00:00:00Z', + last_access_time: '2024-01-01T00:00:00Z' + } + + describe('getAssetDescription', () => { + it('should return string description when present', () => { + const asset = { + ...mockAsset, + user_metadata: { description: 'A test model' } + } + expect(getAssetDescription(asset)).toBe('A test model') + }) + + it('should return null when description is not a string', () => { + const asset = { + ...mockAsset, + user_metadata: { description: 123 } + } + expect(getAssetDescription(asset)).toBeNull() + }) + + it('should return null when no metadata', () => { + expect(getAssetDescription(mockAsset)).toBeNull() + }) + }) + + describe('getAssetBaseModel', () => { + it('should return string base_model when present', () => { + const asset = { + ...mockAsset, + user_metadata: { base_model: 'SDXL' } + } + expect(getAssetBaseModel(asset)).toBe('SDXL') + }) + + it('should return null when base_model is not a string', () => { + const asset = { + ...mockAsset, + user_metadata: { base_model: 123 } + } + expect(getAssetBaseModel(asset)).toBeNull() + }) + + it('should return null when no metadata', () => { + expect(getAssetBaseModel(mockAsset)).toBeNull() + }) + }) +}) diff --git a/tests-ui/tests/services/assetService.test.ts b/tests-ui/tests/services/assetService.test.ts index f11c9d40d..d96ef765b 100644 --- a/tests-ui/tests/services/assetService.test.ts +++ b/tests-ui/tests/services/assetService.test.ts @@ -1,5 +1,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' +import type { AssetItem } from '@/platform/assets/schemas/assetSchema' import { assetService } from '@/platform/assets/services/assetService' import { api } from '@/scripts/api' @@ -17,26 +18,39 @@ vi.mock('@/stores/modelToNodeStore', () => ({ })) })) +// Helper to create API-compliant test assets +function createTestAsset(overrides: Partial = {}) { + return { + id: 'test-uuid', + name: 'test-model.safetensors', + asset_hash: 'blake3:test123', + size: 123456, + mime_type: 'application/octet-stream', + tags: ['models', 'checkpoints'], + created_at: '2024-01-01T00:00:00Z', + updated_at: '2024-01-01T00:00:00Z', + last_access_time: '2024-01-01T00:00:00Z', + ...overrides + } +} + // Test data constants const MOCK_ASSETS = { - checkpoints: { + checkpoints: createTestAsset({ id: 'uuid-1', name: 'model1.safetensors', - tags: ['models', 'checkpoints'], - size: 123456 - }, - loras: { + tags: ['models', 'checkpoints'] + }), + loras: createTestAsset({ id: 'uuid-2', name: 'model2.safetensors', - tags: ['models', 'loras'], - size: 654321 - }, - vae: { + tags: ['models', 'loras'] + }), + vae: createTestAsset({ id: 'uuid-3', name: 'vae1.safetensors', - tags: ['models', 'vae'], - size: 789012 - } + tags: ['models', 'vae'] + }) } as const // Helper functions @@ -66,24 +80,21 @@ describe('assetService', () => { describe('getAssetModelFolders', () => { it('should extract directory names from asset tags and filter blacklisted ones', async () => { const assets = [ - { + createTestAsset({ id: 'uuid-1', name: 'checkpoint1.safetensors', - tags: ['models', 'checkpoints'], - size: 123456 - }, - { + tags: ['models', 'checkpoints'] + }), + createTestAsset({ id: 'uuid-2', name: 'config.yaml', - tags: ['models', 'configs'], // Blacklisted - size: 654321 - }, - { + tags: ['models', 'configs'] // Blacklisted + }), + createTestAsset({ id: 'uuid-3', name: 'vae1.safetensors', - tags: ['models', 'vae'], - size: 789012 - } + tags: ['models', 'vae'] + }) ] mockApiResponse(assets) @@ -123,12 +134,11 @@ describe('assetService', () => { const assets = [ { ...MOCK_ASSETS.checkpoints, name: 'valid.safetensors' }, { ...MOCK_ASSETS.loras, name: 'lora.safetensors' }, // Wrong tag - { + createTestAsset({ id: 'uuid-4', name: 'missing-model.safetensors', - tags: ['models', 'checkpoints', 'missing'], // Has missing tag - size: 654321 - } + tags: ['models', 'checkpoints', 'missing'] // Has missing tag + }) ] mockApiResponse(assets) From 09e7d1040e2b9d393c94f10bd2ffcf8f1ec3f92c Mon Sep 17 00:00:00 2001 From: filtered <176114999+webfiltered@users.noreply.github.com> Date: Thu, 18 Sep 2025 13:32:53 +1000 Subject: [PATCH 07/21] Add desktop dialogs framework (#5605) ### Summary Adds desktop dialog framework with data-driven dialog definitions. ### Changes - Data-driven dialog structure in `desktopDialogs.ts` - Dynamic dialog view component with i18n support - Button action types: openUrl, close, cancel - Button severity levels for styling (primary, secondary, danger, warn) - Fallback invalid dialog for error handling - i18n collection script updated for dialog strings --- scripts/collect-i18n-general.ts | 21 ++++++++- src/assets/css/style.css | 6 +++ src/constants/desktopDialogs.ts | 75 +++++++++++++++++++++++++++++++++ src/router.ts | 6 +++ src/views/DesktopDialogView.vue | 70 ++++++++++++++++++++++++++++++ 5 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 src/constants/desktopDialogs.ts create mode 100644 src/views/DesktopDialogView.vue diff --git a/scripts/collect-i18n-general.ts b/scripts/collect-i18n-general.ts index f0b6dde0c..53c813fb7 100644 --- a/scripts/collect-i18n-general.ts +++ b/scripts/collect-i18n-general.ts @@ -2,6 +2,7 @@ import * as fs from 'fs' import { comfyPageFixture as test } from '../browser_tests/fixtures/ComfyPage' import { CORE_MENU_COMMANDS } from '../src/constants/coreMenuCommands' +import { DESKTOP_DIALOGS } from '../src/constants/desktopDialogs' import { SERVER_CONFIG_ITEMS } from '../src/constants/serverConfig' import type { FormItem, SettingParams } from '../src/platform/settings/types' import type { ComfyCommandImpl } from '../src/stores/commandStore' @@ -131,6 +132,23 @@ test('collect-i18n-general', async ({ comfyPage }) => { ]) ) + // Desktop Dialogs + const allDesktopDialogsLocale = Object.fromEntries( + Object.values(DESKTOP_DIALOGS).map((dialog) => [ + normalizeI18nKey(dialog.id), + { + title: dialog.title, + message: dialog.message, + buttons: Object.fromEntries( + dialog.buttons.map((button) => [ + normalizeI18nKey(button.label), + button.label + ]) + ) + } + ]) + ) + fs.writeFileSync( localePath, JSON.stringify( @@ -144,7 +162,8 @@ test('collect-i18n-general', async ({ comfyPage }) => { ...allSettingCategoriesLocale }, serverConfigItems: allServerConfigsLocale, - serverConfigCategories: allServerConfigCategoriesLocale + serverConfigCategories: allServerConfigCategoriesLocale, + desktopDialogs: allDesktopDialogsLocale }, null, 2 diff --git a/src/assets/css/style.css b/src/assets/css/style.css index 747c3d1f6..cad8a1b3b 100644 --- a/src/assets/css/style.css +++ b/src/assets/css/style.css @@ -66,6 +66,8 @@ --color-charcoal-700: #202121; --color-charcoal-800: #171718; + --color-neutral-550: #636363; + --color-stone-100: #444444; --color-stone-200: #828282; --color-stone-300: #bbbbbb; @@ -103,6 +105,10 @@ --color-danger-100: #c02323; --color-danger-200: #d62952; + --color-coral-red-600: #973a40; + --color-coral-red-500: #c53f49; + --color-coral-red-400: #dd424e; + --color-bypass: #6a246a; --color-error: #962a2a; diff --git a/src/constants/desktopDialogs.ts b/src/constants/desktopDialogs.ts new file mode 100644 index 000000000..d43e80de2 --- /dev/null +++ b/src/constants/desktopDialogs.ts @@ -0,0 +1,75 @@ +export interface DialogAction { + readonly label: string + readonly action: 'openUrl' | 'close' | 'cancel' + readonly url?: string + readonly severity?: 'danger' | 'primary' | 'secondary' | 'warn' + readonly returnValue: string +} + +interface DesktopDialog { + readonly title: string + readonly message: string + readonly buttons: DialogAction[] +} + +export const DESKTOP_DIALOGS = { + /** Shown when a corrupt venv is detected. */ + reinstallVenv: { + title: 'Reinstall ComfyUI (Fresh Start)?', + message: `Sorry, we can't launch ComfyUI because some installed packages aren't compatible. + +Click Reinstall to restore ComfyUI and get back up and running. + +Please note: if you've added custom nodes, you'll need to reinstall them after this process.`, + buttons: [ + { + label: 'Learn More', + action: 'openUrl', + url: 'https://docs.comfy.org', + returnValue: 'openDocs' + }, + { + label: 'Reinstall', + action: 'close', + severity: 'danger', + returnValue: 'resetVenv' + } + ] + }, + /** A dialog that is shown when an invalid dialog ID is provided. */ + invalidDialog: { + title: 'Invalid Dialog', + message: `Invalid dialog ID was provided.`, + buttons: [ + { + label: 'Close', + action: 'cancel', + returnValue: 'cancel' + } + ] + } +} as const satisfies { [K: string]: DesktopDialog } + +/** The ID of a desktop dialog. */ +type DesktopDialogId = keyof typeof DESKTOP_DIALOGS + +/** + * Checks if {@link id} is a valid dialog ID. + * @param id The string to check + * @returns `true` if the ID is a valid dialog ID, otherwise `false` + */ +function isDialogId(id: unknown): id is DesktopDialogId { + return typeof id === 'string' && id in DESKTOP_DIALOGS +} + +/** + * Gets the dialog with the given ID. + * @param dialogId The ID of the dialog to get + * @returns The dialog with the given ID + */ +export function getDialog( + dialogId: string | string[] +): DesktopDialog & { id: DesktopDialogId } { + const id = isDialogId(dialogId) ? dialogId : 'invalidDialog' + return { id, ...structuredClone(DESKTOP_DIALOGS[id]) } +} diff --git a/src/router.ts b/src/router.ts index fceca8efa..f28b46030 100644 --- a/src/router.ts +++ b/src/router.ts @@ -115,6 +115,12 @@ const router = createRouter({ name: 'DesktopUpdateView', component: () => import('@/views/DesktopUpdateView.vue'), beforeEnter: guardElectronAccess + }, + { + path: 'desktop-dialog/:dialogId', + name: 'DesktopDialogView', + component: () => import('@/views/DesktopDialogView.vue'), + beforeEnter: guardElectronAccess } ] } diff --git a/src/views/DesktopDialogView.vue b/src/views/DesktopDialogView.vue new file mode 100644 index 000000000..b250d1559 --- /dev/null +++ b/src/views/DesktopDialogView.vue @@ -0,0 +1,70 @@ + + + + + From 4789d86fe8beafdb75a135a27ce21486f17733b1 Mon Sep 17 00:00:00 2001 From: Johnpaul Chiwetelu <49923152+Myestery@users.noreply.github.com> Date: Thu, 18 Sep 2025 19:17:14 +0100 Subject: [PATCH 08/21] Line Selection toolbox up with Vue Nodes (#5601) This pull request improves the selection toolbox behavior during node dragging by ensuring that it correctly responds to both LiteGraph and Vue node drag events. The main changes introduce a reactive drag state for Vue nodes in the layout store and update the selection toolbox composable and Vue node component to use this state. **Selection toolbox behavior improvements:** * Added a helper function and separate watchers in `useSelectionToolboxPosition.ts` to hide the selection toolbox when either LiteGraph or Vue nodes are being dragged. This ensures consistent UI feedback regardless of node type. [[1]](diffhunk://#diff-57a51ac5e656e64ae7fd276d71b115058631621755de33b1eb8e8a4731d48713L171-R172) [[2]](diffhunk://#diff-57a51ac5e656e64ae7fd276d71b115058631621755de33b1eb8e8a4731d48713R212-R224) **Vue node drag state management:** * Added a reactive `isDraggingVueNodes` property to the `LayoutStoreImpl` class, along with getter and setter methods to manage Vue node drag state. This allows other components to reactively track when Vue nodes are being dragged. [[1]](diffhunk://#diff-80d32fe0fb72730c16cf7259adef8b20732ff214df240b1d39ae516737beaf3bR133-R135) [[2]](diffhunk://#diff-80d32fe0fb72730c16cf7259adef8b20732ff214df240b1d39ae516737beaf3bR354-R367) * Updated `LGraphNode.vue` to set and clear the Vue node dragging state in the layout store during pointer down and up events, ensuring the selection toolbox is hidden while dragging Vue nodes. [[1]](diffhunk://#diff-a7744614cf842e54416047326db79ad81f7c7ab7bfb66ae2b46f5c73ac7d47f2R357-R360) [[2]](diffhunk://#diff-a7744614cf842e54416047326db79ad81f7c7ab7bfb66ae2b46f5c73ac7d47f2R376-R378) **Dependency updates:** * Imported the `layoutStore` in `LGraphNode.vue` to access the new drag state management methods. * Added missing `ref` import in `layoutStore.ts` to support the new reactive property. https://github.com/user-attachments/assets/d6e9c15e-63b5-4de2-9688-ebbc6a3be545 --------- Co-authored-by: GitHub Action --- .../canvas/useSelectionToolboxPosition.ts | 113 +++++++++++------- src/renderer/core/layout/store/layoutStore.ts | 5 +- .../vueNodes/components/LGraphNode.vue | 8 ++ 3 files changed, 81 insertions(+), 45 deletions(-) diff --git a/src/composables/canvas/useSelectionToolboxPosition.ts b/src/composables/canvas/useSelectionToolboxPosition.ts index 963f9c7d2..e98d4d5ef 100644 --- a/src/composables/canvas/useSelectionToolboxPosition.ts +++ b/src/composables/canvas/useSelectionToolboxPosition.ts @@ -1,4 +1,4 @@ -import { onUnmounted, ref, watch } from 'vue' +import { computed, onUnmounted, ref, watch } from 'vue' import type { Ref } from 'vue' import { useCanvasTransformSync } from '@/composables/canvas/useCanvasTransformSync' @@ -170,50 +170,75 @@ export function useSelectionToolboxPosition( } ) - // Watch for dragging state - watch( - () => canvasStore.canvas?.state?.draggingItems, - (dragging) => { - if (dragging) { - visible.value = false - - if (moreOptionsOpen.value) { - const currentSig = buildSelectionSignature(canvasStore) - if (currentSig !== moreOptionsSelectionSignature) { - moreOptionsSelectionSignature = null - } - moreOptionsWasOpenBeforeDrag = true - moreOptionsOpen.value = false - moreOptionsRestorePending.value = !!moreOptionsSelectionSignature - if (moreOptionsRestorePending.value) { - forceCloseMoreOptionsSignal.value++ - } else { - moreOptionsWasOpenBeforeDrag = false - } - } else { - moreOptionsRestorePending.value = false - moreOptionsWasOpenBeforeDrag = false - } - } else { - requestAnimationFrame(() => { - updateSelectionBounds() - const selectionMatches = currentSelectionMatchesSignature(canvasStore) - const shouldRestore = - moreOptionsWasOpenBeforeDrag && - visible.value && - moreOptionsRestorePending.value && - selectionMatches - - if (shouldRestore) { - restoreMoreOptionsSignal.value++ - } else { - moreOptionsRestorePending.value = false - } - moreOptionsWasOpenBeforeDrag = false - }) - } + const handleDragStateChange = (dragging: boolean) => { + if (dragging) { + handleDragStart() + return } - ) + + handleDragEnd() + } + + const handleDragStart = () => { + visible.value = false + + // Early return if more options wasn't open + if (!moreOptionsOpen.value) { + moreOptionsRestorePending.value = false + moreOptionsWasOpenBeforeDrag = false + return + } + + // Handle more options cleanup + const currentSig = buildSelectionSignature(canvasStore) + const selectionChanged = currentSig !== moreOptionsSelectionSignature + + if (selectionChanged) { + moreOptionsSelectionSignature = null + } + moreOptionsOpen.value = false + moreOptionsWasOpenBeforeDrag = true + moreOptionsRestorePending.value = !!moreOptionsSelectionSignature + + if (moreOptionsRestorePending.value) { + forceCloseMoreOptionsSignal.value++ + return + } + + moreOptionsWasOpenBeforeDrag = false + } + + const handleDragEnd = () => { + requestAnimationFrame(() => { + updateSelectionBounds() + + const selectionMatches = currentSelectionMatchesSignature(canvasStore) + const shouldRestore = + moreOptionsWasOpenBeforeDrag && + visible.value && + moreOptionsRestorePending.value && + selectionMatches + + // Single point of assignment for each ref + moreOptionsRestorePending.value = + shouldRestore && moreOptionsRestorePending.value + moreOptionsWasOpenBeforeDrag = false + + if (shouldRestore) { + restoreMoreOptionsSignal.value++ + } + }) + } + + // Unified dragging state - combines both LiteGraph and Vue node dragging + const isDragging = computed((): boolean => { + const litegraphDragging = canvasStore.canvas?.state?.draggingItems ?? false + const vueNodeDragging = + shouldRenderVueNodes.value && layoutStore.isDraggingVueNodes.value + return litegraphDragging || vueNodeDragging + }) + + watch(isDragging, handleDragStateChange) onUnmounted(() => { resetMoreOptionsState() diff --git a/src/renderer/core/layout/store/layoutStore.ts b/src/renderer/core/layout/store/layoutStore.ts index 7daa4523c..254b27a2c 100644 --- a/src/renderer/core/layout/store/layoutStore.ts +++ b/src/renderer/core/layout/store/layoutStore.ts @@ -5,7 +5,7 @@ * CRDT ensures conflict-free operations for both single and multi-user scenarios. */ import log from 'loglevel' -import { type ComputedRef, type Ref, computed, customRef } from 'vue' +import { type ComputedRef, type Ref, computed, customRef, ref } from 'vue' import * as Y from 'yjs' import { ACTOR_CONFIG } from '@/renderer/core/layout/constants' @@ -134,6 +134,9 @@ class LayoutStoreImpl implements LayoutStore { private slotSpatialIndex: SpatialIndexManager // For slots private rerouteSpatialIndex: SpatialIndexManager // For reroutes + // Vue dragging state for selection toolbox (public ref for direct mutation) + public isDraggingVueNodes = ref(false) + constructor() { // Initialize Yjs data structures this.ynodes = this.ydoc.getMap('nodes') diff --git a/src/renderer/extensions/vueNodes/components/LGraphNode.vue b/src/renderer/extensions/vueNodes/components/LGraphNode.vue index 60e946bf0..808c21ca1 100644 --- a/src/renderer/extensions/vueNodes/components/LGraphNode.vue +++ b/src/renderer/extensions/vueNodes/components/LGraphNode.vue @@ -148,6 +148,7 @@ import { useErrorHandling } from '@/composables/useErrorHandling' import { LiteGraph } from '@/lib/litegraph/src/litegraph' import { SelectedNodeIdsKey } from '@/renderer/core/canvas/injectionKeys' import { TransformStateKey } from '@/renderer/core/layout/injectionKeys' +import { layoutStore } from '@/renderer/core/layout/store/layoutStore' import { useNodeExecutionState } from '@/renderer/extensions/vueNodes/execution/useNodeExecutionState' import { useNodeLayout } from '@/renderer/extensions/vueNodes/layout/useNodeLayout' import { LODLevel, useLOD } from '@/renderer/extensions/vueNodes/lod/useLOD' @@ -363,6 +364,10 @@ const handlePointerDown = (event: PointerEvent) => { // Start drag using layout system isDragging.value = true + + // Set Vue node dragging state for selection toolbox + layoutStore.isDraggingVueNodes.value = true + startDrag(event) lastY.value = event.clientY lastX.value = event.clientX @@ -378,6 +383,9 @@ const handlePointerUp = (event: PointerEvent) => { if (isDragging.value) { isDragging.value = false void endDrag(event) + + // Clear Vue node dragging state for selection toolbox + layoutStore.isDraggingVueNodes.value = false } // Emit node-click for selection handling in GraphCanvas const dx = event.clientX - lastX.value From ea4e57b60261d18dae3f36c126baec694e1670b0 Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Thu, 18 Sep 2025 11:18:05 -0700 Subject: [PATCH 09/21] Move VueFire persistence configuration to initialization (#5614) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, we set persistence method in the auth store setup. This creates pattern of using the default on init (indexed DB) up until the firebase store is initialized and `setPersistence` is called. For devices that don't support indexed DB or have the connection aggresively terminated or cleared, like [Safari](https://comfy-org.sentry.io/issues/6879071102/?project=4509681221369857&query=is%3Aunresolved&referrer=issue-stream), this can create problems with maintaing auth persistence. Fix by setting persistence method in the initialization in main.ts ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5614-Move-VueFire-persistence-configuration-to-initialization-2716d73d3650817480e0c8feb1f37b9a) by [Unito](https://www.unito.io) --------- Co-authored-by: Claude --- src/main.ts | 21 +++++++++++++++++-- src/stores/firebaseAuthStore.ts | 4 ---- .../tests/store/firebaseAuthStore.test.ts | 7 ------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main.ts b/src/main.ts index b15d4067f..267de4f44 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,6 +2,11 @@ import { definePreset } from '@primevue/themes' import Aura from '@primevue/themes/aura' import * as Sentry from '@sentry/vue' import { initializeApp } from 'firebase/app' +import { + browserLocalPersistence, + browserSessionPersistence, + indexedDBLocalPersistence +} from 'firebase/auth' import { createPinia } from 'pinia' import 'primeicons/primeicons.css' import PrimeVue from 'primevue/config' @@ -9,7 +14,7 @@ import ConfirmationService from 'primevue/confirmationservice' import ToastService from 'primevue/toastservice' import Tooltip from 'primevue/tooltip' import { createApp } from 'vue' -import { VueFire, VueFireAuth } from 'vuefire' +import { VueFire, VueFireAuthWithDependencies } from 'vuefire' import { FIREBASE_CONFIG } from '@/config/firebase' import '@/lib/litegraph/public/css/litegraph.css' @@ -66,6 +71,18 @@ app .use(i18n) .use(VueFire, { firebaseApp, - modules: [VueFireAuth()] + modules: [ + // Configure Firebase Auth persistence: localStorage first, IndexedDB last. + // Localstorage is preferred to IndexedDB for mobile Safari compatibility. + VueFireAuthWithDependencies({ + dependencies: { + persistence: [ + browserLocalPersistence, + browserSessionPersistence, + indexedDBLocalPersistence + ] + } + }) + ] }) .mount('#vue-app') diff --git a/src/stores/firebaseAuthStore.ts b/src/stores/firebaseAuthStore.ts index 8225b1f33..f2c75417c 100644 --- a/src/stores/firebaseAuthStore.ts +++ b/src/stores/firebaseAuthStore.ts @@ -6,12 +6,10 @@ import { GoogleAuthProvider, type User, type UserCredential, - browserLocalPersistence, createUserWithEmailAndPassword, deleteUser, onAuthStateChanged, sendPasswordResetEmail, - setPersistence, signInWithEmailAndPassword, signInWithPopup, signOut, @@ -80,8 +78,6 @@ export const useFirebaseAuthStore = defineStore('firebaseAuth', () => { // Retrieves the Firebase Auth instance. Returns `null` on the server. // When using this function on the client in TypeScript, you can force the type with `useFirebaseAuth()!`. const auth = useFirebaseAuth()! - // Set persistence to localStorage (works in both browser and Electron) - void setPersistence(auth, browserLocalPersistence) onAuthStateChanged(auth, (user) => { currentUser.value = user diff --git a/tests-ui/tests/store/firebaseAuthStore.test.ts b/tests-ui/tests/store/firebaseAuthStore.test.ts index ffe7a8d99..fee66d3f7 100644 --- a/tests-ui/tests/store/firebaseAuthStore.test.ts +++ b/tests-ui/tests/store/firebaseAuthStore.test.ts @@ -148,13 +148,6 @@ describe('useFirebaseAuthStore', () => { expect(store.loading).toBe(false) }) - it('should set persistence to local storage on initialization', () => { - expect(firebaseAuth.setPersistence).toHaveBeenCalledWith( - mockAuth, - firebaseAuth.browserLocalPersistence - ) - }) - it('should properly clean up error state between operations', async () => { // First, cause an error const mockError = new Error('Invalid password') From 78d0ea6fa5f6e72b28233e292c9e7f9c91f1c257 Mon Sep 17 00:00:00 2001 From: Johnpaul Chiwetelu <49923152+Myestery@users.noreply.github.com> Date: Thu, 18 Sep 2025 19:20:19 +0100 Subject: [PATCH 10/21] LazyImage on Safari (#5626) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This pull request improves the lazy loading behavior and caching strategy for images in the `LazyImage.vue` component. The most significant changes are focused on optimizing image rendering and resource management, as well as improving code clarity. **Lazy loading behavior improvements:** * Changed the `` element to render only when `cachedSrc` is available, ensuring that images are not displayed before they are ready. * Updated watchers in `LazyImage.vue` to use clearer variable names (`shouldLoadVal` instead of `shouldLoad`) for better readability and maintainability. [[1]](diffhunk://#diff-3a1bfa7eb8cb26b04bea73f7b4b4e3c01e9d20a7eba6c3738fb47f96da1a7c95L80-R81) [[2]](diffhunk://#diff-3a1bfa7eb8cb26b04bea73f7b4b4e3c01e9d20a7eba6c3738fb47f96da1a7c95L96-R96) **Caching strategy enhancement:** * Modified the `fetch` call in `mediaCacheService.ts` to use `{ cache: 'force-cache' }`, which leverages the browser's cache more aggressively when loading media, potentially improving performance and reducing network requests. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5626-LazyImage-on-Safari-2716d73d365081eeb1d3c2a96be4d408) by [Unito](https://www.unito.io) --- src/components/common/LazyImage.vue | 8 ++++---- src/services/mediaCacheService.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/common/LazyImage.vue b/src/components/common/LazyImage.vue index 79c7320f6..36aaa8a2b 100644 --- a/src/components/common/LazyImage.vue +++ b/src/components/common/LazyImage.vue @@ -10,7 +10,7 @@ class="absolute inset-0" /> isIntersecting.value) watch( shouldLoad, - async (shouldLoad) => { - if (shouldLoad && src && !cachedSrc.value && !hasError.value) { + async (shouldLoadVal) => { + if (shouldLoadVal && src && !cachedSrc.value && !hasError.value) { try { const cachedMedia = await getCachedMedia(src) if (cachedMedia.error) { @@ -93,7 +93,7 @@ watch( console.warn('Failed to load cached media:', error) cachedSrc.value = src } - } else if (!shouldLoad) { + } else if (!shouldLoadVal) { if (cachedSrc.value?.startsWith('blob:')) { releaseUrl(src) } diff --git a/src/services/mediaCacheService.ts b/src/services/mediaCacheService.ts index 65f87a43c..b2e24c29e 100644 --- a/src/services/mediaCacheService.ts +++ b/src/services/mediaCacheService.ts @@ -113,7 +113,7 @@ class MediaCacheService { try { // Fetch the media - const response = await fetch(src) + const response = await fetch(src, { cache: 'force-cache' }) if (!response.ok) { throw new Error(`Failed to fetch: ${response.status}`) } From b264685052cc1b8a01d0e5ab91593107a87084fa Mon Sep 17 00:00:00 2001 From: Alexander Brown Date: Thu, 18 Sep 2025 11:35:44 -0700 Subject: [PATCH 11/21] lint: add tsconfig for browser_tests, fix existing violations (#5633) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary See https://typescript-eslint.io/blog/project-service/ for context. Creates a browser_tests specific tsconfig so that they can be linted. Does not add a package.json script to do the linting yet, but `pnpm exec eslint browser_tests` should work for now. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5633-lint-add-tsconfig-for-browser_tests-fix-existing-violations-2726d73d3650819d8ef2c4b0abc31e14) by [Unito](https://www.unito.io) --- browser_tests/fixtures/UserSelectPage.ts | 3 ++- .../fixtures/components/ComfyNodeSearchBox.ts | 2 +- browser_tests/fixtures/components/SettingDialog.ts | 4 ++-- browser_tests/fixtures/components/SidebarTab.ts | 2 +- browser_tests/fixtures/components/Topbar.ts | 3 ++- browser_tests/fixtures/ws.ts | 7 ++++--- browser_tests/globalSetup.ts | 2 +- browser_tests/globalTeardown.ts | 2 +- browser_tests/helpers/manageGroupNode.ts | 2 +- browser_tests/helpers/templates.ts | 4 ++-- browser_tests/tests/actionbar.spec.ts | 4 ++-- browser_tests/tests/changeTracker.spec.ts | 2 +- browser_tests/tests/chatHistory.spec.ts | 3 ++- browser_tests/tests/dialog.spec.ts | 3 ++- browser_tests/tests/extensionAPI.spec.ts | 2 +- browser_tests/tests/groupNode.spec.ts | 3 ++- browser_tests/tests/interaction.spec.ts | 7 ++++--- browser_tests/tests/remoteWidgets.spec.ts | 3 ++- browser_tests/tests/sidebar/queue.spec.ts | 12 +++++++++--- browser_tests/tests/templates.spec.ts | 3 ++- .../tests/versionMismatchWarnings.spec.ts | 2 +- .../tsconfig.json | 11 ++--------- eslint.config.ts | 9 +++++++++ .../bottomPanel/tabs/terminal/BaseTerminal.test.ts | 3 ++- .../dialog/footer/ManagerProgressFooter.test.ts | 2 +- .../canvas/useSelectedLiteGraphItems.test.ts | 8 ++------ tests-ui/tests/composables/useManagerQueue.test.ts | 2 +- .../tests/composables/useNodeChatHistory.test.ts | 2 +- tests-ui/tests/composables/useServerLogs.test.ts | 2 +- .../LinkConnectorSubgraphInputValidation.test.ts | 2 +- .../litegraph/core/LGraphNode.titleButtons.test.ts | 2 +- .../core/LinkConnector.integration.test.ts | 3 +-- tests-ui/tests/litegraph/core/NodeSlot.test.ts | 5 ++++- .../litegraph/subgraph/SubgraphConversion.test.ts | 3 +-- .../subgraph/SubgraphNode.titleButton.test.ts | 2 +- .../subgraph/SubgraphSlotConnections.test.ts | 4 ++-- .../subgraph/SubgraphWidgetPromotion.test.ts | 4 ++-- .../subgraph/fixtures/subgraphFixtures.ts | 5 +++-- tests-ui/tests/nodeSearchService.test.ts | 2 +- .../composables/useNodeEventHandlers.test.ts | 2 +- .../widgets/composables/useRemoteWidget.test.ts | 2 +- .../composables/useWorkflowThumbnail.spec.ts | 6 ++---- tests-ui/tests/store/comfyManagerStore.test.ts | 2 +- tests-ui/tests/store/imagePreviewStore.test.ts | 4 ++-- tests-ui/tests/store/serverConfigStore.test.ts | 2 +- tests-ui/tests/store/workflowStore.test.ts | 6 ++++-- tests-ui/tests/utils/litegraphUtil.test.ts | 2 +- tests-ui/tests/utils/treeUtilTest.test.ts | 2 +- tests-ui/tsconfig.json | 14 ++++++++++++++ 49 files changed, 109 insertions(+), 79 deletions(-) rename tsconfig.eslint.json => browser_tests/tsconfig.json (53%) create mode 100644 tests-ui/tsconfig.json diff --git a/browser_tests/fixtures/UserSelectPage.ts b/browser_tests/fixtures/UserSelectPage.ts index 62a961375..ff0735e17 100644 --- a/browser_tests/fixtures/UserSelectPage.ts +++ b/browser_tests/fixtures/UserSelectPage.ts @@ -1,4 +1,5 @@ -import { Page, test as base } from '@playwright/test' +import type { Page } from '@playwright/test' +import { test as base } from '@playwright/test' export class UserSelectPage { constructor( diff --git a/browser_tests/fixtures/components/ComfyNodeSearchBox.ts b/browser_tests/fixtures/components/ComfyNodeSearchBox.ts index 23dc104cf..fd40ca911 100644 --- a/browser_tests/fixtures/components/ComfyNodeSearchBox.ts +++ b/browser_tests/fixtures/components/ComfyNodeSearchBox.ts @@ -1,4 +1,4 @@ -import { Locator, Page } from '@playwright/test' +import type { Locator, Page } from '@playwright/test' export class ComfyNodeSearchFilterSelectionPanel { constructor(public readonly page: Page) {} diff --git a/browser_tests/fixtures/components/SettingDialog.ts b/browser_tests/fixtures/components/SettingDialog.ts index afaf86154..e9040a3a9 100644 --- a/browser_tests/fixtures/components/SettingDialog.ts +++ b/browser_tests/fixtures/components/SettingDialog.ts @@ -1,6 +1,6 @@ -import { Page } from '@playwright/test' +import type { Page } from '@playwright/test' -import { ComfyPage } from '../ComfyPage' +import type { ComfyPage } from '../ComfyPage' export class SettingDialog { constructor( diff --git a/browser_tests/fixtures/components/SidebarTab.ts b/browser_tests/fixtures/components/SidebarTab.ts index 7baaa1ef9..f3fbe42cf 100644 --- a/browser_tests/fixtures/components/SidebarTab.ts +++ b/browser_tests/fixtures/components/SidebarTab.ts @@ -1,4 +1,4 @@ -import { Locator, Page } from '@playwright/test' +import type { Locator, Page } from '@playwright/test' class SidebarTab { constructor( diff --git a/browser_tests/fixtures/components/Topbar.ts b/browser_tests/fixtures/components/Topbar.ts index 04a9117ce..6d0cd1fb3 100644 --- a/browser_tests/fixtures/components/Topbar.ts +++ b/browser_tests/fixtures/components/Topbar.ts @@ -1,4 +1,5 @@ -import { Locator, Page, expect } from '@playwright/test' +import type { Locator, Page } from '@playwright/test' +import { expect } from '@playwright/test' export class Topbar { private readonly menuLocator: Locator diff --git a/browser_tests/fixtures/ws.ts b/browser_tests/fixtures/ws.ts index e12c53465..f1ab1a538 100644 --- a/browser_tests/fixtures/ws.ts +++ b/browser_tests/fixtures/ws.ts @@ -12,9 +12,10 @@ export const webSocketFixture = base.extend<{ // so we can look it up to trigger messages const store: Record = ((window as any).__ws__ = {}) window.WebSocket = class extends window.WebSocket { - constructor() { - // @ts-expect-error - super(...arguments) + constructor( + ...rest: ConstructorParameters + ) { + super(...rest) store[this.url] = this } } diff --git a/browser_tests/globalSetup.ts b/browser_tests/globalSetup.ts index 12033fce3..881ef11c4 100644 --- a/browser_tests/globalSetup.ts +++ b/browser_tests/globalSetup.ts @@ -1,4 +1,4 @@ -import { FullConfig } from '@playwright/test' +import type { FullConfig } from '@playwright/test' import dotenv from 'dotenv' import { backupPath } from './utils/backupUtils' diff --git a/browser_tests/globalTeardown.ts b/browser_tests/globalTeardown.ts index 47bab3db9..aeed77294 100644 --- a/browser_tests/globalTeardown.ts +++ b/browser_tests/globalTeardown.ts @@ -1,4 +1,4 @@ -import { FullConfig } from '@playwright/test' +import type { FullConfig } from '@playwright/test' import dotenv from 'dotenv' import { restorePath } from './utils/backupUtils' diff --git a/browser_tests/helpers/manageGroupNode.ts b/browser_tests/helpers/manageGroupNode.ts index a444a97c6..45010b979 100644 --- a/browser_tests/helpers/manageGroupNode.ts +++ b/browser_tests/helpers/manageGroupNode.ts @@ -1,4 +1,4 @@ -import { Locator, Page } from '@playwright/test' +import type { Locator, Page } from '@playwright/test' export class ManageGroupNode { footer: Locator diff --git a/browser_tests/helpers/templates.ts b/browser_tests/helpers/templates.ts index 0d2c9f31e..c690b8702 100644 --- a/browser_tests/helpers/templates.ts +++ b/browser_tests/helpers/templates.ts @@ -1,7 +1,7 @@ -import { Locator, Page } from '@playwright/test' +import type { Locator, Page } from '@playwright/test' import path from 'path' -import { +import type { TemplateInfo, WorkflowTemplates } from '../../src/platform/workflow/templates/types/template' diff --git a/browser_tests/tests/actionbar.spec.ts b/browser_tests/tests/actionbar.spec.ts index a504ea4fc..b23e4466d 100644 --- a/browser_tests/tests/actionbar.spec.ts +++ b/browser_tests/tests/actionbar.spec.ts @@ -29,9 +29,9 @@ test.describe('Actionbar', () => { // Intercept the prompt queue endpoint let promptNumber = 0 - comfyPage.page.route('**/api/prompt', async (route, req) => { + await comfyPage.page.route('**/api/prompt', async (route, req) => { await new Promise((r) => setTimeout(r, 100)) - route.fulfill({ + await route.fulfill({ status: 200, body: JSON.stringify({ prompt_id: promptNumber, diff --git a/browser_tests/tests/changeTracker.spec.ts b/browser_tests/tests/changeTracker.spec.ts index 7a32833e4..8c23c835a 100644 --- a/browser_tests/tests/changeTracker.spec.ts +++ b/browser_tests/tests/changeTracker.spec.ts @@ -1,5 +1,5 @@ +import type { ComfyPage } from '../fixtures/ComfyPage' import { - ComfyPage, comfyExpect as expect, comfyPageFixture as test } from '../fixtures/ComfyPage' diff --git a/browser_tests/tests/chatHistory.spec.ts b/browser_tests/tests/chatHistory.spec.ts index db3397514..7d1bf6c10 100644 --- a/browser_tests/tests/chatHistory.spec.ts +++ b/browser_tests/tests/chatHistory.spec.ts @@ -1,4 +1,5 @@ -import { Page, expect } from '@playwright/test' +import type { Page } from '@playwright/test' +import { expect } from '@playwright/test' import { comfyPageFixture as test } from '../fixtures/ComfyPage' diff --git a/browser_tests/tests/dialog.spec.ts b/browser_tests/tests/dialog.spec.ts index cf2e5e6be..c86466215 100644 --- a/browser_tests/tests/dialog.spec.ts +++ b/browser_tests/tests/dialog.spec.ts @@ -1,4 +1,5 @@ -import { Locator, expect } from '@playwright/test' +import type { Locator } from '@playwright/test' +import { expect } from '@playwright/test' import type { Keybinding } from '../../src/schemas/keyBindingSchema' import { comfyPageFixture as test } from '../fixtures/ComfyPage' diff --git a/browser_tests/tests/extensionAPI.spec.ts b/browser_tests/tests/extensionAPI.spec.ts index 09a08384c..38f4a6c1d 100644 --- a/browser_tests/tests/extensionAPI.spec.ts +++ b/browser_tests/tests/extensionAPI.spec.ts @@ -1,6 +1,6 @@ import { expect } from '@playwright/test' -import { SettingParams } from '../../src/platform/settings/types' +import type { SettingParams } from '../../src/platform/settings/types' import { comfyPageFixture as test } from '../fixtures/ComfyPage' test.describe('Topbar commands', () => { diff --git a/browser_tests/tests/groupNode.spec.ts b/browser_tests/tests/groupNode.spec.ts index 41b50224a..fc8dbd646 100644 --- a/browser_tests/tests/groupNode.spec.ts +++ b/browser_tests/tests/groupNode.spec.ts @@ -1,6 +1,7 @@ import { expect } from '@playwright/test' -import { ComfyPage, comfyPageFixture as test } from '../fixtures/ComfyPage' +import type { ComfyPage } from '../fixtures/ComfyPage' +import { comfyPageFixture as test } from '../fixtures/ComfyPage' import type { NodeReference } from '../fixtures/utils/litegraphUtils' test.describe('Group Node', () => { diff --git a/browser_tests/tests/interaction.spec.ts b/browser_tests/tests/interaction.spec.ts index c3754ed3b..bd14f91ad 100644 --- a/browser_tests/tests/interaction.spec.ts +++ b/browser_tests/tests/interaction.spec.ts @@ -1,12 +1,13 @@ -import { Locator, expect } from '@playwright/test' -import { Position } from '@vueuse/core' +import type { Locator } from '@playwright/test' +import { expect } from '@playwright/test' +import type { Position } from '@vueuse/core' import { type ComfyPage, comfyPageFixture as test, testComfySnapToGridGridSize } from '../fixtures/ComfyPage' -import { type NodeReference } from '../fixtures/utils/litegraphUtils' +import type { NodeReference } from '../fixtures/utils/litegraphUtils' test.describe('Item Interaction', () => { test('Can select/delete all items', async ({ comfyPage }) => { diff --git a/browser_tests/tests/remoteWidgets.spec.ts b/browser_tests/tests/remoteWidgets.spec.ts index 05bb578df..7a54cae07 100644 --- a/browser_tests/tests/remoteWidgets.spec.ts +++ b/browser_tests/tests/remoteWidgets.spec.ts @@ -1,6 +1,7 @@ import { expect } from '@playwright/test' -import { ComfyPage, comfyPageFixture as test } from '../fixtures/ComfyPage' +import type { ComfyPage } from '../fixtures/ComfyPage' +import { comfyPageFixture as test } from '../fixtures/ComfyPage' test.describe('Remote COMBO Widget', () => { const mockOptions = ['d', 'c', 'b', 'a'] diff --git a/browser_tests/tests/sidebar/queue.spec.ts b/browser_tests/tests/sidebar/queue.spec.ts index 2d9dd10ba..39e2ced6e 100644 --- a/browser_tests/tests/sidebar/queue.spec.ts +++ b/browser_tests/tests/sidebar/queue.spec.ts @@ -160,7 +160,9 @@ test.describe.skip('Queue sidebar', () => { comfyPage }) => { await comfyPage.nextFrame() - expect(comfyPage.menu.queueTab.getGalleryImage(firstImage)).toBeVisible() + await expect( + comfyPage.menu.queueTab.getGalleryImage(firstImage) + ).toBeVisible() }) test('maintains active gallery item when new tasks are added', async ({ @@ -174,7 +176,9 @@ test.describe.skip('Queue sidebar', () => { const newTask = comfyPage.menu.queueTab.tasks.getByAltText(newImage) await newTask.waitFor({ state: 'visible' }) // The active gallery item should still be the initial image - expect(comfyPage.menu.queueTab.getGalleryImage(firstImage)).toBeVisible() + await expect( + comfyPage.menu.queueTab.getGalleryImage(firstImage) + ).toBeVisible() }) test.describe('Gallery navigation', () => { @@ -196,7 +200,9 @@ test.describe.skip('Queue sidebar', () => { delay: 256 }) await comfyPage.nextFrame() - expect(comfyPage.menu.queueTab.getGalleryImage(end)).toBeVisible() + await expect( + comfyPage.menu.queueTab.getGalleryImage(end) + ).toBeVisible() }) }) }) diff --git a/browser_tests/tests/templates.spec.ts b/browser_tests/tests/templates.spec.ts index f2c2e2bb5..9141e9135 100644 --- a/browser_tests/tests/templates.spec.ts +++ b/browser_tests/tests/templates.spec.ts @@ -1,4 +1,5 @@ -import { Page, expect } from '@playwright/test' +import type { Page } from '@playwright/test' +import { expect } from '@playwright/test' import { comfyPageFixture as test } from '../fixtures/ComfyPage' diff --git a/browser_tests/tests/versionMismatchWarnings.spec.ts b/browser_tests/tests/versionMismatchWarnings.spec.ts index d85f18723..b2c62aeb0 100644 --- a/browser_tests/tests/versionMismatchWarnings.spec.ts +++ b/browser_tests/tests/versionMismatchWarnings.spec.ts @@ -1,6 +1,6 @@ import { expect } from '@playwright/test' -import { SystemStats } from '../../src/schemas/apiSchema' +import type { SystemStats } from '../../src/schemas/apiSchema' import { comfyPageFixture as test } from '../fixtures/ComfyPage' test.describe('Version Mismatch Warnings', () => { diff --git a/tsconfig.eslint.json b/browser_tests/tsconfig.json similarity index 53% rename from tsconfig.eslint.json rename to browser_tests/tsconfig.json index 9b1635700..f600c4a7f 100644 --- a/tsconfig.eslint.json +++ b/browser_tests/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "./tsconfig.json", + "extends": "../tsconfig.json", "compilerOptions": { /* Test files should not be compiled */ "noEmit": true, @@ -9,13 +9,6 @@ "resolveJsonModule": true }, "include": [ - "*.ts", - "*.mts", - "*.config.js", - "browser_tests/**/*.ts", - "scripts/**/*.js", - "scripts/**/*.ts", - "tests-ui/**/*.ts", - ".storybook/**/*.ts" + "**/*.ts", ] } diff --git a/eslint.config.ts b/eslint.config.ts index b92d6bbf7..94f8bb5f2 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -153,5 +153,14 @@ export default defineConfig([ } ] } + }, + { + files: ['tests-ui/**/*'], + rules: { + '@typescript-eslint/consistent-type-imports': [ + 'error', + { disallowTypeAnnotations: false } + ] + } } ]) diff --git a/tests-ui/tests/components/bottomPanel/tabs/terminal/BaseTerminal.test.ts b/tests-ui/tests/components/bottomPanel/tabs/terminal/BaseTerminal.test.ts index 9f8743318..faa20f654 100644 --- a/tests-ui/tests/components/bottomPanel/tabs/terminal/BaseTerminal.test.ts +++ b/tests-ui/tests/components/bottomPanel/tabs/terminal/BaseTerminal.test.ts @@ -1,5 +1,6 @@ import { createTestingPinia } from '@pinia/testing' -import { VueWrapper, mount } from '@vue/test-utils' +import type { VueWrapper } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { nextTick } from 'vue' import { createI18n } from 'vue-i18n' diff --git a/tests-ui/tests/components/dialog/footer/ManagerProgressFooter.test.ts b/tests-ui/tests/components/dialog/footer/ManagerProgressFooter.test.ts index e3ff5afb0..b9fd92eda 100644 --- a/tests-ui/tests/components/dialog/footer/ManagerProgressFooter.test.ts +++ b/tests-ui/tests/components/dialog/footer/ManagerProgressFooter.test.ts @@ -14,7 +14,7 @@ import { } from '@/stores/comfyManagerStore' import { useCommandStore } from '@/stores/commandStore' import { useDialogStore } from '@/stores/dialogStore' -import { TaskLog } from '@/types/comfyManagerTypes' +import type { TaskLog } from '@/types/comfyManagerTypes' // Mock modules vi.mock('@/stores/comfyManagerStore') diff --git a/tests-ui/tests/composables/canvas/useSelectedLiteGraphItems.test.ts b/tests-ui/tests/composables/canvas/useSelectedLiteGraphItems.test.ts index 2b248eddd..23e1e8dd3 100644 --- a/tests-ui/tests/composables/canvas/useSelectedLiteGraphItems.test.ts +++ b/tests-ui/tests/composables/canvas/useSelectedLiteGraphItems.test.ts @@ -2,12 +2,8 @@ import { createPinia, setActivePinia } from 'pinia' import { beforeEach, describe, expect, it, vi } from 'vitest' import { useSelectedLiteGraphItems } from '@/composables/canvas/useSelectedLiteGraphItems' -import { - LGraphEventMode, - LGraphNode, - Positionable, - Reroute -} from '@/lib/litegraph/src/litegraph' +import type { LGraphNode, Positionable } from '@/lib/litegraph/src/litegraph' +import { LGraphEventMode, Reroute } from '@/lib/litegraph/src/litegraph' import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' import { app } from '@/scripts/app' diff --git a/tests-ui/tests/composables/useManagerQueue.test.ts b/tests-ui/tests/composables/useManagerQueue.test.ts index 0d9313446..c5e26944c 100644 --- a/tests-ui/tests/composables/useManagerQueue.test.ts +++ b/tests-ui/tests/composables/useManagerQueue.test.ts @@ -2,7 +2,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { ref } from 'vue' import { useManagerQueue } from '@/composables/useManagerQueue' -import { components } from '@/types/generatedManagerTypes' +import type { components } from '@/types/generatedManagerTypes' // Mock dialog service vi.mock('@/services/dialogService', () => ({ diff --git a/tests-ui/tests/composables/useNodeChatHistory.test.ts b/tests-ui/tests/composables/useNodeChatHistory.test.ts index 0b47fabb6..4389b8c80 100644 --- a/tests-ui/tests/composables/useNodeChatHistory.test.ts +++ b/tests-ui/tests/composables/useNodeChatHistory.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { useNodeChatHistory } from '@/composables/node/useNodeChatHistory' -import { LGraphNode } from '@/lib/litegraph/src/litegraph' +import type { LGraphNode } from '@/lib/litegraph/src/litegraph' vi.mock( '@/renderer/extensions/vueNodes/widgets/composables/useChatHistoryWidget', diff --git a/tests-ui/tests/composables/useServerLogs.test.ts b/tests-ui/tests/composables/useServerLogs.test.ts index 3af4f0faa..c056b6f3a 100644 --- a/tests-ui/tests/composables/useServerLogs.test.ts +++ b/tests-ui/tests/composables/useServerLogs.test.ts @@ -3,7 +3,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { nextTick } from 'vue' import { useServerLogs } from '@/composables/useServerLogs' -import { LogsWsMessage } from '@/schemas/apiSchema' +import type { LogsWsMessage } from '@/schemas/apiSchema' import { api } from '@/scripts/api' vi.mock('@/scripts/api', () => ({ diff --git a/tests-ui/tests/litegraph/canvas/LinkConnectorSubgraphInputValidation.test.ts b/tests-ui/tests/litegraph/canvas/LinkConnectorSubgraphInputValidation.test.ts index f0470890e..957076526 100644 --- a/tests-ui/tests/litegraph/canvas/LinkConnectorSubgraphInputValidation.test.ts +++ b/tests-ui/tests/litegraph/canvas/LinkConnectorSubgraphInputValidation.test.ts @@ -5,7 +5,7 @@ import { LinkConnector } from '@/lib/litegraph/src/litegraph' import { MovingOutputLink } from '@/lib/litegraph/src/litegraph' import { ToOutputRenderLink } from '@/lib/litegraph/src/litegraph' import { LGraphNode, LLink } from '@/lib/litegraph/src/litegraph' -import { NodeInputSlot } from '@/lib/litegraph/src/litegraph' +import type { NodeInputSlot } from '@/lib/litegraph/src/litegraph' import { createTestSubgraph } from '../subgraph/fixtures/subgraphHelpers' diff --git a/tests-ui/tests/litegraph/core/LGraphNode.titleButtons.test.ts b/tests-ui/tests/litegraph/core/LGraphNode.titleButtons.test.ts index c88c6cfb2..6599d6562 100644 --- a/tests-ui/tests/litegraph/core/LGraphNode.titleButtons.test.ts +++ b/tests-ui/tests/litegraph/core/LGraphNode.titleButtons.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest' import { LGraphButton } from '@/lib/litegraph/src/litegraph' -import { LGraphCanvas } from '@/lib/litegraph/src/litegraph' +import type { LGraphCanvas } from '@/lib/litegraph/src/litegraph' import { LGraphNode } from '@/lib/litegraph/src/litegraph' describe('LGraphNode Title Buttons', () => { diff --git a/tests-ui/tests/litegraph/core/LinkConnector.integration.test.ts b/tests-ui/tests/litegraph/core/LinkConnector.integration.test.ts index c829a8ba7..da99d9135 100644 --- a/tests-ui/tests/litegraph/core/LinkConnector.integration.test.ts +++ b/tests-ui/tests/litegraph/core/LinkConnector.integration.test.ts @@ -1,13 +1,12 @@ // TODO: Fix these tests after migration import { afterEach, describe, expect, vi } from 'vitest' +import type { LGraph, Reroute } from '@/lib/litegraph/src/litegraph' import { type CanvasPointerEvent, - LGraph, LGraphNode, LLink, LinkConnector, - Reroute, type RerouteId } from '@/lib/litegraph/src/litegraph' diff --git a/tests-ui/tests/litegraph/core/NodeSlot.test.ts b/tests-ui/tests/litegraph/core/NodeSlot.test.ts index e06a44bc5..15215cbf0 100644 --- a/tests-ui/tests/litegraph/core/NodeSlot.test.ts +++ b/tests-ui/tests/litegraph/core/NodeSlot.test.ts @@ -1,6 +1,9 @@ import { describe, expect, it } from 'vitest' -import { INodeInputSlot, INodeOutputSlot } from '@/lib/litegraph/src/litegraph' +import type { + INodeInputSlot, + INodeOutputSlot +} from '@/lib/litegraph/src/litegraph' import { inputAsSerialisable, outputAsSerialisable diff --git a/tests-ui/tests/litegraph/subgraph/SubgraphConversion.test.ts b/tests-ui/tests/litegraph/subgraph/SubgraphConversion.test.ts index 824c06e57..f617ec341 100644 --- a/tests-ui/tests/litegraph/subgraph/SubgraphConversion.test.ts +++ b/tests-ui/tests/litegraph/subgraph/SubgraphConversion.test.ts @@ -1,9 +1,8 @@ // TODO: Fix these tests after migration import { assert, describe, expect, it } from 'vitest' +import type { ISlotType, LGraph } from '@/lib/litegraph/src/litegraph' import { - ISlotType, - LGraph, LGraphGroup, LGraphNode, LiteGraph diff --git a/tests-ui/tests/litegraph/subgraph/SubgraphNode.titleButton.test.ts b/tests-ui/tests/litegraph/subgraph/SubgraphNode.titleButton.test.ts index 514a52c40..9bc64802c 100644 --- a/tests-ui/tests/litegraph/subgraph/SubgraphNode.titleButton.test.ts +++ b/tests-ui/tests/litegraph/subgraph/SubgraphNode.titleButton.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it, vi } from 'vitest' import { LGraphButton } from '@/lib/litegraph/src/litegraph' -import { LGraphCanvas } from '@/lib/litegraph/src/litegraph' +import type { LGraphCanvas } from '@/lib/litegraph/src/litegraph' import { createTestSubgraph, diff --git a/tests-ui/tests/litegraph/subgraph/SubgraphSlotConnections.test.ts b/tests-ui/tests/litegraph/subgraph/SubgraphSlotConnections.test.ts index a82fddc0e..0c10b782a 100644 --- a/tests-ui/tests/litegraph/subgraph/SubgraphSlotConnections.test.ts +++ b/tests-ui/tests/litegraph/subgraph/SubgraphSlotConnections.test.ts @@ -5,8 +5,8 @@ import { LinkConnector } from '@/lib/litegraph/src/litegraph' import { ToInputFromIoNodeLink } from '@/lib/litegraph/src/litegraph' import { SUBGRAPH_INPUT_ID } from '@/lib/litegraph/src/litegraph' import { LGraphNode, type LinkNetwork } from '@/lib/litegraph/src/litegraph' -import { NodeInputSlot } from '@/lib/litegraph/src/litegraph' -import { NodeOutputSlot } from '@/lib/litegraph/src/litegraph' +import type { NodeInputSlot } from '@/lib/litegraph/src/litegraph' +import type { NodeOutputSlot } from '@/lib/litegraph/src/litegraph' import { isSubgraphInput, isSubgraphOutput diff --git a/tests-ui/tests/litegraph/subgraph/SubgraphWidgetPromotion.test.ts b/tests-ui/tests/litegraph/subgraph/SubgraphWidgetPromotion.test.ts index 75c20c0ba..36793829d 100644 --- a/tests-ui/tests/litegraph/subgraph/SubgraphWidgetPromotion.test.ts +++ b/tests-ui/tests/litegraph/subgraph/SubgraphWidgetPromotion.test.ts @@ -1,8 +1,8 @@ // TODO: Fix these tests after migration import { describe, expect, it } from 'vitest' -import type { ISlotType } from '@/lib/litegraph/src/litegraph' -import { LGraphNode, Subgraph } from '@/lib/litegraph/src/litegraph' +import type { ISlotType, Subgraph } from '@/lib/litegraph/src/litegraph' +import { LGraphNode } from '@/lib/litegraph/src/litegraph' import type { TWidgetType } from '@/lib/litegraph/src/litegraph' import { BaseWidget } from '@/lib/litegraph/src/litegraph' diff --git a/tests-ui/tests/litegraph/subgraph/fixtures/subgraphFixtures.ts b/tests-ui/tests/litegraph/subgraph/fixtures/subgraphFixtures.ts index b90a781e2..02134868c 100644 --- a/tests-ui/tests/litegraph/subgraph/fixtures/subgraphFixtures.ts +++ b/tests-ui/tests/litegraph/subgraph/fixtures/subgraphFixtures.ts @@ -5,8 +5,9 @@ * in their test files. Each fixture provides a clean, pre-configured subgraph * setup for different testing scenarios. */ -import { LGraph, Subgraph } from '@/lib/litegraph/src/litegraph' -import { SubgraphNode } from '@/lib/litegraph/src/subgraph/SubgraphNode' +import type { Subgraph } from '@/lib/litegraph/src/litegraph' +import { LGraph } from '@/lib/litegraph/src/litegraph' +import type { SubgraphNode } from '@/lib/litegraph/src/subgraph/SubgraphNode' import { test } from '../../core/fixtures/testExtensions' import { diff --git a/tests-ui/tests/nodeSearchService.test.ts b/tests-ui/tests/nodeSearchService.test.ts index 7f6c1f377..75e409501 100644 --- a/tests-ui/tests/nodeSearchService.test.ts +++ b/tests-ui/tests/nodeSearchService.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { ComfyNodeDef } from '@/schemas/nodeDefSchema' +import type { ComfyNodeDef } from '@/schemas/nodeDefSchema' import { NodeSearchService } from '@/services/nodeSearchService' import { ComfyNodeDefImpl } from '@/stores/nodeDefStore' diff --git a/tests-ui/tests/renderer/extensions/vueNodes/composables/useNodeEventHandlers.test.ts b/tests-ui/tests/renderer/extensions/vueNodes/composables/useNodeEventHandlers.test.ts index 57da3b080..038d27cb0 100644 --- a/tests-ui/tests/renderer/extensions/vueNodes/composables/useNodeEventHandlers.test.ts +++ b/tests-ui/tests/renderer/extensions/vueNodes/composables/useNodeEventHandlers.test.ts @@ -2,7 +2,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { ref } from 'vue' import type { VueNodeData } from '@/composables/graph/useGraphNodeManager' -import { useGraphNodeManager } from '@/composables/graph/useGraphNodeManager' +import type { useGraphNodeManager } from '@/composables/graph/useGraphNodeManager' import type { LGraphCanvas, LGraphNode } from '@/lib/litegraph/src/litegraph' import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' import { useLayoutMutations } from '@/renderer/core/layout/operations/layoutMutations' diff --git a/tests-ui/tests/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.test.ts b/tests-ui/tests/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.test.ts index 9ec2cfdaf..e5c957085 100644 --- a/tests-ui/tests/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.test.ts +++ b/tests-ui/tests/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.test.ts @@ -2,7 +2,7 @@ import axios from 'axios' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { useRemoteWidget } from '@/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget' -import { RemoteWidgetConfig } from '@/schemas/nodeDefSchema' +import type { RemoteWidgetConfig } from '@/schemas/nodeDefSchema' vi.mock('axios', () => { return { diff --git a/tests-ui/tests/renderer/thumbnail/composables/useWorkflowThumbnail.spec.ts b/tests-ui/tests/renderer/thumbnail/composables/useWorkflowThumbnail.spec.ts index e2f0d465f..338ce0fcc 100644 --- a/tests-ui/tests/renderer/thumbnail/composables/useWorkflowThumbnail.spec.ts +++ b/tests-ui/tests/renderer/thumbnail/composables/useWorkflowThumbnail.spec.ts @@ -1,10 +1,8 @@ import { createPinia, setActivePinia } from 'pinia' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { - ComfyWorkflow, - useWorkflowStore -} from '@/platform/workflow/management/stores/workflowStore' +import type { ComfyWorkflow } from '@/platform/workflow/management/stores/workflowStore' +import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' vi.mock('@/renderer/core/thumbnail/graphThumbnailRenderer', () => ({ createGraphThumbnail: vi.fn() diff --git a/tests-ui/tests/store/comfyManagerStore.test.ts b/tests-ui/tests/store/comfyManagerStore.test.ts index a1d748111..e0f2fd2cf 100644 --- a/tests-ui/tests/store/comfyManagerStore.test.ts +++ b/tests-ui/tests/store/comfyManagerStore.test.ts @@ -4,7 +4,7 @@ import { nextTick, ref } from 'vue' import { useComfyManagerService } from '@/services/comfyManagerService' import { useComfyManagerStore } from '@/stores/comfyManagerStore' -import { components as ManagerComponents } from '@/types/generatedManagerTypes' +import type { components as ManagerComponents } from '@/types/generatedManagerTypes' type InstalledPacksResponse = ManagerComponents['schemas']['InstalledPacksResponse'] diff --git a/tests-ui/tests/store/imagePreviewStore.test.ts b/tests-ui/tests/store/imagePreviewStore.test.ts index d0df957dc..d2bb8d639 100644 --- a/tests-ui/tests/store/imagePreviewStore.test.ts +++ b/tests-ui/tests/store/imagePreviewStore.test.ts @@ -1,8 +1,8 @@ import { createPinia, setActivePinia } from 'pinia' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { LGraphNode } from '@/lib/litegraph/src/litegraph' -import { ExecutedWsMessage } from '@/schemas/apiSchema' +import type { LGraphNode } from '@/lib/litegraph/src/litegraph' +import type { ExecutedWsMessage } from '@/schemas/apiSchema' import { app } from '@/scripts/app' import { useNodeOutputStore } from '@/stores/imagePreviewStore' import * as litegraphUtil from '@/utils/litegraphUtil' diff --git a/tests-ui/tests/store/serverConfigStore.test.ts b/tests-ui/tests/store/serverConfigStore.test.ts index 1caa5b5a2..dd25c5b64 100644 --- a/tests-ui/tests/store/serverConfigStore.test.ts +++ b/tests-ui/tests/store/serverConfigStore.test.ts @@ -1,7 +1,7 @@ import { createPinia, setActivePinia } from 'pinia' import { beforeEach, describe, expect, it } from 'vitest' -import { ServerConfig } from '@/constants/serverConfig' +import type { ServerConfig } from '@/constants/serverConfig' import type { FormItem } from '@/platform/settings/types' import { useServerConfigStore } from '@/stores/serverConfigStore' diff --git a/tests-ui/tests/store/workflowStore.test.ts b/tests-ui/tests/store/workflowStore.test.ts index 90a86645e..105e43541 100644 --- a/tests-ui/tests/store/workflowStore.test.ts +++ b/tests-ui/tests/store/workflowStore.test.ts @@ -3,9 +3,11 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { nextTick } from 'vue' import type { Subgraph } from '@/lib/litegraph/src/litegraph' -import { +import type { ComfyWorkflow, - LoadedComfyWorkflow, + LoadedComfyWorkflow +} from '@/platform/workflow/management/stores/workflowStore' +import { useWorkflowBookmarkStore, useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' diff --git a/tests-ui/tests/utils/litegraphUtil.test.ts b/tests-ui/tests/utils/litegraphUtil.test.ts index b4301941f..36a6692ee 100644 --- a/tests-ui/tests/utils/litegraphUtil.test.ts +++ b/tests-ui/tests/utils/litegraphUtil.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { ISerialisedGraph } from '@/lib/litegraph/src/types/serialisation' +import type { ISerialisedGraph } from '@/lib/litegraph/src/types/serialisation' import type { IWidget } from '@/lib/litegraph/src/types/widgets' import type { InputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' import { diff --git a/tests-ui/tests/utils/treeUtilTest.test.ts b/tests-ui/tests/utils/treeUtilTest.test.ts index 9c367a30d..ebd1ffbd5 100644 --- a/tests-ui/tests/utils/treeUtilTest.test.ts +++ b/tests-ui/tests/utils/treeUtilTest.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { TreeNode } from '@/types/treeExplorerTypes' +import type { TreeNode } from '@/types/treeExplorerTypes' import { buildTree, sortedTree } from '@/utils/treeUtil' describe('buildTree', () => { diff --git a/tests-ui/tsconfig.json b/tests-ui/tsconfig.json new file mode 100644 index 000000000..f600c4a7f --- /dev/null +++ b/tests-ui/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + /* Test files should not be compiled */ + "noEmit": true, + // "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "resolveJsonModule": true + }, + "include": [ + "**/*.ts", + ] +} From a41b8a6d4f62f31ec70ad201b685671942117049 Mon Sep 17 00:00:00 2001 From: Jin Yi Date: Fri, 19 Sep 2025 03:45:07 +0900 Subject: [PATCH 12/21] refactor: Change manager flag from --disable-manager to --enable-manager (#5635) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Updated frontend to align with backend changes in ComfyUI core PR #7555 - Changed manager startup argument from `--disable-manager` (opt-out) to `--enable-manager` (opt-in) - Manager is now disabled by default unless explicitly enabled ## Changes - Modified `useManagerState.ts` to check for `--enable-manager` flag presence - Inverted logic: manager is disabled when the flag is NOT present - Updated all related tests to reflect the new opt-in behavior - Fixed edge case where `systemStats` is null ## Related - Backend PR: https://github.com/comfyanonymous/ComfyUI/pull/7555 ## Test Plan - [x] All unit tests pass - [x] Verified manager state logic with different flag combinations - [x] TypeScript type checking passes - [x] Linting passes 🤖 Generated with [Claude Code](https://claude.ai/code) ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5635-refactor-Change-manager-flag-from-disable-manager-to-enable-manager-2726d73d36508153a88bd9f152132b2a) by [Unito](https://www.unito.io) --- src/composables/useManagerState.ts | 7 ++- .../tests/composables/useManagerState.test.ts | 63 ++++++++++++++----- 2 files changed, 54 insertions(+), 16 deletions(-) diff --git a/src/composables/useManagerState.ts b/src/composables/useManagerState.ts index 10a7f4819..56d7e7233 100644 --- a/src/composables/useManagerState.ts +++ b/src/composables/useManagerState.ts @@ -42,7 +42,12 @@ export function useManagerState() { ) // Check command line args first (highest priority) - if (systemStats.value?.system?.argv?.includes('--disable-manager')) { + // --enable-manager flag enables the manager (opposite of old --disable-manager) + const hasEnableManager = + systemStats.value?.system?.argv?.includes('--enable-manager') + + // If --enable-manager is NOT present, manager is disabled + if (!hasEnableManager) { return ManagerUIState.DISABLED } diff --git a/tests-ui/tests/composables/useManagerState.test.ts b/tests-ui/tests/composables/useManagerState.test.ts index dafb48a6f..a870a408b 100644 --- a/tests-ui/tests/composables/useManagerState.test.ts +++ b/tests-ui/tests/composables/useManagerState.test.ts @@ -56,10 +56,10 @@ describe('useManagerState', () => { }) describe('managerUIState property', () => { - it('should return DISABLED state when --disable-manager is present', () => { + it('should return DISABLED state when --enable-manager is NOT present', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ systemStats: ref({ - system: { argv: ['python', 'main.py', '--disable-manager'] } + system: { argv: ['python', 'main.py'] } // No --enable-manager flag }), isInitialized: ref(true) } as any) @@ -76,7 +76,14 @@ describe('useManagerState', () => { it('should return LEGACY_UI state when --enable-manager-legacy-ui is present', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ systemStats: ref({ - system: { argv: ['python', 'main.py', '--enable-manager-legacy-ui'] } + system: { + argv: [ + 'python', + 'main.py', + '--enable-manager', + '--enable-manager-legacy-ui' + ] + } // Both flags needed }), isInitialized: ref(true) } as any) @@ -92,7 +99,9 @@ describe('useManagerState', () => { it('should return NEW_UI state when client and server both support v4', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ - systemStats: ref({ system: { argv: ['python', 'main.py'] } }), + systemStats: ref({ + system: { argv: ['python', 'main.py', '--enable-manager'] } + }), // Need --enable-manager isInitialized: ref(true) } as any) vi.mocked(api.getClientFeatureFlags).mockReturnValue({ @@ -114,7 +123,9 @@ describe('useManagerState', () => { it('should return LEGACY_UI state when server supports v4 but client does not', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ - systemStats: ref({ system: { argv: ['python', 'main.py'] } }), + systemStats: ref({ + system: { argv: ['python', 'main.py', '--enable-manager'] } + }), // Need --enable-manager isInitialized: ref(true) } as any) vi.mocked(api.getClientFeatureFlags).mockReturnValue({ @@ -136,7 +147,9 @@ describe('useManagerState', () => { it('should return LEGACY_UI state when legacy manager extension exists', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ - systemStats: ref({ system: { argv: ['python', 'main.py'] } }), + systemStats: ref({ + system: { argv: ['python', 'main.py', '--enable-manager'] } + }), // Need --enable-manager isInitialized: ref(true) } as any) vi.mocked(api.getClientFeatureFlags).mockReturnValue({}) @@ -155,7 +168,9 @@ describe('useManagerState', () => { it('should return NEW_UI state when server feature flags are undefined', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ - systemStats: ref({ system: { argv: ['python', 'main.py'] } }), + systemStats: ref({ + system: { argv: ['python', 'main.py', '--enable-manager'] } + }), // Need --enable-manager isInitialized: ref(true) } as any) vi.mocked(api.getClientFeatureFlags).mockReturnValue({}) @@ -175,7 +190,9 @@ describe('useManagerState', () => { it('should return LEGACY_UI state when server does not support v4', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ - systemStats: ref({ system: { argv: ['python', 'main.py'] } }), + systemStats: ref({ + system: { argv: ['python', 'main.py', '--enable-manager'] } + }), // Need --enable-manager isInitialized: ref(true) } as any) vi.mocked(api.getClientFeatureFlags).mockReturnValue({}) @@ -212,14 +229,17 @@ describe('useManagerState', () => { const managerState = useManagerState() - expect(managerState.managerUIState.value).toBe(ManagerUIState.NEW_UI) + // When systemStats is null, we can't check for --enable-manager flag, so manager is disabled + expect(managerState.managerUIState.value).toBe(ManagerUIState.DISABLED) }) }) describe('helper properties', () => { it('isManagerEnabled should return true when state is not DISABLED', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ - systemStats: ref({ system: { argv: ['python', 'main.py'] } }), + systemStats: ref({ + system: { argv: ['python', 'main.py', '--enable-manager'] } + }), // Need --enable-manager isInitialized: ref(true) } as any) vi.mocked(api.getClientFeatureFlags).mockReturnValue({ @@ -237,7 +257,7 @@ describe('useManagerState', () => { it('isManagerEnabled should return false when state is DISABLED', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ systemStats: ref({ - system: { argv: ['python', 'main.py', '--disable-manager'] } + system: { argv: ['python', 'main.py'] } // No --enable-manager flag means disabled }), isInitialized: ref(true) } as any) @@ -252,7 +272,9 @@ describe('useManagerState', () => { it('isNewManagerUI should return true when state is NEW_UI', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ - systemStats: ref({ system: { argv: ['python', 'main.py'] } }), + systemStats: ref({ + system: { argv: ['python', 'main.py', '--enable-manager'] } + }), // Need --enable-manager isInitialized: ref(true) } as any) vi.mocked(api.getClientFeatureFlags).mockReturnValue({ @@ -270,7 +292,14 @@ describe('useManagerState', () => { it('isLegacyManagerUI should return true when state is LEGACY_UI', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ systemStats: ref({ - system: { argv: ['python', 'main.py', '--enable-manager-legacy-ui'] } + system: { + argv: [ + 'python', + 'main.py', + '--enable-manager', + '--enable-manager-legacy-ui' + ] + } // Both flags needed }), isInitialized: ref(true) } as any) @@ -285,7 +314,9 @@ describe('useManagerState', () => { it('shouldShowInstallButton should return true only for NEW_UI', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ - systemStats: ref({ system: { argv: ['python', 'main.py'] } }), + systemStats: ref({ + system: { argv: ['python', 'main.py', '--enable-manager'] } + }), // Need --enable-manager isInitialized: ref(true) } as any) vi.mocked(api.getClientFeatureFlags).mockReturnValue({ @@ -302,7 +333,9 @@ describe('useManagerState', () => { it('shouldShowManagerButtons should return true when not DISABLED', () => { vi.mocked(useSystemStatsStore).mockReturnValue({ - systemStats: ref({ system: { argv: ['python', 'main.py'] } }), + systemStats: ref({ + system: { argv: ['python', 'main.py', '--enable-manager'] } + }), // Need --enable-manager isInitialized: ref(true) } as any) vi.mocked(api.getClientFeatureFlags).mockReturnValue({ From 37975e4eacd4d57c9420e6325422bbe187874efa Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Thu, 18 Sep 2025 13:44:21 -0700 Subject: [PATCH 13/21] [test] Add component test for image compare widget (#5549) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Added comprehensive component test suite for WidgetImageCompare widget with 410 test assertions covering display, edge cases, and integration scenarios. ## Changes - **What**: Created [Vue Test Utils](https://vue-test-utils.vuejs.org/) test suite for [WidgetImageCompare component](src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.vue) using [Vitest](https://vitest.dev/) testing framework ## Review Focus Test coverage completeness for string vs object value handling, accessibility attribute propagation, and edge case robustness including malformed URLs and empty states. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5549-test-Add-component-test-for-image-compare-widget-26e6d73d365081189fe0d010f87d1eec) by [Unito](https://www.unito.io) --------- Co-authored-by: DrJKL --- .../components/WidgetImageCompare.test.ts | 337 ++++++++++++++++++ .../widgets/components/WidgetImageCompare.vue | 2 +- 2 files changed, 338 insertions(+), 1 deletion(-) create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.test.ts diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.test.ts b/src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.test.ts new file mode 100644 index 000000000..798d5ee39 --- /dev/null +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.test.ts @@ -0,0 +1,337 @@ +import { mount } from '@vue/test-utils' +import PrimeVue from 'primevue/config' +import ImageCompare from 'primevue/imagecompare' +import { describe, expect, it } from 'vitest' + +import type { SimplifiedWidget } from '@/types/simplifiedWidget' + +import WidgetImageCompare, { + type ImageCompareValue +} from './WidgetImageCompare.vue' + +describe('WidgetImageCompare Display', () => { + const createMockWidget = ( + value: ImageCompareValue | string, + options: SimplifiedWidget['options'] = {} + ): SimplifiedWidget => ({ + name: 'test_imagecompare', + type: 'object', + value, + options + }) + + const mountComponent = ( + widget: SimplifiedWidget, + readonly = false + ) => { + return mount(WidgetImageCompare, { + global: { + plugins: [PrimeVue], + components: { ImageCompare } + }, + props: { + widget, + readonly + } + }) + } + + describe('Component Rendering', () => { + it('renders imagecompare component with proper structure and styling', () => { + const value: ImageCompareValue = { + before: 'https://example.com/before.jpg', + after: 'https://example.com/after.jpg' + } + const widget = createMockWidget(value) + const wrapper = mountComponent(widget) + + // Component exists + const imageCompare = wrapper.findComponent({ name: 'ImageCompare' }) + expect(imageCompare.exists()).toBe(true) + + // Renders both images with correct URLs + const images = wrapper.findAll('img') + expect(images).toHaveLength(2) + expect(images[0].attributes('src')).toBe('https://example.com/before.jpg') + expect(images[1].attributes('src')).toBe('https://example.com/after.jpg') + + // Images have proper styling classes + images.forEach((img) => { + expect(img.classes()).toContain('object-cover') + expect(img.classes()).toContain('w-full') + expect(img.classes()).toContain('h-full') + }) + }) + }) + + describe('Object Value Input', () => { + it('handles alt text correctly - custom, default, and empty', () => { + // Test custom alt text + const customAltValue: ImageCompareValue = { + before: 'https://example.com/before.jpg', + after: 'https://example.com/after.jpg', + beforeAlt: 'Original design', + afterAlt: 'Updated design' + } + const customWrapper = mountComponent(createMockWidget(customAltValue)) + const customImages = customWrapper.findAll('img') + expect(customImages[0].attributes('alt')).toBe('Original design') + expect(customImages[1].attributes('alt')).toBe('Updated design') + + // Test default alt text + const defaultAltValue: ImageCompareValue = { + before: 'https://example.com/before.jpg', + after: 'https://example.com/after.jpg' + } + const defaultWrapper = mountComponent(createMockWidget(defaultAltValue)) + const defaultImages = defaultWrapper.findAll('img') + expect(defaultImages[0].attributes('alt')).toBe('Before image') + expect(defaultImages[1].attributes('alt')).toBe('After image') + + // Test empty string alt text (falls back to default) + const emptyAltValue: ImageCompareValue = { + before: 'https://example.com/before.jpg', + after: 'https://example.com/after.jpg', + beforeAlt: '', + afterAlt: '' + } + const emptyWrapper = mountComponent(createMockWidget(emptyAltValue)) + const emptyImages = emptyWrapper.findAll('img') + expect(emptyImages[0].attributes('alt')).toBe('Before image') + expect(emptyImages[1].attributes('alt')).toBe('After image') + }) + + it('handles missing and partial image URLs gracefully', () => { + // Missing URLs + const missingValue: ImageCompareValue = { before: '', after: '' } + const missingWrapper = mountComponent(createMockWidget(missingValue)) + const missingImages = missingWrapper.findAll('img') + expect(missingImages[0].attributes('src')).toBe('') + expect(missingImages[1].attributes('src')).toBe('') + + // Partial URLs + const partialValue: ImageCompareValue = { + before: 'https://example.com/before.jpg', + after: '' + } + const partialWrapper = mountComponent(createMockWidget(partialValue)) + const partialImages = partialWrapper.findAll('img') + expect(partialImages[0].attributes('src')).toBe( + 'https://example.com/before.jpg' + ) + expect(partialImages[1].attributes('src')).toBe('') + }) + }) + + describe('String Value Input', () => { + it('handles string value as before image only', () => { + const value = 'https://example.com/single.jpg' + const widget = createMockWidget(value) + const wrapper = mountComponent(widget) + + const images = wrapper.findAll('img') + expect(images[0].attributes('src')).toBe('https://example.com/single.jpg') + expect(images[1].attributes('src')).toBe('') + }) + + it('uses default alt text for string values', () => { + const value = 'https://example.com/single.jpg' + const widget = createMockWidget(value) + const wrapper = mountComponent(widget) + + const images = wrapper.findAll('img') + expect(images[0].attributes('alt')).toBe('Before image') + expect(images[1].attributes('alt')).toBe('After image') + }) + }) + + describe('Widget Options Handling', () => { + it('passes through accessibility options', () => { + const value: ImageCompareValue = { + before: 'https://example.com/before.jpg', + after: 'https://example.com/after.jpg' + } + const widget = createMockWidget(value, { + tabindex: 1, + ariaLabel: 'Compare images', + ariaLabelledby: 'compare-label' + }) + const wrapper = mountComponent(widget) + + const imageCompare = wrapper.findComponent({ name: 'ImageCompare' }) + expect(imageCompare.props('tabindex')).toBe(1) + expect(imageCompare.props('ariaLabel')).toBe('Compare images') + expect(imageCompare.props('ariaLabelledby')).toBe('compare-label') + }) + + it('uses default tabindex when not provided', () => { + const value: ImageCompareValue = { + before: 'https://example.com/before.jpg', + after: 'https://example.com/after.jpg' + } + const widget = createMockWidget(value) + const wrapper = mountComponent(widget) + + const imageCompare = wrapper.findComponent({ name: 'ImageCompare' }) + expect(imageCompare.props('tabindex')).toBe(0) + }) + + it('passes through PrimeVue specific options', () => { + const value: ImageCompareValue = { + before: 'https://example.com/before.jpg', + after: 'https://example.com/after.jpg' + } + const widget = createMockWidget(value, { + unstyled: true, + pt: { root: { class: 'custom-class' } }, + ptOptions: { mergeSections: true } + }) + const wrapper = mountComponent(widget) + + const imageCompare = wrapper.findComponent({ name: 'ImageCompare' }) + expect(imageCompare.props('unstyled')).toBe(true) + expect(imageCompare.props('pt')).toEqual({ + root: { class: 'custom-class' } + }) + expect(imageCompare.props('ptOptions')).toEqual({ mergeSections: true }) + }) + }) + + describe('Readonly Mode', () => { + it('renders normally in readonly mode (no interaction restrictions)', () => { + const value: ImageCompareValue = { + before: 'https://example.com/before.jpg', + after: 'https://example.com/after.jpg' + } + const widget = createMockWidget(value) + const wrapper = mountComponent(widget, true) + + // ImageCompare is display-only, readonly doesn't affect rendering + const imageCompare = wrapper.findComponent({ name: 'ImageCompare' }) + expect(imageCompare.exists()).toBe(true) + + const images = wrapper.findAll('img') + expect(images).toHaveLength(2) + }) + }) + + describe('Edge Cases', () => { + it('handles null or undefined widget value', () => { + const widget = createMockWidget('') + const wrapper = mountComponent(widget) + + const images = wrapper.findAll('img') + expect(images[0].attributes('src')).toBe('') + expect(images[1].attributes('src')).toBe('') + expect(images[0].attributes('alt')).toBe('Before image') + expect(images[1].attributes('alt')).toBe('After image') + }) + + it('handles empty object value', () => { + const value: ImageCompareValue = {} as ImageCompareValue + const widget = createMockWidget(value) + const wrapper = mountComponent(widget) + + const images = wrapper.findAll('img') + expect(images[0].attributes('src')).toBe('') + expect(images[1].attributes('src')).toBe('') + }) + + it('handles malformed object value', () => { + const value = { randomProp: 'test', before: '', after: '' } + const widget = createMockWidget(value) + const wrapper = mountComponent(widget) + + const images = wrapper.findAll('img') + expect(images[0].attributes('src')).toBe('') + expect(images[1].attributes('src')).toBe('') + }) + + it('handles special content - long URLs, special characters, and long alt text', () => { + // Test very long URLs + const longUrl = 'https://example.com/' + 'a'.repeat(1000) + '.jpg' + const longUrlValue: ImageCompareValue = { + before: longUrl, + after: longUrl + } + const longUrlWrapper = mountComponent(createMockWidget(longUrlValue)) + const longUrlImages = longUrlWrapper.findAll('img') + expect(longUrlImages[0].attributes('src')).toBe(longUrl) + expect(longUrlImages[1].attributes('src')).toBe(longUrl) + + // Test special characters in URLs + const specialUrl = + 'https://example.com/path with spaces & symbols!@#$.jpg' + const specialUrlValue: ImageCompareValue = { + before: specialUrl, + after: specialUrl + } + const specialUrlWrapper = mountComponent( + createMockWidget(specialUrlValue) + ) + const specialUrlImages = specialUrlWrapper.findAll('img') + expect(specialUrlImages[0].attributes('src')).toBe(specialUrl) + expect(specialUrlImages[1].attributes('src')).toBe(specialUrl) + + // Test very long alt text + const longAlt = + 'Very long alt text that exceeds normal length: ' + + 'description '.repeat(50) + const longAltValue: ImageCompareValue = { + before: 'https://example.com/before.jpg', + after: 'https://example.com/after.jpg', + beforeAlt: longAlt, + afterAlt: longAlt + } + const longAltWrapper = mountComponent(createMockWidget(longAltValue)) + const longAltImages = longAltWrapper.findAll('img') + expect(longAltImages[0].attributes('alt')).toBe(longAlt) + expect(longAltImages[1].attributes('alt')).toBe(longAlt) + }) + }) + + describe('Template Structure', () => { + it('correctly assigns images to left and right template slots', () => { + const value: ImageCompareValue = { + before: 'https://example.com/before.jpg', + after: 'https://example.com/after.jpg' + } + const widget = createMockWidget(value) + const wrapper = mountComponent(widget) + + const images = wrapper.findAll('img') + // First image (before) should be in left template slot + expect(images[0].attributes('src')).toBe('https://example.com/before.jpg') + // Second image (after) should be in right template slot + expect(images[1].attributes('src')).toBe('https://example.com/after.jpg') + }) + }) + + describe('Integration', () => { + it('works with various URL types - data URLs and blob URLs', () => { + // Test data URLs + const dataUrl = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==' + const dataUrlValue: ImageCompareValue = { + before: dataUrl, + after: dataUrl + } + const dataUrlWrapper = mountComponent(createMockWidget(dataUrlValue)) + const dataUrlImages = dataUrlWrapper.findAll('img') + expect(dataUrlImages[0].attributes('src')).toBe(dataUrl) + expect(dataUrlImages[1].attributes('src')).toBe(dataUrl) + + // Test blob URLs + const blobUrl = + 'blob:http://example.com/12345678-1234-1234-1234-123456789012' + const blobUrlValue: ImageCompareValue = { + before: blobUrl, + after: blobUrl + } + const blobUrlWrapper = mountComponent(createMockWidget(blobUrlValue)) + const blobUrlImages = blobUrlWrapper.findAll('img') + expect(blobUrlImages[0].attributes('src')).toBe(blobUrl) + expect(blobUrlImages[1].attributes('src')).toBe(blobUrl) + }) + }) +}) diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.vue index e51413a30..1cf455c78 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.vue +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.vue @@ -30,7 +30,7 @@ import { computed } from 'vue' import type { SimplifiedWidget } from '@/types/simplifiedWidget' -interface ImageCompareValue { +export interface ImageCompareValue { before: string after: string beforeAlt?: string From a886798a10b51023f7ea6714895ad27776751ae4 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Thu, 18 Sep 2025 14:09:16 -0700 Subject: [PATCH 14/21] Explicitly add email scope for social auth login. (#5638) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Some users were authenticating successfully but their email addresses weren't being extracted from the Firebase token. This happened because we weren't explicitly requesting the email scope during OAuth authentication. While Firebase's default configuration includes basic profile info, it doesn't guarantee email access for all account types - particularly Google Workspace accounts with restrictive policies or users with privacy-conscious settings. [Github Scopes](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps) ## Changes Adding email scope for Google + Github social OAuth. ## Review Focus N/A ## Screenshots (if applicable) ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5638-Explicitly-add-email-scope-for-social-auth-login-2726d73d3650817ab356fc9c04f8641b) by [Unito](https://www.unito.io) --------- Co-authored-by: Alexander Brown --- src/stores/firebaseAuthStore.ts | 2 ++ tests-ui/tests/store/firebaseAuthStore.test.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/stores/firebaseAuthStore.ts b/src/stores/firebaseAuthStore.ts index f2c75417c..6e4974839 100644 --- a/src/stores/firebaseAuthStore.ts +++ b/src/stores/firebaseAuthStore.ts @@ -60,10 +60,12 @@ export const useFirebaseAuthStore = defineStore('firebaseAuth', () => { // Providers const googleProvider = new GoogleAuthProvider() + googleProvider.addScope('email') googleProvider.setCustomParameters({ prompt: 'select_account' }) const githubProvider = new GithubAuthProvider() + githubProvider.addScope('user:email') githubProvider.setCustomParameters({ prompt: 'select_account' }) diff --git a/tests-ui/tests/store/firebaseAuthStore.test.ts b/tests-ui/tests/store/firebaseAuthStore.test.ts index fee66d3f7..ef8ffe0bd 100644 --- a/tests-ui/tests/store/firebaseAuthStore.test.ts +++ b/tests-ui/tests/store/firebaseAuthStore.test.ts @@ -58,9 +58,11 @@ vi.mock('firebase/auth', async (importOriginal) => { onAuthStateChanged: vi.fn(), signInWithPopup: vi.fn(), GoogleAuthProvider: class { + addScope = vi.fn() setCustomParameters = vi.fn() }, GithubAuthProvider: class { + addScope = vi.fn() setCustomParameters = vi.fn() }, setPersistence: vi.fn().mockResolvedValue(undefined) From 7585444ce667d67637726fcc3255372784554100 Mon Sep 17 00:00:00 2001 From: Comfy Org PR Bot Date: Fri, 19 Sep 2025 05:13:33 +0800 Subject: [PATCH 15/21] 1.28.0 (#5640) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Minor version increment to 1.28.0 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5640-1-28-0-2726d73d3650818e846fcf78cbf33b73) by [Unito](https://www.unito.io) Co-authored-by: benceruleanlu <162923238+benceruleanlu@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9acc66aa6..770ef7e04 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@comfyorg/comfyui-frontend", "private": true, - "version": "1.27.5", + "version": "1.28.0", "type": "module", "repository": "https://github.com/Comfy-Org/ComfyUI_frontend", "homepage": "https://comfy.org", From bc85d4e87b5bac70bf68ed5f3e7d83f2a8e7250d Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Thu, 18 Sep 2025 15:43:35 -0700 Subject: [PATCH 16/21] Make Vue nodes read-only when in panning mode (#5574) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Integrated Vue node components with canvas panning mode to prevent UI interference during navigation. ## Changes - **What**: Added [canCapturePointerEvents](https://docs.comfy.org/guide/vue-nodes) computed property to `useCanvasInteractions` composable that checks canvas read-only state - **What**: Modified Vue node components (LGraphNode, NodeWidgets) to conditionally handle pointer events based on canvas navigation mode - **What**: Updated node event handlers to respect panning mode and forward events to canvas when appropriate ## Review Focus Event forwarding logic in panning mode and pointer event capture state management across Vue node hierarchy. ```mermaid graph TD A[User Interaction] --> B{Canvas in Panning Mode?} B -->|Yes| C[Forward to Canvas] B -->|No| D[Handle in Vue Component] C --> E[Canvas Navigation] D --> F[Node Selection/Widget Interaction] G[canCapturePointerEvents] --> H{read_only === false} H -->|Yes| I[Allow Vue Events] H -->|No| J[Block Vue Events] style A fill:#f9f9f9,stroke:#333,color:#000 style E fill:#f9f9f9,stroke:#333,color:#000 style F fill:#f9f9f9,stroke:#333,color:#000 style I fill:#e1f5fe,stroke:#01579b,color:#000 style J fill:#ffebee,stroke:#c62828,color:#000 ``` ## Screenshots https://github.com/user-attachments/assets/00dc5e4a-2b56-43be-b92e-eaf511e52542 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5574-Make-Vue-nodes-read-only-when-in-panning-mode-26f6d73d3650818c951cd82c8fe58972) by [Unito](https://www.unito.io) --------- Co-authored-by: GitHub Action --- src/components/graph/GraphCanvas.vue | 2 +- src/components/graph/GraphCanvasMenu.vue | 2 +- src/components/graph/SelectionToolbox.spec.ts | 4 +- src/components/graph/SelectionToolbox.vue | 2 +- src/composables/node/useNodeImage.ts | 2 +- .../core/canvas}/useCanvasInteractions.ts | 14 ++++++- .../vueNodes/components/LGraphNode.vue | 40 ++++++++++++++++++- .../vueNodes/components/NodeWidgets.vue | 25 +++++++++++- .../composables/useNodeEventHandlers.ts | 18 +++++++++ .../canvas}/useCanvasInteractions.test.ts | 2 +- .../composables/useNodeEventHandlers.test.ts | 25 +++++++++++- 11 files changed, 123 insertions(+), 13 deletions(-) rename src/{composables/graph => renderer/core/canvas}/useCanvasInteractions.ts (87%) rename tests-ui/tests/{composables/graph => renderer/core/canvas}/useCanvasInteractions.test.ts (98%) diff --git a/src/components/graph/GraphCanvas.vue b/src/components/graph/GraphCanvas.vue index 49f325c0c..91c91d704 100644 --- a/src/components/graph/GraphCanvas.vue +++ b/src/components/graph/GraphCanvas.vue @@ -96,7 +96,6 @@ import NodeSearchboxPopover from '@/components/searchbox/NodeSearchBoxPopover.vu import SideToolbar from '@/components/sidebar/SideToolbar.vue' import SecondRowWorkflowTabs from '@/components/topbar/SecondRowWorkflowTabs.vue' import { useChainCallback } from '@/composables/functional/useChainCallback' -import { useCanvasInteractions } from '@/composables/graph/useCanvasInteractions' import { useViewportCulling } from '@/composables/graph/useViewportCulling' import { useVueNodeLifecycle } from '@/composables/graph/useVueNodeLifecycle' import { useNodeBadge } from '@/composables/node/useNodeBadge' @@ -118,6 +117,7 @@ import { useWorkflowAutoSave } from '@/platform/workflow/persistence/composables import { useWorkflowPersistence } from '@/platform/workflow/persistence/composables/useWorkflowPersistence' import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' import { SelectedNodeIdsKey } from '@/renderer/core/canvas/injectionKeys' +import { useCanvasInteractions } from '@/renderer/core/canvas/useCanvasInteractions' import TransformPane from '@/renderer/core/layout/transform/TransformPane.vue' import MiniMap from '@/renderer/extensions/minimap/MiniMap.vue' import VueGraphNode from '@/renderer/extensions/vueNodes/components/LGraphNode.vue' diff --git a/src/components/graph/GraphCanvasMenu.vue b/src/components/graph/GraphCanvasMenu.vue index d4ec414d6..c4050d30c 100644 --- a/src/components/graph/GraphCanvasMenu.vue +++ b/src/components/graph/GraphCanvasMenu.vue @@ -124,11 +124,11 @@ import ButtonGroup from 'primevue/buttongroup' import { computed, onBeforeUnmount, onMounted } from 'vue' import { useI18n } from 'vue-i18n' -import { useCanvasInteractions } from '@/composables/graph/useCanvasInteractions' import { useZoomControls } from '@/composables/useZoomControls' import { LiteGraph } from '@/lib/litegraph/src/litegraph' import { useSettingStore } from '@/platform/settings/settingStore' import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' +import { useCanvasInteractions } from '@/renderer/core/canvas/useCanvasInteractions' import { useMinimap } from '@/renderer/extensions/minimap/composables/useMinimap' import { useCommandStore } from '@/stores/commandStore' import { useWorkspaceStore } from '@/stores/workspaceStore' diff --git a/src/components/graph/SelectionToolbox.spec.ts b/src/components/graph/SelectionToolbox.spec.ts index 7b78190e5..85acaf6cf 100644 --- a/src/components/graph/SelectionToolbox.spec.ts +++ b/src/components/graph/SelectionToolbox.spec.ts @@ -5,12 +5,12 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { createI18n } from 'vue-i18n' import SelectionToolbox from '@/components/graph/SelectionToolbox.vue' -import { useCanvasInteractions } from '@/composables/graph/useCanvasInteractions' import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' +import { useCanvasInteractions } from '@/renderer/core/canvas/useCanvasInteractions' import { useExtensionService } from '@/services/extensionService' // Mock the composables and services -vi.mock('@/composables/graph/useCanvasInteractions', () => ({ +vi.mock('@/renderer/core/canvas/useCanvasInteractions', () => ({ useCanvasInteractions: vi.fn(() => ({ handleWheel: vi.fn() })) diff --git a/src/components/graph/SelectionToolbox.vue b/src/components/graph/SelectionToolbox.vue index d87083d3d..067b04346 100644 --- a/src/components/graph/SelectionToolbox.vue +++ b/src/components/graph/SelectionToolbox.vue @@ -60,9 +60,9 @@ import MaskEditorButton from '@/components/graph/selectionToolbox/MaskEditorButt import RefreshSelectionButton from '@/components/graph/selectionToolbox/RefreshSelectionButton.vue' import PublishSubgraphButton from '@/components/graph/selectionToolbox/SaveToSubgraphLibrary.vue' import { useSelectionToolboxPosition } from '@/composables/canvas/useSelectionToolboxPosition' -import { useCanvasInteractions } from '@/composables/graph/useCanvasInteractions' import { useSelectionState } from '@/composables/graph/useSelectionState' import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' +import { useCanvasInteractions } from '@/renderer/core/canvas/useCanvasInteractions' import { useMinimap } from '@/renderer/extensions/minimap/composables/useMinimap' import { useExtensionService } from '@/services/extensionService' import { type ComfyCommandImpl, useCommandStore } from '@/stores/commandStore' diff --git a/src/composables/node/useNodeImage.ts b/src/composables/node/useNodeImage.ts index 83600aec2..ad0a04178 100644 --- a/src/composables/node/useNodeImage.ts +++ b/src/composables/node/useNodeImage.ts @@ -1,5 +1,5 @@ -import { useCanvasInteractions } from '@/composables/graph/useCanvasInteractions' import type { LGraphNode } from '@/lib/litegraph/src/litegraph' +import { useCanvasInteractions } from '@/renderer/core/canvas/useCanvasInteractions' import { useNodeOutputStore } from '@/stores/imagePreviewStore' import { fitDimensionsToNodeWidth } from '@/utils/imageUtil' diff --git a/src/composables/graph/useCanvasInteractions.ts b/src/renderer/core/canvas/useCanvasInteractions.ts similarity index 87% rename from src/composables/graph/useCanvasInteractions.ts rename to src/renderer/core/canvas/useCanvasInteractions.ts index be807b771..cddc50d08 100644 --- a/src/composables/graph/useCanvasInteractions.ts +++ b/src/renderer/core/canvas/useCanvasInteractions.ts @@ -11,12 +11,21 @@ import { app } from '@/scripts/app' */ export function useCanvasInteractions() { const settingStore = useSettingStore() - const { getCanvas } = useCanvasStore() + const canvasStore = useCanvasStore() + const { getCanvas } = canvasStore const isStandardNavMode = computed( () => settingStore.get('Comfy.Canvas.NavigationMode') === 'standard' ) + /** + * Whether Vue node components should handle pointer events. + * Returns false when canvas is in read-only/panning mode (e.g., space key held for panning). + */ + const shouldHandleNodePointerEvents = computed( + () => !(canvasStore.canvas?.read_only ?? false) + ) + /** * Handles wheel events from UI components that should be forwarded to canvas * when appropriate (e.g., Ctrl+wheel for zoom in standard mode) @@ -97,6 +106,7 @@ export function useCanvasInteractions() { return { handleWheel, handlePointer, - forwardEventToCanvas + forwardEventToCanvas, + shouldHandleNodePointerEvents } } diff --git a/src/renderer/extensions/vueNodes/components/LGraphNode.vue b/src/renderer/extensions/vueNodes/components/LGraphNode.vue index 808c21ca1..5d67d0de7 100644 --- a/src/renderer/extensions/vueNodes/components/LGraphNode.vue +++ b/src/renderer/extensions/vueNodes/components/LGraphNode.vue @@ -10,7 +10,9 @@ 'bg-white dark-theme:bg-charcoal-800', 'lg-node absolute rounded-2xl', 'border border-solid border-sand-100 dark-theme:border-charcoal-600', - 'hover:ring-7 ring-gray-500/50 dark-theme:ring-gray-500/20', + // hover (only when node should handle events) + shouldHandleNodePointerEvents && + 'hover:ring-7 ring-gray-500/50 dark-theme:ring-gray-500/20', 'outline-transparent -outline-offset-2 outline-2', borderClass, outlineClass, @@ -21,7 +23,9 @@ 'will-change-transform': isDragging }, lodCssClass, - 'pointer-events-auto' + shouldHandleNodePointerEvents + ? 'pointer-events-auto' + : 'pointer-events-none' ) " :style="[ @@ -34,6 +38,7 @@ @pointerdown="handlePointerDown" @pointermove="handlePointerMove" @pointerup="handlePointerUp" + @wheel="handleWheel" >