mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
ui: add labels to prompt boxes
This commit is contained in:
parent
6c927a9fd4
commit
4dbf851741
@ -1023,7 +1023,7 @@
|
|||||||
"patchmatchDownScaleSize": "Downscale",
|
"patchmatchDownScaleSize": "Downscale",
|
||||||
"perlinNoise": "Perlin Noise",
|
"perlinNoise": "Perlin Noise",
|
||||||
"positivePromptPlaceholder": "Positive Prompt",
|
"positivePromptPlaceholder": "Positive Prompt",
|
||||||
"globalPositivePromptPlaceholder": "or, start typing your prompt here...",
|
"globalPositivePromptPlaceholder": "Global Positive Prompt",
|
||||||
"iterations": "Iterations",
|
"iterations": "Iterations",
|
||||||
"scale": "Scale",
|
"scale": "Scale",
|
||||||
"scaleBeforeProcessing": "Scale Before Processing",
|
"scaleBeforeProcessing": "Scale Before Processing",
|
||||||
@ -1708,6 +1708,7 @@
|
|||||||
"noMatchingTemplates": "No matching templates",
|
"noMatchingTemplates": "No matching templates",
|
||||||
"placeholderDirections": "Use the button to specify where your manual prompt should be included in the template. If you do not provide one, the template will be appended to your prompt.",
|
"placeholderDirections": "Use the button to specify where your manual prompt should be included in the template. If you do not provide one, the template will be appended to your prompt.",
|
||||||
"positivePrompt": "Positive Prompt",
|
"positivePrompt": "Positive Prompt",
|
||||||
|
"preview": "Preview",
|
||||||
"searchByName": "Search by name",
|
"searchByName": "Search by name",
|
||||||
"templateDeleted": "Prompt template deleted",
|
"templateDeleted": "Prompt template deleted",
|
||||||
"toggleViewMode": "Toggle View Mode",
|
"toggleViewMode": "Toggle View Mode",
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { Box, Textarea } from '@invoke-ai/ui-library';
|
import { Box, Textarea } from '@invoke-ai/ui-library';
|
||||||
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||||
import { negativePromptChanged } from 'features/controlLayers/store/controlLayersSlice';
|
import { negativePromptChanged } from 'features/controlLayers/store/controlLayersSlice';
|
||||||
|
import { PromptLabel } from 'features/parameters/components/Prompts/PromptLabel';
|
||||||
import { PromptOverlayButtonWrapper } from 'features/parameters/components/Prompts/PromptOverlayButtonWrapper';
|
import { PromptOverlayButtonWrapper } from 'features/parameters/components/Prompts/PromptOverlayButtonWrapper';
|
||||||
import { ViewModePrompt } from 'features/parameters/components/Prompts/ViewModePrompt';
|
import { ViewModePrompt } from 'features/parameters/components/Prompts/ViewModePrompt';
|
||||||
import { AddPromptTriggerButton } from 'features/prompt/AddPromptTriggerButton';
|
import { AddPromptTriggerButton } from 'features/prompt/AddPromptTriggerButton';
|
||||||
@ -48,18 +49,26 @@ export const ParamNegativePrompt = memo(() => {
|
|||||||
name="negativePrompt"
|
name="negativePrompt"
|
||||||
ref={textareaRef}
|
ref={textareaRef}
|
||||||
value={prompt}
|
value={prompt}
|
||||||
placeholder={t('parameters.globalNegativePromptPlaceholder')}
|
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
onKeyDown={onKeyDown}
|
onKeyDown={onKeyDown}
|
||||||
fontSize="sm"
|
fontSize="sm"
|
||||||
variant="darkFilled"
|
variant="darkFilled"
|
||||||
paddingRight={30}
|
minH={24}
|
||||||
|
paddingRight={10}
|
||||||
|
paddingLeft={3}
|
||||||
|
paddingTop={7}
|
||||||
|
paddingBottom={3}
|
||||||
/>
|
/>
|
||||||
<PromptOverlayButtonWrapper>
|
<PromptOverlayButtonWrapper>
|
||||||
<AddPromptTriggerButton isOpen={isOpen} onOpen={onOpen} />
|
<AddPromptTriggerButton isOpen={isOpen} onOpen={onOpen} />
|
||||||
</PromptOverlayButtonWrapper>
|
</PromptOverlayButtonWrapper>
|
||||||
|
<PromptLabel label={t('parameters.negativePromptPlaceholder')} />
|
||||||
{viewMode && (
|
{viewMode && (
|
||||||
<ViewModePrompt prompt={prompt} presetPrompt={activeStylePreset?.preset_data.negative_prompt || ''} />
|
<ViewModePrompt
|
||||||
|
prompt={prompt}
|
||||||
|
presetPrompt={activeStylePreset?.preset_data.negative_prompt || ''}
|
||||||
|
label={`${t('parameters.negativePromptPlaceholder')} (${t('stylePresets.preview')})`}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
</PromptPopover>
|
</PromptPopover>
|
||||||
|
@ -2,6 +2,7 @@ import { Box, Textarea } from '@invoke-ai/ui-library';
|
|||||||
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||||
import { positivePromptChanged } from 'features/controlLayers/store/controlLayersSlice';
|
import { positivePromptChanged } from 'features/controlLayers/store/controlLayersSlice';
|
||||||
import { ShowDynamicPromptsPreviewButton } from 'features/dynamicPrompts/components/ShowDynamicPromptsPreviewButton';
|
import { ShowDynamicPromptsPreviewButton } from 'features/dynamicPrompts/components/ShowDynamicPromptsPreviewButton';
|
||||||
|
import { PromptLabel } from 'features/parameters/components/Prompts/PromptLabel';
|
||||||
import { PromptOverlayButtonWrapper } from 'features/parameters/components/Prompts/PromptOverlayButtonWrapper';
|
import { PromptOverlayButtonWrapper } from 'features/parameters/components/Prompts/PromptOverlayButtonWrapper';
|
||||||
import { ViewModePrompt } from 'features/parameters/components/Prompts/ViewModePrompt';
|
import { ViewModePrompt } from 'features/parameters/components/Prompts/ViewModePrompt';
|
||||||
import { AddPromptTriggerButton } from 'features/prompt/AddPromptTriggerButton';
|
import { AddPromptTriggerButton } from 'features/prompt/AddPromptTriggerButton';
|
||||||
@ -63,20 +64,27 @@ export const ParamPositivePrompt = memo(() => {
|
|||||||
name="prompt"
|
name="prompt"
|
||||||
ref={textareaRef}
|
ref={textareaRef}
|
||||||
value={prompt}
|
value={prompt}
|
||||||
placeholder={t('parameters.globalPositivePromptPlaceholder')}
|
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
minH={28}
|
minH={40}
|
||||||
onKeyDown={onKeyDown}
|
onKeyDown={onKeyDown}
|
||||||
variant="darkFilled"
|
variant="darkFilled"
|
||||||
paddingRight={30}
|
paddingRight={10}
|
||||||
|
paddingLeft={3}
|
||||||
|
paddingTop={7}
|
||||||
|
paddingBottom={3}
|
||||||
/>
|
/>
|
||||||
<PromptOverlayButtonWrapper>
|
<PromptOverlayButtonWrapper>
|
||||||
<AddPromptTriggerButton isOpen={isOpen} onOpen={onOpen} />
|
<AddPromptTriggerButton isOpen={isOpen} onOpen={onOpen} />
|
||||||
{baseModel === 'sdxl' && <SDXLConcatButton />}
|
{baseModel === 'sdxl' && <SDXLConcatButton />}
|
||||||
<ShowDynamicPromptsPreviewButton />
|
<ShowDynamicPromptsPreviewButton />
|
||||||
</PromptOverlayButtonWrapper>
|
</PromptOverlayButtonWrapper>
|
||||||
|
<PromptLabel label={t('parameters.positivePromptPlaceholder')} />
|
||||||
{viewMode && (
|
{viewMode && (
|
||||||
<ViewModePrompt prompt={prompt} presetPrompt={activeStylePreset?.preset_data.positive_prompt || ''} />
|
<ViewModePrompt
|
||||||
|
prompt={prompt}
|
||||||
|
presetPrompt={activeStylePreset?.preset_data.positive_prompt || ''}
|
||||||
|
label={`${t('parameters.positivePromptPlaceholder')} (${t('stylePresets.preview')})`}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
</PromptPopover>
|
</PromptPopover>
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
import { FormLabel } from '@invoke-ai/ui-library';
|
||||||
|
|
||||||
|
export const PromptLabel = ({ label }: { label: string }) => {
|
||||||
|
return (
|
||||||
|
<FormLabel color="base.450" fontSize="xs" pos="absolute" top={2} left={3}>
|
||||||
|
{label}
|
||||||
|
</FormLabel>
|
||||||
|
);
|
||||||
|
};
|
@ -6,7 +6,17 @@ import { useCallback, useMemo } from 'react';
|
|||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { PiEyeBold } from 'react-icons/pi';
|
import { PiEyeBold } from 'react-icons/pi';
|
||||||
|
|
||||||
export const ViewModePrompt = ({ presetPrompt, prompt }: { presetPrompt: string; prompt: string }) => {
|
import { PromptLabel } from './PromptLabel';
|
||||||
|
|
||||||
|
export const ViewModePrompt = ({
|
||||||
|
presetPrompt,
|
||||||
|
prompt,
|
||||||
|
label,
|
||||||
|
}: {
|
||||||
|
presetPrompt: string;
|
||||||
|
prompt: string;
|
||||||
|
label: string;
|
||||||
|
}) => {
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
@ -20,13 +30,23 @@ export const ViewModePrompt = ({ presetPrompt, prompt }: { presetPrompt: string;
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Box position="absolute" top={0} bottom={0} left={0} right={0} layerStyle="second" borderRadius="base">
|
<Box position="absolute" top={0} bottom={0} left={0} right={0} layerStyle="second" borderRadius="base">
|
||||||
<Flex flexDir="column" onClick={handleExitViewMode} justifyContent="space-between" h="full" padding="8px 10px">
|
<Flex
|
||||||
|
flexDir="column"
|
||||||
|
onClick={handleExitViewMode}
|
||||||
|
justifyContent="space-between"
|
||||||
|
h="full"
|
||||||
|
paddingRight={3}
|
||||||
|
paddingLeft={3}
|
||||||
|
paddingTop={7}
|
||||||
|
paddingBottom={3}
|
||||||
|
>
|
||||||
|
<PromptLabel label={label} />
|
||||||
<Flex overflow="scroll">
|
<Flex overflow="scroll">
|
||||||
<Text fontSize="sm" lineHeight="1rem" w="full">
|
<Text w="full">
|
||||||
{presetChunks.map((chunk, index) => (
|
{presetChunks.map((chunk, index) => (
|
||||||
<Text
|
<Text
|
||||||
as="span"
|
as="span"
|
||||||
color={index === 1 ? 'white' : 'base.300'}
|
color={index === 1 ? 'white' : 'base.200'}
|
||||||
fontWeight={index === 1 ? 'semibold' : 'normal'}
|
fontWeight={index === 1 ? 'semibold' : 'normal'}
|
||||||
key={index}
|
key={index}
|
||||||
>
|
>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { Box, Textarea } from '@invoke-ai/ui-library';
|
import { Box, Textarea } from '@invoke-ai/ui-library';
|
||||||
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||||
import { negativePrompt2Changed } from 'features/controlLayers/store/controlLayersSlice';
|
import { negativePrompt2Changed } from 'features/controlLayers/store/controlLayersSlice';
|
||||||
|
import { PromptLabel } from 'features/parameters/components/Prompts/PromptLabel';
|
||||||
import { PromptOverlayButtonWrapper } from 'features/parameters/components/Prompts/PromptOverlayButtonWrapper';
|
import { PromptOverlayButtonWrapper } from 'features/parameters/components/Prompts/PromptOverlayButtonWrapper';
|
||||||
import { AddPromptTriggerButton } from 'features/prompt/AddPromptTriggerButton';
|
import { AddPromptTriggerButton } from 'features/prompt/AddPromptTriggerButton';
|
||||||
import { PromptPopover } from 'features/prompt/PromptPopover';
|
import { PromptPopover } from 'features/prompt/PromptPopover';
|
||||||
@ -36,16 +37,20 @@ export const ParamSDXLNegativeStylePrompt = memo(() => {
|
|||||||
name="prompt"
|
name="prompt"
|
||||||
ref={textareaRef}
|
ref={textareaRef}
|
||||||
value={prompt}
|
value={prompt}
|
||||||
placeholder={t('sdxl.negStylePrompt')}
|
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
onKeyDown={onKeyDown}
|
onKeyDown={onKeyDown}
|
||||||
fontSize="sm"
|
fontSize="sm"
|
||||||
variant="darkFilled"
|
variant="darkFilled"
|
||||||
paddingRight={30}
|
minH={24}
|
||||||
|
paddingRight={10}
|
||||||
|
paddingLeft={3}
|
||||||
|
paddingTop={7}
|
||||||
|
paddingBottom={3}
|
||||||
/>
|
/>
|
||||||
<PromptOverlayButtonWrapper>
|
<PromptOverlayButtonWrapper>
|
||||||
<AddPromptTriggerButton isOpen={isOpen} onOpen={onOpen} />
|
<AddPromptTriggerButton isOpen={isOpen} onOpen={onOpen} />
|
||||||
</PromptOverlayButtonWrapper>
|
</PromptOverlayButtonWrapper>
|
||||||
|
<PromptLabel label={t('sdxl.negStylePrompt')} />
|
||||||
</Box>
|
</Box>
|
||||||
</PromptPopover>
|
</PromptPopover>
|
||||||
);
|
);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { Box, Textarea } from '@invoke-ai/ui-library';
|
import { Box, Textarea } from '@invoke-ai/ui-library';
|
||||||
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||||
import { positivePrompt2Changed } from 'features/controlLayers/store/controlLayersSlice';
|
import { positivePrompt2Changed } from 'features/controlLayers/store/controlLayersSlice';
|
||||||
|
import { PromptLabel } from 'features/parameters/components/Prompts/PromptLabel';
|
||||||
import { PromptOverlayButtonWrapper } from 'features/parameters/components/Prompts/PromptOverlayButtonWrapper';
|
import { PromptOverlayButtonWrapper } from 'features/parameters/components/Prompts/PromptOverlayButtonWrapper';
|
||||||
import { AddPromptTriggerButton } from 'features/prompt/AddPromptTriggerButton';
|
import { AddPromptTriggerButton } from 'features/prompt/AddPromptTriggerButton';
|
||||||
import { PromptPopover } from 'features/prompt/PromptPopover';
|
import { PromptPopover } from 'features/prompt/PromptPopover';
|
||||||
@ -33,16 +34,20 @@ export const ParamSDXLPositiveStylePrompt = memo(() => {
|
|||||||
name="prompt"
|
name="prompt"
|
||||||
ref={textareaRef}
|
ref={textareaRef}
|
||||||
value={prompt}
|
value={prompt}
|
||||||
placeholder={t('sdxl.posStylePrompt')}
|
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
onKeyDown={onKeyDown}
|
onKeyDown={onKeyDown}
|
||||||
fontSize="sm"
|
fontSize="sm"
|
||||||
variant="darkFilled"
|
variant="darkFilled"
|
||||||
paddingRight={30}
|
minH={24}
|
||||||
|
paddingRight={10}
|
||||||
|
paddingLeft={3}
|
||||||
|
paddingTop={7}
|
||||||
|
paddingBottom={3}
|
||||||
/>
|
/>
|
||||||
<PromptOverlayButtonWrapper>
|
<PromptOverlayButtonWrapper>
|
||||||
<AddPromptTriggerButton isOpen={isOpen} onOpen={onOpen} />
|
<AddPromptTriggerButton isOpen={isOpen} onOpen={onOpen} />
|
||||||
</PromptOverlayButtonWrapper>
|
</PromptOverlayButtonWrapper>
|
||||||
|
<PromptLabel label={t('sdxl.posStylePrompt')} />
|
||||||
</Box>
|
</Box>
|
||||||
</PromptPopover>
|
</PromptPopover>
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user