Merge remote-tracking branch 'origin/main' into feat-widget-label-props

This commit is contained in:
Csongor Czezar
2026-01-06 15:26:59 -08:00
8 changed files with 7246 additions and 7011 deletions

View File

@@ -1,7 +1,7 @@
{
"name": "@comfyorg/comfyui-frontend",
"private": true,
"version": "1.37.3",
"version": "1.37.4",
"type": "module",
"repository": "https://github.com/Comfy-Org/ComfyUI_frontend",
"homepage": "https://comfy.org",

View File

@@ -52,7 +52,31 @@
class="pb-1 px-2 2xl:px-4"
:show-generation-time-sort="activeTab === 'output'"
/>
<Divider type="dashed" class="my-2" />
<div
v-if="isQueuePanelV2Enabled"
class="flex items-center justify-between px-2 py-2 2xl:px-4"
>
<span class="text-sm text-muted-foreground">
{{ activeJobsLabel }}
</span>
<div class="flex items-center gap-2">
<span class="text-sm text-base-foreground">
{{ t('sideToolbar.queueProgressOverlay.clearQueueTooltip') }}
</span>
<Button
variant="destructive"
size="icon"
:aria-label="
t('sideToolbar.queueProgressOverlay.clearQueueTooltip')
"
:disabled="queuedCount === 0"
@click="handleClearQueue"
>
<i class="icon-[lucide--list-x] size-4" />
</Button>
</div>
</div>
<Divider v-else type="dashed" class="my-2" />
</template>
<template #body>
<div v-if="loading && !displayAssets.length">
@@ -165,7 +189,7 @@
<script setup lang="ts">
import { useDebounceFn, useElementHover, useResizeObserver } from '@vueuse/core'
import { Divider } from 'primevue'
import Divider from 'primevue/divider'
import ProgressSpinner from 'primevue/progressspinner'
import { useToast } from 'primevue/usetoast'
import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
@@ -188,18 +212,26 @@ import { useMediaAssetFiltering } from '@/platform/assets/composables/useMediaAs
import { getOutputAssetMetadata } from '@/platform/assets/schemas/assetMetadataSchema'
import type { AssetItem } from '@/platform/assets/schemas/assetSchema'
import { isCloud } from '@/platform/distribution/types'
import { useSettingStore } from '@/platform/settings/settingStore'
import { useCommandStore } from '@/stores/commandStore'
import { useDialogStore } from '@/stores/dialogStore'
import { ResultItemImpl } from '@/stores/queueStore'
import { ResultItemImpl, useQueueStore } from '@/stores/queueStore'
import { formatDuration, getMediaTypeFromFilename } from '@/utils/formatUtil'
import { cn } from '@/utils/tailwindUtil'
const { t } = useI18n()
const { t, n } = useI18n()
const commandStore = useCommandStore()
const queueStore = useQueueStore()
const settingStore = useSettingStore()
const activeTab = ref<'input' | 'output'>('output')
const folderPromptId = ref<string | null>(null)
const folderExecutionTime = ref<number | undefined>(undefined)
const isInFolderView = computed(() => folderPromptId.value !== null)
const viewMode = ref<'list' | 'grid'>('grid')
const isQueuePanelV2Enabled = computed(() =>
settingStore.get('Comfy.Queue.QPOV2')
)
// Track which asset's context menu is open (for single-instance context menu management)
const openContextMenuId = ref<string | null>(null)
@@ -228,6 +260,19 @@ const formattedExecutionTime = computed(() => {
return formatDuration(folderExecutionTime.value * 1000)
})
const queuedCount = computed(() => queueStore.pendingTasks.length)
const activeJobsCount = computed(
() => queueStore.pendingTasks.length + queueStore.runningTasks.length
)
const activeJobsLabel = computed(() => {
const count = activeJobsCount.value
return t(
'sideToolbar.queueProgressOverlay.activeJobs',
{ count: n(count) },
count
)
})
const toast = useToast()
const inputAssets = useMediaAssets('input')
@@ -492,6 +537,10 @@ const handleDeleteSelected = async () => {
clearSelection()
}
const handleClearQueue = async () => {
await commandStore.execute('Comfy.ClearPendingTasks')
}
const handleApproachEnd = useDebounceFn(async () => {
if (
activeTab.value === 'output' &&

View File

@@ -227,6 +227,9 @@
"Comfy_PublishSubgraph": {
"label": "Publish Subgraph"
},
"Comfy_Queue_ToggleOverlay": {
"label": "Toggle Job History"
},
"Comfy_QueuePrompt": {
"label": "Queue Prompt"
},

View File

@@ -738,6 +738,7 @@
"filterCurrentWorkflow": "Current workflow",
"sortJobs": "Sort jobs",
"sortBy": "Sort by",
"activeJobs": "{count} active job | {count} active jobs",
"activeJobsSuffix": "active jobs",
"jobQueue": "Job Queue",
"expandCollapsedQueue": "Expand job queue",
@@ -1154,6 +1155,7 @@
"Manager": "Manager",
"Open": "Open",
"Publish": "Publish",
"Job History": "Job History",
"Queue Prompt": "Queue Prompt",
"Queue Prompt (Front)": "Queue Prompt (Front)",
"Queue Selected Output Nodes": "Queue Selected Output Nodes",

View File

@@ -6079,6 +6079,23 @@
}
}
},
"LTXAVTextEncoderLoader": {
"display_name": "LTXV Audio Text Encoder Loader",
"description": "[Recipes]\n\nltxav: gemma 3 12B",
"inputs": {
"text_encoder": {
"name": "text_encoder"
},
"ckpt_name": {
"name": "ckpt_name"
}
},
"outputs": {
"0": {
"tooltip": null
}
}
},
"LTXVAddGuide": {
"display_name": "LTXVAddGuide",
"inputs": {
@@ -6185,6 +6202,76 @@
}
}
},
"LTXVAudioVAEDecode": {
"display_name": "LTXV Audio VAE Decode",
"inputs": {
"samples": {
"name": "samples",
"tooltip": "The latent to be decoded."
},
"audio_vae": {
"name": "audio_vae",
"tooltip": "The Audio VAE model used for decoding the latent."
}
},
"outputs": {
"0": {
"name": "Audio",
"tooltip": null
}
}
},
"LTXVAudioVAEEncode": {
"display_name": "LTXV Audio VAE Encode",
"inputs": {
"audio": {
"name": "audio",
"tooltip": "The audio to be encoded."
},
"audio_vae": {
"name": "audio_vae",
"tooltip": "The Audio VAE model to use for encoding."
}
},
"outputs": {
"0": {
"name": "Audio Latent",
"tooltip": null
}
}
},
"LTXVAudioVAELoader": {
"display_name": "LTXV Audio VAE Loader",
"inputs": {
"ckpt_name": {
"name": "ckpt_name",
"tooltip": "Audio VAE checkpoint to load."
}
},
"outputs": {
"0": {
"name": "Audio VAE",
"tooltip": null
}
}
},
"LTXVConcatAVLatent": {
"display_name": "LTXVConcatAVLatent",
"inputs": {
"video_latent": {
"name": "video_latent"
},
"audio_latent": {
"name": "audio_latent"
}
},
"outputs": {
"0": {
"name": "latent",
"tooltip": null
}
}
},
"LTXVConditioning": {
"display_name": "LTXVConditioning",
"inputs": {
@@ -6237,6 +6324,33 @@
}
}
},
"LTXVEmptyLatentAudio": {
"display_name": "LTXV Empty Latent Audio",
"inputs": {
"frames_number": {
"name": "frames_number",
"tooltip": "Number of frames."
},
"frame_rate": {
"name": "frame_rate",
"tooltip": "Number of frames per second."
},
"batch_size": {
"name": "batch_size",
"tooltip": "The number of latent audio samples in the batch."
},
"audio_vae": {
"name": "audio_vae",
"tooltip": "The Audio VAE model to get configuration from."
}
},
"outputs": {
"0": {
"name": "Latent",
"tooltip": null
}
}
},
"LTXVImgToVideo": {
"display_name": "LTXVImgToVideo",
"inputs": {
@@ -6283,6 +6397,47 @@
}
}
},
"LTXVImgToVideoInplace": {
"display_name": "LTXVImgToVideoInplace",
"inputs": {
"vae": {
"name": "vae"
},
"image": {
"name": "image"
},
"latent": {
"name": "latent"
},
"strength": {
"name": "strength"
},
"bypass": {
"name": "bypass",
"tooltip": "Bypass the conditioning."
}
},
"outputs": {
"0": {
"name": "latent",
"tooltip": null
}
}
},
"LTXVLatentUpsampler": {
"display_name": "LTXVLatentUpsampler",
"inputs": {
"samples": {
"name": "samples"
},
"upscale_model": {
"name": "upscale_model"
},
"vae": {
"name": "vae"
}
}
},
"LTXVPreprocess": {
"display_name": "LTXVPreprocess",
"inputs": {
@@ -6331,6 +6486,25 @@
}
}
},
"LTXVSeparateAVLatent": {
"display_name": "LTXVSeparateAVLatent",
"description": "LTXV Separate AV Latent",
"inputs": {
"av_latent": {
"name": "av_latent"
}
},
"outputs": {
"0": {
"name": "video_latent",
"tooltip": null
},
"1": {
"name": "audio_latent",
"tooltip": null
}
}
},
"LumaConceptsNode": {
"display_name": "Luma Concepts",
"description": "Camera Concepts for use with Luma Text to Video and Luma Image to Video nodes.",

View File

@@ -80,9 +80,6 @@
"Comfy_Canvas_ToggleMinimap": {
"label": "画布切换小地图"
},
"Comfy_Canvas_ToggleSelected_Pin": {
"label": "固定/取消固定选中项"
},
"Comfy_Canvas_ToggleSelectedNodes_Bypass": {
"label": "忽略/取消忽略选中节点"
},
@@ -95,6 +92,9 @@
"Comfy_Canvas_ToggleSelectedNodes_Pin": {
"label": "固定/取消固定选中节点"
},
"Comfy_Canvas_ToggleSelected_Pin": {
"label": "固定/取消固定选中项"
},
"Comfy_Canvas_Unlock": {
"label": "解锁画布"
},
@@ -290,9 +290,6 @@
"Workspace_ToggleBottomPanel": {
"label": "切换底部面板"
},
"Workspace_ToggleBottomPanel_Shortcuts": {
"label": "显示快捷键对话框"
},
"Workspace_ToggleBottomPanelTab_command-terminal": {
"label": "切换终端底部面板"
},
@@ -305,6 +302,9 @@
"Workspace_ToggleBottomPanelTab_shortcuts-view-controls": {
"label": "切换检视控制底部面板"
},
"Workspace_ToggleBottomPanel_Shortcuts": {
"label": "显示快捷键对话框"
},
"Workspace_ToggleFocusMode": {
"label": "切换焦点模式"
},
@@ -324,4 +324,4 @@
"label": "切换工作流侧边栏",
"tooltip": "工作流"
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff