diff --git a/invokeai/frontend/webv2/public/locales/en.json b/invokeai/frontend/webv2/public/locales/en.json index a98c3237249..35fa8bebfaf 100644 --- a/invokeai/frontend/webv2/public/locales/en.json +++ b/invokeai/frontend/webv2/public/locales/en.json @@ -3110,6 +3110,7 @@ "initialFrames": "Start & End Images", "initialVideo": "Initial Video", "initialVideoBlocked": "Clear the first frame to extend a video instead.", + "initialVideoCapBlocked": "All 3 video reference slots are in use, so there is no room for the continuity reference this clip needs. Remove a video reference first.", "lastFrame": "Last Frame", "lastFrameExtendHelp": "Optional destination: the extension ends on this image.", "lastFrameHelp": "Optional: the video ends on this image (interpolates from the first frame).", @@ -3163,6 +3164,12 @@ "referenceConditioningVideoAudio": "Video + audio", "referenceDetailMatch": "Match generation size", "referenceDetailMax": "Max detail (2048px, slower)", + "referenceExtendCapFull": "Initial video not set", + "referenceExtendCapFullDescription": "All 3 video reference slots are in use, so there is no room for the continuity reference this clip needs. Remove a video reference, then drop the clip again.", + "referenceExtendHelp": "The generated video is appended to this clip at its End Frame. A linked video reference samples up to the last ~5 seconds before that cutpoint for continuity — never more than the generated clip's own length, since the model discards the overrun at the seam. Its trim re-derives whenever the cutpoints or the frame count change.", + "referenceImageCapRace": "All {{max}} image reference slots filled while this one was loading, so it was not added.", + "referenceVideoCapRace": "All {{max}} video reference slots filled while this one was loading, so it was not added.", + "referenceFromInitialVideo": "Initial video", "references": "References", "referencesHelp": "Up to 3 videos and 9 images condition the generation, in order — reordering references changes the result. A video reference can contribute its image track, its soundtrack, or both.", "removeReference": "Remove reference", diff --git a/invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx b/invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx index f53f959cc2b..e1ae5ebed83 100644 --- a/invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx +++ b/invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx @@ -52,7 +52,7 @@ import { Combobox, Field, IconButton, Select, Tooltip } from '@platform/ui'; import { SliderNumberField } from '@platform/ui/SliderNumberField'; import { toaster } from '@platform/ui/toaster'; import { DicesIcon } from 'lucide-react'; -import { memo, useCallback, useMemo } from 'react'; +import { memo, useCallback, useId, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { areInputImagesEquivalent, valuesAreEqual } from './upscaleComparators'; @@ -284,6 +284,13 @@ export const UpscaleWidgetView = () => { [t, values] ); const patch = useCallback((next: Partial) => patchValues(next), [patchValues]); + // Chakra's `Field.Root` hands its single `ids.control` to EVERY control + // inside it, and the seed Field holds the NumberInput, the shuffle button + // and this switch. Without an id of its own the switch's hidden input + // collides with the seed input, so the `