diff --git a/invokeai/frontend/web/src/common/components/InformationalPopover/constants.ts b/invokeai/frontend/web/src/common/components/InformationalPopover/constants.ts index bdcd1ca9a4..2e88c28df6 100644 --- a/invokeai/frontend/web/src/common/components/InformationalPopover/constants.ts +++ b/invokeai/frontend/web/src/common/components/InformationalPopover/constants.ts @@ -13,28 +13,46 @@ export type Feature = | 'compositingCoherenceSteps' | 'compositingStrength' | 'compositingMaskAdjustments' + | 'controlNet' | 'controlNetBeginEnd' | 'controlNetControlMode' + | 'controlNetProcessor' | 'controlNetResizeMode' - | 'controlNet' | 'controlNetWeight' | 'dynamicPrompts' | 'dynamicPromptsMaxPrompts' | 'dynamicPromptsSeedBehaviour' + | 'imageFit' | 'infillMethod' | 'lora' + | 'loraWeight' | 'noiseUseCPU' + | 'paramAspect' | 'paramCFGScale' | 'paramCFGRescaleMultiplier' | 'paramDenoisingStrength' + | 'paramHeight' + | 'paramHrf' | 'paramIterations' | 'paramModel' | 'paramRatio' | 'paramSeed' | 'paramSteps' + | 'paramUpscaleMethod' | 'paramVAE' | 'paramVAEPrecision' - | 'scaleBeforeProcessing'; + | 'paramWidth' + | 'patchmatchDownScaleSize' + | 'refinerModel' + | 'refinerNegativeAestheticScore' + | 'refinerPositiveAestheticScore' + | 'refinerScheduler' + | 'refinerStart' + | 'refinerSteps' + | 'refinerCfgScale' + | 'scaleBeforeProcessing' + | 'seamlessTilingXAxis' + | 'seamlessTilingYAxis'; export type PopoverData = PopoverProps & { image?: string; @@ -46,21 +64,57 @@ export const POPOVER_DATA: { [key in Feature]?: PopoverData } = { paramNegativeConditioning: { placement: 'right', }, + clipSkip: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings', + }, controlNet: { href: 'https://support.invoke.ai/support/solutions/articles/151000105880', }, + controlNetBeginEnd: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178148', + }, + controlNetWeight: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178148', + }, lora: { href: 'https://support.invoke.ai/support/solutions/articles/151000159072', }, + loraWeight: { + href: 'https://support.invoke.ai/support/solutions/articles/151000159072-concepts-low-rank-adaptations-loras-', + }, + compositingBlur: { + href: 'https://support.invoke.ai/support/solutions/articles/151000158838-compositing-settings', + }, + compositingBlurMethod: { + href: 'https://support.invoke.ai/support/solutions/articles/151000158838-compositing-settings', + }, compositingCoherenceMode: { - href: 'https://support.invoke.ai/support/solutions/articles/151000158838', + href: 'https://support.invoke.ai/support/solutions/articles/151000158838-compositing-settings', + }, + compositingCoherenceSteps: { + href: 'https://support.invoke.ai/support/solutions/articles/151000158838-compositing-settings', + }, + compositingStrength: { + href: 'https://support.invoke.ai/support/solutions/articles/151000158838-compositing-settings', }, infillMethod: { - href: 'https://support.invoke.ai/support/solutions/articles/151000158841', + href: 'https://support.invoke.ai/support/solutions/articles/151000158841-infill-and-scaling', }, scaleBeforeProcessing: { href: 'https://support.invoke.ai/support/solutions/articles/151000158841', }, + paramCFGScale: { + href: 'https://www.youtube.com/watch?v=1OeHEJrsTpI', + }, + paramCFGRescaleMultiplier: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings', + }, + paramDenoisingStrength: { + href: 'https://support.invoke.ai/support/solutions/articles/151000094998-image-to-image', + }, + paramHrf: { + href: 'https://support.invoke.ai/support/solutions/articles/151000096700-how-can-i-get-larger-images-what-does-upscaling-do-', + }, paramIterations: { href: 'https://support.invoke.ai/support/solutions/articles/151000159073', }, @@ -70,7 +124,10 @@ export const POPOVER_DATA: { [key in Feature]?: PopoverData } = { }, paramScheduler: { placement: 'right', - href: 'https://support.invoke.ai/support/solutions/articles/151000159073', + href: 'https://www.youtube.com/watch?v=1OeHEJrsTpI', + }, + paramSeed: { + href: 'https://support.invoke.ai/support/solutions/articles/151000096684-what-is-a-seed-how-do-i-use-it-to-recreate-the-same-image-', }, paramModel: { placement: 'right', @@ -81,15 +138,53 @@ export const POPOVER_DATA: { [key in Feature]?: PopoverData } = { }, controlNetControlMode: { placement: 'right', + href: 'https://support.invoke.ai/support/solutions/articles/151000178148', + }, + controlNetProcessor: { + placement: 'right', + href: 'https://support.invoke.ai/support/solutions/articles/151000105880-using-controlnet', }, controlNetResizeMode: { placement: 'right', + href: 'https://support.invoke.ai/support/solutions/articles/151000178148', }, paramVAE: { placement: 'right', + href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings', }, paramVAEPrecision: { placement: 'right', + href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings', + }, + paramUpscaleMethod: { + href: 'https://support.invoke.ai/support/solutions/articles/151000096700-how-can-i-get-larger-images-what-does-upscaling-do-', + }, + refinerModel: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner', + }, + refinerNegativeAestheticScore: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner', + }, + refinerPositiveAestheticScore: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner', + }, + refinerScheduler: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner', + }, + refinerStart: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner', + }, + refinerSteps: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner', + }, + refinerCfgScale: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178333-using-the-refiner', + }, + seamlessTilingXAxis: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings', + }, + seamlessTilingYAxis: { + href: 'https://support.invoke.ai/support/solutions/articles/151000178161-advanced-settings', }, } as const; diff --git a/invokeai/frontend/web/src/features/controlAdapters/components/parameters/ParamControlAdapterBeginEnd.tsx b/invokeai/frontend/web/src/features/controlAdapters/components/parameters/ParamControlAdapterBeginEnd.tsx index a62f7e7d8a..245c182b9f 100644 --- a/invokeai/frontend/web/src/features/controlAdapters/components/parameters/ParamControlAdapterBeginEnd.tsx +++ b/invokeai/frontend/web/src/features/controlAdapters/components/parameters/ParamControlAdapterBeginEnd.tsx @@ -1,5 +1,6 @@ import { CompositeRangeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { useAppDispatch } from 'app/store/storeHooks'; +import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { useControlAdapterBeginEndStepPct } from 'features/controlAdapters/hooks/useControlAdapterBeginEndStepPct'; import { useControlAdapterIsEnabled } from 'features/controlAdapters/hooks/useControlAdapterIsEnabled'; import { @@ -61,12 +62,10 @@ export const ParamControlAdapterBeginEnd = memo(({ id }: Props) => { } return ( - - {t('controlnet.beginEndStepPercent')} + + + {t('controlnet.beginEndStepPercent')} + { } return ( - {t('controlnet.processor')} + + {t('controlnet.processor')} + ); diff --git a/invokeai/frontend/web/src/features/hrf/components/ParamHrfMethod.tsx b/invokeai/frontend/web/src/features/hrf/components/ParamHrfMethod.tsx index 8a94544233..65f65240fc 100644 --- a/invokeai/frontend/web/src/features/hrf/components/ParamHrfMethod.tsx +++ b/invokeai/frontend/web/src/features/hrf/components/ParamHrfMethod.tsx @@ -1,6 +1,7 @@ import type { ComboboxOnChange, ComboboxOption } from '@invoke-ai/ui-library'; import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { setHrfMethod } from 'features/hrf/store/hrfSlice'; import { isParameterHRFMethod } from 'features/parameters/types/parameterSchemas'; import { memo, useCallback, useMemo } from 'react'; @@ -30,7 +31,9 @@ const ParamHrfMethodSelect = () => { return ( - {t('hrf.upscaleMethod')} + + {t('hrf.upscaleMethod')} + ); diff --git a/invokeai/frontend/web/src/features/hrf/components/ParamHrfStrength.tsx b/invokeai/frontend/web/src/features/hrf/components/ParamHrfStrength.tsx index c663989b08..3cb9f7e528 100644 --- a/invokeai/frontend/web/src/features/hrf/components/ParamHrfStrength.tsx +++ b/invokeai/frontend/web/src/features/hrf/components/ParamHrfStrength.tsx @@ -1,5 +1,6 @@ import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { setHrfStrength } from 'features/hrf/store/hrfSlice'; import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; @@ -25,7 +26,9 @@ const ParamHrfStrength = () => { return ( - {t('parameters.denoisingStrength')} + + {`${t('parameters.denoisingStrength')}`} + { return ( - {t('hrf.enableHrf')} + + {t('hrf.enableHrf')} + ); diff --git a/invokeai/frontend/web/src/features/lora/components/LoRACard.tsx b/invokeai/frontend/web/src/features/lora/components/LoRACard.tsx index caedde875a..28bd8afe95 100644 --- a/invokeai/frontend/web/src/features/lora/components/LoRACard.tsx +++ b/invokeai/frontend/web/src/features/lora/components/LoRACard.tsx @@ -10,6 +10,7 @@ import { Text, } from '@invoke-ai/ui-library'; import { useAppDispatch } from 'app/store/storeHooks'; +import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import type { LoRA } from 'features/lora/store/loraSlice'; import { loraIsEnabledChanged, loraRemoved, loraWeightChanged } from 'features/lora/store/loraSlice'; import { memo, useCallback } from 'react'; @@ -57,29 +58,31 @@ export const LoRACard = memo((props: LoRACardProps) => { - - - - + + + + + + ); }); diff --git a/invokeai/frontend/web/src/features/lora/components/LoRASelect.tsx b/invokeai/frontend/web/src/features/lora/components/LoRASelect.tsx index 30ef99d2f7..ed70a4d44a 100644 --- a/invokeai/frontend/web/src/features/lora/components/LoRASelect.tsx +++ b/invokeai/frontend/web/src/features/lora/components/LoRASelect.tsx @@ -2,6 +2,7 @@ import type { ChakraProps } from '@invoke-ai/ui-library'; import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { createMemoizedSelector } from 'app/store/createMemoizedSelector'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox'; import { loraAdded, selectLoraSlice } from 'features/lora/store/loraSlice'; import { memo, useCallback, useMemo } from 'react'; @@ -57,7 +58,9 @@ const LoRASelect = () => { return ( - {t('models.lora')} + + {t('models.lora')} + { return ( - {t('parameters.patchmatchDownScaleSize')} + + {t('parameters.patchmatchDownScaleSize')} + { return ( - {t('parameters.height')} + + {t('parameters.height')} + { return ( - {t('parameters.width')} + + {t('parameters.width')} + { return ( - {t('parameters.aspect')} + + {t('parameters.aspect')} + ); diff --git a/invokeai/frontend/web/src/features/parameters/components/ImageToImage/ImageToImageFit.tsx b/invokeai/frontend/web/src/features/parameters/components/ImageToImage/ImageToImageFit.tsx index 9c41b2d56c..a772daa177 100644 --- a/invokeai/frontend/web/src/features/parameters/components/ImageToImage/ImageToImageFit.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/ImageToImage/ImageToImageFit.tsx @@ -1,6 +1,7 @@ import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library'; import type { RootState } from 'app/store/store'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { setShouldFitToWidthHeight } from 'features/parameters/store/generationSlice'; import type { ChangeEvent } from 'react'; import { memo, useCallback } from 'react'; @@ -22,7 +23,9 @@ const ImageToImageFit = () => { return ( - {t('parameters.imageFit')} + + {t('parameters.imageFit')} + ); diff --git a/invokeai/frontend/web/src/features/parameters/components/MainModel/ParamMainModelSelect.tsx b/invokeai/frontend/web/src/features/parameters/components/MainModel/ParamMainModelSelect.tsx index 13e03962b4..c6c77b5fe9 100644 --- a/invokeai/frontend/web/src/features/parameters/components/MainModel/ParamMainModelSelect.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/MainModel/ParamMainModelSelect.tsx @@ -1,6 +1,7 @@ -import { Combobox, FormControl, FormLabel, Tooltip } from '@invoke-ai/ui-library'; +import { Box, Combobox, FormControl, FormLabel, Tooltip } from '@invoke-ai/ui-library'; import { createMemoizedSelector } from 'app/store/createMemoizedSelector'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox'; import { modelSelected } from 'features/parameters/store/actions'; import { selectGenerationSlice } from 'features/parameters/store/generationSlice'; @@ -41,18 +42,22 @@ const ParamMainModelSelect = () => { }); return ( - - + + {t('modelManager.model')} - - - + + + + + + + ); }; diff --git a/invokeai/frontend/web/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx b/invokeai/frontend/web/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx index b66293580a..739cf7d83f 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx @@ -1,5 +1,6 @@ import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { setSeamlessXAxis } from 'features/parameters/store/generationSlice'; import type { ChangeEvent } from 'react'; import { memo, useCallback } from 'react'; @@ -20,7 +21,9 @@ const ParamSeamlessXAxis = () => { return ( - {t('parameters.seamlessXAxis')} + + {t('parameters.seamlessXAxis')} + ); diff --git a/invokeai/frontend/web/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx b/invokeai/frontend/web/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx index e983565476..455e50b90f 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx @@ -1,5 +1,6 @@ import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { setSeamlessYAxis } from 'features/parameters/store/generationSlice'; import type { ChangeEvent } from 'react'; import { memo, useCallback } from 'react'; @@ -18,7 +19,9 @@ const ParamSeamlessYAxis = () => { return ( - {t('parameters.seamlessYAxis')} + + {t('parameters.seamlessYAxis')} + ); diff --git a/invokeai/frontend/web/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx b/invokeai/frontend/web/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx index 9f3bf33848..a4409955cc 100644 --- a/invokeai/frontend/web/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx +++ b/invokeai/frontend/web/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx @@ -1,5 +1,6 @@ import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { setRefinerCFGScale } from 'features/sdxl/store/sdxlSlice'; import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -21,7 +22,9 @@ const ParamSDXLRefinerCFGScale = () => { return ( - {t('sdxl.cfgScale')} + + {t('sdxl.cfgScale')} + { }); return ( - {t('sdxl.refinermodel')} + + {t('sdxl.refinermodel')} + { return ( - {t('sdxl.negAestheticScore')} + + {t('sdxl.negAestheticScore')} + { return ( - {t('sdxl.posAestheticScore')} + + {t('sdxl.posAestheticScore')} + { return ( - {t('sdxl.scheduler')} + + {t('sdxl.scheduler')} + ); diff --git a/invokeai/frontend/web/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerStart.tsx b/invokeai/frontend/web/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerStart.tsx index c2eea5d925..fd7b1f89cf 100644 --- a/invokeai/frontend/web/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerStart.tsx +++ b/invokeai/frontend/web/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerStart.tsx @@ -1,5 +1,6 @@ import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { setRefinerStart } from 'features/sdxl/store/sdxlSlice'; import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; @@ -12,7 +13,9 @@ const ParamSDXLRefinerStart = () => { return ( - {t('sdxl.refinerStart')} + + {t('sdxl.refinerStart')} + { return ( - {t('sdxl.steps')} + + {t('sdxl.steps')} +