Let every thumbwheel accept typed values and line the image dials up.

Drop the how-to copy under duration and CFG, keep only the CFG default, and label megapixels so that wheel sits on the same row as steps.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Towsty
2026-09-01 19:11:02 -05:00
co-authored by Cursor
parent 0ab42f488b
commit 8b414044cd
3 changed files with 18 additions and 34 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
<template> <template>
<div class="w-[6.5rem] min-w-0"> <div class="w-[6.5rem] min-w-0">
<div v-if="label" class="mb-1.5 text-[10px] font-medium uppercase tracking-wider text-zinc-500">{{ label }}</div> <div class="mb-1.5 min-h-[1.25rem] text-[10px] font-medium uppercase tracking-wider text-zinc-500">{{ label || '\u00a0' }}</div>
<button <button
type="button" type="button"
role="switch" role="switch"
+2 -2
View File
@@ -1,6 +1,6 @@
<template> <template>
<div class="min-w-0" :class="[disabled ? 'opacity-50' : '', unit ? 'w-[7.25rem]' : 'w-[6.5rem]']"> <div class="min-w-0" :class="[disabled ? 'opacity-50' : '', unit ? 'w-[7.25rem]' : 'w-[6.5rem]']">
<div v-if="label" class="mb-1.5 text-[10px] font-medium uppercase tracking-wider text-zinc-500">{{ label }}</div> <div class="mb-1.5 min-h-[1.25rem] text-[10px] font-medium uppercase tracking-wider text-zinc-500">{{ label || '\u00a0' }}</div>
<div <div
class="overflow-hidden rounded-2xl border bg-zinc-950" class="overflow-hidden rounded-2xl border bg-zinc-950"
:class="locked ? 'border-amber-300/35' : 'border-white/10'" :class="locked ? 'border-amber-300/35' : 'border-white/10'"
@@ -123,7 +123,7 @@ const props = withDefaults(defineProps<{
disabled: false, disabled: false,
compact: false, compact: false,
digits: 1, digits: 1,
editable: false, editable: true,
unit: '', unit: '',
dragRange: 0 dragRange: 0
}) })
+15 -31
View File
@@ -847,21 +847,18 @@
</div> </div>
<div> <div>
<AspectRatioPick :model-value="aspect" heading="Aspect ratio" :options="imageAspects" @update:model-value="setImageAspect" /> <AspectRatioPick :model-value="aspect" heading="Aspect ratio" :options="imageAspects" @update:model-value="setImageAspect" />
<p class="mt-2 text-xs text-zinc-500">{{ imageAspectHelp }}</p>
</div> </div>
<div v-if="v2Mode === 'refine' || (v2Engine === 'krea' && v2Mode !== 'generate')" class="space-y-2 rounded-2xl border border-white/10 bg-zinc-950/40 p-3"> <div v-if="v2Mode === 'refine' || (v2Engine === 'krea' && v2Mode !== 'generate')" class="space-y-2 rounded-2xl border border-white/10 bg-zinc-950/40 p-3">
<label class="block text-sm"> <Thumbwheel
<span class="mb-1 block text-zinc-300">Strength (denoise)</span> v-model="v2Denoise"
<Thumbwheel label="Strength"
v-model="v2Denoise" lock-key="v2-denoise"
lock-key="v2-denoise" :min="IMAGE_V2_DENOISE_MIN"
:min="IMAGE_V2_DENOISE_MIN" :max="IMAGE_V2_DENOISE_MAX"
:max="IMAGE_V2_DENOISE_MAX" :step="IMAGE_V2_DENOISE_STEP"
:step="IMAGE_V2_DENOISE_STEP" :digits="2"
:digits="2" compact
compact />
/>
</label>
<div v-if="v2Mode === 'refine'" class="flex flex-wrap gap-2"> <div v-if="v2Mode === 'refine'" class="flex flex-wrap gap-2">
<button <button
type="button" type="button"
@@ -915,7 +912,7 @@
<LampToggle :model-value="v2ScaleOn" label="Scale to MP" @update:model-value="setV2ScaleOn" /> <LampToggle :model-value="v2ScaleOn" label="Scale to MP" @update:model-value="setV2ScaleOn" />
<Thumbwheel <Thumbwheel
v-model="v2Megapixels" v-model="v2Megapixels"
aria-label="Megapixels" label="Megapixels"
lock-key="megapixels" lock-key="megapixels"
:min="IMAGE_SCALE_MP_MIN" :min="IMAGE_SCALE_MP_MIN"
:max="IMAGE_SCALE_MP_MAX" :max="IMAGE_SCALE_MP_MAX"
@@ -953,7 +950,6 @@
<p class="text-xs text-zinc-500">Legacy Klein v1 still. New Image work uses Flux / Krea above. This graph stays for older library stills.</p> <p class="text-xs text-zinc-500">Legacy Klein v1 still. New Image work uses Flux / Krea above. This graph stays for older library stills.</p>
<div> <div>
<AspectRatioPick :model-value="aspect" heading="Aspect ratio" :options="imageAspects" @update:model-value="setImageAspect" /> <AspectRatioPick :model-value="aspect" heading="Aspect ratio" :options="imageAspects" @update:model-value="setImageAspect" />
<p class="mt-2 text-xs text-zinc-500">{{ imageAspectHelp }}</p>
</div> </div>
<div class="max-w-md space-y-2"> <div class="max-w-md space-y-2">
<LoraSelect <LoraSelect
@@ -1029,24 +1025,21 @@
</div> </div>
<div v-if="studioMode === 'video'" class="space-y-4"> <div v-if="studioMode === 'video'" class="space-y-4">
<div class="grid grid-cols-1 gap-3 sm:grid-cols-2"> <div class="grid grid-cols-1 items-start gap-3 sm:grid-cols-2">
<DurationField <DurationField
v-model="duration" v-model="duration"
label="Duration" label="Duration"
:hint="shotScriptMode
? 'This length applies to the initial shot and every extension in the script. Tap the digits to type.'
: 'Tap the digits to type. Hover and scroll ±0.1s, Shift-scroll ±1s. Drag the wheel.'"
/> />
<div class="text-sm"> <div>
<Thumbwheel <Thumbwheel
v-model="cfg" v-model="cfg"
label="CFG / Guidance scale" label="CFG"
:min="CFG_MIN" :min="CFG_MIN"
:max="CFG_MAX" :max="CFG_MAX"
:step="CFG_STEP" :step="CFG_STEP"
@update:model-value="cfgTouched = true" @update:model-value="cfgTouched = true"
/> />
<p class="mt-1 text-[11px] text-zinc-500">{{ ltxVideo ? 'Default 3.5 for PinkCherry' : (turbo ? 'Default 1.5 with Turbo LoRA' : 'Default 4.0 with High-Fidelity') }}.</p> <p class="mt-1 text-[11px] text-zinc-500">{{ ltxVideo ? 'Default 3.5' : (turbo ? 'Default 1.5' : 'Default 4.0') }}</p>
</div> </div>
</div> </div>
<label class="block text-sm"> <label class="block text-sm">
@@ -1436,7 +1429,6 @@
<DurationField <DurationField
v-model="extendDuration" v-model="extendDuration"
label="Extension duration" label="Extension duration"
hint="Tap the digits to type. Hover and scroll ±0.1s, Shift-scroll ±1s."
/> />
<LoraSelect <LoraSelect
v-model="extendLoraStack" v-model="extendLoraStack"
@@ -2424,14 +2416,6 @@ const imageAspects = computed(() => {
{ id: '1:1' as const, label: '1:1 Square', hint: generate ? '1024 × 1024' : 'Fill extra edges — no stretch' } { id: '1:1' as const, label: '1:1 Square', hint: generate ? '1024 × 1024' : 'Fill extra edges — no stretch' }
] ]
}) })
const imageAspectHelp = computed(() => {
if (studioMode.value === 'editv2' && v2Mode.value === 'generate') {
const size = generateSizeForAspect(aspect.value)
return `Empty canvas ${size.width} × ${size.height}. Nothing is stretched.`
}
if (aspect.value === 'auto') return 'Output keeps the still’s aspect ratio. No padding.'
return 'The still stays as-is. New edges are generated to fill the frame — no squish or stretch.'
})
const imageFillWithoutPrompt = computed(() => ( const imageFillWithoutPrompt = computed(() => (
aspect.value !== 'auto' aspect.value !== 'auto'
&& (studioMode.value === 'edit' || (studioMode.value === 'editv2' && v2Mode.value !== 'generate')) && (studioMode.value === 'edit' || (studioMode.value === 'editv2' && v2Mode.value !== 'generate'))