mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
Merge branch 'main' into feat/onnx
This commit is contained in:
commit
6ca0c38ee3
BIN
docs/assets/troubleshooting/broken-dependency.png
Normal file
BIN
docs/assets/troubleshooting/broken-dependency.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 131 KiB |
@ -80,11 +80,11 @@ Q&A</a>]
|
|||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
|
|
||||||
This fork is rapidly evolving. Please use the [Issues tab](https://github.com/invoke-ai/InvokeAI/issues) to report bugs and make feature requests. Be sure to use the provided templates. They will help aid diagnose issues faster.
|
This software is rapidly evolving. Please use the [Issues tab](https://github.com/invoke-ai/InvokeAI/issues) to report bugs and make feature requests. Be sure to use the provided templates. They will help aid diagnose issues faster.
|
||||||
|
|
||||||
## :octicons-package-dependencies-24: Installation
|
## :octicons-package-dependencies-24: Installation
|
||||||
|
|
||||||
This fork is supported across Linux, Windows and Macintosh. Linux users can use
|
This software is supported across Linux, Windows and Macintosh. Linux users can use
|
||||||
either an Nvidia-based card (with CUDA support) or an AMD card (using the ROCm
|
either an Nvidia-based card (with CUDA support) or an AMD card (using the ROCm
|
||||||
driver).
|
driver).
|
||||||
|
|
||||||
@ -95,6 +95,8 @@ driver).
|
|||||||
This method is recommended for experienced users and developers
|
This method is recommended for experienced users and developers
|
||||||
#### [Docker Installation](installation/040_INSTALL_DOCKER.md)
|
#### [Docker Installation](installation/040_INSTALL_DOCKER.md)
|
||||||
This method is recommended for those familiar with running Docker containers
|
This method is recommended for those familiar with running Docker containers
|
||||||
|
#### [Installation Troubleshooting](installation/010_INSTALL_AUTOMATED.md#troubleshooting)
|
||||||
|
Installation troubleshooting guide.
|
||||||
### Other Installation Guides
|
### Other Installation Guides
|
||||||
- [PyPatchMatch](installation/060_INSTALL_PATCHMATCH.md)
|
- [PyPatchMatch](installation/060_INSTALL_PATCHMATCH.md)
|
||||||
- [XFormers](installation/070_INSTALL_XFORMERS.md)
|
- [XFormers](installation/070_INSTALL_XFORMERS.md)
|
||||||
@ -230,7 +232,7 @@ encouraged to do so.
|
|||||||
|
|
||||||
## :octicons-person-24: Contributors
|
## :octicons-person-24: Contributors
|
||||||
|
|
||||||
This fork is a combined effort of various people from across the world.
|
This software is a combined effort of various people from across the world.
|
||||||
[Check out the list of all these amazing people](other/CONTRIBUTORS.md). We
|
[Check out the list of all these amazing people](other/CONTRIBUTORS.md). We
|
||||||
thank them for their time, hard work and effort.
|
thank them for their time, hard work and effort.
|
||||||
|
|
||||||
|
@ -372,8 +372,71 @@ experimental versions later.
|
|||||||
Once InvokeAI is installed, do not move or remove this directory."
|
Once InvokeAI is installed, do not move or remove this directory."
|
||||||
|
|
||||||
|
|
||||||
|
<a name="troubleshooting"></a>
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
|
### _OSErrors on Windows while installing dependencies_
|
||||||
|
|
||||||
|
During a zip file installation or an online update, installation stops
|
||||||
|
with an error like this:
|
||||||
|
|
||||||
|
![broken-dependency-screenshot](../assets/troubleshooting/broken-dependency.png){:width="800px"}
|
||||||
|
|
||||||
|
This seems to happen particularly often with the `pydantic` and
|
||||||
|
`numpy` packages. The most reliable solution requires several manual
|
||||||
|
steps to complete installation.
|
||||||
|
|
||||||
|
Open up a Powershell window and navigate to the `invokeai` directory
|
||||||
|
created by the installer. Then give the following series of commands:
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
rm .\.venv -r -force
|
||||||
|
python -mvenv .venv
|
||||||
|
.\.venv\Scripts\activate
|
||||||
|
pip install invokeai
|
||||||
|
invokeai-configure --root .
|
||||||
|
```
|
||||||
|
|
||||||
|
If you see anything marked as an error during this process please stop
|
||||||
|
and seek help on the Discord [installation support
|
||||||
|
channel](https://discord.com/channels/1020123559063990373/1041391462190956654). A
|
||||||
|
few warning messages are OK.
|
||||||
|
|
||||||
|
If you are updating from a previous version, this should restore your
|
||||||
|
system to a working state. If you are installing from scratch, there
|
||||||
|
is one additional command to give:
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
wget -O invoke.bat https://raw.githubusercontent.com/invoke-ai/InvokeAI/main/installer/templates/invoke.bat.in
|
||||||
|
```
|
||||||
|
|
||||||
|
This will create the `invoke.bat` script needed to launch InvokeAI and
|
||||||
|
its related programs.
|
||||||
|
|
||||||
|
|
||||||
|
### _Stable Diffusion XL Generation Fails after Trying to Load unet_
|
||||||
|
|
||||||
|
InvokeAI is working in other respects, but when trying to generate
|
||||||
|
images with Stable Diffusion XL you get a "Server Error". The text log
|
||||||
|
in the launch window contains this log line above several more lines of
|
||||||
|
error messages:
|
||||||
|
|
||||||
|
```INFO --> Loading model:D:\LONG\PATH\TO\MODEL, type sdxl:main:unet```
|
||||||
|
|
||||||
|
This failure mode occurs when there is a network glitch during
|
||||||
|
downloading the very large SDXL model.
|
||||||
|
|
||||||
|
To address this, first go to the Web Model Manager and delete the
|
||||||
|
Stable-Diffusion-XL-base-1.X model. Then navigate to HuggingFace and
|
||||||
|
manually download the .safetensors version of the model. The 1.0
|
||||||
|
version is located at
|
||||||
|
https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main
|
||||||
|
and the file is named `sd_xl_base_1.0.safetensors`.
|
||||||
|
|
||||||
|
Save this file to disk and then reenter the Model Manager. Navigate to
|
||||||
|
Import Models->Add Model, then type (or drag-and-drop) the path to the
|
||||||
|
.safetensors file. Press "Add Model".
|
||||||
|
|
||||||
### _Package dependency conflicts_
|
### _Package dependency conflicts_
|
||||||
|
|
||||||
If you have previously installed InvokeAI or another Stable Diffusion
|
If you have previously installed InvokeAI or another Stable Diffusion
|
||||||
|
@ -292,15 +292,16 @@ class SDXLTextToLatentsInvocation(BaseInvocation):
|
|||||||
)
|
)
|
||||||
|
|
||||||
num_inference_steps = self.steps
|
num_inference_steps = self.steps
|
||||||
scheduler.set_timesteps(num_inference_steps)
|
|
||||||
timesteps = scheduler.timesteps
|
|
||||||
|
|
||||||
latents = latents * scheduler.init_noise_sigma
|
|
||||||
|
|
||||||
unet_info = context.services.model_manager.get_model(**self.unet.unet.dict(), context=context)
|
unet_info = context.services.model_manager.get_model(**self.unet.unet.dict(), context=context)
|
||||||
do_classifier_free_guidance = True
|
do_classifier_free_guidance = True
|
||||||
cross_attention_kwargs = None
|
cross_attention_kwargs = None
|
||||||
with unet_info as unet:
|
with unet_info as unet:
|
||||||
|
scheduler.set_timesteps(num_inference_steps, device=unet.device)
|
||||||
|
timesteps = scheduler.timesteps
|
||||||
|
|
||||||
|
latents = latents.to(device=unet.device, dtype=unet.dtype) * scheduler.init_noise_sigma
|
||||||
|
|
||||||
extra_step_kwargs = dict()
|
extra_step_kwargs = dict()
|
||||||
if "eta" in set(inspect.signature(scheduler.step).parameters.keys()):
|
if "eta" in set(inspect.signature(scheduler.step).parameters.keys()):
|
||||||
extra_step_kwargs.update(
|
extra_step_kwargs.update(
|
||||||
@ -537,27 +538,28 @@ class SDXLLatentsToLatentsInvocation(BaseInvocation):
|
|||||||
scheduler_name=self.scheduler,
|
scheduler_name=self.scheduler,
|
||||||
)
|
)
|
||||||
|
|
||||||
# apply denoising_start
|
|
||||||
num_inference_steps = self.steps
|
|
||||||
scheduler.set_timesteps(num_inference_steps)
|
|
||||||
|
|
||||||
t_start = int(round(self.denoising_start * num_inference_steps))
|
|
||||||
timesteps = scheduler.timesteps[t_start * scheduler.order :]
|
|
||||||
num_inference_steps = num_inference_steps - t_start
|
|
||||||
|
|
||||||
# apply noise(if provided)
|
|
||||||
if self.noise is not None and timesteps.shape[0] > 0:
|
|
||||||
noise = context.services.latents.get(self.noise.latents_name)
|
|
||||||
latents = scheduler.add_noise(latents, noise, timesteps[:1])
|
|
||||||
del noise
|
|
||||||
|
|
||||||
unet_info = context.services.model_manager.get_model(
|
unet_info = context.services.model_manager.get_model(
|
||||||
**self.unet.unet.dict(),
|
**self.unet.unet.dict(),
|
||||||
context=context,
|
context=context,
|
||||||
)
|
)
|
||||||
|
|
||||||
do_classifier_free_guidance = True
|
do_classifier_free_guidance = True
|
||||||
cross_attention_kwargs = None
|
cross_attention_kwargs = None
|
||||||
with unet_info as unet:
|
with unet_info as unet:
|
||||||
|
# apply denoising_start
|
||||||
|
num_inference_steps = self.steps
|
||||||
|
scheduler.set_timesteps(num_inference_steps, device=unet.device)
|
||||||
|
|
||||||
|
t_start = int(round(self.denoising_start * num_inference_steps))
|
||||||
|
timesteps = scheduler.timesteps[t_start * scheduler.order :]
|
||||||
|
num_inference_steps = num_inference_steps - t_start
|
||||||
|
|
||||||
|
# apply noise(if provided)
|
||||||
|
if self.noise is not None and timesteps.shape[0] > 0:
|
||||||
|
noise = context.services.latents.get(self.noise.latents_name)
|
||||||
|
latents = scheduler.add_noise(latents, noise, timesteps[:1])
|
||||||
|
del noise
|
||||||
|
|
||||||
# apply scheduler extra args
|
# apply scheduler extra args
|
||||||
extra_step_kwargs = dict()
|
extra_step_kwargs = dict()
|
||||||
if "eta" in set(inspect.signature(scheduler.step).parameters.keys()):
|
if "eta" in set(inspect.signature(scheduler.step).parameters.keys()):
|
||||||
|
169
invokeai/frontend/web/dist/assets/App-d6f88f50.js
vendored
Normal file
169
invokeai/frontend/web/dist/assets/App-d6f88f50.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
invokeai/frontend/web/dist/assets/MantineProvider-c592f969.js
vendored
Normal file
1
invokeai/frontend/web/dist/assets/MantineProvider-c592f969.js
vendored
Normal file
File diff suppressed because one or more lines are too long
310
invokeai/frontend/web/dist/assets/ThemeLocaleProvider-94e0a1e5.js
vendored
Normal file
310
invokeai/frontend/web/dist/assets/ThemeLocaleProvider-94e0a1e5.js
vendored
Normal file
File diff suppressed because one or more lines are too long
125
invokeai/frontend/web/dist/assets/index-bad7ff83.js
vendored
Normal file
125
invokeai/frontend/web/dist/assets/index-bad7ff83.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
invokeai/frontend/web/dist/index.html
vendored
2
invokeai/frontend/web/dist/index.html
vendored
@ -12,7 +12,7 @@
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<script type="module" crossorigin src="./assets/index-bb725c64.js"></script>
|
<script type="module" crossorigin src="./assets/index-bad7ff83.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body dir="ltr">
|
<body dir="ltr">
|
||||||
|
@ -13,15 +13,20 @@ import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke';
|
|||||||
import AddEmbeddingButton from 'features/embedding/components/AddEmbeddingButton';
|
import AddEmbeddingButton from 'features/embedding/components/AddEmbeddingButton';
|
||||||
import ParamEmbeddingPopover from 'features/embedding/components/ParamEmbeddingPopover';
|
import ParamEmbeddingPopover from 'features/embedding/components/ParamEmbeddingPopover';
|
||||||
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
|
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
|
||||||
|
import { AnimatePresence } from 'framer-motion';
|
||||||
import { isEqual } from 'lodash-es';
|
import { isEqual } from 'lodash-es';
|
||||||
import { flushSync } from 'react-dom';
|
import { flushSync } from 'react-dom';
|
||||||
import { setNegativeStylePromptSDXL } from '../store/sdxlSlice';
|
import { setNegativeStylePromptSDXL } from '../store/sdxlSlice';
|
||||||
|
import SDXLConcatLink from './SDXLConcatLink';
|
||||||
|
|
||||||
const promptInputSelector = createSelector(
|
const promptInputSelector = createSelector(
|
||||||
[stateSelector, activeTabNameSelector],
|
[stateSelector, activeTabNameSelector],
|
||||||
({ sdxl }, activeTabName) => {
|
({ sdxl }, activeTabName) => {
|
||||||
|
const { negativeStylePrompt, shouldConcatSDXLStylePrompt } = sdxl;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
prompt: sdxl.negativeStylePrompt,
|
prompt: negativeStylePrompt,
|
||||||
|
shouldConcatSDXLStylePrompt,
|
||||||
activeTabName,
|
activeTabName,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -37,11 +42,13 @@ const promptInputSelector = createSelector(
|
|||||||
*/
|
*/
|
||||||
const ParamSDXLNegativeStyleConditioning = () => {
|
const ParamSDXLNegativeStyleConditioning = () => {
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const { prompt, activeTabName } = useAppSelector(promptInputSelector);
|
|
||||||
const isReady = useIsReadyToInvoke();
|
const isReady = useIsReadyToInvoke();
|
||||||
const promptRef = useRef<HTMLTextAreaElement>(null);
|
const promptRef = useRef<HTMLTextAreaElement>(null);
|
||||||
const { isOpen, onClose, onOpen } = useDisclosure();
|
const { isOpen, onClose, onOpen } = useDisclosure();
|
||||||
|
|
||||||
|
const { prompt, activeTabName, shouldConcatSDXLStylePrompt } =
|
||||||
|
useAppSelector(promptInputSelector);
|
||||||
|
|
||||||
const handleChangePrompt = useCallback(
|
const handleChangePrompt = useCallback(
|
||||||
(e: ChangeEvent<HTMLTextAreaElement>) => {
|
(e: ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
dispatch(setNegativeStylePromptSDXL(e.target.value));
|
dispatch(setNegativeStylePromptSDXL(e.target.value));
|
||||||
@ -111,6 +118,20 @@ const ParamSDXLNegativeStyleConditioning = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Box position="relative">
|
<Box position="relative">
|
||||||
|
<AnimatePresence>
|
||||||
|
{shouldConcatSDXLStylePrompt && (
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
position: 'absolute',
|
||||||
|
left: '3',
|
||||||
|
w: '94%',
|
||||||
|
top: '-17px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<SDXLConcatLink />
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
|
</AnimatePresence>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<ParamEmbeddingPopover
|
<ParamEmbeddingPopover
|
||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
|
@ -13,15 +13,20 @@ import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke';
|
|||||||
import AddEmbeddingButton from 'features/embedding/components/AddEmbeddingButton';
|
import AddEmbeddingButton from 'features/embedding/components/AddEmbeddingButton';
|
||||||
import ParamEmbeddingPopover from 'features/embedding/components/ParamEmbeddingPopover';
|
import ParamEmbeddingPopover from 'features/embedding/components/ParamEmbeddingPopover';
|
||||||
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
|
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
|
||||||
|
import { AnimatePresence } from 'framer-motion';
|
||||||
import { isEqual } from 'lodash-es';
|
import { isEqual } from 'lodash-es';
|
||||||
import { flushSync } from 'react-dom';
|
import { flushSync } from 'react-dom';
|
||||||
import { setPositiveStylePromptSDXL } from '../store/sdxlSlice';
|
import { setPositiveStylePromptSDXL } from '../store/sdxlSlice';
|
||||||
|
import SDXLConcatLink from './SDXLConcatLink';
|
||||||
|
|
||||||
const promptInputSelector = createSelector(
|
const promptInputSelector = createSelector(
|
||||||
[stateSelector, activeTabNameSelector],
|
[stateSelector, activeTabNameSelector],
|
||||||
({ sdxl }, activeTabName) => {
|
({ sdxl }, activeTabName) => {
|
||||||
|
const { positiveStylePrompt, shouldConcatSDXLStylePrompt } = sdxl;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
prompt: sdxl.positiveStylePrompt,
|
prompt: positiveStylePrompt,
|
||||||
|
shouldConcatSDXLStylePrompt,
|
||||||
activeTabName,
|
activeTabName,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -37,11 +42,13 @@ const promptInputSelector = createSelector(
|
|||||||
*/
|
*/
|
||||||
const ParamSDXLPositiveStyleConditioning = () => {
|
const ParamSDXLPositiveStyleConditioning = () => {
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const { prompt, activeTabName } = useAppSelector(promptInputSelector);
|
|
||||||
const isReady = useIsReadyToInvoke();
|
const isReady = useIsReadyToInvoke();
|
||||||
const promptRef = useRef<HTMLTextAreaElement>(null);
|
const promptRef = useRef<HTMLTextAreaElement>(null);
|
||||||
const { isOpen, onClose, onOpen } = useDisclosure();
|
const { isOpen, onClose, onOpen } = useDisclosure();
|
||||||
|
|
||||||
|
const { prompt, activeTabName, shouldConcatSDXLStylePrompt } =
|
||||||
|
useAppSelector(promptInputSelector);
|
||||||
|
|
||||||
const handleChangePrompt = useCallback(
|
const handleChangePrompt = useCallback(
|
||||||
(e: ChangeEvent<HTMLTextAreaElement>) => {
|
(e: ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
dispatch(setPositiveStylePromptSDXL(e.target.value));
|
dispatch(setPositiveStylePromptSDXL(e.target.value));
|
||||||
@ -111,6 +118,20 @@ const ParamSDXLPositiveStyleConditioning = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Box position="relative">
|
<Box position="relative">
|
||||||
|
<AnimatePresence>
|
||||||
|
{shouldConcatSDXLStylePrompt && (
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
position: 'absolute',
|
||||||
|
left: '3',
|
||||||
|
w: '94%',
|
||||||
|
top: '-17px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<SDXLConcatLink />
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
|
</AnimatePresence>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<ParamEmbeddingPopover
|
<ParamEmbeddingPopover
|
||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
|
@ -1,23 +1,11 @@
|
|||||||
import { Box, Flex } from '@chakra-ui/react';
|
import { Flex } from '@chakra-ui/react';
|
||||||
import { RootState } from 'app/store/store';
|
|
||||||
import { useAppSelector } from 'app/store/storeHooks';
|
|
||||||
import ParamNegativeConditioning from 'features/parameters/components/Parameters/Core/ParamNegativeConditioning';
|
import ParamNegativeConditioning from 'features/parameters/components/Parameters/Core/ParamNegativeConditioning';
|
||||||
import ParamPositiveConditioning from 'features/parameters/components/Parameters/Core/ParamPositiveConditioning';
|
import ParamPositiveConditioning from 'features/parameters/components/Parameters/Core/ParamPositiveConditioning';
|
||||||
import { AnimatePresence } from 'framer-motion';
|
|
||||||
import ParamSDXLConcatButton from './ParamSDXLConcatButton';
|
import ParamSDXLConcatButton from './ParamSDXLConcatButton';
|
||||||
import ParamSDXLNegativeStyleConditioning from './ParamSDXLNegativeStyleConditioning';
|
import ParamSDXLNegativeStyleConditioning from './ParamSDXLNegativeStyleConditioning';
|
||||||
import ParamSDXLPositiveStyleConditioning from './ParamSDXLPositiveStyleConditioning';
|
import ParamSDXLPositiveStyleConditioning from './ParamSDXLPositiveStyleConditioning';
|
||||||
import SDXLConcatLink from './SDXLConcatLink';
|
|
||||||
|
|
||||||
export default function ParamSDXLPromptArea() {
|
export default function ParamSDXLPromptArea() {
|
||||||
const shouldPinParametersPanel = useAppSelector(
|
|
||||||
(state: RootState) => state.ui.shouldPinParametersPanel
|
|
||||||
);
|
|
||||||
|
|
||||||
const shouldConcatSDXLStylePrompt = useAppSelector(
|
|
||||||
(state: RootState) => state.sdxl.shouldConcatSDXLStylePrompt
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex
|
<Flex
|
||||||
sx={{
|
sx={{
|
||||||
@ -25,32 +13,6 @@ export default function ParamSDXLPromptArea() {
|
|||||||
gap: 2,
|
gap: 2,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<AnimatePresence>
|
|
||||||
{shouldConcatSDXLStylePrompt && (
|
|
||||||
<Box
|
|
||||||
sx={{
|
|
||||||
position: 'absolute',
|
|
||||||
w: 'full',
|
|
||||||
top: shouldPinParametersPanel ? '119px' : '175px',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<SDXLConcatLink />
|
|
||||||
</Box>
|
|
||||||
)}
|
|
||||||
</AnimatePresence>
|
|
||||||
<AnimatePresence>
|
|
||||||
{shouldConcatSDXLStylePrompt && (
|
|
||||||
<Box
|
|
||||||
sx={{
|
|
||||||
position: 'absolute',
|
|
||||||
w: 'full',
|
|
||||||
top: shouldPinParametersPanel ? '263px' : '319px',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<SDXLConcatLink />
|
|
||||||
</Box>
|
|
||||||
)}
|
|
||||||
</AnimatePresence>
|
|
||||||
<ParamPositiveConditioning />
|
<ParamPositiveConditioning />
|
||||||
<ParamSDXLConcatButton />
|
<ParamSDXLConcatButton />
|
||||||
<ParamSDXLPositiveStyleConditioning />
|
<ParamSDXLPositiveStyleConditioning />
|
||||||
|
@ -18,14 +18,7 @@ const sharedConcatLinkStyle: CSSObject = {
|
|||||||
|
|
||||||
export default function SDXLConcatLink() {
|
export default function SDXLConcatLink() {
|
||||||
return (
|
return (
|
||||||
<Flex
|
<Flex>
|
||||||
sx={{
|
|
||||||
h: 0.5,
|
|
||||||
placeContent: 'center',
|
|
||||||
gap: 2,
|
|
||||||
flexDirection: 'column',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Box
|
<Box
|
||||||
as={motion.div}
|
as={motion.div}
|
||||||
initial={{
|
initial={{
|
||||||
@ -43,7 +36,6 @@ export default function SDXLConcatLink() {
|
|||||||
top: '1px',
|
top: '1px',
|
||||||
borderTop: 'none',
|
borderTop: 'none',
|
||||||
borderColor: 'base.400',
|
borderColor: 'base.400',
|
||||||
zIndex: 2,
|
|
||||||
...sharedConcatLinkStyle,
|
...sharedConcatLinkStyle,
|
||||||
_dark: {
|
_dark: {
|
||||||
borderColor: 'accent.500',
|
borderColor: 'accent.500',
|
||||||
|
@ -1 +1 @@
|
|||||||
__version__ = "3.0.1rc2"
|
__version__ = "3.0.1"
|
||||||
|
Loading…
Reference in New Issue
Block a user