diff --git a/.github/workflows/api-update-electron-api-types.yaml b/.github/workflows/api-update-electron-api-types.yaml index c25742118..b7c5bce71 100644 --- a/.github/workflows/api-update-electron-api-types.yaml +++ b/.github/workflows/api-update-electron-api-types.yaml @@ -1,5 +1,5 @@ +# Description: When upstream electron API is updated, click dispatch to update the TypeScript type definitions in this repo name: 'Api: Update Electron API Types' -description: 'When upstream electron API is updated, click dispatch to update the TypeScript type definitions in this repo' on: workflow_dispatch: diff --git a/.github/workflows/api-update-manager-api-types.yaml b/.github/workflows/api-update-manager-api-types.yaml index c6469326d..a709baecf 100644 --- a/.github/workflows/api-update-manager-api-types.yaml +++ b/.github/workflows/api-update-manager-api-types.yaml @@ -1,5 +1,5 @@ +# Description: When upstream ComfyUI-Manager API is updated, click dispatch to update the TypeScript type definitions in this repo name: 'Api: Update Manager API Types' -description: 'When upstream ComfyUI-Manager API is updated, click dispatch to update the TypeScript type definitions in this repo' on: # Manual trigger diff --git a/.github/workflows/api-update-registry-api-types.yaml b/.github/workflows/api-update-registry-api-types.yaml index 41a3d0a7a..5ae701dc2 100644 --- a/.github/workflows/api-update-registry-api-types.yaml +++ b/.github/workflows/api-update-registry-api-types.yaml @@ -1,5 +1,5 @@ +# Description: When upstream comfy-api is updated, click dispatch to update the TypeScript type definitions in this repo name: 'Api: Update Registry API Types' -description: 'When upstream comfy-api is updated, click dispatch to update the TypeScript type definitions in this repo' on: # Manual trigger diff --git a/.github/workflows/ci-json-validation.yaml b/.github/workflows/ci-json-validation.yaml index ae0359014..8c55705e7 100644 --- a/.github/workflows/ci-json-validation.yaml +++ b/.github/workflows/ci-json-validation.yaml @@ -1,5 +1,5 @@ +# Description: Validates JSON syntax in all tracked .json files (excluding tsconfig*.json) using jq name: "CI: JSON Validation" -description: "Validates JSON syntax in all tracked .json files (excluding tsconfig*.json) using jq" on: push: diff --git a/.github/workflows/ci-lint-format.yaml b/.github/workflows/ci-lint-format.yaml index 4221d5174..3ce6d6aa9 100644 --- a/.github/workflows/ci-lint-format.yaml +++ b/.github/workflows/ci-lint-format.yaml @@ -1,5 +1,5 @@ +# Description: Linting and code formatting validation for pull requests name: "CI: Lint Format" -description: "Linting and code formatting validation for pull requests" on: pull_request: diff --git a/.github/workflows/ci-python-validation.yaml b/.github/workflows/ci-python-validation.yaml index 2b8279236..1625ca29f 100644 --- a/.github/workflows/ci-python-validation.yaml +++ b/.github/workflows/ci-python-validation.yaml @@ -1,5 +1,5 @@ +# Description: Validates Python code in tools/devtools directory name: "CI: Python Validation" -description: "Validates Python code in tools/devtools directory" on: pull_request: diff --git a/.github/workflows/ci-tests-e2e-forks.yaml b/.github/workflows/ci-tests-e2e-forks.yaml index 7eadfa63a..c1828b7fb 100644 --- a/.github/workflows/ci-tests-e2e-forks.yaml +++ b/.github/workflows/ci-tests-e2e-forks.yaml @@ -1,5 +1,5 @@ +# Description: Deploys test results from forked PRs (forks can't access deployment secrets) name: "CI: Tests E2E (Deploy for Forks)" -description: "Deploys test results from forked PRs (forks can't access deployment secrets)" on: workflow_run: diff --git a/.github/workflows/ci-tests-e2e.yaml b/.github/workflows/ci-tests-e2e.yaml index 8d793e0fa..f4a770574 100644 --- a/.github/workflows/ci-tests-e2e.yaml +++ b/.github/workflows/ci-tests-e2e.yaml @@ -1,5 +1,5 @@ +# Description: End-to-end testing with Playwright across multiple browsers, deploys test reports to Cloudflare Pages name: "CI: Tests E2E" -description: "End-to-end testing with Playwright across multiple browsers, deploys test reports to Cloudflare Pages" on: push: diff --git a/.github/workflows/ci-tests-storybook-forks.yaml b/.github/workflows/ci-tests-storybook-forks.yaml index b6cad2060..e93b5bb90 100644 --- a/.github/workflows/ci-tests-storybook-forks.yaml +++ b/.github/workflows/ci-tests-storybook-forks.yaml @@ -1,5 +1,5 @@ +# Description: Deploys Storybook previews from forked PRs (forks can't access deployment secrets) name: "CI: Tests Storybook (Deploy for Forks)" -description: "Deploys Storybook previews from forked PRs (forks can't access deployment secrets)" on: workflow_run: diff --git a/.github/workflows/ci-tests-storybook.yaml b/.github/workflows/ci-tests-storybook.yaml index 5734f9980..8158787a2 100644 --- a/.github/workflows/ci-tests-storybook.yaml +++ b/.github/workflows/ci-tests-storybook.yaml @@ -1,10 +1,9 @@ +# Description: Builds Storybook and runs visual regression testing via Chromatic, deploys previews to Cloudflare Pages name: "CI: Tests Storybook" -description: "Builds Storybook and runs visual regression testing via Chromatic, deploys previews to Cloudflare Pages" on: workflow_dispatch: # Allow manual triggering pull_request: - branches: [main] jobs: # Post starting comment for non-forked PRs diff --git a/.github/workflows/ci-tests-unit.yaml b/.github/workflows/ci-tests-unit.yaml index 2f4417594..8a97a9128 100644 --- a/.github/workflows/ci-tests-unit.yaml +++ b/.github/workflows/ci-tests-unit.yaml @@ -1,5 +1,5 @@ +# Description: Unit and component testing with Vitest name: "CI: Tests Unit" -description: "Unit and component testing with Vitest" on: push: diff --git a/.github/workflows/ci-yaml-validation.yaml b/.github/workflows/ci-yaml-validation.yaml index 41c88ae2c..cf2a3b648 100644 --- a/.github/workflows/ci-yaml-validation.yaml +++ b/.github/workflows/ci-yaml-validation.yaml @@ -1,5 +1,5 @@ +# Description: Validates YAML syntax and style using yamllint with relaxed rules name: "CI: YAML Validation" -description: "Validates YAML syntax and style using yamllint with relaxed rules" on: push: diff --git a/.github/workflows/i18n-update-core.yaml b/.github/workflows/i18n-update-core.yaml index cb06e228a..a4e73f538 100644 --- a/.github/workflows/i18n-update-core.yaml +++ b/.github/workflows/i18n-update-core.yaml @@ -1,5 +1,5 @@ +# Description: Generates and updates translations for core ComfyUI components using OpenAI name: "i18n: Update Core" -description: "Generates and updates translations for core ComfyUI components using OpenAI" on: # Manual dispatch for urgent translation updates diff --git a/.github/workflows/pr-backport.yaml b/.github/workflows/pr-backport.yaml index c56126af4..696873add 100644 --- a/.github/workflows/pr-backport.yaml +++ b/.github/workflows/pr-backport.yaml @@ -78,8 +78,7 @@ jobs: if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then LABELS=$(gh pr view ${{ inputs.pr_number }} --json labels | jq -r '.labels[].name') else - LABELS='${{ toJSON(github.event.pull_request.labels) }}' - LABELS=$(echo "$LABELS" | jq -r '.[].name') + LABELS=$(jq -r '.pull_request.labels[].name' "$GITHUB_EVENT_PATH") fi add_target() { diff --git a/.github/workflows/pr-claude-review.yaml b/.github/workflows/pr-claude-review.yaml index e4684af07..ec4159c1c 100644 --- a/.github/workflows/pr-claude-review.yaml +++ b/.github/workflows/pr-claude-review.yaml @@ -1,5 +1,5 @@ +# Description: AI-powered code review triggered by adding the 'claude-review' label to a PR name: "PR: Claude Review" -description: "AI-powered code review triggered by adding the 'claude-review' label to a PR" permissions: contents: read diff --git a/.github/workflows/release-branch-create.yaml b/.github/workflows/release-branch-create.yaml index 88d7d53bc..3e7290fdf 100644 --- a/.github/workflows/release-branch-create.yaml +++ b/.github/workflows/release-branch-create.yaml @@ -148,10 +148,10 @@ jobs: done { - echo "results<<'EOF'" + echo "results<> $GITHUB_OUTPUT + } >> "$GITHUB_OUTPUT" - name: Ensure release labels if: steps.check_version.outputs.is_minor_bump == 'true' diff --git a/.github/workflows/release-version-bump.yaml b/.github/workflows/release-version-bump.yaml index 30254c6aa..766f5d406 100644 --- a/.github/workflows/release-version-bump.yaml +++ b/.github/workflows/release-version-bump.yaml @@ -1,5 +1,5 @@ +# Description: Manual workflow to increment package version with semantic versioning support name: "Release: Version Bump" -description: "Manual workflow to increment package version with semantic versioning support" on: workflow_dispatch: diff --git a/.github/workflows/weekly-docs-check.yaml b/.github/workflows/weekly-docs-check.yaml index c67e4adcb..317e4d8fe 100644 --- a/.github/workflows/weekly-docs-check.yaml +++ b/.github/workflows/weekly-docs-check.yaml @@ -1,5 +1,5 @@ +# Description: Automated weekly documentation accuracy check and update via Claude name: "Weekly Documentation Check" -description: "Automated weekly documentation accuracy check and update via Claude" permissions: contents: write diff --git a/apps/desktop-ui/package.json b/apps/desktop-ui/package.json index 0aa47e320..48a134872 100644 --- a/apps/desktop-ui/package.json +++ b/apps/desktop-ui/package.json @@ -91,7 +91,7 @@ "build-storybook": "storybook build -o dist/storybook" }, "dependencies": { - "@comfyorg/comfyui-electron-types": "0.4.73-0", + "@comfyorg/comfyui-electron-types": "catalog:", "@comfyorg/shared-frontend-utils": "workspace:*", "@primevue/core": "catalog:", "@primevue/themes": "catalog:", diff --git a/apps/desktop-ui/src/components/common/StartupDisplay.vue b/apps/desktop-ui/src/components/common/StartupDisplay.vue index bd42c14e4..7bde5ec86 100644 --- a/apps/desktop-ui/src/components/common/StartupDisplay.vue +++ b/apps/desktop-ui/src/components/common/StartupDisplay.vue @@ -22,7 +22,11 @@

