diff --git a/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-hidden-links-chromium-linux.png b/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-hidden-links-chromium-linux.png
index c1411d5f9..2b1678631 100644
Binary files a/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-hidden-links-chromium-linux.png and b/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-hidden-links-chromium-linux.png differ
diff --git a/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-visible-links-chromium-linux.png b/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-visible-links-chromium-linux.png
index 46b645fc1..fb46d991f 100644
Binary files a/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-visible-links-chromium-linux.png and b/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-visible-links-chromium-linux.png differ
diff --git a/browser_tests/tests/interaction.spec.ts b/browser_tests/tests/interaction.spec.ts
index 31d6316db..94c2f1632 100644
--- a/browser_tests/tests/interaction.spec.ts
+++ b/browser_tests/tests/interaction.spec.ts
@@ -768,6 +768,11 @@ test.describe('Viewport settings', () => {
comfyMouse
}) => {
// Screenshot the canvas element
+ await comfyPage.setSetting('Comfy.Graph.CanvasMenu', true)
+ const toggleButton = comfyPage.page.getByTestId('toggle-minimap-button')
+
+ await toggleButton.click()
+
await comfyPage.menu.topbar.saveWorkflow('Workflow A')
await comfyPage.nextFrame()
const screenshotA = (await comfyPage.canvas.screenshot()).toString('base64')
diff --git a/browser_tests/tests/minimap.spec.ts b/browser_tests/tests/minimap.spec.ts
new file mode 100644
index 000000000..9275107cb
--- /dev/null
+++ b/browser_tests/tests/minimap.spec.ts
@@ -0,0 +1,77 @@
+import { expect } from '@playwright/test'
+
+import { comfyPageFixture as test } from '../fixtures/ComfyPage'
+
+test.describe('Minimap', () => {
+ test.beforeEach(async ({ comfyPage }) => {
+ await comfyPage.setSetting('Comfy.UseNewMenu', 'Top')
+ await comfyPage.setSetting('Comfy.Minimap.Visible', true)
+ await comfyPage.setSetting('Comfy.Graph.CanvasMenu', true)
+ await comfyPage.loadWorkflow('default')
+ await comfyPage.page.waitForFunction(
+ () => window['app'] && window['app'].canvas
+ )
+ })
+
+ test('Validate minimap is visible by default', async ({ comfyPage }) => {
+ const minimapContainer = comfyPage.page.locator('.litegraph-minimap')
+
+ await expect(minimapContainer).toBeVisible()
+
+ const minimapCanvas = minimapContainer.locator('.minimap-canvas')
+ await expect(minimapCanvas).toBeVisible()
+
+ const minimapViewport = minimapContainer.locator('.minimap-viewport')
+ await expect(minimapViewport).toBeVisible()
+
+ await expect(minimapContainer).toHaveCSS('position', 'absolute')
+ await expect(minimapContainer).toHaveCSS('z-index', '1000')
+ })
+
+ test('Validate minimap toggle button state', async ({ comfyPage }) => {
+ const toggleButton = comfyPage.page.getByTestId('toggle-minimap-button')
+
+ await expect(toggleButton).toBeVisible()
+
+ await expect(toggleButton).toHaveClass(/minimap-active/)
+
+ const minimapContainer = comfyPage.page.locator('.litegraph-minimap')
+ await expect(minimapContainer).toBeVisible()
+ })
+
+ test('Validate minimap can be toggled off and on', async ({ comfyPage }) => {
+ const minimapContainer = comfyPage.page.locator('.litegraph-minimap')
+ const toggleButton = comfyPage.page.getByTestId('toggle-minimap-button')
+
+ await expect(minimapContainer).toBeVisible()
+ await expect(toggleButton).toHaveClass(/minimap-active/)
+
+ await toggleButton.click()
+ await comfyPage.nextFrame()
+
+ await expect(minimapContainer).not.toBeVisible()
+ await expect(toggleButton).not.toHaveClass(/minimap-active/)
+
+ await toggleButton.click()
+ await comfyPage.nextFrame()
+
+ await expect(minimapContainer).toBeVisible()
+ await expect(toggleButton).toHaveClass(/minimap-active/)
+ })
+
+ test('Validate minimap keyboard shortcut Alt+M', async ({ comfyPage }) => {
+ const minimapContainer = comfyPage.page.locator('.litegraph-minimap')
+
+ await expect(minimapContainer).toBeVisible()
+
+ await comfyPage.page.keyboard.press('Alt+KeyM')
+ await comfyPage.nextFrame()
+
+ await expect(minimapContainer).not.toBeVisible()
+
+ await comfyPage.page.keyboard.press('Alt+KeyM')
+ await comfyPage.nextFrame()
+
+ await expect(minimapContainer).toBeVisible()
+ })
+})
diff --git a/src/components/graph/GraphCanvas.vue b/src/components/graph/GraphCanvas.vue
index fbb9500ae..a019f583e 100644
--- a/src/components/graph/GraphCanvas.vue
+++ b/src/components/graph/GraphCanvas.vue
@@ -18,6 +18,12 @@
/>
+
+
@@ -51,6 +57,7 @@ import LiteGraphCanvasSplitterOverlay from '@/components/LiteGraphCanvasSplitter
import BottomPanel from '@/components/bottomPanel/BottomPanel.vue'
import DomWidgets from '@/components/graph/DomWidgets.vue'
import GraphCanvasMenu from '@/components/graph/GraphCanvasMenu.vue'
+import MiniMap from '@/components/graph/MiniMap.vue'
import NodeTooltip from '@/components/graph/NodeTooltip.vue'
import SelectionOverlay from '@/components/graph/SelectionOverlay.vue'
import SelectionToolbox from '@/components/graph/SelectionToolbox.vue'
@@ -65,6 +72,7 @@ import { useContextMenuTranslation } from '@/composables/useContextMenuTranslati
import { useCopy } from '@/composables/useCopy'
import { useGlobalLitegraph } from '@/composables/useGlobalLitegraph'
import { useLitegraphSettings } from '@/composables/useLitegraphSettings'
+import { useMinimap } from '@/composables/useMinimap'
import { usePaste } from '@/composables/usePaste'
import { useWorkflowAutoSave } from '@/composables/useWorkflowAutoSave'
import { useWorkflowPersistence } from '@/composables/useWorkflowPersistence'
@@ -111,6 +119,10 @@ const selectionToolboxEnabled = computed(() =>
settingStore.get('Comfy.Canvas.SelectionToolbox')
)
+const minimapRef = ref>()
+const minimapEnabled = computed(() => settingStore.get('Comfy.Minimap.Visible'))
+const minimap = useMinimap()
+
watchEffect(() => {
nodeDefStore.showDeprecated = settingStore.get('Comfy.Node.ShowDeprecated')
})
@@ -346,6 +358,13 @@ onMounted(async () => {
}
)
+ whenever(
+ () => minimapRef.value,
+ (ref) => {
+ minimap.setMinimapRef(ref)
+ }
+ )
+
whenever(
() => useCanvasStore().canvas,
(canvas) => {
diff --git a/src/components/graph/GraphCanvasMenu.vue b/src/components/graph/GraphCanvasMenu.vue
index 8f5d036cb..f0b208ce4 100644
--- a/src/components/graph/GraphCanvasMenu.vue
+++ b/src/components/graph/GraphCanvasMenu.vue
@@ -56,6 +56,15 @@
data-testid="toggle-link-visibility-button"
@click="() => commandStore.execute('Comfy.Canvas.ToggleLinkVisibility')"
/>
+