Join pre/prompt/post for Comfy, stop zero-size generates snapping to a small square, and give the phone library a real closeable preview.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Towsty
2026-09-02 20:29:44 -05:00
co-authored by Cursor
parent d471d1bdd6
commit 369eb595d7
11 changed files with 76 additions and 28 deletions
+3 -3
View File
@@ -6686,7 +6686,7 @@ async function editImage() {
if (inputStillId.value) body.append('stillId', inputStillId.value)
if (extraPasses.length) body.append('passes', JSON.stringify(extraPasses))
body.append('passMode', imagePassMode.value)
if (imageLoraStack.value.length) body.append('loraStack', JSON.stringify(imageLoraStack.value))
body.append('loraStack', JSON.stringify(imageLoraStack.value))
const downloadName = clipFileName(clipName.value.trim() || autoOutputName.value)
const started = await $fetch<{
jobId: string
@@ -6942,7 +6942,7 @@ async function editImageV2() {
return
}
}
if (v2Stack.length) body.append('loraStack', JSON.stringify(v2Stack))
body.append('loraStack', JSON.stringify(v2Stack))
const downloadName = clipFileName(clipName.value.trim() || autoOutputName.value)
const started = await $fetch<{
jobId: string
@@ -7154,7 +7154,7 @@ async function generate() {
const shotLoraStacksList = shots
? shots.map(shot => shotLoraStacks.value[shot.n] || [])
: [shotLoraStacks.value[1] || [], ...queued.map(item => item.loraStack || [])]
if (videoLoraStack.value.length) body.append('loraStack', JSON.stringify(videoLoraStack.value))
body.append('loraStack', JSON.stringify(videoLoraStack.value))
body.append('shotLoraStacks', JSON.stringify(shotLoraStacksList))
if (activeDraftId) body.append('draftId', activeDraftId)
if (queued.length) {
+25 -2
View File
@@ -200,8 +200,23 @@
</template>
</section>
<aside class="glass w-full shrink-0 overflow-y-auto rounded-3xl p-4 sm:p-5 lg:h-full lg:w-[22rem]">
<aside
class="glass overflow-y-auto p-4 sm:p-5"
:class="focused
? 'fixed inset-0 z-[60] rounded-none lg:static lg:z-auto lg:h-full lg:w-[22rem] lg:shrink-0 lg:rounded-3xl'
: 'hidden w-full shrink-0 rounded-3xl lg:block lg:h-full lg:w-[22rem]'"
>
<template v-if="focused">
<div class="mb-3 flex items-center justify-between lg:hidden">
<p class="text-sm text-zinc-400">Preview</p>
<button
type="button"
class="rounded-full border border-white/20 bg-zinc-950 px-3 py-1.5 text-sm text-amber-100"
@click="clearFocus"
>
Close
</button>
</div>
<div class="relative overflow-hidden rounded-2xl bg-zinc-900">
<span v-if="detailsHidden" class="sensitive-glow block aspect-video w-full" />
<video
@@ -494,7 +509,7 @@ const previewVideo = computed(() => {
const previewStillSrc = computed(() => {
if (focused.value?.kind !== 'still' || !focused.value.stillGroup) return ''
const id = focusedPartId.value || focused.value.stillGroup.head.id
return `/api/library/stills/${id}?thumb=1`
return `/api/library/stills/${id}`
})
const focusedParts = computed(() => {
if (focused.value?.kind === 'clip') return focused.value.group?.parts || []
@@ -719,6 +734,13 @@ function clearSelection() {
lastSelectedKey.value = ''
}
function clearFocus() {
focusedKey.value = ''
focusedPartId.value = ''
detailsHidden.value = false
cancelRename()
}
function selectAll() {
selectedKeys.value = entries.value.map(entry => entry.key)
lastSelectedKey.value = selectedKeys.value.at(-1) || ''
@@ -978,6 +1000,7 @@ function onKey(event: KeyboardEvent) {
if (event.key === 'Escape') {
if (pendingDelete.value) pendingDelete.value = null
else if (renaming.value) cancelRename()
else if (focusedKey.value) clearFocus()
else clearSelection()
}
if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'a' && !renaming.value) {