{{ title }}

-

+

{{ statusText }}

diff --git a/apps/desktop-ui/src/components/install/InstallLocationPicker.vue b/apps/desktop-ui/src/components/install/InstallLocationPicker.vue index 6b139c1e9..2122a136e 100644 --- a/apps/desktop-ui/src/components/install/InstallLocationPicker.vue +++ b/apps/desktop-ui/src/components/install/InstallLocationPicker.vue @@ -115,19 +115,18 @@ import Button from 'primevue/button' import Divider from 'primevue/divider' import InputText from 'primevue/inputtext' import Message from 'primevue/message' -import { type ModelRef, computed, onMounted, ref } from 'vue' +import { computed, onMounted, ref } from 'vue' +import type { ModelRef } from 'vue' import { useI18n } from 'vue-i18n' -import MigrationPicker from '@/components/install/MigrationPicker.vue' -import MirrorItem from '@/components/install/mirror/MirrorItem.vue' -import { - PYPI_MIRROR, - PYTHON_MIRROR, - type UVMirror -} from '@/constants/uvMirrors' +import { PYPI_MIRROR, PYTHON_MIRROR } from '@/constants/uvMirrors' +import type { UVMirror } from '@/constants/uvMirrors' import { electronAPI } from '@/utils/envUtil' import { ValidationState } from '@/utils/validationUtil' +import MigrationPicker from './MigrationPicker.vue' +import MirrorItem from './mirror/MirrorItem.vue' + const { t } = useI18n() const installPath = defineModel('installPath', { required: true }) @@ -229,6 +228,10 @@ const validatePath = async (path: string | undefined) => { } if (validation.parentMissing) errors.push(t('install.parentMissing')) if (validation.isOneDrive) errors.push(t('install.isOneDrive')) + if (validation.isInsideAppInstallDir) + errors.push(t('install.insideAppInstallDir')) + if (validation.isInsideUpdaterCache) + errors.push(t('install.insideUpdaterCache')) if (validation.error) errors.push(`${t('install.unhandledError')}: ${validation.error}`) diff --git a/apps/desktop-ui/src/constants/desktopMaintenanceTasks.ts b/apps/desktop-ui/src/constants/desktopMaintenanceTasks.ts index 082a62045..9f81ab394 100644 --- a/apps/desktop-ui/src/constants/desktopMaintenanceTasks.ts +++ b/apps/desktop-ui/src/constants/desktopMaintenanceTasks.ts @@ -16,7 +16,8 @@ export const DESKTOP_MAINTENANCE_TASKS: Readonly[] = [ execute: async () => await electron.setBasePath(), name: 'Base path', shortDescription: 'Change the application base path.', - errorDescription: 'Unable to open the base path. Please select a new one.', + errorDescription: + 'The current base path is invalid or unsafe. Please select a new location.', description: 'The base path is the default location where ComfyUI stores data. It is the location for the python environment, and may also contain models, custom nodes, and other extensions.', isInstallationFix: true, diff --git a/apps/desktop-ui/src/stores/maintenanceTaskStore.ts b/apps/desktop-ui/src/stores/maintenanceTaskStore.ts index 7ce4811cf..d3dfca18c 100644 --- a/apps/desktop-ui/src/stores/maintenanceTaskStore.ts +++ b/apps/desktop-ui/src/stores/maintenanceTaskStore.ts @@ -85,6 +85,7 @@ export const useMaintenanceTaskStore = defineStore('maintenanceTask', () => { const electron = electronAPI() // Reactive state + const lastUpdate = ref(null) const isRefreshing = ref(false) const isRunningTerminalCommand = computed(() => tasks.value @@ -97,6 +98,13 @@ export const useMaintenanceTaskStore = defineStore('maintenanceTask', () => { .some((task) => getRunner(task)?.executing) ) + const unsafeBasePath = computed( + () => lastUpdate.value?.unsafeBasePath === true + ) + const unsafeBasePathReason = computed( + () => lastUpdate.value?.unsafeBasePathReason + ) + // Task list const tasks = ref(DESKTOP_MAINTENANCE_TASKS) @@ -123,6 +131,7 @@ export const useMaintenanceTaskStore = defineStore('maintenanceTask', () => { * @param validationUpdate Update details passed in by electron */ const processUpdate = (validationUpdate: InstallValidation) => { + lastUpdate.value = validationUpdate const update = validationUpdate as IndexedUpdate isRefreshing.value = true @@ -155,7 +164,11 @@ export const useMaintenanceTaskStore = defineStore('maintenanceTask', () => { } const execute = async (task: MaintenanceTask) => { - return getRunner(task).execute(task) + const success = await getRunner(task).execute(task) + if (success && task.isInstallationFix) { + await refreshDesktopTasks() + } + return success } return { @@ -163,6 +176,8 @@ export const useMaintenanceTaskStore = defineStore('maintenanceTask', () => { isRefreshing, isRunningTerminalCommand, isRunningInstallationFix, + unsafeBasePath, + unsafeBasePathReason, execute, getRunner, processUpdate, diff --git a/apps/desktop-ui/src/views/MaintenanceView.stories.ts b/apps/desktop-ui/src/views/MaintenanceView.stories.ts new file mode 100644 index 000000000..5dee7106b --- /dev/null +++ b/apps/desktop-ui/src/views/MaintenanceView.stories.ts @@ -0,0 +1,159 @@ +// eslint-disable-next-line storybook/no-renderer-packages +import type { Meta, StoryObj } from '@storybook/vue3' +import { defineAsyncComponent } from 'vue' + +type UnsafeReason = 'appInstallDir' | 'updaterCache' | 'oneDrive' | null +type ValidationIssueState = 'OK' | 'warning' | 'error' | 'skipped' + +type ValidationState = { + inProgress: boolean + installState: string + basePath?: ValidationIssueState + unsafeBasePath: boolean + unsafeBasePathReason: UnsafeReason + venvDirectory?: ValidationIssueState + pythonInterpreter?: ValidationIssueState + pythonPackages?: ValidationIssueState + uv?: ValidationIssueState + git?: ValidationIssueState + vcRedist?: ValidationIssueState + upgradePackages?: ValidationIssueState +} + +const validationState: ValidationState = { + inProgress: false, + installState: 'installed', + basePath: 'OK', + unsafeBasePath: false, + unsafeBasePathReason: null, + venvDirectory: 'OK', + pythonInterpreter: 'OK', + pythonPackages: 'OK', + uv: 'OK', + git: 'OK', + vcRedist: 'OK', + upgradePackages: 'OK' +} + +const createMockElectronAPI = () => { + const logListeners: Array<(message: string) => void> = [] + + const getValidationUpdate = () => ({ + ...validationState + }) + + return { + getPlatform: () => 'darwin', + changeTheme: (_theme: unknown) => {}, + onLogMessage: (listener: (message: string) => void) => { + logListeners.push(listener) + }, + showContextMenu: (_options: unknown) => {}, + Events: { + trackEvent: (_eventName: string, _data?: unknown) => {} + }, + Validation: { + onUpdate: (_callback: (update: unknown) => void) => {}, + async getStatus() { + return getValidationUpdate() + }, + async validateInstallation(callback: (update: unknown) => void) { + callback(getValidationUpdate()) + }, + async complete() { + // Only allow completion when the base path is safe + return !validationState.unsafeBasePath + }, + dispose: () => {} + }, + setBasePath: () => Promise.resolve(true), + reinstall: () => Promise.resolve(), + uv: { + installRequirements: () => Promise.resolve(), + clearCache: () => Promise.resolve(), + resetVenv: () => Promise.resolve() + } + } +} + +const ensureElectronAPI = () => { + const globalWindow = window as unknown as { electronAPI?: unknown } + if (!globalWindow.electronAPI) { + globalWindow.electronAPI = createMockElectronAPI() + } + + return globalWindow.electronAPI +} + +const MaintenanceView = defineAsyncComponent(async () => { + ensureElectronAPI() + const module = await import('./MaintenanceView.vue') + return module.default +}) + +const meta: Meta = { + title: 'Desktop/Views/MaintenanceView', + component: MaintenanceView, + parameters: { + layout: 'fullscreen', + backgrounds: { + default: 'dark', + values: [ + { name: 'dark', value: '#0a0a0a' }, + { name: 'neutral-900', value: '#171717' }, + { name: 'neutral-950', value: '#0a0a0a' } + ] + } + } +} + +export default meta +type Story = StoryObj + +export const Default: Story = { + name: 'All tasks OK', + render: () => ({ + components: { MaintenanceView }, + setup() { + validationState.inProgress = false + validationState.installState = 'installed' + validationState.basePath = 'OK' + validationState.unsafeBasePath = false + validationState.unsafeBasePathReason = null + validationState.venvDirectory = 'OK' + validationState.pythonInterpreter = 'OK' + validationState.pythonPackages = 'OK' + validationState.uv = 'OK' + validationState.git = 'OK' + validationState.vcRedist = 'OK' + validationState.upgradePackages = 'OK' + ensureElectronAPI() + return {} + }, + template: '' + }) +} + +export const UnsafeBasePathOneDrive: Story = { + name: 'Unsafe base path (OneDrive)', + render: () => ({ + components: { MaintenanceView }, + setup() { + validationState.inProgress = false + validationState.installState = 'installed' + validationState.basePath = 'error' + validationState.unsafeBasePath = true + validationState.unsafeBasePathReason = 'oneDrive' + validationState.venvDirectory = 'OK' + validationState.pythonInterpreter = 'OK' + validationState.pythonPackages = 'OK' + validationState.uv = 'OK' + validationState.git = 'OK' + validationState.vcRedist = 'OK' + validationState.upgradePackages = 'OK' + ensureElectronAPI() + return {} + }, + template: '' + }) +} diff --git a/apps/desktop-ui/src/views/MaintenanceView.vue b/apps/desktop-ui/src/views/MaintenanceView.vue index dbe1b269e..433dda54d 100644 --- a/apps/desktop-ui/src/views/MaintenanceView.vue +++ b/apps/desktop-ui/src/views/MaintenanceView.vue @@ -47,6 +47,28 @@ + +
+

+ + + + {{ t('maintenance.unsafeMigration.title') }} + + + {{ unsafeReasonText }} + + + {{ t('maintenance.unsafeMigration.action') }} + + +

+
+ (filterOptions.value[0]) +const unsafeReasonText = computed(() => { + const reason = taskStore.unsafeBasePathReason + if (!reason) { + return t('maintenance.unsafeMigration.generic') + } + + if (reason === 'appInstallDir') { + return t('maintenance.unsafeMigration.appInstallDir') + } + + if (reason === 'updaterCache') { + return t('maintenance.unsafeMigration.updaterCache') + } + + if (reason === 'oneDrive') { + return t('maintenance.unsafeMigration.oneDrive') + } + + return t('maintenance.unsafeMigration.generic') +}) + /** If valid, leave the validation window. */ const completeValidation = async () => { const isValid = await electron.Validation.complete() diff --git a/browser_tests/fixtures/ComfyPage.ts b/browser_tests/fixtures/ComfyPage.ts index 8059fb4cb..bf1a219e6 100644 --- a/browser_tests/fixtures/ComfyPage.ts +++ b/browser_tests/fixtures/ComfyPage.ts @@ -16,7 +16,6 @@ import { ComfyNodeSearchBox } from './components/ComfyNodeSearchBox' import { SettingDialog } from './components/SettingDialog' import { NodeLibrarySidebarTab, - QueueSidebarTab, WorkflowsSidebarTab } from './components/SidebarTab' import { Topbar } from './components/Topbar' @@ -31,7 +30,6 @@ type WorkspaceStore = ReturnType class ComfyMenu { private _nodeLibraryTab: NodeLibrarySidebarTab | null = null private _workflowsTab: WorkflowsSidebarTab | null = null - private _queueTab: QueueSidebarTab | null = null private _topbar: Topbar | null = null public readonly sideToolbar: Locator @@ -60,11 +58,6 @@ class ComfyMenu { return this._workflowsTab } - get queueTab() { - this._queueTab ??= new QueueSidebarTab(this.page) - return this._queueTab - } - get topbar() { this._topbar ??= new Topbar(this.page) return this._topbar @@ -564,7 +557,7 @@ export class ComfyPage { async dragAndDrop(source: Position, target: Position) { await this.page.mouse.move(source.x, source.y) await this.page.mouse.down() - await this.page.mouse.move(target.x, target.y) + await this.page.mouse.move(target.x, target.y, { steps: 100 }) await this.page.mouse.up() await this.nextFrame() } diff --git a/browser_tests/fixtures/VueNodeHelpers.ts b/browser_tests/fixtures/VueNodeHelpers.ts index 86d715bfd..e6121b3c3 100644 --- a/browser_tests/fixtures/VueNodeHelpers.ts +++ b/browser_tests/fixtures/VueNodeHelpers.ts @@ -65,7 +65,9 @@ export class VueNodeHelpers { * Select a specific Vue node by ID */ async selectNode(nodeId: string): Promise { - await this.page.locator(`[data-node-id="${nodeId}"]`).click() + await this.page + .locator(`[data-node-id="${nodeId}"] .lg-node-header`) + .click() } /** @@ -77,11 +79,13 @@ export class VueNodeHelpers { // Select first node normally await this.selectNode(nodeIds[0]) - // Add additional nodes with Ctrl+click + // Add additional nodes with Ctrl+click on header for (let i = 1; i < nodeIds.length; i++) { - await this.page.locator(`[data-node-id="${nodeIds[i]}"]`).click({ - modifiers: ['Control'] - }) + await this.page + .locator(`[data-node-id="${nodeIds[i]}"] .lg-node-header`) + .click({ + modifiers: ['Control'] + }) } } diff --git a/browser_tests/fixtures/components/SidebarTab.ts b/browser_tests/fixtures/components/SidebarTab.ts index f3fbe42cf..1700866f2 100644 --- a/browser_tests/fixtures/components/SidebarTab.ts +++ b/browser_tests/fixtures/components/SidebarTab.ts @@ -148,124 +148,3 @@ export class WorkflowsSidebarTab extends SidebarTab { .click() } } - -export class QueueSidebarTab extends SidebarTab { - constructor(public readonly page: Page) { - super(page, 'queue') - } - - get root() { - return this.page.locator('.sidebar-content-container', { hasText: 'Queue' }) - } - - get tasks() { - return this.root.locator('[data-virtual-grid-item]') - } - - get visibleTasks() { - return this.tasks.locator('visible=true') - } - - get clearButton() { - return this.root.locator('.clear-all-button') - } - - get collapseTasksButton() { - return this.getToggleExpandButton(false) - } - - get expandTasksButton() { - return this.getToggleExpandButton(true) - } - - get noResultsPlaceholder() { - return this.root.locator('.no-results-placeholder') - } - - get galleryImage() { - return this.page.locator('.galleria-image') - } - - private getToggleExpandButton(isExpanded: boolean) { - const iconSelector = isExpanded ? '.pi-image' : '.pi-images' - return this.root.locator(`.toggle-expanded-button ${iconSelector}`) - } - - async open() { - await super.open() - return this.root.waitFor({ state: 'visible' }) - } - - async close() { - await super.close() - await this.root.waitFor({ state: 'hidden' }) - } - - async expandTasks() { - await this.expandTasksButton.click() - await this.collapseTasksButton.waitFor({ state: 'visible' }) - } - - async collapseTasks() { - await this.collapseTasksButton.click() - await this.expandTasksButton.waitFor({ state: 'visible' }) - } - - async waitForTasks() { - return Promise.all([ - this.tasks.first().waitFor({ state: 'visible' }), - this.tasks.last().waitFor({ state: 'visible' }) - ]) - } - - async scrollTasks(direction: 'up' | 'down') { - const scrollToEl = - direction === 'up' ? this.tasks.last() : this.tasks.first() - await scrollToEl.scrollIntoViewIfNeeded() - await this.waitForTasks() - } - - async clearTasks() { - await this.clearButton.click() - const confirmButton = this.page.getByLabel('Delete') - await confirmButton.click() - await this.noResultsPlaceholder.waitFor({ state: 'visible' }) - } - - /** Set the width of the tab (out of 100). Must call before opening the tab */ - async setTabWidth(width: number) { - if (width < 0 || width > 100) { - throw new Error('Width must be between 0 and 100') - } - return this.page.evaluate((width) => { - localStorage.setItem('queue', JSON.stringify([width, 100 - width])) - }, width) - } - - getTaskPreviewButton(taskIndex: number) { - return this.tasks.nth(taskIndex).getByRole('button') - } - - async openTaskPreview(taskIndex: number) { - const previewButton = this.getTaskPreviewButton(taskIndex) - await previewButton.click() - return this.galleryImage.waitFor({ state: 'visible' }) - } - - getGalleryImage(imageFilename: string) { - return this.galleryImage.and(this.page.getByAltText(imageFilename)) - } - - getTaskImage(imageFilename: string) { - return this.tasks.getByAltText(imageFilename) - } - - /** Trigger the queue store and tasks to update */ - async triggerTasksUpdate() { - await this.page.evaluate(() => { - window['app']['api'].dispatchCustomEvent('status', { - exec_info: { queue_remaining: 0 } - }) - }) - } -} diff --git a/browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png b/browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png index a3d7a8443..d59e9707a 100644 Binary files a/browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png and b/browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png differ diff --git a/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-node-chromium-linux.png b/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-node-chromium-linux.png index cffe23ed1..67190e335 100644 Binary files a/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-node-chromium-linux.png and b/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-node-chromium-linux.png differ diff --git a/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-pinned-node-chromium-linux.png b/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-pinned-node-chromium-linux.png index 5cd2eacc4..54b98eaec 100644 Binary files a/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-pinned-node-chromium-linux.png and b/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-pinned-node-chromium-linux.png differ diff --git a/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-unpinned-node-chromium-linux.png b/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-unpinned-node-chromium-linux.png index cffe23ed1..67190e335 100644 Binary files a/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-unpinned-node-chromium-linux.png and b/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-unpinned-node-chromium-linux.png differ diff --git a/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-unpinned-node-moved-chromium-linux.png b/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-unpinned-node-moved-chromium-linux.png index 700e9d2c5..7b75a5a3e 100644 Binary files a/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-unpinned-node-moved-chromium-linux.png and b/browser_tests/tests/rightClickMenu.spec.ts-snapshots/right-click-unpinned-node-moved-chromium-linux.png differ diff --git a/browser_tests/tests/sidebar/queue.spec.ts b/browser_tests/tests/sidebar/queue.spec.ts deleted file mode 100644 index 39e2ced6e..000000000 --- a/browser_tests/tests/sidebar/queue.spec.ts +++ /dev/null @@ -1,210 +0,0 @@ -import { expect } from '@playwright/test' - -import { comfyPageFixture as test } from '../../fixtures/ComfyPage' - -test.describe.skip('Queue sidebar', () => { - test.beforeEach(async ({ comfyPage }) => { - await comfyPage.setSetting('Comfy.UseNewMenu', 'Top') - }) - - test('can display tasks', async ({ comfyPage }) => { - await comfyPage.setupHistory().withTask(['example.webp']).setupRoutes() - await comfyPage.menu.queueTab.open() - await comfyPage.menu.queueTab.waitForTasks() - expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe(1) - }) - - test('can display tasks after closing then opening', async ({ - comfyPage - }) => { - await comfyPage.setupHistory().withTask(['example.webp']).setupRoutes() - await comfyPage.menu.queueTab.open() - await comfyPage.menu.queueTab.close() - await comfyPage.menu.queueTab.open() - await comfyPage.menu.queueTab.waitForTasks() - expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe(1) - }) - - test.describe('Virtual scroll', () => { - const layouts = [ - { description: 'Five columns layout', width: 95, rows: 3, cols: 5 }, - { description: 'Three columns layout', width: 55, rows: 3, cols: 3 }, - { description: 'Two columns layout', width: 40, rows: 3, cols: 2 } - ] - - test.beforeEach(async ({ comfyPage }) => { - await comfyPage - .setupHistory() - .withTask(['example.webp']) - .repeat(50) - .setupRoutes() - }) - - layouts.forEach(({ description, width, rows, cols }) => { - const preRenderedRows = 1 - const preRenderedTasks = preRenderedRows * cols * 2 - const visibleTasks = rows * cols - const expectRenderLimit = visibleTasks + preRenderedTasks - - test.describe(description, () => { - test.beforeEach(async ({ comfyPage }) => { - await comfyPage.menu.queueTab.setTabWidth(width) - await comfyPage.menu.queueTab.open() - await comfyPage.menu.queueTab.waitForTasks() - }) - - test('should not render items outside of view', async ({ - comfyPage - }) => { - const renderedCount = - await comfyPage.menu.queueTab.visibleTasks.count() - expect(renderedCount).toBeLessThanOrEqual(expectRenderLimit) - }) - - test('should teardown items after scrolling away', async ({ - comfyPage - }) => { - await comfyPage.menu.queueTab.scrollTasks('down') - const renderedCount = - await comfyPage.menu.queueTab.visibleTasks.count() - expect(renderedCount).toBeLessThanOrEqual(expectRenderLimit) - }) - - test('should re-render items after scrolling away then back', async ({ - comfyPage - }) => { - await comfyPage.menu.queueTab.scrollTasks('down') - await comfyPage.menu.queueTab.scrollTasks('up') - const renderedCount = - await comfyPage.menu.queueTab.visibleTasks.count() - expect(renderedCount).toBeLessThanOrEqual(expectRenderLimit) - }) - }) - }) - }) - - test.describe('Expand tasks', () => { - test.beforeEach(async ({ comfyPage }) => { - // 2-item batch and 3-item batch -> 3 additional items when expanded - await comfyPage - .setupHistory() - .withTask(['example.webp', 'example.webp', 'example.webp']) - .withTask(['example.webp', 'example.webp']) - .setupRoutes() - await comfyPage.menu.queueTab.open() - await comfyPage.menu.queueTab.waitForTasks() - }) - - test('can expand tasks with multiple outputs', async ({ comfyPage }) => { - const initialCount = await comfyPage.menu.queueTab.visibleTasks.count() - await comfyPage.menu.queueTab.expandTasks() - expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe( - initialCount + 3 - ) - }) - - test('can collapse flat tasks', async ({ comfyPage }) => { - const initialCount = await comfyPage.menu.queueTab.visibleTasks.count() - await comfyPage.menu.queueTab.expandTasks() - await comfyPage.menu.queueTab.collapseTasks() - expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe( - initialCount - ) - }) - }) - - test.describe('Clear tasks', () => { - test.beforeEach(async ({ comfyPage }) => { - await comfyPage - .setupHistory() - .withTask(['example.webp']) - .repeat(6) - .setupRoutes() - await comfyPage.menu.queueTab.open() - }) - - test('can clear all tasks', async ({ comfyPage }) => { - await comfyPage.menu.queueTab.clearTasks() - expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe(0) - expect( - await comfyPage.menu.queueTab.noResultsPlaceholder.isVisible() - ).toBe(true) - }) - - test('can load new tasks after clearing all', async ({ comfyPage }) => { - await comfyPage.menu.queueTab.clearTasks() - await comfyPage.menu.queueTab.close() - await comfyPage.setupHistory().withTask(['example.webp']).setupRoutes() - await comfyPage.menu.queueTab.open() - await comfyPage.menu.queueTab.waitForTasks() - expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe(1) - }) - }) - - test.describe('Gallery', () => { - const firstImage = 'example.webp' - const secondImage = 'image32x32.webp' - - test.beforeEach(async ({ comfyPage }) => { - await comfyPage - .setupHistory() - .withTask([secondImage]) - .withTask([firstImage]) - .setupRoutes() - await comfyPage.menu.queueTab.open() - await comfyPage.menu.queueTab.waitForTasks() - await comfyPage.menu.queueTab.openTaskPreview(0) - }) - - test('displays gallery image after opening task preview', async ({ - comfyPage - }) => { - await comfyPage.nextFrame() - await expect( - comfyPage.menu.queueTab.getGalleryImage(firstImage) - ).toBeVisible() - }) - - test('maintains active gallery item when new tasks are added', async ({ - comfyPage - }) => { - // Add a new task while the gallery is still open - const newImage = 'image64x64.webp' - comfyPage.setupHistory().withTask([newImage]) - await comfyPage.menu.queueTab.triggerTasksUpdate() - await comfyPage.page.waitForTimeout(500) - const newTask = comfyPage.menu.queueTab.tasks.getByAltText(newImage) - await newTask.waitFor({ state: 'visible' }) - // The active gallery item should still be the initial image - await expect( - comfyPage.menu.queueTab.getGalleryImage(firstImage) - ).toBeVisible() - }) - - test.describe('Gallery navigation', () => { - const paths: { - description: string - path: ('Right' | 'Left')[] - end: string - }[] = [ - { description: 'Right', path: ['Right'], end: secondImage }, - { description: 'Left', path: ['Right', 'Left'], end: firstImage }, - { description: 'Left wrap', path: ['Left'], end: secondImage }, - { description: 'Right wrap', path: ['Right', 'Right'], end: firstImage } - ] - - paths.forEach(({ description, path, end }) => { - test(`can navigate gallery ${description}`, async ({ comfyPage }) => { - for (const direction of path) - await comfyPage.page.keyboard.press(`Arrow${direction}`, { - delay: 256 - }) - await comfyPage.nextFrame() - await expect( - comfyPage.menu.queueTab.getGalleryImage(end) - ).toBeVisible() - }) - }) - }) - }) -}) diff --git a/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png b/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png index d19fe3708..1dccc58db 100644 Binary files a/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png and b/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png b/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png index 137f58ea5..84996f8e2 100644 Binary files a/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png and b/browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png b/browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png index e9f23fd37..444fb1ff4 100644 Binary files a/browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png and b/browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts b/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts index b87309f10..216623337 100644 --- a/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts +++ b/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts @@ -6,6 +6,7 @@ import { test.describe('Vue Nodes Zoom', () => { test.beforeEach(async ({ comfyPage }) => { await comfyPage.setSetting('Comfy.VueNodes.Enabled', true) + await comfyPage.setSetting('LiteGraph.Canvas.MinFontSizeForLOD', 8) await comfyPage.vueNodes.waitForNodes() }) diff --git a/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png index c7bf65bc3..0bfc41ae2 100644 Binary files a/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png index 6d3cd70e6..91e76b5d2 100644 Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png index 1831a6465..476d29a2d 100644 Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png index 6af9325a8..ad24d6e79 100644 Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png index d145d8890..6c28b3c47 100644 Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png index 53162e19f..23dc8a5a5 100644 Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png index 589059136..293bb92b2 100644 Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png index cac66743b..7d0b806cf 100644 Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png index 70daf6c8e..788c45f87 100644 Binary files a/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png index 5a8a3b925..9f5f3a672 100644 Binary files a/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png and b/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png b/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png index f4e5b8901..d75048d8d 100644 Binary files a/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png and b/browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png differ diff --git a/browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png index 2aa7952dd..b65fb09a4 100644 Binary files a/browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png index 49535a3ed..51f6ea9c6 100644 Binary files a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png index 6f0ec83aa..638f5c91f 100644 Binary files a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-light-all-colors-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-light-all-colors-chromium-linux.png index d8b3ca38d..6981227c6 100644 Binary files a/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-light-all-colors-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-light-all-colors-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts b/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts index cfe0ba1b3..96ab721ca 100644 --- a/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts +++ b/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts @@ -11,6 +11,7 @@ test.describe('Vue Nodes - LOD', () => { await comfyPage.setSetting('Comfy.VueNodes.Enabled', true) await comfyPage.setup() await comfyPage.loadWorkflow('default') + await comfyPage.setSetting('LiteGraph.Canvas.MinFontSizeForLOD', 8) }) test('should toggle LOD based on zoom threshold', async ({ comfyPage }) => { diff --git a/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-default-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-default-chromium-linux.png index df81fe75e..9b97adfb0 100644 Binary files a/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-default-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-default-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-lod-active-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-lod-active-chromium-linux.png index 9b4dcc6f8..4dd10e50e 100644 Binary files a/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-lod-active-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-lod-active-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-lod-inactive-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-lod-inactive-chromium-linux.png index df81fe75e..4f951a2b0 100644 Binary files a/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-lod-inactive-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/lod.spec.ts-snapshots/vue-nodes-lod-inactive-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png b/browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png index 4fcd2d7c6..dd519951f 100644 Binary files a/browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png and b/browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png differ diff --git a/browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png b/browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png index 917231dae..3caa2e249 100644 Binary files a/browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png and b/browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png differ diff --git a/package.json b/package.json index 3660e300c..7cc57c9d8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@comfyorg/comfyui-frontend", "private": true, - "version": "1.32.6", + "version": "1.33.8", "type": "module", "repository": "https://github.com/Comfy-Org/ComfyUI_frontend", "homepage": "https://comfy.org", @@ -75,6 +75,7 @@ "@vitest/coverage-v8": "catalog:", "@vitest/ui": "catalog:", "@vue/test-utils": "catalog:", + "@webgpu/types": "catalog:", "cross-env": "catalog:", "eslint": "catalog:", "eslint-config-prettier": "catalog:", @@ -112,6 +113,7 @@ "typescript": "catalog:", "typescript-eslint": "catalog:", "unplugin-icons": "catalog:", + "unplugin-typegpu": "catalog:", "unplugin-vue-components": "catalog:", "uuid": "^11.1.0", "vite": "catalog:", @@ -128,7 +130,7 @@ "dependencies": { "@alloc/quick-lru": "catalog:", "@atlaskit/pragmatic-drag-and-drop": "^1.3.1", - "@comfyorg/comfyui-electron-types": "0.4.73-0", + "@comfyorg/comfyui-electron-types": "catalog:", "@comfyorg/design-system": "workspace:*", "@comfyorg/registry-types": "workspace:*", "@comfyorg/shared-frontend-utils": "workspace:*", @@ -176,6 +178,7 @@ "semver": "^7.7.2", "three": "^0.170.0", "tiptap-markdown": "^0.8.10", + "typegpu": "catalog:", "vue": "catalog:", "vue-i18n": "catalog:", "vue-router": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d65a29266..6c7c36f58 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,6 +9,9 @@ catalogs: '@alloc/quick-lru': specifier: ^5.2.0 version: 5.2.0 + '@comfyorg/comfyui-electron-types': + specifier: 0.5.5 + version: 0.5.5 '@eslint/js': specifier: ^9.35.0 version: 9.35.0 @@ -123,6 +126,9 @@ catalogs: '@vueuse/integrations': specifier: ^13.9.0 version: 13.9.0 + '@webgpu/types': + specifier: ^0.1.66 + version: 0.1.66 algoliasearch: specifier: ^5.21.0 version: 5.21.0 @@ -243,6 +249,9 @@ catalogs: tw-animate-css: specifier: ^1.3.8 version: 1.3.8 + typegpu: + specifier: ^0.8.2 + version: 0.8.2 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -252,6 +261,9 @@ catalogs: unplugin-icons: specifier: ^0.22.0 version: 0.22.0 + unplugin-typegpu: + specifier: 0.8.0 + version: 0.8.0 unplugin-vue-components: specifier: ^0.28.0 version: 0.28.0 @@ -318,8 +330,8 @@ importers: specifier: ^1.3.1 version: 1.3.1 '@comfyorg/comfyui-electron-types': - specifier: 0.4.73-0 - version: 0.4.73-0 + specifier: 'catalog:' + version: 0.5.5 '@comfyorg/design-system': specifier: workspace:* version: link:packages/design-system @@ -461,6 +473,9 @@ importers: tiptap-markdown: specifier: ^0.8.10 version: 0.8.10(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + typegpu: + specifier: 'catalog:' + version: 0.8.2 vue: specifier: 'catalog:' version: 3.5.13(typescript@5.9.2) @@ -558,6 +573,9 @@ importers: '@vue/test-utils': specifier: 'catalog:' version: 2.4.6 + '@webgpu/types': + specifier: 'catalog:' + version: 0.1.66 cross-env: specifier: 'catalog:' version: 10.1.0 @@ -669,6 +687,9 @@ importers: unplugin-icons: specifier: 'catalog:' version: 0.22.0(@vue/compiler-sfc@3.5.13) + unplugin-typegpu: + specifier: 'catalog:' + version: 0.8.0(typegpu@0.8.2) unplugin-vue-components: specifier: 'catalog:' version: 0.28.0(@babel/parser@7.28.4)(rollup@4.22.4)(vue@3.5.13(typescript@5.9.2)) @@ -709,8 +730,8 @@ importers: apps/desktop-ui: dependencies: '@comfyorg/comfyui-electron-types': - specifier: 0.4.73-0 - version: 0.4.73-0 + specifier: 'catalog:' + version: 0.5.5 '@comfyorg/shared-frontend-utils': specifier: workspace:* version: link:../../packages/shared-frontend-utils @@ -1428,6 +1449,10 @@ packages: resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} + '@babel/standalone@7.28.5': + resolution: {integrity: sha512-1DViPYJpRU50irpGMfLBQ9B4kyfQuL6X7SS7pwTeWeZX0mNkjzPi0XFqxCjSdddZXUQy4AhnQnnesA/ZHnvAdw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -1453,8 +1478,8 @@ packages: '@cacheable/utils@2.0.3': resolution: {integrity: sha512-m7Rce68cMHlAUjvWBy9Ru1Nmw5gU0SjGGtQDdhpe6E0xnbcvrIY0Epy//JU1VYYBUTzrG9jvgmTauULGKzOkWA==} - '@comfyorg/comfyui-electron-types@0.4.73-0': - resolution: {integrity: sha512-WlItGJQx9ZWShNG9wypx3kq+19pSig/U+s5sD2SAeEcMph4u8A/TS+lnRgdKhT58VT1uD7cMcj2SJpfdBPNWvw==} + '@comfyorg/comfyui-electron-types@0.5.5': + resolution: {integrity: sha512-f3XOXpMsALIwHakz7FekVPm4/Fh2pvJPEi8tRe8jYGBt8edsd4Mkkq31Yjs2Weem3BP7yNwbdNuSiQdP/pxJyg==} '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} @@ -3787,8 +3812,8 @@ packages: peerDependencies: vue: ^3.5.0 - '@webgpu/types@0.1.51': - resolution: {integrity: sha512-ktR3u64NPjwIViNCck+z9QeyN0iPkQCUOQ07ZCV1RzlkfP+olLTeEZ95O1QHS+v4w9vJeY9xj/uJuSphsHy5rQ==} + '@webgpu/types@0.1.66': + resolution: {integrity: sha512-YA2hLrwLpDsRueNDXIMqN9NTzD6bCDkuXbOSe0heS+f8YE8usA6Gbv1prj81pzVHrbaAma7zObnIC+I6/sXJgA==} '@xstate/fsm@1.6.5': resolution: {integrity: sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw==} @@ -4413,6 +4438,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -6032,6 +6060,10 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + magic-string-ast@1.0.3: + resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==} + engines: {node: '>=20.19.0'} + magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} @@ -7000,6 +7032,11 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -7095,6 +7132,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -7395,6 +7437,14 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyest-for-wgsl@0.1.3: + resolution: {integrity: sha512-Wm5ADG1UyDxykf42S1gLYP4U9e1QP/TdtJeovQi6y68zttpiFLKqQGioHmPs9Mjysh7YMSAr/Lpuk0cD2MVdGA==} + engines: {node: '>=12.20.0'} + + tinyest@0.1.2: + resolution: {integrity: sha512-aHRmouyowIq1P5jrTF+YK6pGX+WuvFtSCLbqk91yHnU3SWQRIcNIamZLM5XF6lLqB13AWz0PGPXRff2QGDsxIg==} + engines: {node: '>=12.20.0'} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -7521,6 +7571,13 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typed-binary@4.3.2: + resolution: {integrity: sha512-HT3pIBM2njCZUmeczDaQUUErGiM6GXFCqMsHegE12HCoBtvHCkfR10JJni0TeGOTnLilTd6YFyj+YhflqQDrDQ==} + + typegpu@0.8.2: + resolution: {integrity: sha512-wkMJWhJE0pSkw2G/FesjqjbtHkREyOKu1Zmyj19xfmaX5+65YFwgfQNKSK8CxqN4kJkP7JFelLDJTSYY536TYg==} + engines: {node: '>=12.20.0'} + typescript-eslint@8.44.0: resolution: {integrity: sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -7625,6 +7682,11 @@ packages: vue-template-es2015-compiler: optional: true + unplugin-typegpu@0.8.0: + resolution: {integrity: sha512-VJHdXSXGOkAx0WhwFczhVUjAI6HyDkrQXk20HnwyuzIE3FdqE5l9sJTCYZzoVGo3z8i/IA5TMHCDzzP0Bc97Cw==} + peerDependencies: + typegpu: ^0.8.0 + unplugin-vue-components@0.28.0: resolution: {integrity: sha512-jiTGtJ3JsRFBjgvyilfrX7yUoGKScFgbdNw+6p6kEXU+Spf/rhxzgvdfuMcvhCcLmflB/dY3pGQshYBVGOUx7Q==} engines: {node: '>=14'} @@ -7815,8 +7877,8 @@ packages: vue-component-type-helpers@3.1.1: resolution: {integrity: sha512-B0kHv7qX6E7+kdc5nsaqjdGZ1KwNKSUQDWGy7XkTYT7wFsOpkEyaJ1Vq79TjwrrtuLRgizrTV7PPuC4rRQo+vw==} - vue-component-type-helpers@3.1.3: - resolution: {integrity: sha512-V1dOD8XYfstOKCnXbWyEJIrhTBMwSyNjv271L1Jlx9ExpNlCSuqOs3OdWrGJ0V544zXufKbcYabi/o+gK8lyfQ==} + vue-component-type-helpers@3.1.4: + resolution: {integrity: sha512-Uws7Ew1OzTTqHW8ZVl/qLl/HB+jf08M0NdFONbVWAx0N4gMLK8yfZDgeB77hDnBmaigWWEn5qP8T9BG59jIeyQ==} vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} @@ -8953,6 +9015,8 @@ snapshots: '@babel/runtime@7.28.4': {} + '@babel/standalone@7.28.5': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -8992,7 +9056,7 @@ snapshots: '@cacheable/utils@2.0.3': {} - '@comfyorg/comfyui-electron-types@0.4.73-0': {} + '@comfyorg/comfyui-electron-types@0.5.5': {} '@csstools/color-helpers@5.1.0': {} @@ -10617,7 +10681,7 @@ snapshots: storybook: 9.1.6(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@5.4.19(@types/node@20.14.10)(lightningcss@1.30.1)(terser@5.39.2)) type-fest: 2.19.0 vue: 3.5.13(typescript@5.9.2) - vue-component-type-helpers: 3.1.3 + vue-component-type-helpers: 3.1.4 '@swc/helpers@0.5.17': dependencies: @@ -10989,7 +11053,7 @@ snapshots: '@types/react@19.1.9': dependencies: - csstype: 3.1.3 + csstype: 3.2.3 '@types/semver@7.7.0': {} @@ -11000,7 +11064,7 @@ snapshots: '@tweenjs/tween.js': 23.1.3 '@types/stats.js': 0.17.3 '@types/webxr': 0.5.20 - '@webgpu/types': 0.1.51 + '@webgpu/types': 0.1.66 fflate: 0.8.2 meshoptimizer: 0.18.1 @@ -11503,7 +11567,7 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.9.2) - '@webgpu/types@0.1.51': {} + '@webgpu/types@0.1.66': {} '@xstate/fsm@1.6.5': {} @@ -12168,6 +12232,8 @@ snapshots: csstype@3.1.3: {} + csstype@3.2.3: {} + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -12594,7 +12660,7 @@ snapshots: dependencies: debug: 3.2.7 is-core-module: 2.16.1 - resolve: 1.22.10 + resolve: 1.22.11 transitivePeerDependencies: - supports-color optional: true @@ -13740,7 +13806,7 @@ snapshots: acorn: 8.15.0 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.7.2 + semver: 7.7.3 jsonc-parser@3.2.0: {} @@ -13982,6 +14048,10 @@ snapshots: lz-string@1.5.0: {} + magic-string-ast@1.0.3: + dependencies: + magic-string: 0.30.19 + magic-string@0.30.19: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -15345,6 +15415,13 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + optional: true + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -15449,6 +15526,8 @@ snapshots: semver@7.7.2: {} + semver@7.7.3: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -15837,6 +15916,12 @@ snapshots: tinybench@2.9.0: {} + tinyest-for-wgsl@0.1.3: + dependencies: + tinyest: 0.1.2 + + tinyest@0.1.2: {} + tinyexec@0.3.2: {} tinyexec@1.0.1: {} @@ -15968,6 +16053,13 @@ snapshots: reflect.getprototypeof: 1.0.10 optional: true + typed-binary@4.3.2: {} + + typegpu@0.8.2: + dependencies: + tinyest: 0.1.2 + typed-binary: 4.3.2 + typescript-eslint@8.44.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.9.2): dependencies: '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.35.0(jiti@2.4.2))(typescript@5.9.2) @@ -16063,6 +16155,19 @@ snapshots: transitivePeerDependencies: - supports-color + unplugin-typegpu@0.8.0(typegpu@0.8.2): + dependencies: + '@babel/standalone': 7.28.5 + defu: 6.1.4 + estree-walker: 3.0.3 + magic-string-ast: 1.0.3 + pathe: 2.0.3 + picomatch: 4.0.3 + tinyest: 0.1.2 + tinyest-for-wgsl: 0.1.3 + typegpu: 0.8.2 + unplugin: 2.3.5 + 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 @@ -16343,7 +16448,7 @@ snapshots: vue-component-type-helpers@3.1.1: {} - vue-component-type-helpers@3.1.3: {} + vue-component-type-helpers@3.1.4: {} vue-demi@0.14.10(vue@3.5.13(typescript@5.9.2)): dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d2d081e89..03b59cd17 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,6 +4,7 @@ packages: catalog: '@alloc/quick-lru': ^5.2.0 + '@comfyorg/comfyui-electron-types': 0.5.5 '@eslint/js': ^9.35.0 '@iconify-json/lucide': ^1.1.178 '@iconify/json': ^2.2.380 @@ -42,6 +43,7 @@ catalog: '@vue/test-utils': ^2.4.6 '@vueuse/core': ^11.0.0 '@vueuse/integrations': ^13.9.0 + '@webgpu/types': ^0.1.66 algoliasearch: ^5.21.0 axios: ^1.8.2 cross-env: ^10.1.0 @@ -82,9 +84,11 @@ catalog: tailwindcss-primeui: ^0.6.1 tsx: ^4.15.6 tw-animate-css: ^1.3.8 + typegpu: ^0.8.2 typescript: ^5.9.2 typescript-eslint: ^8.44.0 unplugin-icons: ^0.22.0 + unplugin-typegpu: 0.8.0 unplugin-vue-components: ^0.28.0 vite: ^5.4.19 vite-plugin-dts: ^4.5.4 diff --git a/src/components/actionbar/ComfyRunButton/ComfyQueueButton.vue b/src/components/actionbar/ComfyRunButton/ComfyQueueButton.vue index 2b57b2439..db28d980c 100644 --- a/src/components/actionbar/ComfyRunButton/ComfyQueueButton.vue +++ b/src/components/actionbar/ComfyRunButton/ComfyQueueButton.vue @@ -10,7 +10,6 @@ severity="primary" size="small" :model="queueModeMenuItems" - :disabled="hasMissingNodes" data-testid="queue-button" @click="queuePrompt" > @@ -32,46 +31,12 @@ - -