diff --git a/invokeai/app/api/routers/images.py b/invokeai/app/api/routers/images.py
index ae10cce140..11453d97f1 100644
--- a/invokeai/app/api/routers/images.py
+++ b/invokeai/app/api/routers/images.py
@@ -70,27 +70,25 @@ async def upload_image(
raise HTTPException(status_code=500, detail="Failed to create image")
-@images_router.delete("/{image_origin}/{image_name}", operation_id="delete_image")
+@images_router.delete("/{image_name}", operation_id="delete_image")
async def delete_image(
- image_origin: ResourceOrigin = Path(description="The origin of image to delete"),
image_name: str = Path(description="The name of the image to delete"),
) -> None:
"""Deletes an image"""
try:
- ApiDependencies.invoker.services.images.delete(image_origin, image_name)
+ ApiDependencies.invoker.services.images.delete(image_name)
except Exception as e:
# TODO: Does this need any exception handling at all?
pass
@images_router.patch(
- "/{image_origin}/{image_name}",
+ "/{image_name}",
operation_id="update_image",
response_model=ImageDTO,
)
async def update_image(
- image_origin: ResourceOrigin = Path(description="The origin of image to update"),
image_name: str = Path(description="The name of the image to update"),
image_changes: ImageRecordChanges = Body(
description="The changes to apply to the image"
@@ -99,32 +97,29 @@ async def update_image(
"""Updates an image"""
try:
- return ApiDependencies.invoker.services.images.update(
- image_origin, image_name, image_changes
- )
+ return ApiDependencies.invoker.services.images.update(image_name, image_changes)
except Exception as e:
raise HTTPException(status_code=400, detail="Failed to update image")
@images_router.get(
- "/{image_origin}/{image_name}/metadata",
+ "/{image_name}/metadata",
operation_id="get_image_metadata",
response_model=ImageDTO,
)
async def get_image_metadata(
- image_origin: ResourceOrigin = Path(description="The origin of image to get"),
image_name: str = Path(description="The name of image to get"),
) -> ImageDTO:
"""Gets an image's metadata"""
try:
- return ApiDependencies.invoker.services.images.get_dto(image_origin, image_name)
+ return ApiDependencies.invoker.services.images.get_dto(image_name)
except Exception as e:
raise HTTPException(status_code=404)
@images_router.get(
- "/{image_origin}/{image_name}",
+ "/{image_name}",
operation_id="get_image_full",
response_class=Response,
responses={
@@ -136,15 +131,12 @@ async def get_image_metadata(
},
)
async def get_image_full(
- image_origin: ResourceOrigin = Path(
- description="The type of full-resolution image file to get"
- ),
image_name: str = Path(description="The name of full-resolution image file to get"),
) -> FileResponse:
"""Gets a full-resolution image file"""
try:
- path = ApiDependencies.invoker.services.images.get_path(image_origin, image_name)
+ path = ApiDependencies.invoker.services.images.get_path(image_name)
if not ApiDependencies.invoker.services.images.validate_path(path):
raise HTTPException(status_code=404)
@@ -160,7 +152,7 @@ async def get_image_full(
@images_router.get(
- "/{image_origin}/{image_name}/thumbnail",
+ "/{image_name}/thumbnail",
operation_id="get_image_thumbnail",
response_class=Response,
responses={
@@ -172,14 +164,13 @@ async def get_image_full(
},
)
async def get_image_thumbnail(
- image_origin: ResourceOrigin = Path(description="The origin of thumbnail image file to get"),
image_name: str = Path(description="The name of thumbnail image file to get"),
) -> FileResponse:
"""Gets a thumbnail image file"""
try:
path = ApiDependencies.invoker.services.images.get_path(
- image_origin, image_name, thumbnail=True
+ image_name, thumbnail=True
)
if not ApiDependencies.invoker.services.images.validate_path(path):
raise HTTPException(status_code=404)
@@ -192,25 +183,21 @@ async def get_image_thumbnail(
@images_router.get(
- "/{image_origin}/{image_name}/urls",
+ "/{image_name}/urls",
operation_id="get_image_urls",
response_model=ImageUrlsDTO,
)
async def get_image_urls(
- image_origin: ResourceOrigin = Path(description="The origin of the image whose URL to get"),
image_name: str = Path(description="The name of the image whose URL to get"),
) -> ImageUrlsDTO:
"""Gets an image and thumbnail URL"""
try:
- image_url = ApiDependencies.invoker.services.images.get_url(
- image_origin, image_name
- )
+ image_url = ApiDependencies.invoker.services.images.get_url(image_name)
thumbnail_url = ApiDependencies.invoker.services.images.get_url(
- image_origin, image_name, thumbnail=True
+ image_name, thumbnail=True
)
return ImageUrlsDTO(
- image_origin=image_origin,
image_name=image_name,
image_url=image_url,
thumbnail_url=thumbnail_url,
diff --git a/invokeai/app/invocations/controlnet_image_processors.py b/invokeai/app/invocations/controlnet_image_processors.py
index b32afe4941..f40954ebb6 100644
--- a/invokeai/app/invocations/controlnet_image_processors.py
+++ b/invokeai/app/invocations/controlnet_image_processors.py
@@ -193,9 +193,7 @@ class ImageProcessorInvocation(BaseInvocation, PILInvocationConfig):
return image
def invoke(self, context: InvocationContext) -> ImageOutput:
- raw_image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ raw_image = context.services.images.get_pil_image(self.image.image_name)
# image type should be PIL.PngImagePlugin.PngImageFile ?
processed_image = self.run_processor(raw_image)
@@ -216,10 +214,7 @@ class ImageProcessorInvocation(BaseInvocation, PILInvocationConfig):
)
"""Builds an ImageOutput and its ImageField"""
- processed_image_field = ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- )
+ processed_image_field = ImageField(image_name=image_dto.image_name)
return ImageOutput(
image=processed_image_field,
# width=processed_image.width,
diff --git a/invokeai/app/invocations/cv.py b/invokeai/app/invocations/cv.py
index 5275116a2a..dd0ab4d027 100644
--- a/invokeai/app/invocations/cv.py
+++ b/invokeai/app/invocations/cv.py
@@ -36,12 +36,8 @@ class CvInpaintInvocation(BaseInvocation, CvInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
- mask = context.services.images.get_pil_image(
- self.mask.image_origin, self.mask.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
+ mask = context.services.images.get_pil_image(self.mask.image_name)
# Convert to cv image/mask
# TODO: consider making these utility functions
@@ -65,10 +61,7 @@ class CvInpaintInvocation(BaseInvocation, CvInvocationConfig):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
diff --git a/invokeai/app/invocations/generate.py b/invokeai/app/invocations/generate.py
index 53d4d16330..21574c7323 100644
--- a/invokeai/app/invocations/generate.py
+++ b/invokeai/app/invocations/generate.py
@@ -83,9 +83,7 @@ class TextToImageInvocation(BaseInvocation, SDImageInvocation):
# loading controlnet image (currently requires pre-processed image)
control_image = (
None if self.control_image is None
- else context.services.images.get_pil_image(
- self.control_image.image_origin, self.control_image.image_name
- )
+ else context.services.images.get_pil_image(self.control_image.image_name)
)
# loading controlnet model
if (self.control_model is None or self.control_model==''):
@@ -125,10 +123,7 @@ class TextToImageInvocation(BaseInvocation, SDImageInvocation):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -166,9 +161,7 @@ class ImageToImageInvocation(TextToImageInvocation):
image = (
None
if self.image is None
- else context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ else context.services.images.get_pil_image(self.image.image_name)
)
if self.fit:
@@ -206,10 +199,7 @@ class ImageToImageInvocation(TextToImageInvocation):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -279,14 +269,12 @@ class InpaintInvocation(ImageToImageInvocation):
image = (
None
if self.image is None
- else context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ else context.services.images.get_pil_image(self.image.image_name)
)
mask = (
None
if self.mask is None
- else context.services.images.get_pil_image(self.mask.image_origin, self.mask.image_name)
+ else context.services.images.get_pil_image(self.mask.image_name)
)
# Handle invalid model parameter
@@ -322,10 +310,7 @@ class InpaintInvocation(ImageToImageInvocation):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
diff --git a/invokeai/app/invocations/image.py b/invokeai/app/invocations/image.py
index d048410468..f85669eab1 100644
--- a/invokeai/app/invocations/image.py
+++ b/invokeai/app/invocations/image.py
@@ -72,13 +72,10 @@ class LoadImageInvocation(BaseInvocation):
)
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(self.image.image_origin, self.image.image_name)
+ image = context.services.images.get_pil_image(self.image.image_name)
return ImageOutput(
- image=ImageField(
- image_name=self.image.image_name,
- image_origin=self.image.image_origin,
- ),
+ image=ImageField(image_name=self.image.image_name),
width=image.width,
height=image.height,
)
@@ -95,19 +92,14 @@ class ShowImageInvocation(BaseInvocation):
)
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
if image:
image.show()
# TODO: how to handle failure?
return ImageOutput(
- image=ImageField(
- image_name=self.image.image_name,
- image_origin=self.image.image_origin,
- ),
+ image=ImageField(image_name=self.image.image_name),
width=image.width,
height=image.height,
)
@@ -128,9 +120,7 @@ class ImageCropInvocation(BaseInvocation, PILInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
image_crop = Image.new(
mode="RGBA", size=(self.width, self.height), color=(0, 0, 0, 0)
@@ -147,10 +137,7 @@ class ImageCropInvocation(BaseInvocation, PILInvocationConfig):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -171,19 +158,13 @@ class ImagePasteInvocation(BaseInvocation, PILInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- base_image = context.services.images.get_pil_image(
- self.base_image.image_origin, self.base_image.image_name
- )
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ base_image = context.services.images.get_pil_image(self.base_image.image_name)
+ image = context.services.images.get_pil_image(self.image.image_name)
mask = (
None
if self.mask is None
else ImageOps.invert(
- context.services.images.get_pil_image(
- self.mask.image_origin, self.mask.image_name
- )
+ context.services.images.get_pil_image(self.mask.image_name)
)
)
# TODO: probably shouldn't invert mask here... should user be required to do it?
@@ -209,10 +190,7 @@ class ImagePasteInvocation(BaseInvocation, PILInvocationConfig):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -230,9 +208,7 @@ class MaskFromAlphaInvocation(BaseInvocation, PILInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> MaskOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
image_mask = image.split()[-1]
if self.invert:
@@ -248,9 +224,7 @@ class MaskFromAlphaInvocation(BaseInvocation, PILInvocationConfig):
)
return MaskOutput(
- mask=ImageField(
- image_origin=image_dto.image_origin, image_name=image_dto.image_name
- ),
+ mask=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -268,12 +242,8 @@ class ImageMultiplyInvocation(BaseInvocation, PILInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- image1 = context.services.images.get_pil_image(
- self.image1.image_origin, self.image1.image_name
- )
- image2 = context.services.images.get_pil_image(
- self.image2.image_origin, self.image2.image_name
- )
+ image1 = context.services.images.get_pil_image(self.image1.image_name)
+ image2 = context.services.images.get_pil_image(self.image2.image_name)
multiply_image = ImageChops.multiply(image1, image2)
@@ -287,9 +257,7 @@ class ImageMultiplyInvocation(BaseInvocation, PILInvocationConfig):
)
return ImageOutput(
- image=ImageField(
- image_origin=image_dto.image_origin, image_name=image_dto.image_name
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -310,9 +278,7 @@ class ImageChannelInvocation(BaseInvocation, PILInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
channel_image = image.getchannel(self.channel)
@@ -326,9 +292,7 @@ class ImageChannelInvocation(BaseInvocation, PILInvocationConfig):
)
return ImageOutput(
- image=ImageField(
- image_origin=image_dto.image_origin, image_name=image_dto.image_name
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -349,9 +313,7 @@ class ImageConvertInvocation(BaseInvocation, PILInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
converted_image = image.convert(self.mode)
@@ -365,9 +327,7 @@ class ImageConvertInvocation(BaseInvocation, PILInvocationConfig):
)
return ImageOutput(
- image=ImageField(
- image_origin=image_dto.image_origin, image_name=image_dto.image_name
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -386,9 +346,7 @@ class ImageBlurInvocation(BaseInvocation, PILInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
blur = (
ImageFilter.GaussianBlur(self.radius)
@@ -407,10 +365,7 @@ class ImageBlurInvocation(BaseInvocation, PILInvocationConfig):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -450,9 +405,7 @@ class ImageResizeInvocation(BaseInvocation, PILInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
resample_mode = PIL_RESAMPLING_MAP[self.resample_mode]
@@ -471,10 +424,7 @@ class ImageResizeInvocation(BaseInvocation, PILInvocationConfig):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -493,9 +443,7 @@ class ImageScaleInvocation(BaseInvocation, PILInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
resample_mode = PIL_RESAMPLING_MAP[self.resample_mode]
width = int(image.width * self.scale_factor)
@@ -516,10 +464,7 @@ class ImageScaleInvocation(BaseInvocation, PILInvocationConfig):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -538,9 +483,7 @@ class ImageLerpInvocation(BaseInvocation, PILInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
image_arr = numpy.asarray(image, dtype=numpy.float32) / 255
image_arr = image_arr * (self.max - self.min) + self.max
@@ -557,10 +500,7 @@ class ImageLerpInvocation(BaseInvocation, PILInvocationConfig):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -579,9 +519,7 @@ class ImageInverseLerpInvocation(BaseInvocation, PILInvocationConfig):
# fmt: on
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
image_arr = numpy.asarray(image, dtype=numpy.float32)
image_arr = (
@@ -603,10 +541,7 @@ class ImageInverseLerpInvocation(BaseInvocation, PILInvocationConfig):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
diff --git a/invokeai/app/invocations/infill.py b/invokeai/app/invocations/infill.py
index a06780c1f5..ad67594c29 100644
--- a/invokeai/app/invocations/infill.py
+++ b/invokeai/app/invocations/infill.py
@@ -134,9 +134,7 @@ class InfillColorInvocation(BaseInvocation):
)
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
solid_bg = Image.new("RGBA", image.size, self.color.tuple())
infilled = Image.alpha_composite(solid_bg, image.convert("RGBA"))
@@ -153,10 +151,7 @@ class InfillColorInvocation(BaseInvocation):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -179,9 +174,7 @@ class InfillTileInvocation(BaseInvocation):
)
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
infilled = tile_fill_missing(
image.copy(), seed=self.seed, tile_size=self.tile_size
@@ -198,10 +191,7 @@ class InfillTileInvocation(BaseInvocation):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -217,9 +207,7 @@ class InfillPatchMatchInvocation(BaseInvocation):
)
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
if PatchMatch.patchmatch_available():
infilled = infill_patchmatch(image.copy())
@@ -236,10 +224,7 @@ class InfillPatchMatchInvocation(BaseInvocation):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
diff --git a/invokeai/app/invocations/latent.py b/invokeai/app/invocations/latent.py
index 7da697a1ff..cf216e6c54 100644
--- a/invokeai/app/invocations/latent.py
+++ b/invokeai/app/invocations/latent.py
@@ -316,8 +316,7 @@ class TextToLatentsInvocation(BaseInvocation):
torch_dtype=model.unet.dtype).to(model.device)
control_models.append(control_model)
control_image_field = control_info.image
- input_image = context.services.images.get_pil_image(control_image_field.image_origin,
- control_image_field.image_name)
+ input_image = context.services.images.get_pil_image(control_image_field.image_name)
# self.image.image_type, self.image.image_name
# FIXME: still need to test with different widths, heights, devices, dtypes
# and add in batch_size, num_images_per_prompt?
@@ -537,10 +536,7 @@ class LatentsToImageInvocation(BaseInvocation):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_type=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
@@ -635,9 +631,7 @@ class ImageToLatentsInvocation(BaseInvocation):
# image = context.services.images.get(
# self.image.image_type, self.image.image_name
# )
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
#vae_info = context.services.model_manager.get_model(**self.vae.vae.dict())
vae_info = context.services.model_manager.get_model(
diff --git a/invokeai/app/invocations/reconstruct.py b/invokeai/app/invocations/reconstruct.py
index 5313411400..4185de3fd3 100644
--- a/invokeai/app/invocations/reconstruct.py
+++ b/invokeai/app/invocations/reconstruct.py
@@ -28,9 +28,7 @@ class RestoreFaceInvocation(BaseInvocation):
}
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
results = context.services.restoration.upscale_and_reconstruct(
image_list=[[image, 0]],
upscale=None,
@@ -51,10 +49,7 @@ class RestoreFaceInvocation(BaseInvocation):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
diff --git a/invokeai/app/invocations/upscale.py b/invokeai/app/invocations/upscale.py
index 80e1567047..42f85fd18d 100644
--- a/invokeai/app/invocations/upscale.py
+++ b/invokeai/app/invocations/upscale.py
@@ -30,9 +30,7 @@ class UpscaleInvocation(BaseInvocation):
}
def invoke(self, context: InvocationContext) -> ImageOutput:
- image = context.services.images.get_pil_image(
- self.image.image_origin, self.image.image_name
- )
+ image = context.services.images.get_pil_image(self.image.image_name)
results = context.services.restoration.upscale_and_reconstruct(
image_list=[[image, 0]],
upscale=(self.level, self.strength),
@@ -53,10 +51,7 @@ class UpscaleInvocation(BaseInvocation):
)
return ImageOutput(
- image=ImageField(
- image_name=image_dto.image_name,
- image_origin=image_dto.image_origin,
- ),
+ image=ImageField(image_name=image_dto.image_name),
width=image_dto.width,
height=image_dto.height,
)
diff --git a/invokeai/app/models/image.py b/invokeai/app/models/image.py
index 6d48f2dbb1..988a3e1447 100644
--- a/invokeai/app/models/image.py
+++ b/invokeai/app/models/image.py
@@ -66,13 +66,10 @@ class InvalidImageCategoryException(ValueError):
class ImageField(BaseModel):
"""An image field used for passing image objects between invocations"""
- image_origin: ResourceOrigin = Field(
- default=ResourceOrigin.INTERNAL, description="The type of the image"
- )
image_name: Optional[str] = Field(default=None, description="The name of the image")
class Config:
- schema_extra = {"required": ["image_origin", "image_name"]}
+ schema_extra = {"required": ["image_name"]}
class ColorField(BaseModel):
diff --git a/invokeai/app/services/image_file_storage.py b/invokeai/app/services/image_file_storage.py
index 68a994ea75..aeacfe3f1c 100644
--- a/invokeai/app/services/image_file_storage.py
+++ b/invokeai/app/services/image_file_storage.py
@@ -40,14 +40,12 @@ class ImageFileStorageBase(ABC):
"""Low-level service responsible for storing and retrieving image files."""
@abstractmethod
- def get(self, image_origin: ResourceOrigin, image_name: str) -> PILImageType:
+ def get(self, image_name: str) -> PILImageType:
"""Retrieves an image as PIL Image."""
pass
@abstractmethod
- def get_path(
- self, image_origin: ResourceOrigin, image_name: str, thumbnail: bool = False
- ) -> str:
+ def get_path(self, image_name: str, thumbnail: bool = False) -> str:
"""Gets the internal path to an image or thumbnail."""
pass
@@ -62,7 +60,6 @@ class ImageFileStorageBase(ABC):
def save(
self,
image: PILImageType,
- image_origin: ResourceOrigin,
image_name: str,
metadata: Optional[ImageMetadata] = None,
thumbnail_size: int = 256,
@@ -71,7 +68,7 @@ class ImageFileStorageBase(ABC):
pass
@abstractmethod
- def delete(self, image_origin: ResourceOrigin, image_name: str) -> None:
+ def delete(self, image_name: str) -> None:
"""Deletes an image and its thumbnail (if one exists)."""
pass
@@ -93,17 +90,14 @@ class DiskImageFileStorage(ImageFileStorageBase):
Path(output_folder).mkdir(parents=True, exist_ok=True)
# TODO: don't hard-code. get/save/delete should maybe take subpath?
- for image_origin in ResourceOrigin:
- Path(os.path.join(output_folder, image_origin)).mkdir(
- parents=True, exist_ok=True
- )
- Path(os.path.join(output_folder, image_origin, "thumbnails")).mkdir(
- parents=True, exist_ok=True
- )
+ Path(os.path.join(output_folder)).mkdir(parents=True, exist_ok=True)
+ Path(os.path.join(output_folder, "thumbnails")).mkdir(
+ parents=True, exist_ok=True
+ )
- def get(self, image_origin: ResourceOrigin, image_name: str) -> PILImageType:
+ def get(self, image_name: str) -> PILImageType:
try:
- image_path = self.get_path(image_origin, image_name)
+ image_path = self.get_path(image_name)
cache_item = self.__get_cache(image_path)
if cache_item:
return cache_item
@@ -117,13 +111,12 @@ class DiskImageFileStorage(ImageFileStorageBase):
def save(
self,
image: PILImageType,
- image_origin: ResourceOrigin,
image_name: str,
metadata: Optional[ImageMetadata] = None,
thumbnail_size: int = 256,
) -> None:
try:
- image_path = self.get_path(image_origin, image_name)
+ image_path = self.get_path(image_name)
if metadata is not None:
pnginfo = PngImagePlugin.PngInfo()
@@ -133,7 +126,7 @@ class DiskImageFileStorage(ImageFileStorageBase):
image.save(image_path, "PNG")
thumbnail_name = get_thumbnail_name(image_name)
- thumbnail_path = self.get_path(image_origin, thumbnail_name, thumbnail=True)
+ thumbnail_path = self.get_path(thumbnail_name, thumbnail=True)
thumbnail_image = make_thumbnail(image, thumbnail_size)
thumbnail_image.save(thumbnail_path)
@@ -142,10 +135,10 @@ class DiskImageFileStorage(ImageFileStorageBase):
except Exception as e:
raise ImageFileSaveException from e
- def delete(self, image_origin: ResourceOrigin, image_name: str) -> None:
+ def delete(self, image_name: str) -> None:
try:
basename = os.path.basename(image_name)
- image_path = self.get_path(image_origin, basename)
+ image_path = self.get_path(basename)
if os.path.exists(image_path):
send2trash(image_path)
@@ -153,7 +146,7 @@ class DiskImageFileStorage(ImageFileStorageBase):
del self.__cache[image_path]
thumbnail_name = get_thumbnail_name(image_name)
- thumbnail_path = self.get_path(image_origin, thumbnail_name, True)
+ thumbnail_path = self.get_path(thumbnail_name, True)
if os.path.exists(thumbnail_path):
send2trash(thumbnail_path)
@@ -163,19 +156,19 @@ class DiskImageFileStorage(ImageFileStorageBase):
raise ImageFileDeleteException from e
# TODO: make this a bit more flexible for e.g. cloud storage
- def get_path(
- self, image_origin: ResourceOrigin, image_name: str, thumbnail: bool = False
- ) -> str:
+ def get_path(self, image_name: str, thumbnail: bool = False) -> str:
# strip out any relative path shenanigans
basename = os.path.basename(image_name)
if thumbnail:
thumbnail_name = get_thumbnail_name(basename)
path = os.path.join(
- self.__output_folder, image_origin, "thumbnails", thumbnail_name
+ self.__output_folder,
+ "thumbnails",
+ thumbnail_name,
)
else:
- path = os.path.join(self.__output_folder, image_origin, basename)
+ path = os.path.join(self.__output_folder, basename)
abspath = os.path.abspath(path)
diff --git a/invokeai/app/services/image_record_storage.py b/invokeai/app/services/image_record_storage.py
index 6907ac3952..30b379ed8b 100644
--- a/invokeai/app/services/image_record_storage.py
+++ b/invokeai/app/services/image_record_storage.py
@@ -21,6 +21,7 @@ from invokeai.app.services.models.image_record import (
T = TypeVar("T", bound=BaseModel)
+
class OffsetPaginatedResults(GenericModel, Generic[T]):
"""Offset-paginated results"""
@@ -60,7 +61,7 @@ class ImageRecordStorageBase(ABC):
# TODO: Implement an `update()` method
@abstractmethod
- def get(self, image_origin: ResourceOrigin, image_name: str) -> ImageRecord:
+ def get(self, image_name: str) -> ImageRecord:
"""Gets an image record."""
pass
@@ -68,7 +69,6 @@ class ImageRecordStorageBase(ABC):
def update(
self,
image_name: str,
- image_origin: ResourceOrigin,
changes: ImageRecordChanges,
) -> None:
"""Updates an image record."""
@@ -89,7 +89,7 @@ class ImageRecordStorageBase(ABC):
# TODO: The database has a nullable `deleted_at` column, currently unused.
# Should we implement soft deletes? Would need coordination with ImageFileStorage.
@abstractmethod
- def delete(self, image_origin: ResourceOrigin, image_name: str) -> None:
+ def delete(self, image_name: str) -> None:
"""Deletes an image record."""
pass
@@ -196,9 +196,7 @@ class SqliteImageRecordStorage(ImageRecordStorageBase):
"""
)
- def get(
- self, image_origin: ResourceOrigin, image_name: str
- ) -> Union[ImageRecord, None]:
+ def get(self, image_name: str) -> Union[ImageRecord, None]:
try:
self._lock.acquire()
@@ -225,7 +223,6 @@ class SqliteImageRecordStorage(ImageRecordStorageBase):
def update(
self,
image_name: str,
- image_origin: ResourceOrigin,
changes: ImageRecordChanges,
) -> None:
try:
@@ -294,9 +291,7 @@ class SqliteImageRecordStorage(ImageRecordStorageBase):
if categories is not None:
## Convert the enum values to unique list of strings
- category_strings = list(
- map(lambda c: c.value, set(categories))
- )
+ category_strings = list(map(lambda c: c.value, set(categories)))
# Create the correct length of placeholders
placeholders = ",".join("?" * len(category_strings))
query_conditions += f"AND image_category IN ( {placeholders} )\n"
@@ -337,7 +332,7 @@ class SqliteImageRecordStorage(ImageRecordStorageBase):
items=images, offset=offset, limit=limit, total=count
)
- def delete(self, image_origin: ResourceOrigin, image_name: str) -> None:
+ def delete(self, image_name: str) -> None:
try:
self._lock.acquire()
self._cursor.execute(
diff --git a/invokeai/app/services/images.py b/invokeai/app/services/images.py
index 2618a9763e..9f7188f607 100644
--- a/invokeai/app/services/images.py
+++ b/invokeai/app/services/images.py
@@ -57,7 +57,6 @@ class ImageServiceABC(ABC):
@abstractmethod
def update(
self,
- image_origin: ResourceOrigin,
image_name: str,
changes: ImageRecordChanges,
) -> ImageDTO:
@@ -65,22 +64,22 @@ class ImageServiceABC(ABC):
pass
@abstractmethod
- def get_pil_image(self, image_origin: ResourceOrigin, image_name: str) -> PILImageType:
+ def get_pil_image(self, image_name: str) -> PILImageType:
"""Gets an image as a PIL image."""
pass
@abstractmethod
- def get_record(self, image_origin: ResourceOrigin, image_name: str) -> ImageRecord:
+ def get_record(self, image_name: str) -> ImageRecord:
"""Gets an image record."""
pass
@abstractmethod
- def get_dto(self, image_origin: ResourceOrigin, image_name: str) -> ImageDTO:
+ def get_dto(self, image_name: str) -> ImageDTO:
"""Gets an image DTO."""
pass
@abstractmethod
- def get_path(self, image_origin: ResourceOrigin, image_name: str) -> str:
+ def get_path(self, image_name: str) -> str:
"""Gets an image's path."""
pass
@@ -90,9 +89,7 @@ class ImageServiceABC(ABC):
pass
@abstractmethod
- def get_url(
- self, image_origin: ResourceOrigin, image_name: str, thumbnail: bool = False
- ) -> str:
+ def get_url(self, image_name: str, thumbnail: bool = False) -> str:
"""Gets an image's or thumbnail's URL."""
pass
@@ -109,7 +106,7 @@ class ImageServiceABC(ABC):
pass
@abstractmethod
- def delete(self, image_origin: ResourceOrigin, image_name: str):
+ def delete(self, image_name: str):
"""Deletes an image."""
pass
@@ -206,16 +203,13 @@ class ImageService(ImageServiceABC):
)
self._services.files.save(
- image_origin=image_origin,
image_name=image_name,
image=image,
metadata=metadata,
)
- image_url = self._services.urls.get_image_url(image_origin, image_name)
- thumbnail_url = self._services.urls.get_image_url(
- image_origin, image_name, True
- )
+ image_url = self._services.urls.get_image_url(image_name)
+ thumbnail_url = self._services.urls.get_image_url(image_name, True)
return ImageDTO(
# Non-nullable fields
@@ -249,13 +243,12 @@ class ImageService(ImageServiceABC):
def update(
self,
- image_origin: ResourceOrigin,
image_name: str,
changes: ImageRecordChanges,
) -> ImageDTO:
try:
- self._services.records.update(image_name, image_origin, changes)
- return self.get_dto(image_origin, image_name)
+ self._services.records.update(image_name, changes)
+ return self.get_dto(image_name)
except ImageRecordSaveException:
self._services.logger.error("Failed to update image record")
raise
@@ -263,9 +256,9 @@ class ImageService(ImageServiceABC):
self._services.logger.error("Problem updating image record")
raise e
- def get_pil_image(self, image_origin: ResourceOrigin, image_name: str) -> PILImageType:
+ def get_pil_image(self, image_name: str) -> PILImageType:
try:
- return self._services.files.get(image_origin, image_name)
+ return self._services.files.get(image_name)
except ImageFileNotFoundException:
self._services.logger.error("Failed to get image file")
raise
@@ -273,9 +266,9 @@ class ImageService(ImageServiceABC):
self._services.logger.error("Problem getting image file")
raise e
- def get_record(self, image_origin: ResourceOrigin, image_name: str) -> ImageRecord:
+ def get_record(self, image_name: str) -> ImageRecord:
try:
- return self._services.records.get(image_origin, image_name)
+ return self._services.records.get(image_name)
except ImageRecordNotFoundException:
self._services.logger.error("Image record not found")
raise
@@ -283,14 +276,14 @@ class ImageService(ImageServiceABC):
self._services.logger.error("Problem getting image record")
raise e
- def get_dto(self, image_origin: ResourceOrigin, image_name: str) -> ImageDTO:
+ def get_dto(self, image_name: str) -> ImageDTO:
try:
- image_record = self._services.records.get(image_origin, image_name)
+ image_record = self._services.records.get(image_name)
image_dto = image_record_to_dto(
image_record,
- self._services.urls.get_image_url(image_origin, image_name),
- self._services.urls.get_image_url(image_origin, image_name, True),
+ self._services.urls.get_image_url(image_name),
+ self._services.urls.get_image_url(image_name, True),
)
return image_dto
@@ -301,11 +294,9 @@ class ImageService(ImageServiceABC):
self._services.logger.error("Problem getting image DTO")
raise e
- def get_path(
- self, image_origin: ResourceOrigin, image_name: str, thumbnail: bool = False
- ) -> str:
+ def get_path(self, image_name: str, thumbnail: bool = False) -> str:
try:
- return self._services.files.get_path(image_origin, image_name, thumbnail)
+ return self._services.files.get_path(image_name, thumbnail)
except Exception as e:
self._services.logger.error("Problem getting image path")
raise e
@@ -317,11 +308,9 @@ class ImageService(ImageServiceABC):
self._services.logger.error("Problem validating image path")
raise e
- def get_url(
- self, image_origin: ResourceOrigin, image_name: str, thumbnail: bool = False
- ) -> str:
+ def get_url(self, image_name: str, thumbnail: bool = False) -> str:
try:
- return self._services.urls.get_image_url(image_origin, image_name, thumbnail)
+ return self._services.urls.get_image_url(image_name, thumbnail)
except Exception as e:
self._services.logger.error("Problem getting image path")
raise e
@@ -347,10 +336,8 @@ class ImageService(ImageServiceABC):
map(
lambda r: image_record_to_dto(
r,
- self._services.urls.get_image_url(r.image_origin, r.image_name),
- self._services.urls.get_image_url(
- r.image_origin, r.image_name, True
- ),
+ self._services.urls.get_image_url(r.image_name),
+ self._services.urls.get_image_url(r.image_name, True),
),
results.items,
)
@@ -366,10 +353,10 @@ class ImageService(ImageServiceABC):
self._services.logger.error("Problem getting paginated image DTOs")
raise e
- def delete(self, image_origin: ResourceOrigin, image_name: str):
+ def delete(self, image_name: str):
try:
- self._services.files.delete(image_origin, image_name)
- self._services.records.delete(image_origin, image_name)
+ self._services.files.delete(image_name)
+ self._services.records.delete(image_name)
except ImageRecordDeleteException:
self._services.logger.error(f"Failed to delete image record")
raise
diff --git a/invokeai/app/services/models/image_record.py b/invokeai/app/services/models/image_record.py
index 051236b12b..d971d65916 100644
--- a/invokeai/app/services/models/image_record.py
+++ b/invokeai/app/services/models/image_record.py
@@ -79,8 +79,6 @@ class ImageUrlsDTO(BaseModel):
image_name: str = Field(description="The unique name of the image.")
"""The unique name of the image."""
- image_origin: ResourceOrigin = Field(description="The type of the image.")
- """The origin of the image."""
image_url: str = Field(description="The URL of the image.")
"""The URL of the image."""
thumbnail_url: str = Field(description="The URL of the image's thumbnail.")
diff --git a/invokeai/app/services/urls.py b/invokeai/app/services/urls.py
index 4c8354c899..5920e9e6c1 100644
--- a/invokeai/app/services/urls.py
+++ b/invokeai/app/services/urls.py
@@ -1,17 +1,12 @@
import os
from abc import ABC, abstractmethod
-from invokeai.app.models.image import ResourceOrigin
-from invokeai.app.util.thumbnails import get_thumbnail_name
-
class UrlServiceBase(ABC):
"""Responsible for building URLs for resources."""
@abstractmethod
- def get_image_url(
- self, image_origin: ResourceOrigin, image_name: str, thumbnail: bool = False
- ) -> str:
+ def get_image_url(self, image_name: str, thumbnail: bool = False) -> str:
"""Gets the URL for an image or thumbnail."""
pass
@@ -20,15 +15,11 @@ class LocalUrlService(UrlServiceBase):
def __init__(self, base_url: str = "api/v1"):
self._base_url = base_url
- def get_image_url(
- self, image_origin: ResourceOrigin, image_name: str, thumbnail: bool = False
- ) -> str:
+ def get_image_url(self, image_name: str, thumbnail: bool = False) -> str:
image_basename = os.path.basename(image_name)
# These paths are determined by the routes in invokeai/app/api/routers/images.py
if thumbnail:
- return (
- f"{self._base_url}/images/{image_origin.value}/{image_basename}/thumbnail"
- )
+ return f"{self._base_url}/images/{image_basename}/thumbnail"
- return f"{self._base_url}/images/{image_origin.value}/{image_basename}"
+ return f"{self._base_url}/images/{image_basename}"
diff --git a/invokeai/frontend/web/package.json b/invokeai/frontend/web/package.json
index 64b9a828cd..c072a9d95c 100644
--- a/invokeai/frontend/web/package.json
+++ b/invokeai/frontend/web/package.json
@@ -62,10 +62,12 @@
"@dagrejs/graphlib": "^2.1.12",
"@dnd-kit/core": "^6.0.8",
"@dnd-kit/modifiers": "^6.0.1",
- "@emotion/react": "^11.10.6",
+ "@emotion/react": "^11.11.1",
"@emotion/styled": "^11.10.6",
"@floating-ui/react-dom": "^2.0.0",
"@fontsource/inter": "^4.5.15",
+ "@mantine/core": "^6.0.13",
+ "@mantine/hooks": "^6.0.13",
"@reduxjs/toolkit": "^1.9.5",
"@roarr/browser-log-writer": "^1.1.5",
"chakra-ui-contextmenu": "^1.0.5",
diff --git a/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx b/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx
index 6aa38fc15b..82065d83e3 100644
--- a/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx
+++ b/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx
@@ -3,11 +3,11 @@ import {
createLocalStorageManager,
extendTheme,
} from '@chakra-ui/react';
+import { RootState } from 'app/store/store';
+import { useAppSelector } from 'app/store/storeHooks';
import { ReactNode, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { theme as invokeAITheme } from 'theme/theme';
-import { RootState } from 'app/store/store';
-import { useAppSelector } from 'app/store/storeHooks';
import { greenTeaThemeColors } from 'theme/colors/greenTea';
import { invokeAIThemeColors } from 'theme/colors/invokeAI';
@@ -15,6 +15,8 @@ import { lightThemeColors } from 'theme/colors/lightTheme';
import { oceanBlueColors } from 'theme/colors/oceanBlue';
import '@fontsource/inter/variable.css';
+import { MantineProvider } from '@mantine/core';
+import { mantineTheme } from 'mantine-theme/theme';
import 'overlayscrollbars/overlayscrollbars.css';
import 'theme/css/overlayscrollbars.css';
@@ -51,9 +53,11 @@ function ThemeLocaleProvider({ children }: ThemeLocaleProviderProps) {
}, [direction]);
return (
-
- {children}
-
+
+
+ {children}
+
+
);
}
diff --git a/invokeai/frontend/web/src/app/constants.ts b/invokeai/frontend/web/src/app/constants.ts
index 6700a732b3..c2e525ad7d 100644
--- a/invokeai/frontend/web/src/app/constants.ts
+++ b/invokeai/frontend/web/src/app/constants.ts
@@ -22,9 +22,9 @@ export const SCHEDULERS = [
export type Scheduler = (typeof SCHEDULERS)[number];
// Valid upscaling levels
-export const UPSCALING_LEVELS: Array<{ key: string; value: number }> = [
- { key: '2x', value: 2 },
- { key: '4x', value: 4 },
+export const UPSCALING_LEVELS: Array<{ label: string; value: string }> = [
+ { label: '2x', value: '2' },
+ { label: '4x', value: '4' },
];
export const NUMPY_RAND_MIN = 0;
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts
index 717417792c..ce1b515b84 100644
--- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts
@@ -34,10 +34,7 @@ export const addControlNetImageProcessedListener = () => {
[controlNet.processorNode.id]: {
...controlNet.processorNode,
is_intermediate: true,
- image: pick(controlNet.controlImage, [
- 'image_name',
- 'image_origin',
- ]),
+ image: pick(controlNet.controlImage, ['image_name']),
},
},
};
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts
index f4376a4959..4c0c057242 100644
--- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts
@@ -25,7 +25,7 @@ export const addRequestedImageDeletionListener = () => {
effect: (action, { dispatch, getState }) => {
const { image, imageUsage } = action.payload;
- const { image_name, image_origin } = image;
+ const { image_name } = image;
const state = getState();
const selectedImage = state.gallery.selectedImage;
@@ -79,9 +79,7 @@ export const addRequestedImageDeletionListener = () => {
dispatch(imageRemoved(image_name));
// Delete from server
- dispatch(
- imageDeleted({ imageName: image_name, imageOrigin: image_origin })
- );
+ dispatch(imageDeleted({ imageName: image_name }));
},
});
};
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageMetadataReceived.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageMetadataReceived.ts
index 016e3ec8a8..ed308f08a8 100644
--- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageMetadataReceived.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageMetadataReceived.ts
@@ -20,7 +20,6 @@ export const addImageMetadataReceivedFulfilledListener = () => {
dispatch(
imageUpdated({
imageName: image.image_name,
- imageOrigin: image.image_origin,
requestBody: { is_intermediate: false },
})
);
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts
index 0b47f7a1be..c9ab894ddb 100644
--- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts
@@ -36,13 +36,12 @@ export const addInvocationCompleteEventListener = () => {
// This complete event has an associated image output
if (isImageOutput(result) && !nodeDenylist.includes(node.type)) {
- const { image_name, image_origin } = result.image;
+ const { image_name } = result.image;
// Get its metadata
dispatch(
imageMetadataReceived({
imageName: image_name,
- imageOrigin: image_origin,
})
);
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts
index 9bd3cd6dd2..3e211f73bb 100644
--- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts
@@ -11,12 +11,11 @@ export const addStagingAreaImageSavedListener = () => {
startAppListening({
actionCreator: stagingAreaImageSaved,
effect: async (action, { dispatch, getState, take }) => {
- const { image_name, image_origin } = action.payload;
+ const { image_name } = action.payload;
dispatch(
imageUpdated({
imageName: image_name,
- imageOrigin: image_origin,
requestBody: {
is_intermediate: false,
},
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts
index d02ffbe931..7cb8012848 100644
--- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts
@@ -80,11 +80,10 @@ export const addUpdateImageUrlsOnConnectListener = () => {
`Fetching new image URLs for ${allUsedImages.length} images`
);
- allUsedImages.forEach(({ image_name, image_origin }) => {
+ allUsedImages.forEach(({ image_name }) => {
dispatch(
imageUrlsReceived({
imageName: image_name,
- imageOrigin: image_origin,
})
);
});
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedCanvas.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedCanvas.ts
index 0ee3016bdb..4d8177d7f3 100644
--- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedCanvas.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedCanvas.ts
@@ -116,7 +116,6 @@ export const addUserInvokedCanvasListener = () => {
// Update the base node with the image name and type
baseNode.image = {
image_name: baseImageDTO.image_name,
- image_origin: baseImageDTO.image_origin,
};
}
@@ -143,7 +142,6 @@ export const addUserInvokedCanvasListener = () => {
// Update the base node with the image name and type
baseNode.mask = {
image_name: maskImageDTO.image_name,
- image_origin: maskImageDTO.image_origin,
};
}
@@ -160,7 +158,6 @@ export const addUserInvokedCanvasListener = () => {
dispatch(
imageUpdated({
imageName: baseNode.image.image_name,
- imageOrigin: baseNode.image.image_origin,
requestBody: { session_id: sessionId },
})
);
@@ -171,7 +168,6 @@ export const addUserInvokedCanvasListener = () => {
dispatch(
imageUpdated({
imageName: baseNode.mask.image_name,
- imageOrigin: baseNode.mask.image_origin,
requestBody: { session_id: sessionId },
})
);
diff --git a/invokeai/frontend/web/src/common/components/IAICustomSelect.tsx b/invokeai/frontend/web/src/common/components/IAICustomSelect.tsx
deleted file mode 100644
index 1d9ae763b1..0000000000
--- a/invokeai/frontend/web/src/common/components/IAICustomSelect.tsx
+++ /dev/null
@@ -1,256 +0,0 @@
-import { CheckIcon, ChevronUpIcon } from '@chakra-ui/icons';
-import {
- Box,
- Flex,
- FormControl,
- FormControlProps,
- FormLabel,
- Grid,
- GridItem,
- List,
- ListItem,
- Text,
- Tooltip,
- TooltipProps,
-} from '@chakra-ui/react';
-import { autoUpdate, offset, shift, useFloating } from '@floating-ui/react-dom';
-import { useSelect } from 'downshift';
-import { isString } from 'lodash-es';
-import { OverlayScrollbarsComponent } from 'overlayscrollbars-react';
-
-import { memo, useLayoutEffect, useMemo } from 'react';
-import { getInputOutlineStyles } from 'theme/util/getInputOutlineStyles';
-
-export type ItemTooltips = { [key: string]: string };
-
-export type IAICustomSelectOption = {
- value: string;
- label: string;
- tooltip?: string;
-};
-
-type IAICustomSelectProps = {
- label?: string;
- value: string;
- data: IAICustomSelectOption[] | string[];
- onChange: (v: string) => void;
- withCheckIcon?: boolean;
- formControlProps?: FormControlProps;
- tooltip?: string;
- tooltipProps?: Omit;
- ellipsisPosition?: 'start' | 'end';
- isDisabled?: boolean;
-};
-
-const IAICustomSelect = (props: IAICustomSelectProps) => {
- const {
- label,
- withCheckIcon,
- formControlProps,
- tooltip,
- tooltipProps,
- ellipsisPosition = 'end',
- data,
- value,
- onChange,
- isDisabled = false,
- } = props;
-
- const values = useMemo(() => {
- return data.map((v) => {
- if (isString(v)) {
- return { value: v, label: v };
- }
- return v;
- });
- }, [data]);
-
- const stringValues = useMemo(() => {
- return values.map((v) => v.value);
- }, [values]);
-
- const valueData = useMemo(() => {
- return values.find((v) => v.value === value);
- }, [values, value]);
-
- const {
- isOpen,
- getToggleButtonProps,
- getLabelProps,
- getMenuProps,
- highlightedIndex,
- getItemProps,
- } = useSelect({
- items: stringValues,
- selectedItem: value,
- onSelectedItemChange: ({ selectedItem: newSelectedItem }) => {
- newSelectedItem && onChange(newSelectedItem);
- },
- });
-
- const { refs, floatingStyles, update } = useFloating({
- // whileElementsMounted: autoUpdate,
- middleware: [offset(4), shift({ crossAxis: true, padding: 8 })],
- });
-
- useLayoutEffect(() => {
- if (isOpen && refs.reference.current && refs.floating.current) {
- return autoUpdate(refs.reference.current, refs.floating.current, update);
- }
- }, [isOpen, update, refs.floating, refs.reference]);
-
- const labelTextDirection = useMemo(() => {
- if (ellipsisPosition === 'start') {
- return document.dir === 'rtl' ? 'ltr' : 'rtl';
- }
-
- return document.dir;
- }, [ellipsisPosition]);
-
- return (
-
- {label && (
- {
- refs.floating.current && refs.floating.current.focus();
- }}
- >
- {label}
-
- )}
-
-
-
- {valueData?.label}
-
-
-
-
-
- {isOpen && (
-
-
- {values.map((v, index) => {
- const isSelected = value === v.value;
- const isHighlighted = highlightedIndex === index;
- const fontWeight = isSelected ? 700 : 500;
- const bg = isHighlighted
- ? 'base.700'
- : isSelected
- ? 'base.750'
- : undefined;
- return (
-
-
- {withCheckIcon ? (
-
-
- {isSelected && }
-
-
-
- {v.label}
-
-
-
- ) : (
-
- {v.label}
-
- )}
-
-
- );
- })}
-
-
- )}
-
-
- );
-};
-
-export default memo(IAICustomSelect);
diff --git a/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx
new file mode 100644
index 0000000000..30517d0f41
--- /dev/null
+++ b/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx
@@ -0,0 +1,76 @@
+import { Tooltip } from '@chakra-ui/react';
+import { Select, SelectProps } from '@mantine/core';
+import { memo } from 'react';
+
+export type IAISelectDataType = {
+ value: string;
+ label: string;
+ tooltip?: string;
+};
+
+type IAISelectProps = SelectProps & {
+ tooltip?: string;
+};
+
+const IAIMantineSelect = (props: IAISelectProps) => {
+ const { searchable = true, tooltip, ...rest } = props;
+ return (
+
+
+ );
+};
+
+export default memo(IAIMantineSelect);
diff --git a/invokeai/frontend/web/src/common/components/IAIScrollArea.tsx b/invokeai/frontend/web/src/common/components/IAIScrollArea.tsx
new file mode 100644
index 0000000000..5dc96859b5
--- /dev/null
+++ b/invokeai/frontend/web/src/common/components/IAIScrollArea.tsx
@@ -0,0 +1,12 @@
+import { ScrollArea, ScrollAreaProps } from '@mantine/core';
+
+type IAIScrollArea = ScrollAreaProps;
+
+export default function IAIScrollArea(props: IAIScrollArea) {
+ const { ...rest } = props;
+ return (
+
+ {props.children}
+
+ );
+}
diff --git a/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx b/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx
index 30ff6fff81..8c46d67de3 100644
--- a/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx
+++ b/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx
@@ -2,7 +2,6 @@ import { Box, ButtonGroup, Flex } from '@chakra-ui/react';
import { createSelector } from '@reduxjs/toolkit';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import IAIIconButton from 'common/components/IAIIconButton';
-import IAISelect from 'common/components/IAISelect';
import useImageUploader from 'common/hooks/useImageUploader';
import { useSingleAndDoubleClick } from 'common/hooks/useSingleAndDoubleClick';
import {
@@ -25,7 +24,13 @@ import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider';
import { systemSelector } from 'features/system/store/systemSelectors';
import { isEqual } from 'lodash-es';
-import { ChangeEvent } from 'react';
+import IAIMantineSelect from 'common/components/IAIMantineSelect';
+import {
+ canvasCopiedToClipboard,
+ canvasDownloadedAsImage,
+ canvasMerged,
+ canvasSavedToGallery,
+} from 'features/canvas/store/actions';
import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next';
import {
@@ -43,12 +48,6 @@ import IAICanvasRedoButton from './IAICanvasRedoButton';
import IAICanvasSettingsButtonPopover from './IAICanvasSettingsButtonPopover';
import IAICanvasToolChooserOptions from './IAICanvasToolChooserOptions';
import IAICanvasUndoButton from './IAICanvasUndoButton';
-import {
- canvasCopiedToClipboard,
- canvasDownloadedAsImage,
- canvasMerged,
- canvasSavedToGallery,
-} from 'features/canvas/store/actions';
export const selector = createSelector(
[systemSelector, canvasSelector, isStagingSelector],
@@ -197,8 +196,8 @@ const IAICanvasToolbar = () => {
dispatch(canvasDownloadedAsImage());
};
- const handleChangeLayer = (e: ChangeEvent) => {
- const newLayer = e.target.value as CanvasLayer;
+ const handleChangeLayer = (v: string) => {
+ const newLayer = v as CanvasLayer;
dispatch(setLayer(newLayer));
if (newLayer === 'mask' && !isMaskEnabled) {
dispatch(setIsMaskEnabled(true));
@@ -214,13 +213,12 @@ const IAICanvasToolbar = () => {
}}
>
-
diff --git a/invokeai/frontend/web/src/features/canvas/store/canvasSlice.ts b/invokeai/frontend/web/src/features/canvas/store/canvasSlice.ts
index dc86783642..b7092bf7e0 100644
--- a/invokeai/frontend/web/src/features/canvas/store/canvasSlice.ts
+++ b/invokeai/frontend/web/src/features/canvas/store/canvasSlice.ts
@@ -866,8 +866,7 @@ export const canvasSlice = createSlice({
});
builder.addCase(imageUrlsReceived.fulfilled, (state, action) => {
- const { image_name, image_origin, image_url, thumbnail_url } =
- action.payload;
+ const { image_name, image_url, thumbnail_url } = action.payload;
state.layerState.objects.forEach((object) => {
if (object.kind === 'image') {
diff --git a/invokeai/frontend/web/src/features/canvas/store/canvasTypes.ts b/invokeai/frontend/web/src/features/canvas/store/canvasTypes.ts
index 804e06f88f..ae78287a7b 100644
--- a/invokeai/frontend/web/src/features/canvas/store/canvasTypes.ts
+++ b/invokeai/frontend/web/src/features/canvas/store/canvasTypes.ts
@@ -4,8 +4,8 @@ import { RgbaColor } from 'react-colorful';
import { ImageDTO } from 'services/api';
export const LAYER_NAMES_DICT = [
- { key: 'Base', value: 'base' },
- { key: 'Mask', value: 'mask' },
+ { label: 'Base', value: 'base' },
+ { label: 'Mask', value: 'mask' },
];
export const LAYER_NAMES = ['base', 'mask'] as const;
@@ -13,9 +13,9 @@ export const LAYER_NAMES = ['base', 'mask'] as const;
export type CanvasLayer = (typeof LAYER_NAMES)[number];
export const BOUNDING_BOX_SCALES_DICT = [
- { key: 'Auto', value: 'auto' },
- { key: 'Manual', value: 'manual' },
- { key: 'None', value: 'none' },
+ { label: 'Auto', value: 'auto' },
+ { label: 'Manual', value: 'manual' },
+ { label: 'None', value: 'none' },
];
export const BOUNDING_BOX_SCALES = ['none', 'auto', 'manual'] as const;
diff --git a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetModel.tsx b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetModel.tsx
index cbdd727b42..7a6def717a 100644
--- a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetModel.tsx
+++ b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetModel.tsx
@@ -1,9 +1,8 @@
import { createSelector } from '@reduxjs/toolkit';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
-import IAICustomSelect, {
- IAICustomSelectOption,
-} from 'common/components/IAICustomSelect';
-import IAISelect from 'common/components/IAISelect';
+import IAIMantineSelect, {
+ IAISelectDataType,
+} from 'common/components/IAIMantineSelect';
import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke';
import {
CONTROLNET_MODELS,
@@ -12,7 +11,7 @@ import {
import { controlNetModelChanged } from 'features/controlNet/store/controlNetSlice';
import { configSelector } from 'features/system/store/configSelectors';
import { map } from 'lodash-es';
-import { ChangeEvent, memo, useCallback } from 'react';
+import { memo, useCallback } from 'react';
type ParamControlNetModelProps = {
controlNetId: string;
@@ -20,17 +19,18 @@ type ParamControlNetModelProps = {
};
const selector = createSelector(configSelector, (config) => {
- return map(CONTROLNET_MODELS, (m) => ({
- key: m.label,
+ const controlNetModels: IAISelectDataType[] = map(CONTROLNET_MODELS, (m) => ({
+ label: m.label,
value: m.type,
- })).filter((d) => !config.sd.disabledControlNetModels.includes(d.value));
-});
+ })).filter(
+ (d) =>
+ !config.sd.disabledControlNetModels.includes(
+ d.value as ControlNetModelName
+ )
+ );
-// const DATA: IAICustomSelectOption[] = map(CONTROLNET_MODELS, (m) => ({
-// value: m.type,
-// label: m.label,
-// tooltip: m.type,
-// }));
+ return controlNetModels;
+});
const ParamControlNetModel = (props: ParamControlNetModelProps) => {
const { controlNetId, model } = props;
@@ -39,47 +39,23 @@ const ParamControlNetModel = (props: ParamControlNetModelProps) => {
const isReady = useIsReadyToInvoke();
const handleModelChanged = useCallback(
- (e: ChangeEvent) => {
+ (val: string | null) => {
// TODO: do not cast
- const model = e.target.value as ControlNetModelName;
+ const model = val as ControlNetModelName;
dispatch(controlNetModelChanged({ controlNetId, model }));
},
[controlNetId, dispatch]
);
- // const handleModelChanged = useCallback(
- // (val: string | null | undefined) => {
- // // TODO: do not cast
- // const model = val as ControlNetModelName;
- // dispatch(controlNetModelChanged({ controlNetId, model }));
- // },
- // [controlNetId, dispatch]
- // );
-
return (
-
);
- // return (
- //
- // );
};
export default memo(ParamControlNetModel);
diff --git a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetProcessorSelect.tsx b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetProcessorSelect.tsx
index b48fa50188..9f333e1c33 100644
--- a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetProcessorSelect.tsx
+++ b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetProcessorSelect.tsx
@@ -1,64 +1,55 @@
-import IAICustomSelect, {
- IAICustomSelectOption,
-} from 'common/components/IAICustomSelect';
-import { ChangeEvent, memo, useCallback } from 'react';
+import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
+
+import IAIMantineSelect, {
+ IAISelectDataType,
+} from 'common/components/IAIMantineSelect';
+import { map } from 'lodash-es';
+import { memo, useCallback } from 'react';
+import { CONTROLNET_PROCESSORS } from '../../store/constants';
+import { controlNetProcessorTypeChanged } from '../../store/controlNetSlice';
import {
ControlNetProcessorNode,
ControlNetProcessorType,
} from '../../store/types';
-import { controlNetProcessorTypeChanged } from '../../store/controlNetSlice';
-import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
-import { CONTROLNET_PROCESSORS } from '../../store/constants';
-import { map } from 'lodash-es';
import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke';
-import IAISelect from 'common/components/IAISelect';
import { createSelector } from '@reduxjs/toolkit';
import { configSelector } from 'features/system/store/configSelectors';
+import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
type ParamControlNetProcessorSelectProps = {
controlNetId: string;
processorNode: ControlNetProcessorNode;
};
-const CONTROLNET_PROCESSOR_TYPES = map(CONTROLNET_PROCESSORS, (p) => ({
- value: p.type,
- key: p.label,
-})).sort((a, b) =>
- // sort 'none' to the top
- a.value === 'none' ? -1 : b.value === 'none' ? 1 : a.key.localeCompare(b.key)
-);
-
-const selector = createSelector(configSelector, (config) => {
- return map(CONTROLNET_PROCESSORS, (p) => ({
- value: p.type,
- key: p.label,
- }))
- .sort((a, b) =>
- // sort 'none' to the top
- a.value === 'none'
- ? -1
- : b.value === 'none'
- ? 1
- : a.key.localeCompare(b.key)
+const selector = createSelector(
+ configSelector,
+ (config) => {
+ const controlNetProcessors: IAISelectDataType[] = map(
+ CONTROLNET_PROCESSORS,
+ (p) => ({
+ value: p.type,
+ label: p.label,
+ })
)
- .filter((d) => !config.sd.disabledControlNetProcessors.includes(d.value));
-});
+ .sort((a, b) =>
+ // sort 'none' to the top
+ a.value === 'none'
+ ? -1
+ : b.value === 'none'
+ ? 1
+ : a.label.localeCompare(b.label)
+ )
+ .filter(
+ (d) =>
+ !config.sd.disabledControlNetProcessors.includes(
+ d.value as ControlNetProcessorType
+ )
+ );
-// const CONTROLNET_PROCESSOR_TYPES: IAICustomSelectOption[] = map(
-// CONTROLNET_PROCESSORS,
-// (p) => ({
-// value: p.type,
-// label: p.label,
-// tooltip: p.description,
-// })
-// ).sort((a, b) =>
-// // sort 'none' to the top
-// a.value === 'none'
-// ? -1
-// : b.value === 'none'
-// ? 1
-// : a.label.localeCompare(b.label)
-// );
+ return controlNetProcessors;
+ },
+ defaultSelectorOptions
+);
const ParamControlNetProcessorSelect = (
props: ParamControlNetProcessorSelectProps
@@ -69,47 +60,26 @@ const ParamControlNetProcessorSelect = (
const controlNetProcessors = useAppSelector(selector);
const handleProcessorTypeChanged = useCallback(
- (e: ChangeEvent) => {
+ (v: string | null) => {
dispatch(
controlNetProcessorTypeChanged({
controlNetId,
- processorType: e.target.value as ControlNetProcessorType,
+ processorType: v as ControlNetProcessorType,
})
);
},
[controlNetId, dispatch]
);
- // const handleProcessorTypeChanged = useCallback(
- // (v: string | null | undefined) => {
- // dispatch(
- // controlNetProcessorTypeChanged({
- // controlNetId,
- // processorType: v as ControlNetProcessorType,
- // })
- // );
- // },
- // [controlNetId, dispatch]
- // );
return (
-
);
- // return (
- //
- // );
};
export default memo(ParamControlNetProcessorSelect);
diff --git a/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts b/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts
index d71ff4da68..f1b62cd997 100644
--- a/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts
+++ b/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts
@@ -271,8 +271,7 @@ export const controlNetSlice = createSlice({
});
builder.addCase(imageUrlsReceived.fulfilled, (state, action) => {
- const { image_name, image_origin, image_url, thumbnail_url } =
- action.payload;
+ const { image_name, image_url, thumbnail_url } = action.payload;
forEach(state.controlNets, (c) => {
if (c.controlImage?.image_name === image_name) {
diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer.tsx
index 1a8801fa52..892516a3cc 100644
--- a/invokeai/frontend/web/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer.tsx
+++ b/invokeai/frontend/web/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer.tsx
@@ -9,15 +9,15 @@ import {
Tooltip,
} from '@chakra-ui/react';
import { useAppDispatch } from 'app/store/storeHooks';
+import { useRecallParameters } from 'features/parameters/hooks/useRecallParameters';
import { setShouldShowImageDetails } from 'features/ui/store/uiSlice';
+import { OverlayScrollbarsComponent } from 'overlayscrollbars-react';
import { memo } from 'react';
import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next';
import { FaCopy } from 'react-icons/fa';
import { IoArrowUndoCircleOutline } from 'react-icons/io5';
-import { OverlayScrollbarsComponent } from 'overlayscrollbars-react';
import { ImageDTO } from 'services/api';
-import { useRecallParameters } from 'features/parameters/hooks/useRecallParameters';
type MetadataItemProps = {
isLink?: boolean;
@@ -324,7 +324,7 @@ const ImageMetadataViewer = memo(({ image }: ImageMetadataViewerProps) => {
borderRadius: 'base',
bg: 'whiteAlpha.500',
_dark: { bg: 'blackAlpha.500' },
- w: 'max-content',
+ w: 'full',
}}
>
{metadataJSON}
diff --git a/invokeai/frontend/web/src/features/gallery/store/gallerySlice.ts b/invokeai/frontend/web/src/features/gallery/store/gallerySlice.ts
index b9d091305a..4f250a7c3a 100644
--- a/invokeai/frontend/web/src/features/gallery/store/gallerySlice.ts
+++ b/invokeai/frontend/web/src/features/gallery/store/gallerySlice.ts
@@ -59,8 +59,7 @@ export const gallerySlice = createSlice({
}
});
builder.addCase(imageUrlsReceived.fulfilled, (state, action) => {
- const { image_name, image_origin, image_url, thumbnail_url } =
- action.payload;
+ const { image_name, image_url, thumbnail_url } = action.payload;
if (state.selectedImage?.image_name === image_name) {
state.selectedImage.image_url = image_url;
diff --git a/invokeai/frontend/web/src/features/gallery/store/imagesSlice.ts b/invokeai/frontend/web/src/features/gallery/store/imagesSlice.ts
index c9fc61d10d..9c18380c54 100644
--- a/invokeai/frontend/web/src/features/gallery/store/imagesSlice.ts
+++ b/invokeai/frontend/web/src/features/gallery/store/imagesSlice.ts
@@ -86,8 +86,7 @@ const imagesSlice = createSlice({
imagesAdapter.removeOne(state, imageName);
});
builder.addCase(imageUrlsReceived.fulfilled, (state, action) => {
- const { image_name, image_origin, image_url, thumbnail_url } =
- action.payload;
+ const { image_name, image_url, thumbnail_url } = action.payload;
imagesAdapter.updateOne(state, {
id: image_name,
diff --git a/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts b/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts
index 403a9292e1..5425d1cfd5 100644
--- a/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts
+++ b/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts
@@ -103,8 +103,7 @@ const nodesSlice = createSlice({
});
builder.addCase(imageUrlsReceived.fulfilled, (state, action) => {
- const { image_name, image_origin, image_url, thumbnail_url } =
- action.payload;
+ const { image_name, image_url, thumbnail_url } = action.payload;
state.nodes.forEach((node) => {
forEach(node.data.inputs, (input) => {
diff --git a/invokeai/frontend/web/src/features/nodes/util/addControlNetToLinearGraph.ts b/invokeai/frontend/web/src/features/nodes/util/addControlNetToLinearGraph.ts
index 9aab13784f..1fd7eb2dba 100644
--- a/invokeai/frontend/web/src/features/nodes/util/addControlNetToLinearGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/addControlNetToLinearGraph.ts
@@ -66,17 +66,15 @@ export const addControlNetToLinearGraph = (
if (processedControlImage && processorType !== 'none') {
// We've already processed the image in the app, so we can just use the processed image
- const { image_name, image_origin } = processedControlImage;
+ const { image_name } = processedControlImage;
controlNetNode.image = {
image_name,
- image_origin,
};
} else if (controlImage) {
// The control image is preprocessed
- const { image_name, image_origin } = controlImage;
+ const { image_name } = controlImage;
controlNetNode.image = {
image_name,
- image_origin,
};
} else {
// Skip ControlNets without an unprocessed image - should never happen if everything is working correctly
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildImageToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildImageToImageGraph.ts
index f8fea7e4d7..4986d86713 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildImageToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildImageToImageGraph.ts
@@ -354,7 +354,6 @@ export const buildImageToImageGraph = (state: RootState): Graph => {
type: 'img_resize',
image: {
image_name: initialImage.image_name,
- image_origin: initialImage.image_origin,
},
is_intermediate: true,
height,
@@ -392,7 +391,6 @@ export const buildImageToImageGraph = (state: RootState): Graph => {
// We are not resizing, so we need to set the image on the `IMAGE_TO_LATENTS` node explicitly
set(graph.nodes[IMAGE_TO_LATENTS], 'image', {
image_name: initialImage.image_name,
- image_origin: initialImage.image_origin,
});
// Pass the image's dimensions to the `NOISE` node
diff --git a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildImageToImageNode.ts b/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildImageToImageNode.ts
index 558f937837..e29b46af70 100644
--- a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildImageToImageNode.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildImageToImageNode.ts
@@ -57,8 +57,7 @@ export const buildImg2ImgNode = (
}
imageToImageNode.image = {
- image_name: initialImage.name,
- image_origin: initialImage.type,
+ image_name: initialImage.image_name,
};
}
diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamInfillMethod.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamInfillMethod.tsx
index 00812f458a..d0f8545e14 100644
--- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamInfillMethod.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamInfillMethod.tsx
@@ -1,12 +1,12 @@
import { createSelector } from '@reduxjs/toolkit';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
-import IAISelect from 'common/components/IAISelect';
+import IAIMantineSelect from 'common/components/IAIMantineSelect';
import { generationSelector } from 'features/parameters/store/generationSelectors';
import { setInfillMethod } from 'features/parameters/store/generationSlice';
import { systemSelector } from 'features/system/store/systemSelectors';
-import { ChangeEvent, memo, useCallback } from 'react';
+import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
const selector = createSelector(
@@ -30,17 +30,17 @@ const ParamInfillMethod = () => {
const { t } = useTranslation();
const handleChange = useCallback(
- (e: ChangeEvent) => {
- dispatch(setInfillMethod(e.target.value));
+ (v: string) => {
+ dispatch(setInfillMethod(v));
},
[dispatch]
);
return (
-
);
diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamScaleBeforeProcessing.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamScaleBeforeProcessing.tsx
index 8164371b56..827fe77e0d 100644
--- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamScaleBeforeProcessing.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamScaleBeforeProcessing.tsx
@@ -1,15 +1,15 @@
import { createSelector } from '@reduxjs/toolkit';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
-import IAISelect from 'common/components/IAISelect';
+import IAIMantineSelect from 'common/components/IAIMantineSelect';
import { canvasSelector } from 'features/canvas/store/canvasSelectors';
import { setBoundingBoxScaleMethod } from 'features/canvas/store/canvasSlice';
import {
- BoundingBoxScale,
BOUNDING_BOX_SCALES_DICT,
+ BoundingBoxScale,
} from 'features/canvas/store/canvasTypes';
-import { ChangeEvent, memo } from 'react';
+import { memo } from 'react';
import { useTranslation } from 'react-i18next';
const selector = createSelector(
@@ -30,16 +30,14 @@ const ParamScaleBeforeProcessing = () => {
const { t } = useTranslation();
- const handleChangeBoundingBoxScaleMethod = (
- e: ChangeEvent
- ) => {
- dispatch(setBoundingBoxScaleMethod(e.target.value as BoundingBoxScale));
+ const handleChangeBoundingBoxScaleMethod = (v: string) => {
+ dispatch(setBoundingBoxScaleMethod(v as BoundingBoxScale));
};
return (
-
diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamScheduler.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamScheduler.tsx
index b12345ae8d..cf29636ea3 100644
--- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamScheduler.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamScheduler.tsx
@@ -2,23 +2,20 @@ import { createSelector } from '@reduxjs/toolkit';
import { Scheduler } from 'app/constants';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
-import IAICustomSelect from 'common/components/IAICustomSelect';
-import IAISelect from 'common/components/IAISelect';
+import IAIMantineSelect, {
+ IAISelectDataType,
+} from 'common/components/IAIMantineSelect';
import { generationSelector } from 'features/parameters/store/generationSelectors';
import { setScheduler } from 'features/parameters/store/generationSlice';
import { uiSelector } from 'features/ui/store/uiSelectors';
-import { ChangeEvent, memo, useCallback } from 'react';
+import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
const selector = createSelector(
[uiSelector, generationSelector],
(ui, generation) => {
- // TODO: DPMSolverSinglestepScheduler is fixed in https://github.com/huggingface/diffusers/pull/3413
- // but we need to wait for the next release before removing this special handling.
- const allSchedulers = ui.schedulers
- .filter((scheduler) => {
- return !['dpmpp_2s'].includes(scheduler);
- })
+ const allSchedulers: string[] = ui.schedulers
+ .slice()
.sort((a, b) => a.localeCompare(b));
return {
@@ -36,39 +33,23 @@ const ParamScheduler = () => {
const { t } = useTranslation();
const handleChange = useCallback(
- (e: ChangeEvent) => {
- dispatch(setScheduler(e.target.value as Scheduler));
+ (v: string | null) => {
+ if (!v) {
+ return;
+ }
+ dispatch(setScheduler(v as Scheduler));
},
[dispatch]
);
- // const handleChange = useCallback(
- // (v: string | null | undefined) => {
- // if (!v) {
- // return;
- // }
- // dispatch(setScheduler(v as Scheduler));
- // },
- // [dispatch]
- // );
return (
-
);
-
- // return (
- //
- // );
};
export default memo(ParamScheduler);
diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreType.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreType.tsx
index aa4231eb4b..9246b3bd5c 100644
--- a/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreType.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreType.tsx
@@ -1,12 +1,11 @@
import { FACETOOL_TYPES } from 'app/constants';
import { RootState } from 'app/store/store';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
-import IAISelect from 'common/components/IAISelect';
+import IAIMantineSelect from 'common/components/IAIMantineSelect';
import {
FacetoolType,
setFacetoolType,
} from 'features/parameters/store/postprocessingSlice';
-import { ChangeEvent } from 'react';
import { useTranslation } from 'react-i18next';
export default function FaceRestoreType() {
@@ -17,13 +16,13 @@ export default function FaceRestoreType() {
const dispatch = useAppDispatch();
const { t } = useTranslation();
- const handleChangeFacetoolType = (e: ChangeEvent) =>
- dispatch(setFacetoolType(e.target.value as FacetoolType));
+ const handleChangeFacetoolType = (v: string) =>
+ dispatch(setFacetoolType(v as FacetoolType));
return (
-
diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleScale.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleScale.tsx
index 180b90f021..fadc8a7419 100644
--- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleScale.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleScale.tsx
@@ -1,12 +1,11 @@
import { UPSCALING_LEVELS } from 'app/constants';
import type { RootState } from 'app/store/store';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
-import IAISelect from 'common/components/IAISelect';
+import IAIMantineSelect from 'common/components/IAIMantineSelect';
import {
- setUpscalingLevel,
UpscalingLevel,
+ setUpscalingLevel,
} from 'features/parameters/store/postprocessingSlice';
-import type { ChangeEvent } from 'react';
import { useTranslation } from 'react-i18next';
export default function UpscaleScale() {
@@ -21,16 +20,16 @@ export default function UpscaleScale() {
const { t } = useTranslation();
const dispatch = useAppDispatch();
- const handleChangeLevel = (e: ChangeEvent) =>
- dispatch(setUpscalingLevel(Number(e.target.value) as UpscalingLevel));
+ const handleChangeLevel = (v: string) =>
+ dispatch(setUpscalingLevel(Number(v) as UpscalingLevel));
return (
-
);
}
diff --git a/invokeai/frontend/web/src/features/parameters/store/actions.ts b/invokeai/frontend/web/src/features/parameters/store/actions.ts
index eba01248d1..e9f708fc03 100644
--- a/invokeai/frontend/web/src/features/parameters/store/actions.ts
+++ b/invokeai/frontend/web/src/features/parameters/store/actions.ts
@@ -1,11 +1,5 @@
import { createAction } from '@reduxjs/toolkit';
-import { isObject } from 'lodash-es';
-import { ImageDTO, ResourceOrigin } from 'services/api';
-
-export type ImageNameAndOrigin = {
- image_name: string;
- image_origin: ResourceOrigin;
-};
+import { ImageDTO } from 'services/api';
export const initialImageSelected = createAction(
'generation/initialImageSelected'
diff --git a/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts b/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts
index 3512ded3ab..f516229efe 100644
--- a/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts
+++ b/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts
@@ -234,8 +234,7 @@ export const generationSlice = createSlice({
});
builder.addCase(imageUrlsReceived.fulfilled, (state, action) => {
- const { image_name, image_origin, image_url, thumbnail_url } =
- action.payload;
+ const { image_name, image_url, thumbnail_url } = action.payload;
if (state.initialImage?.image_name === image_name) {
state.initialImage.image_url = image_url;
diff --git a/invokeai/frontend/web/src/features/system/components/ModelSelect.tsx b/invokeai/frontend/web/src/features/system/components/ModelSelect.tsx
index 48be6d263a..a38ab150dd 100644
--- a/invokeai/frontend/web/src/features/system/components/ModelSelect.tsx
+++ b/invokeai/frontend/web/src/features/system/components/ModelSelect.tsx
@@ -1,17 +1,16 @@
import { createSelector } from '@reduxjs/toolkit';
-import { ChangeEvent, memo, useCallback } from 'react';
import { isEqual } from 'lodash-es';
+import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
-import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
-import { selectModelsAll, selectModelsById } from '../store/modelSlice';
import { RootState } from 'app/store/store';
-import { modelSelected } from 'features/parameters/store/generationSlice';
+import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
+import IAIMantineSelect, {
+ IAISelectDataType,
+} from 'common/components/IAIMantineSelect';
import { generationSelector } from 'features/parameters/store/generationSelectors';
-import IAICustomSelect, {
- IAICustomSelectOption,
-} from 'common/components/IAICustomSelect';
-import IAISelect from 'common/components/IAISelect';
+import { modelSelected } from 'features/parameters/store/generationSlice';
+import { selectModelsAll, selectModelsById } from '../store/modelSlice';
const selector = createSelector(
[(state: RootState) => state, generationSelector],
@@ -19,18 +18,11 @@ const selector = createSelector(
const selectedModel = selectModelsById(state, generation.model);
const modelData = selectModelsAll(state)
- .map((m) => ({
+ .map((m) => ({
value: m.name,
- key: m.name,
+ label: m.name,
}))
- .sort((a, b) => a.key.localeCompare(b.key));
- // const modelData = selectModelsAll(state)
- // .map((m) => ({
- // value: m.name,
- // label: m.name,
- // tooltip: m.description,
- // }))
- // .sort((a, b) => a.label.localeCompare(b.label));
+ .sort((a, b) => a.label.localeCompare(b.label));
return {
selectedModel,
modelData,
@@ -48,43 +40,25 @@ const ModelSelect = () => {
const { t } = useTranslation();
const { selectedModel, modelData } = useAppSelector(selector);
const handleChangeModel = useCallback(
- (e: ChangeEvent) => {
- dispatch(modelSelected(e.target.value));
+ (v: string | null) => {
+ if (!v) {
+ return;
+ }
+ dispatch(modelSelected(v));
},
[dispatch]
);
- // const handleChangeModel = useCallback(
- // (v: string | null | undefined) => {
- // if (!v) {
- // return;
- // }
- // dispatch(modelSelected(v));
- // },
- // [dispatch]
- // );
return (
-
);
-
- // return (
- //
- // );
};
export default memo(ModelSelect);
diff --git a/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx b/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx
index 4cfe35081b..dfba1da4ef 100644
--- a/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx
+++ b/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx
@@ -13,19 +13,21 @@ import {
useDisclosure,
} from '@chakra-ui/react';
import { createSelector } from '@reduxjs/toolkit';
+import { VALID_LOG_LEVELS } from 'app/logging/useLogger';
+import { LOCALSTORAGE_KEYS, LOCALSTORAGE_PREFIX } from 'app/store/constants';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import IAIButton from 'common/components/IAIButton';
-import IAISelect from 'common/components/IAISelect';
+import IAIMantineSelect from 'common/components/IAIMantineSelect';
import IAISwitch from 'common/components/IAISwitch';
import { systemSelector } from 'features/system/store/systemSelectors';
import {
+ SystemState,
consoleLogLevelChanged,
setEnableImageDebugging,
setShouldConfirmOnDelete,
setShouldDisplayGuides,
shouldAntialiasProgressImageChanged,
shouldLogToConsoleChanged,
- SystemState,
} from 'features/system/store/systemSlice';
import { uiSelector } from 'features/ui/store/uiSelectors';
import {
@@ -37,15 +39,13 @@ import { UIState } from 'features/ui/store/uiTypes';
import { isEqual } from 'lodash-es';
import {
ChangeEvent,
- cloneElement,
ReactElement,
+ cloneElement,
useCallback,
useEffect,
} from 'react';
import { useTranslation } from 'react-i18next';
-import { VALID_LOG_LEVELS } from 'app/logging/useLogger';
import { LogLevelName } from 'roarr';
-import { LOCALSTORAGE_KEYS, LOCALSTORAGE_PREFIX } from 'app/store/constants';
import SettingsSchedulers from './SettingsSchedulers';
const selector = createSelector(
@@ -157,8 +157,8 @@ const SettingsModal = ({ children, config }: SettingsModalProps) => {
}, [onSettingsModalClose, onRefreshModalOpen]);
const handleLogLevelChanged = useCallback(
- (e: ChangeEvent) => {
- dispatch(consoleLogLevelChanged(e.target.value as LogLevelName));
+ (v: string) => {
+ dispatch(consoleLogLevelChanged(v as LogLevelName));
},
[dispatch]
);
@@ -255,14 +255,12 @@ const SettingsModal = ({ children, config }: SettingsModalProps) => {
isChecked={shouldLogToConsole}
onChange={handleLogToConsoleChanged}
/>
-
{
const { shouldPinParametersPanel, shouldShowParametersPanel } = ui;
@@ -35,19 +35,27 @@ const ParametersPinnedWrapper = (props: ParametersPinnedWrapperProps) => {
flexShrink: 0,
}}
>
-
-
- {props.children}
-
-
+
+
+
+ {props.children}
+
+
+
+
diff --git a/invokeai/frontend/web/src/features/ui/components/common/OverlayScrollable.tsx b/invokeai/frontend/web/src/features/ui/components/common/OverlayScrollable.tsx
index 71413fd01a..722ee46fd5 100644
--- a/invokeai/frontend/web/src/features/ui/components/common/OverlayScrollable.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/common/OverlayScrollable.tsx
@@ -1,6 +1,5 @@
import { OverlayScrollbarsComponent } from 'overlayscrollbars-react';
import { PropsWithChildren, memo } from 'react';
-
const OverlayScrollable = (props: PropsWithChildren) => {
return (
{
);
};
-
export default memo(OverlayScrollable);
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ImageToImage/ImageToImageTab.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ImageToImage/ImageToImageTab.tsx
index cbd261f455..a0ec95d72d 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/ImageToImage/ImageToImageTab.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/ImageToImage/ImageToImageTab.tsx
@@ -1,14 +1,17 @@
import { Box, Flex } from '@chakra-ui/react';
-import { memo, useCallback, useRef } from 'react';
-import { Panel, PanelGroup } from 'react-resizable-panels';
import { useAppDispatch } from 'app/store/storeHooks';
import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale';
-import ResizeHandle from '../ResizeHandle';
-import ImageToImageTabParameters from './ImageToImageTabParameters';
-import TextToImageTabMain from '../TextToImage/TextToImageTabMain';
-import { ImperativePanelGroupHandle } from 'react-resizable-panels';
-import ParametersPinnedWrapper from '../../ParametersPinnedWrapper';
import InitialImageDisplay from 'features/parameters/components/Parameters/ImageToImage/InitialImageDisplay';
+import { memo, useCallback, useRef } from 'react';
+import {
+ ImperativePanelGroupHandle,
+ Panel,
+ PanelGroup,
+} from 'react-resizable-panels';
+import ParametersPinnedWrapper from '../../ParametersPinnedWrapper';
+import ResizeHandle from '../ResizeHandle';
+import TextToImageTabMain from '../TextToImage/TextToImageTabMain';
+import ImageToImageTabParameters from './ImageToImageTabParameters';
const ImageToImageTab = () => {
const dispatch = useAppDispatch();
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTab.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTab.tsx
index 87e77cc3ba..90141af785 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTab.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTab.tsx
@@ -1,8 +1,8 @@
import { Flex } from '@chakra-ui/react';
import { memo } from 'react';
+import ParametersPinnedWrapper from '../../ParametersPinnedWrapper';
import TextToImageTabMain from './TextToImageTabMain';
import TextToImageTabParameters from './TextToImageTabParameters';
-import ParametersPinnedWrapper from '../../ParametersPinnedWrapper';
const TextToImageTab = () => {
return (
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasLayerSelect.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasLayerSelect.tsx
index 780744b045..d7fb9d8201 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasLayerSelect.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasLayerSelect.tsx
@@ -1,6 +1,6 @@
import { createSelector } from '@reduxjs/toolkit';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
-import IAISelect from 'common/components/IAISelect';
+import IAIMantineSelect from 'common/components/IAIMantineSelect';
import {
canvasSelector,
isStagingSelector,
@@ -12,7 +12,6 @@ import {
} from 'features/canvas/store/canvasTypes';
import { isEqual } from 'lodash-es';
-import { ChangeEvent } from 'react';
import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next';
@@ -51,22 +50,22 @@ export default function UnifiedCanvasLayerSelect() {
[layer]
);
- const handleChangeLayer = (e: ChangeEvent) => {
- const newLayer = e.target.value as CanvasLayer;
+ const handleChangeLayer = (v: string) => {
+ const newLayer = v as CanvasLayer;
dispatch(setLayer(newLayer));
if (newLayer === 'mask' && !isMaskEnabled) {
dispatch(setIsMaskEnabled(true));
}
};
return (
-
);
}
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbarBeta.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbarBeta.tsx
index ece4386d45..b5eec3bec3 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbarBeta.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbarBeta.tsx
@@ -2,6 +2,7 @@ import { Flex } from '@chakra-ui/react';
import IAICanvasRedoButton from 'features/canvas/components/IAICanvasToolbar/IAICanvasRedoButton';
import IAICanvasUndoButton from 'features/canvas/components/IAICanvasToolbar/IAICanvasUndoButton';
+import UnifiedCanvasSettings from './UnifiedCanvasToolSettings/UnifiedCanvasSettings';
import UnifiedCanvasCopyToClipboard from './UnifiedCanvasToolbar/UnifiedCanvasCopyToClipboard';
import UnifiedCanvasDownloadImage from './UnifiedCanvasToolbar/UnifiedCanvasDownloadImage';
import UnifiedCanvasFileUploader from './UnifiedCanvasToolbar/UnifiedCanvasFileUploader';
@@ -13,11 +14,10 @@ import UnifiedCanvasResetCanvas from './UnifiedCanvasToolbar/UnifiedCanvasResetC
import UnifiedCanvasResetView from './UnifiedCanvasToolbar/UnifiedCanvasResetView';
import UnifiedCanvasSaveToGallery from './UnifiedCanvasToolbar/UnifiedCanvasSaveToGallery';
import UnifiedCanvasToolSelect from './UnifiedCanvasToolbar/UnifiedCanvasToolSelect';
-import UnifiedCanvasSettings from './UnifiedCanvasToolSettings/UnifiedCanvasSettings';
const UnifiedCanvasToolbarBeta = () => {
return (
-
+
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasTab.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasTab.tsx
index 6905879bdc..4c36c45e13 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasTab.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasTab.tsx
@@ -1,8 +1,8 @@
import { Flex } from '@chakra-ui/react';
import { memo } from 'react';
+import ParametersPinnedWrapper from '../../ParametersPinnedWrapper';
import UnifiedCanvasContent from './UnifiedCanvasContent';
import UnifiedCanvasParameters from './UnifiedCanvasParameters';
-import ParametersPinnedWrapper from '../../ParametersPinnedWrapper';
const UnifiedCanvasTab = () => {
return (
diff --git a/invokeai/frontend/web/src/mantine-theme/theme.ts b/invokeai/frontend/web/src/mantine-theme/theme.ts
new file mode 100644
index 0000000000..081b2c3457
--- /dev/null
+++ b/invokeai/frontend/web/src/mantine-theme/theme.ts
@@ -0,0 +1,23 @@
+import { MantineThemeOverride } from '@mantine/core';
+
+export const mantineTheme: MantineThemeOverride = {
+ colorScheme: 'dark',
+ fontFamily: `'InterVariable', sans-serif`,
+ components: {
+ ScrollArea: {
+ defaultProps: {
+ scrollbarSize: 10,
+ },
+ styles: {
+ scrollbar: {
+ '&:hover': {
+ backgroundColor: 'var(--invokeai-colors-baseAlpha-300)',
+ },
+ },
+ thumb: {
+ backgroundColor: 'var(--invokeai-colors-baseAlpha-300)',
+ },
+ },
+ },
+ },
+};
diff --git a/invokeai/frontend/web/src/services/api/index.ts b/invokeai/frontend/web/src/services/api/index.ts
index 187752627a..6d1dbed780 100644
--- a/invokeai/frontend/web/src/services/api/index.ts
+++ b/invokeai/frontend/web/src/services/api/index.ts
@@ -27,6 +27,7 @@ export type { DivideInvocation } from './models/DivideInvocation';
export type { Edge } from './models/Edge';
export type { EdgeConnection } from './models/EdgeConnection';
export type { FloatCollectionOutput } from './models/FloatCollectionOutput';
+export type { FloatLinearRangeInvocation } from './models/FloatLinearRangeInvocation';
export type { FloatOutput } from './models/FloatOutput';
export type { Graph } from './models/Graph';
export type { GraphExecutionState } from './models/GraphExecutionState';
@@ -95,6 +96,7 @@ export type { ResourceOrigin } from './models/ResourceOrigin';
export type { RestoreFaceInvocation } from './models/RestoreFaceInvocation';
export type { ScaleLatentsInvocation } from './models/ScaleLatentsInvocation';
export type { ShowImageInvocation } from './models/ShowImageInvocation';
+export type { StepParamEasingInvocation } from './models/StepParamEasingInvocation';
export type { SubtractInvocation } from './models/SubtractInvocation';
export type { TextToImageInvocation } from './models/TextToImageInvocation';
export type { TextToLatentsInvocation } from './models/TextToLatentsInvocation';
diff --git a/invokeai/frontend/web/src/services/api/models/ControlField.ts b/invokeai/frontend/web/src/services/api/models/ControlField.ts
index a67655c018..0479684d2c 100644
--- a/invokeai/frontend/web/src/services/api/models/ControlField.ts
+++ b/invokeai/frontend/web/src/services/api/models/ControlField.ts
@@ -16,7 +16,7 @@ export type ControlField = {
/**
* The weight given to the ControlNet
*/
- control_weight: number;
+ control_weight: (number | Array);
/**
* When the ControlNet is first applied (% of total steps)
*/
diff --git a/invokeai/frontend/web/src/services/api/models/ControlNetInvocation.ts b/invokeai/frontend/web/src/services/api/models/ControlNetInvocation.ts
index 92688d6adc..42268b8295 100644
--- a/invokeai/frontend/web/src/services/api/models/ControlNetInvocation.ts
+++ b/invokeai/frontend/web/src/services/api/models/ControlNetInvocation.ts
@@ -22,13 +22,13 @@ export type ControlNetInvocation = {
*/
image?: ImageField;
/**
- * The ControlNet model to use
+ * control model used
*/
control_model?: 'lllyasviel/sd-controlnet-canny' | 'lllyasviel/sd-controlnet-depth' | 'lllyasviel/sd-controlnet-hed' | 'lllyasviel/sd-controlnet-seg' | 'lllyasviel/sd-controlnet-openpose' | 'lllyasviel/sd-controlnet-scribble' | 'lllyasviel/sd-controlnet-normal' | 'lllyasviel/sd-controlnet-mlsd' | 'lllyasviel/control_v11p_sd15_canny' | 'lllyasviel/control_v11p_sd15_openpose' | 'lllyasviel/control_v11p_sd15_seg' | 'lllyasviel/control_v11f1p_sd15_depth' | 'lllyasviel/control_v11p_sd15_normalbae' | 'lllyasviel/control_v11p_sd15_scribble' | 'lllyasviel/control_v11p_sd15_mlsd' | 'lllyasviel/control_v11p_sd15_softedge' | 'lllyasviel/control_v11p_sd15s2_lineart_anime' | 'lllyasviel/control_v11p_sd15_lineart' | 'lllyasviel/control_v11p_sd15_inpaint' | 'lllyasviel/control_v11e_sd15_shuffle' | 'lllyasviel/control_v11e_sd15_ip2p' | 'lllyasviel/control_v11f1e_sd15_tile' | 'thibaud/controlnet-sd21-openpose-diffusers' | 'thibaud/controlnet-sd21-canny-diffusers' | 'thibaud/controlnet-sd21-depth-diffusers' | 'thibaud/controlnet-sd21-scribble-diffusers' | 'thibaud/controlnet-sd21-hed-diffusers' | 'thibaud/controlnet-sd21-zoedepth-diffusers' | 'thibaud/controlnet-sd21-color-diffusers' | 'thibaud/controlnet-sd21-openposev2-diffusers' | 'thibaud/controlnet-sd21-lineart-diffusers' | 'thibaud/controlnet-sd21-normalbae-diffusers' | 'thibaud/controlnet-sd21-ade20k-diffusers' | 'CrucibleAI/ControlNetMediaPipeFace,diffusion_sd15' | 'CrucibleAI/ControlNetMediaPipeFace';
/**
* The weight given to the ControlNet
*/
- control_weight?: number;
+ control_weight?: (number | Array);
/**
* When the ControlNet is first applied (% of total steps)
*/
diff --git a/invokeai/frontend/web/src/services/api/models/ControlOutput.ts b/invokeai/frontend/web/src/services/api/models/ControlOutput.ts
index 8c8b76a32f..a3cc5530c1 100644
--- a/invokeai/frontend/web/src/services/api/models/ControlOutput.ts
+++ b/invokeai/frontend/web/src/services/api/models/ControlOutput.ts
@@ -10,7 +10,7 @@ import type { ControlField } from './ControlField';
export type ControlOutput = {
type?: 'control_output';
/**
- * The output control image
+ * The control info
*/
control?: ControlField;
};
diff --git a/invokeai/frontend/web/src/services/api/models/FloatLinearRangeInvocation.ts b/invokeai/frontend/web/src/services/api/models/FloatLinearRangeInvocation.ts
new file mode 100644
index 0000000000..e0fd4a1caa
--- /dev/null
+++ b/invokeai/frontend/web/src/services/api/models/FloatLinearRangeInvocation.ts
@@ -0,0 +1,31 @@
+/* istanbul ignore file */
+/* tslint:disable */
+/* eslint-disable */
+
+/**
+ * Creates a range
+ */
+export type FloatLinearRangeInvocation = {
+ /**
+ * The id of this node. Must be unique among all nodes.
+ */
+ id: string;
+ /**
+ * Whether or not this node is an intermediate node.
+ */
+ is_intermediate?: boolean;
+ type?: 'float_range';
+ /**
+ * The first value of the range
+ */
+ start?: number;
+ /**
+ * The last value of the range
+ */
+ stop?: number;
+ /**
+ * number of values to interpolate over (including start and stop)
+ */
+ steps?: number;
+};
+
diff --git a/invokeai/frontend/web/src/services/api/models/Graph.ts b/invokeai/frontend/web/src/services/api/models/Graph.ts
index 2c7efbb423..fbc03dcf3a 100644
--- a/invokeai/frontend/web/src/services/api/models/Graph.ts
+++ b/invokeai/frontend/web/src/services/api/models/Graph.ts
@@ -11,6 +11,7 @@ import type { ControlNetInvocation } from './ControlNetInvocation';
import type { CvInpaintInvocation } from './CvInpaintInvocation';
import type { DivideInvocation } from './DivideInvocation';
import type { Edge } from './Edge';
+import type { FloatLinearRangeInvocation } from './FloatLinearRangeInvocation';
import type { GraphInvocation } from './GraphInvocation';
import type { HedImageProcessorInvocation } from './HedImageProcessorInvocation';
import type { ImageBlurInvocation } from './ImageBlurInvocation';
@@ -55,6 +56,7 @@ import type { ResizeLatentsInvocation } from './ResizeLatentsInvocation';
import type { RestoreFaceInvocation } from './RestoreFaceInvocation';
import type { ScaleLatentsInvocation } from './ScaleLatentsInvocation';
import type { ShowImageInvocation } from './ShowImageInvocation';
+import type { StepParamEasingInvocation } from './StepParamEasingInvocation';
import type { SubtractInvocation } from './SubtractInvocation';
import type { TextToImageInvocation } from './TextToImageInvocation';
import type { TextToLatentsInvocation } from './TextToLatentsInvocation';
@@ -69,7 +71,7 @@ export type Graph = {
/**
* The nodes in this graph
*/
- nodes?: Record;
+ nodes?: Record;
/**
* The connections between nodes and their fields in this graph
*/
diff --git a/invokeai/frontend/web/src/services/api/models/HedImageProcessorInvocation.ts b/invokeai/frontend/web/src/services/api/models/HedImageProcessorInvocation.ts
index 6dea43dc32..1132012c5a 100644
--- a/invokeai/frontend/web/src/services/api/models/HedImageProcessorInvocation.ts
+++ b/invokeai/frontend/web/src/services/api/models/HedImageProcessorInvocation.ts
@@ -7,26 +7,30 @@ import type { ImageField } from './ImageField';
/**
* Applies HED edge detection to image
*/
-export type HedImageprocessorInvocation = {
+export type HedImageProcessorInvocation = {
/**
* The id of this node. Must be unique among all nodes.
*/
id: string;
+ /**
+ * Whether or not this node is an intermediate node.
+ */
+ is_intermediate?: boolean;
type?: 'hed_image_processor';
/**
- * image to process
+ * The image to process
*/
image?: ImageField;
/**
- * pixel resolution for edge detection
+ * The pixel resolution for detection
*/
detect_resolution?: number;
/**
- * pixel resolution for output image
+ * The pixel resolution for the output image
*/
image_resolution?: number;
/**
- * whether to use scribble mode
+ * Whether to use scribble mode
*/
scribble?: boolean;
};
diff --git a/invokeai/frontend/web/src/services/api/models/HedImageprocessorInvocation.ts b/invokeai/frontend/web/src/services/api/models/HedImageprocessorInvocation.ts
deleted file mode 100644
index 6dea43dc32..0000000000
--- a/invokeai/frontend/web/src/services/api/models/HedImageprocessorInvocation.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/* istanbul ignore file */
-/* tslint:disable */
-/* eslint-disable */
-
-import type { ImageField } from './ImageField';
-
-/**
- * Applies HED edge detection to image
- */
-export type HedImageprocessorInvocation = {
- /**
- * The id of this node. Must be unique among all nodes.
- */
- id: string;
- type?: 'hed_image_processor';
- /**
- * image to process
- */
- image?: ImageField;
- /**
- * pixel resolution for edge detection
- */
- detect_resolution?: number;
- /**
- * pixel resolution for output image
- */
- image_resolution?: number;
- /**
- * whether to use scribble mode
- */
- scribble?: boolean;
-};
-
diff --git a/invokeai/frontend/web/src/services/api/models/ImageDTO.ts b/invokeai/frontend/web/src/services/api/models/ImageDTO.ts
index f5f2603b03..5399d16b8f 100644
--- a/invokeai/frontend/web/src/services/api/models/ImageDTO.ts
+++ b/invokeai/frontend/web/src/services/api/models/ImageDTO.ts
@@ -14,10 +14,6 @@ export type ImageDTO = {
* The unique name of the image.
*/
image_name: string;
- /**
- * The type of the image.
- */
- image_origin: ResourceOrigin;
/**
* The URL of the image.
*/
@@ -26,6 +22,10 @@ export type ImageDTO = {
* The URL of the image's thumbnail.
*/
thumbnail_url: string;
+ /**
+ * The type of the image.
+ */
+ image_origin: ResourceOrigin;
/**
* The category of the image.
*/
diff --git a/invokeai/frontend/web/src/services/api/models/ImageField.ts b/invokeai/frontend/web/src/services/api/models/ImageField.ts
index 63a12f4730..baf3bf2b54 100644
--- a/invokeai/frontend/web/src/services/api/models/ImageField.ts
+++ b/invokeai/frontend/web/src/services/api/models/ImageField.ts
@@ -2,16 +2,10 @@
/* tslint:disable */
/* eslint-disable */
-import type { ResourceOrigin } from './ResourceOrigin';
-
/**
* An image field used for passing image objects between invocations
*/
export type ImageField = {
- /**
- * The type of the image
- */
- image_origin: ResourceOrigin;
/**
* The name of the image
*/
diff --git a/invokeai/frontend/web/src/services/api/models/ImageMetadata.ts b/invokeai/frontend/web/src/services/api/models/ImageMetadata.ts
index 76c0155e97..0b2af78799 100644
--- a/invokeai/frontend/web/src/services/api/models/ImageMetadata.ts
+++ b/invokeai/frontend/web/src/services/api/models/ImageMetadata.ts
@@ -40,7 +40,7 @@ export type ImageMetadata = {
/**
* The classifier-free guidance scale.
*/
- cfg_scale?: number;
+ cfg_scale?: (number | Array);
/**
* The number of steps used for inference.
*/
diff --git a/invokeai/frontend/web/src/services/api/models/ImageUrlsDTO.ts b/invokeai/frontend/web/src/services/api/models/ImageUrlsDTO.ts
index 81639be9b3..1e0ff322e8 100644
--- a/invokeai/frontend/web/src/services/api/models/ImageUrlsDTO.ts
+++ b/invokeai/frontend/web/src/services/api/models/ImageUrlsDTO.ts
@@ -2,8 +2,6 @@
/* tslint:disable */
/* eslint-disable */
-import type { ResourceOrigin } from './ResourceOrigin';
-
/**
* The URLs for an image and its thumbnail.
*/
@@ -12,10 +10,6 @@ export type ImageUrlsDTO = {
* The unique name of the image.
*/
image_name: string;
- /**
- * The type of the image.
- */
- image_origin: ResourceOrigin;
/**
* The URL of the image.
*/
diff --git a/invokeai/frontend/web/src/services/api/models/LatentsToLatentsInvocation.ts b/invokeai/frontend/web/src/services/api/models/LatentsToLatentsInvocation.ts
index f5b4912141..60504459e7 100644
--- a/invokeai/frontend/web/src/services/api/models/LatentsToLatentsInvocation.ts
+++ b/invokeai/frontend/web/src/services/api/models/LatentsToLatentsInvocation.ts
@@ -38,7 +38,7 @@ export type LatentsToLatentsInvocation = {
/**
* The Classifier-Free Guidance, higher values may result in a result closer to the prompt
*/
- cfg_scale?: number;
+ cfg_scale?: (number | Array);
/**
* The scheduler to use
*/
diff --git a/invokeai/frontend/web/src/services/api/models/StepParamEasingInvocation.ts b/invokeai/frontend/web/src/services/api/models/StepParamEasingInvocation.ts
new file mode 100644
index 0000000000..2cff38b3e5
--- /dev/null
+++ b/invokeai/frontend/web/src/services/api/models/StepParamEasingInvocation.ts
@@ -0,0 +1,59 @@
+/* istanbul ignore file */
+/* tslint:disable */
+/* eslint-disable */
+
+/**
+ * Experimental per-step parameter easing for denoising steps
+ */
+export type StepParamEasingInvocation = {
+ /**
+ * The id of this node. Must be unique among all nodes.
+ */
+ id: string;
+ /**
+ * Whether or not this node is an intermediate node.
+ */
+ is_intermediate?: boolean;
+ type?: 'step_param_easing';
+ /**
+ * The easing function to use
+ */
+ easing?: 'Linear' | 'QuadIn' | 'QuadOut' | 'QuadInOut' | 'CubicIn' | 'CubicOut' | 'CubicInOut' | 'QuarticIn' | 'QuarticOut' | 'QuarticInOut' | 'QuinticIn' | 'QuinticOut' | 'QuinticInOut' | 'SineIn' | 'SineOut' | 'SineInOut' | 'CircularIn' | 'CircularOut' | 'CircularInOut' | 'ExponentialIn' | 'ExponentialOut' | 'ExponentialInOut' | 'ElasticIn' | 'ElasticOut' | 'ElasticInOut' | 'BackIn' | 'BackOut' | 'BackInOut' | 'BounceIn' | 'BounceOut' | 'BounceInOut';
+ /**
+ * number of denoising steps
+ */
+ num_steps?: number;
+ /**
+ * easing starting value
+ */
+ start_value?: number;
+ /**
+ * easing ending value
+ */
+ end_value?: number;
+ /**
+ * fraction of steps at which to start easing
+ */
+ start_step_percent?: number;
+ /**
+ * fraction of steps after which to end easing
+ */
+ end_step_percent?: number;
+ /**
+ * value before easing start
+ */
+ pre_start_value?: number;
+ /**
+ * value after easing end
+ */
+ post_end_value?: number;
+ /**
+ * include mirror of easing function
+ */
+ mirror?: boolean;
+ /**
+ * show easing plot
+ */
+ show_easing_plot?: boolean;
+};
+
diff --git a/invokeai/frontend/web/src/services/api/models/TextToLatentsInvocation.ts b/invokeai/frontend/web/src/services/api/models/TextToLatentsInvocation.ts
index f1831b2b59..2db0657e25 100644
--- a/invokeai/frontend/web/src/services/api/models/TextToLatentsInvocation.ts
+++ b/invokeai/frontend/web/src/services/api/models/TextToLatentsInvocation.ts
@@ -38,7 +38,7 @@ export type TextToLatentsInvocation = {
/**
* The Classifier-Free Guidance, higher values may result in a result closer to the prompt
*/
- cfg_scale?: number;
+ cfg_scale?: (number | Array);
/**
* The scheduler to use
*/
diff --git a/invokeai/frontend/web/src/services/api/services/ImagesService.ts b/invokeai/frontend/web/src/services/api/services/ImagesService.ts
index 51fe6c820f..d0eae92d4b 100644
--- a/invokeai/frontend/web/src/services/api/services/ImagesService.ts
+++ b/invokeai/frontend/web/src/services/api/services/ImagesService.ts
@@ -115,13 +115,8 @@ export class ImagesService {
* @throws ApiError
*/
public static getImageFull({
- imageOrigin,
imageName,
}: {
- /**
- * The type of full-resolution image file to get
- */
- imageOrigin: ResourceOrigin,
/**
* The name of full-resolution image file to get
*/
@@ -129,9 +124,8 @@ export class ImagesService {
}): CancelablePromise {
return __request(OpenAPI, {
method: 'GET',
- url: '/api/v1/images/{image_origin}/{image_name}',
+ url: '/api/v1/images/{image_name}',
path: {
- 'image_origin': imageOrigin,
'image_name': imageName,
},
errors: {
@@ -148,13 +142,8 @@ export class ImagesService {
* @throws ApiError
*/
public static deleteImage({
- imageOrigin,
imageName,
}: {
- /**
- * The origin of image to delete
- */
- imageOrigin: ResourceOrigin,
/**
* The name of the image to delete
*/
@@ -162,9 +151,8 @@ export class ImagesService {
}): CancelablePromise {
return __request(OpenAPI, {
method: 'DELETE',
- url: '/api/v1/images/{image_origin}/{image_name}',
+ url: '/api/v1/images/{image_name}',
path: {
- 'image_origin': imageOrigin,
'image_name': imageName,
},
errors: {
@@ -180,14 +168,9 @@ export class ImagesService {
* @throws ApiError
*/
public static updateImage({
- imageOrigin,
imageName,
requestBody,
}: {
- /**
- * The origin of image to update
- */
- imageOrigin: ResourceOrigin,
/**
* The name of the image to update
*/
@@ -196,9 +179,8 @@ export class ImagesService {
}): CancelablePromise {
return __request(OpenAPI, {
method: 'PATCH',
- url: '/api/v1/images/{image_origin}/{image_name}',
+ url: '/api/v1/images/{image_name}',
path: {
- 'image_origin': imageOrigin,
'image_name': imageName,
},
body: requestBody,
@@ -216,13 +198,8 @@ export class ImagesService {
* @throws ApiError
*/
public static getImageMetadata({
- imageOrigin,
imageName,
}: {
- /**
- * The origin of image to get
- */
- imageOrigin: ResourceOrigin,
/**
* The name of image to get
*/
@@ -230,9 +207,8 @@ export class ImagesService {
}): CancelablePromise {
return __request(OpenAPI, {
method: 'GET',
- url: '/api/v1/images/{image_origin}/{image_name}/metadata',
+ url: '/api/v1/images/{image_name}/metadata',
path: {
- 'image_origin': imageOrigin,
'image_name': imageName,
},
errors: {
@@ -248,13 +224,8 @@ export class ImagesService {
* @throws ApiError
*/
public static getImageThumbnail({
- imageOrigin,
imageName,
}: {
- /**
- * The origin of thumbnail image file to get
- */
- imageOrigin: ResourceOrigin,
/**
* The name of thumbnail image file to get
*/
@@ -262,9 +233,8 @@ export class ImagesService {
}): CancelablePromise {
return __request(OpenAPI, {
method: 'GET',
- url: '/api/v1/images/{image_origin}/{image_name}/thumbnail',
+ url: '/api/v1/images/{image_name}/thumbnail',
path: {
- 'image_origin': imageOrigin,
'image_name': imageName,
},
errors: {
@@ -281,13 +251,8 @@ export class ImagesService {
* @throws ApiError
*/
public static getImageUrls({
- imageOrigin,
imageName,
}: {
- /**
- * The origin of the image whose URL to get
- */
- imageOrigin: ResourceOrigin,
/**
* The name of the image whose URL to get
*/
@@ -295,9 +260,8 @@ export class ImagesService {
}): CancelablePromise {
return __request(OpenAPI, {
method: 'GET',
- url: '/api/v1/images/{image_origin}/{image_name}/urls',
+ url: '/api/v1/images/{image_name}/urls',
path: {
- 'image_origin': imageOrigin,
'image_name': imageName,
},
errors: {
diff --git a/invokeai/frontend/web/src/services/api/services/SessionsService.ts b/invokeai/frontend/web/src/services/api/services/SessionsService.ts
index 977c03e6fb..b95f0526be 100644
--- a/invokeai/frontend/web/src/services/api/services/SessionsService.ts
+++ b/invokeai/frontend/web/src/services/api/services/SessionsService.ts
@@ -10,6 +10,7 @@ import type { ControlNetInvocation } from '../models/ControlNetInvocation';
import type { CvInpaintInvocation } from '../models/CvInpaintInvocation';
import type { DivideInvocation } from '../models/DivideInvocation';
import type { Edge } from '../models/Edge';
+import type { FloatLinearRangeInvocation } from '../models/FloatLinearRangeInvocation';
import type { Graph } from '../models/Graph';
import type { GraphExecutionState } from '../models/GraphExecutionState';
import type { GraphInvocation } from '../models/GraphInvocation';
@@ -57,6 +58,7 @@ import type { ResizeLatentsInvocation } from '../models/ResizeLatentsInvocation'
import type { RestoreFaceInvocation } from '../models/RestoreFaceInvocation';
import type { ScaleLatentsInvocation } from '../models/ScaleLatentsInvocation';
import type { ShowImageInvocation } from '../models/ShowImageInvocation';
+import type { StepParamEasingInvocation } from '../models/StepParamEasingInvocation';
import type { SubtractInvocation } from '../models/SubtractInvocation';
import type { TextToImageInvocation } from '../models/TextToImageInvocation';
import type { TextToLatentsInvocation } from '../models/TextToLatentsInvocation';
@@ -171,7 +173,7 @@ export class SessionsService {
* The id of the session
*/
sessionId: string,
- requestBody: (LoadImageInvocation | ShowImageInvocation | ImageCropInvocation | ImagePasteInvocation | MaskFromAlphaInvocation | ImageMultiplyInvocation | ImageChannelInvocation | ImageConvertInvocation | ImageBlurInvocation | ImageResizeInvocation | ImageScaleInvocation | ImageLerpInvocation | ImageInverseLerpInvocation | ControlNetInvocation | ImageProcessorInvocation | CompelInvocation | AddInvocation | SubtractInvocation | MultiplyInvocation | DivideInvocation | RandomIntInvocation | ParamIntInvocation | ParamFloatInvocation | NoiseInvocation | TextToLatentsInvocation | LatentsToImageInvocation | ResizeLatentsInvocation | ScaleLatentsInvocation | ImageToLatentsInvocation | CvInpaintInvocation | RangeInvocation | RangeOfSizeInvocation | RandomRangeInvocation | UpscaleInvocation | RestoreFaceInvocation | TextToImageInvocation | InfillColorInvocation | InfillTileInvocation | InfillPatchMatchInvocation | GraphInvocation | IterateInvocation | CollectInvocation | CannyImageProcessorInvocation | HedImageProcessorInvocation | LineartImageProcessorInvocation | LineartAnimeImageProcessorInvocation | OpenposeImageProcessorInvocation | MidasDepthImageProcessorInvocation | NormalbaeImageProcessorInvocation | MlsdImageProcessorInvocation | PidiImageProcessorInvocation | ContentShuffleImageProcessorInvocation | ZoeDepthImageProcessorInvocation | MediapipeFaceProcessorInvocation | LatentsToLatentsInvocation | ImageToImageInvocation | InpaintInvocation),
+ requestBody: (LoadImageInvocation | ShowImageInvocation | ImageCropInvocation | ImagePasteInvocation | MaskFromAlphaInvocation | ImageMultiplyInvocation | ImageChannelInvocation | ImageConvertInvocation | ImageBlurInvocation | ImageResizeInvocation | ImageScaleInvocation | ImageLerpInvocation | ImageInverseLerpInvocation | ControlNetInvocation | ImageProcessorInvocation | CompelInvocation | AddInvocation | SubtractInvocation | MultiplyInvocation | DivideInvocation | RandomIntInvocation | ParamIntInvocation | ParamFloatInvocation | NoiseInvocation | TextToLatentsInvocation | LatentsToImageInvocation | ResizeLatentsInvocation | ScaleLatentsInvocation | ImageToLatentsInvocation | CvInpaintInvocation | RangeInvocation | RangeOfSizeInvocation | RandomRangeInvocation | FloatLinearRangeInvocation | StepParamEasingInvocation | UpscaleInvocation | RestoreFaceInvocation | TextToImageInvocation | InfillColorInvocation | InfillTileInvocation | InfillPatchMatchInvocation | GraphInvocation | IterateInvocation | CollectInvocation | CannyImageProcessorInvocation | HedImageProcessorInvocation | LineartImageProcessorInvocation | LineartAnimeImageProcessorInvocation | OpenposeImageProcessorInvocation | MidasDepthImageProcessorInvocation | NormalbaeImageProcessorInvocation | MlsdImageProcessorInvocation | PidiImageProcessorInvocation | ContentShuffleImageProcessorInvocation | ZoeDepthImageProcessorInvocation | MediapipeFaceProcessorInvocation | LatentsToLatentsInvocation | ImageToImageInvocation | InpaintInvocation),
}): CancelablePromise {
return __request(OpenAPI, {
method: 'POST',
@@ -208,7 +210,7 @@ export class SessionsService {
* The path to the node in the graph
*/
nodePath: string,
- requestBody: (LoadImageInvocation | ShowImageInvocation | ImageCropInvocation | ImagePasteInvocation | MaskFromAlphaInvocation | ImageMultiplyInvocation | ImageChannelInvocation | ImageConvertInvocation | ImageBlurInvocation | ImageResizeInvocation | ImageScaleInvocation | ImageLerpInvocation | ImageInverseLerpInvocation | ControlNetInvocation | ImageProcessorInvocation | CompelInvocation | AddInvocation | SubtractInvocation | MultiplyInvocation | DivideInvocation | RandomIntInvocation | ParamIntInvocation | ParamFloatInvocation | NoiseInvocation | TextToLatentsInvocation | LatentsToImageInvocation | ResizeLatentsInvocation | ScaleLatentsInvocation | ImageToLatentsInvocation | CvInpaintInvocation | RangeInvocation | RangeOfSizeInvocation | RandomRangeInvocation | UpscaleInvocation | RestoreFaceInvocation | TextToImageInvocation | InfillColorInvocation | InfillTileInvocation | InfillPatchMatchInvocation | GraphInvocation | IterateInvocation | CollectInvocation | CannyImageProcessorInvocation | HedImageProcessorInvocation | LineartImageProcessorInvocation | LineartAnimeImageProcessorInvocation | OpenposeImageProcessorInvocation | MidasDepthImageProcessorInvocation | NormalbaeImageProcessorInvocation | MlsdImageProcessorInvocation | PidiImageProcessorInvocation | ContentShuffleImageProcessorInvocation | ZoeDepthImageProcessorInvocation | MediapipeFaceProcessorInvocation | LatentsToLatentsInvocation | ImageToImageInvocation | InpaintInvocation),
+ requestBody: (LoadImageInvocation | ShowImageInvocation | ImageCropInvocation | ImagePasteInvocation | MaskFromAlphaInvocation | ImageMultiplyInvocation | ImageChannelInvocation | ImageConvertInvocation | ImageBlurInvocation | ImageResizeInvocation | ImageScaleInvocation | ImageLerpInvocation | ImageInverseLerpInvocation | ControlNetInvocation | ImageProcessorInvocation | CompelInvocation | AddInvocation | SubtractInvocation | MultiplyInvocation | DivideInvocation | RandomIntInvocation | ParamIntInvocation | ParamFloatInvocation | NoiseInvocation | TextToLatentsInvocation | LatentsToImageInvocation | ResizeLatentsInvocation | ScaleLatentsInvocation | ImageToLatentsInvocation | CvInpaintInvocation | RangeInvocation | RangeOfSizeInvocation | RandomRangeInvocation | FloatLinearRangeInvocation | StepParamEasingInvocation | UpscaleInvocation | RestoreFaceInvocation | TextToImageInvocation | InfillColorInvocation | InfillTileInvocation | InfillPatchMatchInvocation | GraphInvocation | IterateInvocation | CollectInvocation | CannyImageProcessorInvocation | HedImageProcessorInvocation | LineartImageProcessorInvocation | LineartAnimeImageProcessorInvocation | OpenposeImageProcessorInvocation | MidasDepthImageProcessorInvocation | NormalbaeImageProcessorInvocation | MlsdImageProcessorInvocation | PidiImageProcessorInvocation | ContentShuffleImageProcessorInvocation | ZoeDepthImageProcessorInvocation | MediapipeFaceProcessorInvocation | LatentsToLatentsInvocation | ImageToImageInvocation | InpaintInvocation),
}): CancelablePromise {
return __request(OpenAPI, {
method: 'PUT',
diff --git a/invokeai/frontend/web/yarn.lock b/invokeai/frontend/web/yarn.lock
index b14d83ae2b..e1ee68e95c 100644
--- a/invokeai/frontend/web/yarn.lock
+++ b/invokeai/frontend/web/yarn.lock
@@ -64,6 +64,13 @@
dependencies:
regenerator-runtime "^0.13.11"
+"@babel/runtime@^7.10.2", "@babel/runtime@^7.13.10":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec"
+ integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==
+ dependencies:
+ regenerator-runtime "^0.13.11"
+
"@babel/types@^7.21.4", "@babel/types@^7.4":
version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4"
@@ -985,22 +992,44 @@
source-map "^0.5.7"
stylis "4.1.4"
-"@emotion/cache@^11.10.8":
- version "11.10.8"
- resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.8.tgz#3b39b4761bea0ae2f4f07f0a425eec8b6977c03e"
- integrity sha512-5fyqGHi51LU95o7qQ/vD1jyvC4uCY5GcBT+UgP4LHdpO9jPDlXqhrRr9/wCKmfoAvh5G/F7aOh4MwQa+8uEqhA==
+"@emotion/babel-plugin@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c"
+ integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==
dependencies:
- "@emotion/memoize" "^0.8.0"
- "@emotion/sheet" "^1.2.1"
- "@emotion/utils" "^1.2.0"
- "@emotion/weak-memoize" "^0.3.0"
- stylis "4.1.4"
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/runtime" "^7.18.3"
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/serialize" "^1.1.2"
+ babel-plugin-macros "^3.1.0"
+ convert-source-map "^1.5.0"
+ escape-string-regexp "^4.0.0"
+ find-root "^1.1.0"
+ source-map "^0.5.7"
+ stylis "4.2.0"
+
+"@emotion/cache@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff"
+ integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==
+ dependencies:
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/sheet" "^1.2.2"
+ "@emotion/utils" "^1.2.1"
+ "@emotion/weak-memoize" "^0.3.1"
+ stylis "4.2.0"
"@emotion/hash@^0.9.0":
version "0.9.0"
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7"
integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==
+"@emotion/hash@^0.9.1":
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43"
+ integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==
+
"@emotion/is-prop-valid@^0.8.2":
version "0.8.8"
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a"
@@ -1025,18 +1054,23 @@
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f"
integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==
-"@emotion/react@^11.10.6":
- version "11.10.8"
- resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.8.tgz#02e274ecb45e03ab9d7a8eb9f0f0c064613eaf7b"
- integrity sha512-ZfGfiABtJ1P1OXqOBsW08EgCDp5fK6C5I8hUJauc/VcJBGSzqAirMnFslhFWnZJ/w5HxPI36XbvMV0l4KZHl+w==
+"@emotion/memoize@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
+ integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
+
+"@emotion/react@^11.11.1":
+ version "11.11.1"
+ resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157"
+ integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==
dependencies:
"@babel/runtime" "^7.18.3"
- "@emotion/babel-plugin" "^11.10.8"
- "@emotion/cache" "^11.10.8"
- "@emotion/serialize" "^1.1.1"
- "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
- "@emotion/utils" "^1.2.0"
- "@emotion/weak-memoize" "^0.3.0"
+ "@emotion/babel-plugin" "^11.11.0"
+ "@emotion/cache" "^11.11.0"
+ "@emotion/serialize" "^1.1.2"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
+ "@emotion/utils" "^1.2.1"
+ "@emotion/weak-memoize" "^0.3.1"
hoist-non-react-statics "^3.3.1"
"@emotion/serialize@^1.1.1":
@@ -1050,10 +1084,21 @@
"@emotion/utils" "^1.2.0"
csstype "^3.0.2"
-"@emotion/sheet@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c"
- integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==
+"@emotion/serialize@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51"
+ integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==
+ dependencies:
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/unitless" "^0.8.1"
+ "@emotion/utils" "^1.2.1"
+ csstype "^3.0.2"
+
+"@emotion/sheet@^1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec"
+ integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
"@emotion/styled@^11.10.6":
version "11.10.8"
@@ -1072,20 +1117,35 @@
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db"
integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==
+"@emotion/unitless@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3"
+ integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
+
"@emotion/use-insertion-effect-with-fallbacks@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df"
integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==
+"@emotion/use-insertion-effect-with-fallbacks@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963"
+ integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==
+
"@emotion/utils@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561"
integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==
-"@emotion/weak-memoize@^0.3.0":
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb"
- integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==
+"@emotion/utils@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4"
+ integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==
+
+"@emotion/weak-memoize@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6"
+ integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==
"@esbuild/android-arm64@0.17.18":
version "0.17.18"
@@ -1234,6 +1294,18 @@
resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.6.tgz#d21ace437cc919cdd8f1640302fa8851e65e75c0"
integrity sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==
+"@floating-ui/core@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.3.0.tgz#113bc85fa102cf890ae801668f43ee265c547a09"
+ integrity sha512-vX1WVAdPjZg9DkDkC+zEx/tKtnST6/qcNpwcjeBgco3XRNHz5PUA+ivi/yr6G3o0kMR60uKBJcfOdfzOFI7PMQ==
+
+"@floating-ui/dom@^1.2.1":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.3.0.tgz#69456f2164fc3d33eb40837686eaf71537235ac9"
+ integrity sha512-qIAwejE3r6NeA107u4ELDKkH8+VtgRKdXqtSPaKflL2S2V+doyN+Wt9s5oHKXPDo4E8TaVXaHT3+6BbagH31xw==
+ dependencies:
+ "@floating-ui/core" "^1.3.0"
+
"@floating-ui/dom@^1.2.7":
version "1.2.7"
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.7.tgz#c123e4db014b07b97e996cd459245fa217049c6b"
@@ -1241,6 +1313,13 @@
dependencies:
"@floating-ui/core" "^1.2.6"
+"@floating-ui/react-dom@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-1.3.0.tgz#4d35d416eb19811c2b0e9271100a6aa18c1579b3"
+ integrity sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==
+ dependencies:
+ "@floating-ui/dom" "^1.2.1"
+
"@floating-ui/react-dom@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.0.tgz#7514baac526c818892bbcc84e1c3115008c029f9"
@@ -1248,6 +1327,15 @@
dependencies:
"@floating-ui/dom" "^1.2.7"
+"@floating-ui/react@^0.19.1":
+ version "0.19.2"
+ resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.19.2.tgz#c6e4d2097ed0dca665a7c042ddf9cdecc95e9412"
+ integrity sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==
+ dependencies:
+ "@floating-ui/react-dom" "^1.3.0"
+ aria-hidden "^1.1.3"
+ tabbable "^6.0.1"
+
"@fontsource/inter@^4.5.15":
version "4.5.15"
resolved "https://registry.yarnpkg.com/@fontsource/inter/-/inter-4.5.15.tgz#eed1873d68755d3b52d6fcfcfa3493118430a512"
@@ -1335,6 +1423,36 @@
resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796"
integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==
+"@mantine/core@^6.0.13":
+ version "6.0.13"
+ resolved "https://registry.yarnpkg.com/@mantine/core/-/core-6.0.13.tgz#f05a952e1e2e3cc6eb24d4d77b6c96a1c23fb0bb"
+ integrity sha512-FjVUGgat2qISV9WD1maVJa81y7H0JjKJ3m0cJj65PzgrXT20hzdEda7S3i4j+a8vUnx+836x5q/yS+RDHvoSlA==
+ dependencies:
+ "@floating-ui/react" "^0.19.1"
+ "@mantine/styles" "6.0.13"
+ "@mantine/utils" "6.0.13"
+ "@radix-ui/react-scroll-area" "1.0.2"
+ react-remove-scroll "^2.5.5"
+ react-textarea-autosize "8.3.4"
+
+"@mantine/hooks@^6.0.13":
+ version "6.0.13"
+ resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-6.0.13.tgz#d90fa315ee30a900e0d9a460c6bb00c9a65f18e0"
+ integrity sha512-fHuE3zXo5OP/Q1dMOTnegU6U+tI9GuhO2tgOz6szVuOxrrk0Hzuq1Na9NUSv27HShSRbAfQk+hvyIh+iVV7KXA==
+
+"@mantine/styles@6.0.13":
+ version "6.0.13"
+ resolved "https://registry.yarnpkg.com/@mantine/styles/-/styles-6.0.13.tgz#a3dc542e1613e7cc461dd8b11c6069b5dd8143d7"
+ integrity sha512-+27oX8ObiBv8jHHDxXKjqe+7cfTJyaAV/Ie00T49EE4LuHuS6nL4vlXHmqamFtDCj2ypEWBV0sdXDev/DNAXSg==
+ dependencies:
+ clsx "1.1.1"
+ csstype "3.0.9"
+
+"@mantine/utils@6.0.13":
+ version "6.0.13"
+ resolved "https://registry.yarnpkg.com/@mantine/utils/-/utils-6.0.13.tgz#a7adc128a2e7c07031c7221c1533800d0c80279a"
+ integrity sha512-iqIU9wurqAeccVbWjM0yr1JGne5VP+ob55M03QAXOEN4+ck93VDTjCkZJR2RFhDcs5q0twQFoOmU/gULR8aKIA==
+
"@microsoft/api-extractor-model@7.26.5":
version "7.26.5"
resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.26.5.tgz#b3d0939b4dab6897ce27c966bd394a582f1871e7"
@@ -1403,6 +1521,96 @@
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7"
integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==
+"@radix-ui/number@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.0.0.tgz#4c536161d0de750b3f5d55860fc3de46264f897b"
+ integrity sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/primitive@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.0.tgz#e1d8ef30b10ea10e69c76e896f608d9276352253"
+ integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-compose-refs@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae"
+ integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-context@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.0.tgz#f38e30c5859a9fb5e9aa9a9da452ee3ed9e0aee0"
+ integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-direction@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.0.tgz#a2e0b552352459ecf96342c79949dd833c1e6e45"
+ integrity sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-presence@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz#814fe46df11f9a468808a6010e3f3ca7e0b2e84a"
+ integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-compose-refs" "1.0.0"
+ "@radix-ui/react-use-layout-effect" "1.0.0"
+
+"@radix-ui/react-primitive@1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz#c1ebcce283dd2f02e4fbefdaa49d1cb13dbc990a"
+ integrity sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-slot" "1.0.1"
+
+"@radix-ui/react-scroll-area@1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.2.tgz#26c906d351b56835c0301126b24574c9e9c7b93b"
+ integrity sha512-k8VseTxI26kcKJaX0HPwkvlNBPTs56JRdYzcZ/vzrNUkDlvXBy8sMc7WvCpYzZkHgb+hd72VW9MqkqecGtuNgg==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/number" "1.0.0"
+ "@radix-ui/primitive" "1.0.0"
+ "@radix-ui/react-compose-refs" "1.0.0"
+ "@radix-ui/react-context" "1.0.0"
+ "@radix-ui/react-direction" "1.0.0"
+ "@radix-ui/react-presence" "1.0.0"
+ "@radix-ui/react-primitive" "1.0.1"
+ "@radix-ui/react-use-callback-ref" "1.0.0"
+ "@radix-ui/react-use-layout-effect" "1.0.0"
+
+"@radix-ui/react-slot@1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.1.tgz#e7868c669c974d649070e9ecbec0b367ee0b4d81"
+ integrity sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-compose-refs" "1.0.0"
+
+"@radix-ui/react-use-callback-ref@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz#9e7b8b6b4946fe3cbe8f748c82a2cce54e7b6a90"
+ integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-use-layout-effect@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz#2fc19e97223a81de64cd3ba1dc42ceffd82374dc"
+ integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
"@reactflow/background@11.2.0":
version "11.2.0"
resolved "https://registry.yarnpkg.com/@reactflow/background/-/background-11.2.0.tgz#2a6f89d4f4837d488629d32a2bd5f01708018115"
@@ -2251,7 +2459,7 @@ argparse@~1.0.9:
dependencies:
sprintf-js "~1.0.2"
-aria-hidden@^1.2.2:
+aria-hidden@^1.1.3, aria-hidden@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954"
integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==
@@ -2644,6 +2852,11 @@ clone@^1.0.2:
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
+clsx@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188"
+ integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==
+
code-block-writer@^12.0.0:
version "12.0.0"
resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-12.0.0.tgz#4dd58946eb4234105aff7f0035977b2afdc2a770"
@@ -2833,6 +3046,11 @@ css-tree@^1.1.2:
mdn-data "2.0.14"
source-map "^0.6.1"
+csstype@3.0.9:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b"
+ integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==
+
csstype@^3.0.11, csstype@^3.0.2, csstype@^3.0.6:
version "3.1.2"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
@@ -5623,6 +5841,15 @@ react-style-singleton@^2.2.1:
invariant "^2.2.4"
tslib "^2.0.0"
+react-textarea-autosize@8.3.4:
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz#270a343de7ad350534141b02c9cb78903e553524"
+ integrity sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==
+ dependencies:
+ "@babel/runtime" "^7.10.2"
+ use-composed-ref "^1.3.0"
+ use-latest "^1.2.1"
+
react-universal-interface@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/react-universal-interface/-/react-universal-interface-0.6.2.tgz#5e8d438a01729a4dbbcbeeceb0b86be146fe2b3b"
@@ -6287,6 +6514,11 @@ stylis@4.1.4, stylis@^4.0.6:
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.4.tgz#9cb60e7153d8ac6d02d773552bf51c7a0344535b"
integrity sha512-USf5pszRYwuE6hg9by0OkKChkQYEXfkeTtm0xKw+jqQhwyjCVLdYyMBK7R+n7dhzsblAWJnGxju4vxq5eH20GQ==
+stylis@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
+ integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
+
stylus-lookup@^3.0.1:
version "3.0.2"
resolved "https://registry.yarnpkg.com/stylus-lookup/-/stylus-lookup-3.0.2.tgz#c9eca3ff799691020f30b382260a67355fefdddd"
@@ -6321,6 +6553,11 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+tabbable@^6.0.1:
+ version "6.1.2"
+ resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.1.2.tgz#b0d3ca81d582d48a80f71b267d1434b1469a3703"
+ integrity sha512-qCN98uP7i9z0fIS4amQ5zbGBOq+OSigYeGvPy7NDk8Y9yncqDZ9pRPgfsc2PJIVM9RrJj7GIfuRgmjoUU9zTHQ==
+
tapable@^2.2.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
@@ -6631,11 +6868,28 @@ use-callback-ref@^1.3.0:
dependencies:
tslib "^2.0.0"
+use-composed-ref@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda"
+ integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==
+
use-image@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/use-image/-/use-image-1.1.0.tgz#dc244c34506d3cf3a8177c1f0bbfb158b9beefe5"
integrity sha512-+cBHRR/44ZyMUS873O0vbVylgMM0AbdTunEplAWXvIQ2p69h2sIo2Qq74zeUsq6AMo+27e5lERQvXzd1crGiMg==
+use-isomorphic-layout-effect@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb"
+ integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==
+
+use-latest@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2"
+ integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==
+ dependencies:
+ use-isomorphic-layout-effect "^1.1.1"
+
use-sidecar@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2"