From de9219c888c5dd3016f89ac9c9e610f502273d6b Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Tue, 12 Aug 2025 15:25:58 +1000 Subject: [PATCH 1/3] feat(ui): remove SDXL style prompt from linear UI This feature added a lot of unexpected complexity in graph building / metadata recall and is unintuitive user experience. 99% of the time, the style prompt should be exactly the main prompt. You can still use style prompts in workflows, but in an effort to reduce complexity in the linear UI, we are removing this rarely-used feature. --- .../controlLayers/store/paramsSlice.ts | 15 ---- .../src/features/controlLayers/store/types.ts | 8 -- .../ImageMetadataActions.tsx | 2 - .../gallery/hooks/useRecallPrompts.ts | 7 +- .../web/src/features/metadata/parsing.tsx | 75 +------------------ .../graph/buildMultidiffusionUpscaleGraph.ts | 13 +--- .../util/graph/generation/buildSDXLGraph.ts | 13 +--- .../nodes/util/graph/graphBuilderUtils.ts | 8 +- .../components/Core/ParamPositivePrompt.tsx | 4 - .../parameters/components/Prompts/Prompts.tsx | 17 +---- .../components/Prompts/UpscalePrompts.tsx | 17 +---- .../parameters/types/parameterSchemas.ts | 10 --- .../ParamSDXLNegativeStylePrompt.tsx | 65 ---------------- .../ParamSDXLPositiveStylePrompt.tsx | 65 ---------------- .../SDXLPrompts/SDXLConcatButton.tsx | 37 --------- 15 files changed, 11 insertions(+), 345 deletions(-) delete mode 100644 invokeai/frontend/web/src/features/sdxl/components/SDXLPrompts/ParamSDXLNegativeStylePrompt.tsx delete mode 100644 invokeai/frontend/web/src/features/sdxl/components/SDXLPrompts/ParamSDXLPositiveStylePrompt.tsx delete mode 100644 invokeai/frontend/web/src/features/sdxl/components/SDXLPrompts/SDXLConcatButton.tsx diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts index 50e7d630856..ce087e0660b 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts @@ -181,15 +181,6 @@ const slice = createSlice({ negativePromptChanged: (state, action: PayloadAction) => { state.negativePrompt = action.payload; }, - positivePrompt2Changed: (state, action: PayloadAction) => { - state.positivePrompt2 = action.payload; - }, - negativePrompt2Changed: (state, action: PayloadAction) => { - state.negativePrompt2 = action.payload; - }, - shouldConcatPromptsChanged: (state, action: PayloadAction) => { - state.shouldConcatPrompts = action.payload; - }, refinerModelChanged: (state, action: PayloadAction) => { const result = zParamsState.shape.refinerModel.safeParse(action.payload); if (!result.success) { @@ -425,9 +416,6 @@ export const { shouldUseCpuNoiseChanged, positivePromptChanged, negativePromptChanged, - positivePrompt2Changed, - negativePrompt2Changed, - shouldConcatPromptsChanged, refinerModelChanged, setRefinerSteps, setRefinerCFGScale, @@ -518,9 +506,6 @@ export const selectModelSupportsNegativePrompt = createSelector( [selectIsFLUX, selectIsChatGPT4o, selectIsFluxKontext], (isFLUX, isChatGPT4o, isFluxKontext) => !isFLUX && !isChatGPT4o && !isFluxKontext ); -export const selectPositivePrompt2 = createParamsSelector((params) => params.positivePrompt2); -export const selectNegativePrompt2 = createParamsSelector((params) => params.negativePrompt2); -export const selectShouldConcatPrompts = createParamsSelector((params) => params.shouldConcatPrompts); export const selectScheduler = createParamsSelector((params) => params.scheduler); export const selectSeamlessXAxis = createParamsSelector((params) => params.seamlessXAxis); export const selectSeamlessYAxis = createParamsSelector((params) => params.seamlessYAxis); diff --git a/invokeai/frontend/web/src/features/controlLayers/store/types.ts b/invokeai/frontend/web/src/features/controlLayers/store/types.ts index f771f8c7469..bcae4cb1277 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/types.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/types.ts @@ -14,9 +14,7 @@ import { zParameterMaskBlurMethod, zParameterModel, zParameterNegativePrompt, - zParameterNegativeStylePromptSDXL, zParameterPositivePrompt, - zParameterPositiveStylePromptSDXL, zParameterPrecision, zParameterScheduler, zParameterSDXLRefinerModel, @@ -534,9 +532,6 @@ export const zParamsState = z.object({ shouldUseCpuNoise: z.boolean(), positivePrompt: zParameterPositivePrompt, negativePrompt: zParameterNegativePrompt, - positivePrompt2: zParameterPositiveStylePromptSDXL, - negativePrompt2: zParameterNegativeStylePromptSDXL, - shouldConcatPrompts: z.boolean(), refinerModel: zParameterSDXLRefinerModel.nullable(), refinerSteps: z.number(), refinerCFGScale: z.number(), @@ -584,9 +579,6 @@ export const getInitialParamsState = (): ParamsState => ({ shouldUseCpuNoise: true, positivePrompt: '', negativePrompt: null, - positivePrompt2: '', - negativePrompt2: '', - shouldConcatPrompts: true, refinerModel: null, refinerSteps: 20, refinerCFGScale: 7.5, diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx index 285524ded21..0b7198d16fc 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx @@ -33,8 +33,6 @@ const ImageMetadataActions = (props: Props) => { - - diff --git a/invokeai/frontend/web/src/features/gallery/hooks/useRecallPrompts.ts b/invokeai/frontend/web/src/features/gallery/hooks/useRecallPrompts.ts index a882e4a9e82..b14d0187b95 100644 --- a/invokeai/frontend/web/src/features/gallery/hooks/useRecallPrompts.ts +++ b/invokeai/frontend/web/src/features/gallery/hooks/useRecallPrompts.ts @@ -22,12 +22,7 @@ export const useRecallPrompts = (imageDTO: ImageDTO) => { const parse = async () => { try { const result = await MetadataUtils.hasMetadataByHandlers({ - handlers: [ - MetadataHandlers.PositivePrompt, - MetadataHandlers.NegativePrompt, - MetadataHandlers.PositiveStylePrompt, - MetadataHandlers.NegativeStylePrompt, - ], + handlers: [MetadataHandlers.PositivePrompt, MetadataHandlers.NegativePrompt], metadata, store, require: 'some', diff --git a/invokeai/frontend/web/src/features/metadata/parsing.tsx b/invokeai/frontend/web/src/features/metadata/parsing.tsx index ca66be6e24e..3db8c3022c9 100644 --- a/invokeai/frontend/web/src/features/metadata/parsing.tsx +++ b/invokeai/frontend/web/src/features/metadata/parsing.tsx @@ -9,9 +9,7 @@ import { bboxHeightChanged, bboxWidthChanged, canvasMetadataRecalled } from 'fea import { loraAllDeleted, loraRecalled } from 'features/controlLayers/store/lorasSlice'; import { heightChanged, - negativePrompt2Changed, negativePromptChanged, - positivePrompt2Changed, positivePromptChanged, refinerModelChanged, selectBase, @@ -30,7 +28,6 @@ import { setSeamlessYAxis, setSeed, setSteps, - shouldConcatPromptsChanged, vaeSelected, widthChanged, } from 'features/controlLayers/store/paramsSlice'; @@ -49,7 +46,6 @@ import type { ParameterModel, ParameterNegativePrompt, ParameterPositivePrompt, - ParameterPositiveStylePromptSDXL, ParameterScheduler, ParameterSDXLRefinerModel, ParameterSDXLRefinerNegativeAestheticScore, @@ -70,9 +66,7 @@ import { zParameterGuidance, zParameterImageDimension, zParameterNegativePrompt, - zParameterNegativeStylePromptSDXL, zParameterPositivePrompt, - zParameterPositiveStylePromptSDXL, zParameterScheduler, zParameterSDXLRefinerNegativeAestheticScore, zParameterSDXLRefinerPositiveAestheticScore, @@ -289,46 +283,6 @@ const NegativePrompt: SingleMetadataHandler = { }; //#endregion Negative Prompt -//#region SDXL Positive Style Prompt -const PositiveStylePrompt: SingleMetadataHandler = { - [SingleMetadataKey]: true, - type: 'PositiveStylePrompt', - parse: (metadata, _store) => { - const raw = getProperty(metadata, 'positive_style_prompt'); - const parsed = zParameterPositiveStylePromptSDXL.parse(raw); - return Promise.resolve(parsed); - }, - recall: (value, store) => { - store.dispatch(positivePrompt2Changed(value)); - }, - i18nKey: 'sdxl.posStylePrompt', - LabelComponent: MetadataLabel, - ValueComponent: ({ value }: SingleMetadataValueProps) => ( - - ), -}; -//#endregion SDXL Positive Style Prompt - -//#region SDXL Negative Style Prompt -const NegativeStylePrompt: SingleMetadataHandler = { - [SingleMetadataKey]: true, - type: 'NegativeStylePrompt', - parse: (metadata, _store) => { - const raw = getProperty(metadata, 'negative_style_prompt'); - const parsed = zParameterNegativeStylePromptSDXL.parse(raw); - return Promise.resolve(parsed); - }, - recall: (value, store) => { - store.dispatch(negativePrompt2Changed(value)); - }, - i18nKey: 'sdxl.negStylePrompt', - LabelComponent: MetadataLabel, - ValueComponent: ({ value }: SingleMetadataValueProps) => ( - - ), -}; -//#endregion SDXL Negative Style Prompt - //#region CFG Scale const CFGScale: SingleMetadataHandler = { [SingleMetadataKey]: true, @@ -927,8 +881,6 @@ export const MetadataHandlers = { GenerationMode, PositivePrompt, NegativePrompt, - PositiveStylePrompt, - NegativeStylePrompt, CFGScale, CFGRescaleMultiplier, Guidance, @@ -1052,26 +1004,6 @@ const recallByHandlers = async (arg: { } } - // We may need to update the prompt concat flag based on the recalled prompts - const positivePrompt = recalled.get(MetadataHandlers.PositivePrompt); - const negativePrompt = recalled.get(MetadataHandlers.NegativePrompt); - const positiveStylePrompt = recalled.get(MetadataHandlers.PositiveStylePrompt); - const negativeStylePrompt = recalled.get(MetadataHandlers.NegativeStylePrompt); - - // The values will be undefined if the handler was not recalled - if ( - positivePrompt !== undefined || - negativePrompt !== undefined || - positiveStylePrompt !== undefined || - negativeStylePrompt !== undefined - ) { - const concat = - (Boolean(positiveStylePrompt) && positiveStylePrompt === positivePrompt) || - (Boolean(negativeStylePrompt) && negativeStylePrompt === negativePrompt); - - store.dispatch(shouldConcatPromptsChanged(concat)); - } - if (!silent) { if (recalled.size > 0) { toast({ @@ -1094,12 +1026,7 @@ const recallByHandlers = async (arg: { const recallPrompts = async (metadata: unknown, store: AppStore) => { const recalled = await recallByHandlers({ metadata, - handlers: [ - MetadataHandlers.PositivePrompt, - MetadataHandlers.NegativePrompt, - MetadataHandlers.PositiveStylePrompt, - MetadataHandlers.NegativeStylePrompt, - ], + handlers: [MetadataHandlers.PositivePrompt, MetadataHandlers.NegativePrompt], store, silent: true, }); diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts index a77b0338a08..26db510599c 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts @@ -115,7 +115,7 @@ export const buildMultidiffusionUpscaleGraph = async (state: RootState): Promise type: 'sdxl_compel_prompt', id: getPrefixedId('neg_cond'), prompt: prompts.negative, - style: prompts.negativeStyle, + style: prompts.negative, }); modelLoader = g.addNode({ type: 'sdxl_model_loader', @@ -130,23 +130,14 @@ export const buildMultidiffusionUpscaleGraph = async (state: RootState): Promise g.addEdge(modelLoader, 'unet', tiledMultidiffusion, 'unet'); g.addEdge(positivePrompt, 'value', posCond, 'prompt'); + g.addEdge(positivePrompt, 'value', posCond, 'style'); addSDXLLoRAs(state, g, tiledMultidiffusion, modelLoader, null, posCond, negCond); g.upsertMetadata({ negative_prompt: prompts.negative, - negative_style_prompt: prompts.negativeStyle, }); - g.addEdgeToMetadata(positivePrompt, 'value', 'positive_prompt'); - - if (prompts.useMainPromptsForStyle) { - g.addEdge(positivePrompt, 'value', posCond, 'style'); - g.addEdgeToMetadata(positivePrompt, 'value', 'positive_style_prompt'); - } else { - posCond.style = prompts.positiveStyle; - g.upsertMetadata({ positive_style_prompt: prompts.positiveStyle }); - } } else { const prompts = selectPresetModifiedPrompts(state); diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts index 093ca55a32c..bb9ef2a9bcc 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts @@ -78,7 +78,7 @@ export const buildSDXLGraph = async (arg: GraphBuilderArg): Promise { const negativePrompt = params.negativePrompt ?? ''; - const { positivePrompt, positivePrompt2, negativePrompt2, shouldConcatPrompts } = params; + const { positivePrompt } = params; const { activeStylePresetId } = stylePresetSlice; if (activeStylePresetId) { @@ -107,9 +107,6 @@ export const selectPresetModifiedPrompts = createSelector( return { positive: presetModifiedPositivePrompt, negative: presetModifiedNegativePrompt, - positiveStyle: positivePrompt2, - negativeStyle: negativePrompt2, - useMainPromptsForStyle: shouldConcatPrompts, }; } } @@ -117,9 +114,6 @@ export const selectPresetModifiedPrompts = createSelector( return { positive: positivePrompt, negative: negativePrompt, - positiveStyle: positivePrompt2, - negativeStyle: negativePrompt2, - useMainPromptsForStyle: shouldConcatPrompts, }; } ); diff --git a/invokeai/frontend/web/src/features/parameters/components/Core/ParamPositivePrompt.tsx b/invokeai/frontend/web/src/features/parameters/components/Core/ParamPositivePrompt.tsx index 06b5ee2b815..cd1d92c26be 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Core/ParamPositivePrompt.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Core/ParamPositivePrompt.tsx @@ -4,7 +4,6 @@ import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { usePersistedTextAreaSize } from 'common/hooks/usePersistedTextareaSize'; import { positivePromptChanged, - selectBase, selectModelSupportsNegativePrompt, selectPositivePrompt, } from 'features/controlLayers/store/paramsSlice'; @@ -21,7 +20,6 @@ import { PromptExpansionOverlay } from 'features/prompt/PromptExpansion/PromptEx import { promptExpansionApi } from 'features/prompt/PromptExpansion/state'; import { PromptPopover } from 'features/prompt/PromptPopover'; import { usePrompt } from 'features/prompt/usePrompt'; -import { SDXLConcatButton } from 'features/sdxl/components/SDXLPrompts/SDXLConcatButton'; import { selectStylePresetActivePresetId, selectStylePresetViewMode, @@ -42,7 +40,6 @@ const persistOptions: Parameters[2] = { export const ParamPositivePrompt = memo(() => { const dispatch = useAppDispatch(); const prompt = useAppSelector(selectPositivePrompt); - const baseModel = useAppSelector(selectBase); const viewMode = useAppSelector(selectStylePresetViewMode); const activeStylePresetId = useAppSelector(selectStylePresetActivePresetId); const modelSupportsNegativePrompt = useAppSelector(selectModelSupportsNegativePrompt); @@ -118,7 +115,6 @@ export const ParamPositivePrompt = memo(() => { - {baseModel === 'sdxl' && } {modelSupportsNegativePrompt && } diff --git a/invokeai/frontend/web/src/features/parameters/components/Prompts/Prompts.tsx b/invokeai/frontend/web/src/features/parameters/components/Prompts/Prompts.tsx index b4b3ced89df..efec7a857df 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Prompts/Prompts.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Prompts/Prompts.tsx @@ -1,33 +1,18 @@ import { Flex } from '@invoke-ai/ui-library'; import { useAppSelector } from 'app/store/storeHooks'; import { RefImageList } from 'features/controlLayers/components/RefImage/RefImageList'; -import { - createParamsSelector, - selectHasNegativePrompt, - selectModelSupportsNegativePrompt, -} from 'features/controlLayers/store/paramsSlice'; +import { selectHasNegativePrompt, selectModelSupportsNegativePrompt } from 'features/controlLayers/store/paramsSlice'; import { ParamNegativePrompt } from 'features/parameters/components/Core/ParamNegativePrompt'; import { ParamPositivePrompt } from 'features/parameters/components/Core/ParamPositivePrompt'; -import { ParamSDXLNegativeStylePrompt } from 'features/sdxl/components/SDXLPrompts/ParamSDXLNegativeStylePrompt'; -import { ParamSDXLPositiveStylePrompt } from 'features/sdxl/components/SDXLPrompts/ParamSDXLPositiveStylePrompt'; import { memo } from 'react'; -const selectWithStylePrompts = createParamsSelector((params) => { - const isSDXL = params.model?.base === 'sdxl'; - const shouldConcatPrompts = params.shouldConcatPrompts; - return isSDXL && !shouldConcatPrompts; -}); - export const Prompts = memo(() => { - const withStylePrompts = useAppSelector(selectWithStylePrompts); const modelSupportsNegativePrompt = useAppSelector(selectModelSupportsNegativePrompt); const hasNegativePrompt = useAppSelector(selectHasNegativePrompt); return ( - {withStylePrompts && } {modelSupportsNegativePrompt && hasNegativePrompt && } - {withStylePrompts && } ); diff --git a/invokeai/frontend/web/src/features/parameters/components/Prompts/UpscalePrompts.tsx b/invokeai/frontend/web/src/features/parameters/components/Prompts/UpscalePrompts.tsx index d5c9f13bd6b..51536d867d2 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Prompts/UpscalePrompts.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Prompts/UpscalePrompts.tsx @@ -1,32 +1,17 @@ import { Flex } from '@invoke-ai/ui-library'; import { useAppSelector } from 'app/store/storeHooks'; -import { - createParamsSelector, - selectHasNegativePrompt, - selectModelSupportsNegativePrompt, -} from 'features/controlLayers/store/paramsSlice'; +import { selectHasNegativePrompt, selectModelSupportsNegativePrompt } from 'features/controlLayers/store/paramsSlice'; import { ParamNegativePrompt } from 'features/parameters/components/Core/ParamNegativePrompt'; import { ParamPositivePrompt } from 'features/parameters/components/Core/ParamPositivePrompt'; -import { ParamSDXLNegativeStylePrompt } from 'features/sdxl/components/SDXLPrompts/ParamSDXLNegativeStylePrompt'; -import { ParamSDXLPositiveStylePrompt } from 'features/sdxl/components/SDXLPrompts/ParamSDXLPositiveStylePrompt'; import { memo } from 'react'; -const selectWithStylePrompts = createParamsSelector((params) => { - const isSDXL = params.model?.base === 'sdxl'; - const shouldConcatPrompts = params.shouldConcatPrompts; - return isSDXL && !shouldConcatPrompts; -}); - export const UpscalePrompts = memo(() => { - const withStylePrompts = useAppSelector(selectWithStylePrompts); const modelSupportsNegativePrompt = useAppSelector(selectModelSupportsNegativePrompt); const hasNegativePrompt = useAppSelector(selectHasNegativePrompt); return ( - {withStylePrompts && } {modelSupportsNegativePrompt && hasNegativePrompt && } - {withStylePrompts && } ); }); diff --git a/invokeai/frontend/web/src/features/parameters/types/parameterSchemas.ts b/invokeai/frontend/web/src/features/parameters/types/parameterSchemas.ts index 5421ae162f3..a318c5d6112 100644 --- a/invokeai/frontend/web/src/features/parameters/types/parameterSchemas.ts +++ b/invokeai/frontend/web/src/features/parameters/types/parameterSchemas.ts @@ -33,16 +33,6 @@ export const [zParameterNegativePrompt, isParameterNegativePrompt] = buildParame export type ParameterNegativePrompt = z.infer; // #endregion -// #region Positive style prompt (SDXL) -export const [zParameterPositiveStylePromptSDXL, isParameterPositiveStylePromptSDXL] = buildParameter(z.string()); -export type ParameterPositiveStylePromptSDXL = z.infer; -// #endregion - -// #region Positive style prompt (SDXL) -export const [zParameterNegativeStylePromptSDXL, isParameterNegativeStylePromptSDXL] = buildParameter(z.string()); -export type ParameterNegativeStylePromptSDXL = z.infer; -// #endregion - // #region Steps export const [zParameterSteps, isParameterSteps] = buildParameter(z.number().int().min(1)); export type ParameterSteps = z.infer; diff --git a/invokeai/frontend/web/src/features/sdxl/components/SDXLPrompts/ParamSDXLNegativeStylePrompt.tsx b/invokeai/frontend/web/src/features/sdxl/components/SDXLPrompts/ParamSDXLNegativeStylePrompt.tsx deleted file mode 100644 index 41e57f5416b..00000000000 --- a/invokeai/frontend/web/src/features/sdxl/components/SDXLPrompts/ParamSDXLNegativeStylePrompt.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { Box, Textarea } from '@invoke-ai/ui-library'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { usePersistedTextAreaSize } from 'common/hooks/usePersistedTextareaSize'; -import { negativePrompt2Changed, selectNegativePrompt2 } from 'features/controlLayers/store/paramsSlice'; -import { PromptLabel } from 'features/parameters/components/Prompts/PromptLabel'; -import { PromptOverlayButtonWrapper } from 'features/parameters/components/Prompts/PromptOverlayButtonWrapper'; -import { AddPromptTriggerButton } from 'features/prompt/AddPromptTriggerButton'; -import { PromptPopover } from 'features/prompt/PromptPopover'; -import { usePrompt } from 'features/prompt/usePrompt'; -import { memo, useCallback, useRef } from 'react'; -import { useTranslation } from 'react-i18next'; - -const persistOptions: Parameters[2] = { - trackWidth: false, - trackHeight: true, -}; - -export const ParamSDXLNegativeStylePrompt = memo(() => { - const dispatch = useAppDispatch(); - const prompt = useAppSelector(selectNegativePrompt2); - const textareaRef = useRef(null); - usePersistedTextAreaSize('negative_style_prompt', textareaRef, persistOptions); - - const { t } = useTranslation(); - const handleChange = useCallback( - (v: string) => { - dispatch(negativePrompt2Changed(v)); - }, - [dispatch] - ); - const { onChange, isOpen, onClose, onOpen, onSelect, onKeyDown } = usePrompt({ - prompt, - textareaRef: textareaRef, - onChange: handleChange, - }); - - return ( - - -