diff --git a/.github/workflows/python-checks.yml b/.github/workflows/python-checks.yml index 94232e15768..40d028826b3 100644 --- a/.github/workflows/python-checks.yml +++ b/.github/workflows/python-checks.yml @@ -62,7 +62,7 @@ jobs: - name: install ruff if: ${{ steps.changed-files.outputs.python_any_changed == 'true' || inputs.always_run == true }} - run: pip install ruff + run: pip install ruff==0.6.0 shell: bash - name: ruff check diff --git a/docker/Dockerfile b/docker/Dockerfile index 864bc5eb609..7ea078af0d9 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -55,6 +55,7 @@ RUN --mount=type=cache,target=/root/.cache/pip \ FROM node:20-slim AS web-builder ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" +RUN corepack use pnpm@8.x RUN corepack enable WORKDIR /build diff --git a/installer/templates/invoke.sh.in b/installer/templates/invoke.sh.in index b8d5a7af23e..0bc6bbb4717 100644 --- a/installer/templates/invoke.sh.in +++ b/installer/templates/invoke.sh.in @@ -17,7 +17,7 @@ set -eu # Ensure we're in the correct folder in case user's CWD is somewhere else -scriptdir=$(dirname "$0") +scriptdir=$(dirname $(readlink -f "$0")) cd "$scriptdir" . .venv/bin/activate diff --git a/invokeai/app/api/dependencies.py b/invokeai/app/api/dependencies.py index 6e049399dbd..d2be674e539 100644 --- a/invokeai/app/api/dependencies.py +++ b/invokeai/app/api/dependencies.py @@ -1,5 +1,6 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) +import asyncio from logging import Logger import torch @@ -31,6 +32,8 @@ ) from invokeai.app.services.session_queue.session_queue_sqlite import SqliteSessionQueue from invokeai.app.services.shared.sqlite.sqlite_util import init_db +from invokeai.app.services.style_preset_images.style_preset_images_disk import StylePresetImageFileStorageDisk +from invokeai.app.services.style_preset_records.style_preset_records_sqlite import SqliteStylePresetRecordsStorage from invokeai.app.services.urls.urls_default import LocalUrlService from invokeai.app.services.workflow_records.workflow_records_sqlite import SqliteWorkflowRecordsStorage from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ConditioningFieldData @@ -63,7 +66,12 @@ class ApiDependencies: invoker: Invoker @staticmethod - def initialize(config: InvokeAIAppConfig, event_handler_id: int, logger: Logger = logger) -> None: + def initialize( + config: InvokeAIAppConfig, + event_handler_id: int, + loop: asyncio.AbstractEventLoop, + logger: Logger = logger, + ) -> None: logger.info(f"InvokeAI version {__version__}") logger.info(f"Root directory = {str(config.root_path)}") @@ -74,6 +82,7 @@ def initialize(config: InvokeAIAppConfig, event_handler_id: int, logger: Logger image_files = DiskImageFileStorage(f"{output_folder}/images") model_images_folder = config.models_path + style_presets_folder = config.style_presets_path db = init_db(config=config, logger=logger, image_files=image_files) @@ -84,7 +93,7 @@ def initialize(config: InvokeAIAppConfig, event_handler_id: int, logger: Logger board_images = BoardImagesService() board_records = SqliteBoardRecordStorage(db=db) boards = BoardService() - events = FastAPIEventService(event_handler_id) + events = FastAPIEventService(event_handler_id, loop=loop) bulk_download = BulkDownloadService() image_records = SqliteImageRecordStorage(db=db) images = ImageService() @@ -109,6 +118,8 @@ def initialize(config: InvokeAIAppConfig, event_handler_id: int, logger: Logger session_queue = SqliteSessionQueue(db=db) urls = LocalUrlService() workflow_records = SqliteWorkflowRecordsStorage(db=db) + style_preset_records = SqliteStylePresetRecordsStorage(db=db) + style_preset_image_files = StylePresetImageFileStorageDisk(style_presets_folder / "images") services = InvocationServices( board_image_records=board_image_records, @@ -134,6 +145,8 @@ def initialize(config: InvokeAIAppConfig, event_handler_id: int, logger: Logger workflow_records=workflow_records, tensors=tensors, conditioning=conditioning, + style_preset_records=style_preset_records, + style_preset_image_files=style_preset_image_files, ) ApiDependencies.invoker = Invoker(services) diff --git a/invokeai/app/api/routers/images.py b/invokeai/app/api/routers/images.py index 2bc0b48251d..14652ea7848 100644 --- a/invokeai/app/api/routers/images.py +++ b/invokeai/app/api/routers/images.py @@ -218,9 +218,8 @@ async def get_image_workflow( raise HTTPException(status_code=404) -@images_router.api_route( +@images_router.get( "/i/{image_name}/full", - methods=["GET", "HEAD"], operation_id="get_image_full", response_class=Response, responses={ @@ -231,6 +230,18 @@ async def get_image_workflow( 404: {"description": "Image not found"}, }, ) +@images_router.head( + "/i/{image_name}/full", + operation_id="get_image_full_head", + response_class=Response, + responses={ + 200: { + "description": "Return the full-resolution image", + "content": {"image/png": {}}, + }, + 404: {"description": "Image not found"}, + }, +) async def get_image_full( image_name: str = Path(description="The name of full-resolution image file to get"), ) -> Response: @@ -242,6 +253,7 @@ async def get_image_full( content = f.read() response = Response(content, media_type="image/png") response.headers["Cache-Control"] = f"max-age={IMAGE_MAX_AGE}" + response.headers["Content-Disposition"] = f'inline; filename="{image_name}"' return response except Exception: raise HTTPException(status_code=404) diff --git a/invokeai/app/api/routers/model_manager.py b/invokeai/app/api/routers/model_manager.py index f73b7a86b1e..d19b028cb65 100644 --- a/invokeai/app/api/routers/model_manager.py +++ b/invokeai/app/api/routers/model_manager.py @@ -6,7 +6,7 @@ import traceback from copy import deepcopy from tempfile import TemporaryDirectory -from typing import Any, Dict, List, Optional, Type +from typing import List, Optional, Type from fastapi import Body, Path, Query, Response, UploadFile from fastapi.responses import FileResponse, HTMLResponse @@ -430,13 +430,11 @@ async def delete_model_image( async def install_model( source: str = Query(description="Model source to install, can be a local path, repo_id, or remote URL"), inplace: Optional[bool] = Query(description="Whether or not to install a local model in place", default=False), - # TODO(MM2): Can we type this? - config: Optional[Dict[str, Any]] = Body( - description="Dict of fields that override auto-probed values in the model config record, such as name, description and prediction_type ", - default=None, + access_token: Optional[str] = Query(description="access token for the remote resource", default=None), + config: ModelRecordChanges = Body( + description="Object containing fields that override auto-probed values in the model config record, such as name, description and prediction_type ", example={"name": "string", "description": "string"}, ), - access_token: Optional[str] = None, ) -> ModelInstallJob: """Install a model using a string identifier. @@ -451,8 +449,9 @@ async def install_model( - model/name:fp16:path/to/model.safetensors - model/name::path/to/model.safetensors - `config` is an optional dict containing model configuration values that will override - the ones that are probed automatically. + `config` is a ModelRecordChanges object. Fields in this object will override + the ones that are probed automatically. Pass an empty object to accept + all the defaults. `access_token` is an optional access token for use with Urls that require authentication. @@ -737,7 +736,7 @@ async def convert_model( # write the converted file to the convert path raw_model = converted_model.model assert hasattr(raw_model, "save_pretrained") - raw_model.save_pretrained(convert_path) + raw_model.save_pretrained(convert_path) # type: ignore assert convert_path.exists() # temporarily rename the original safetensors file so that there is no naming conflict @@ -750,12 +749,12 @@ async def convert_model( try: new_key = installer.install_path( convert_path, - config={ - "name": original_name, - "description": model_config.description, - "hash": model_config.hash, - "source": model_config.source, - }, + config=ModelRecordChanges( + name=original_name, + description=model_config.description, + hash=model_config.hash, + source=model_config.source, + ), ) except Exception as e: logger.error(str(e)) diff --git a/invokeai/app/api/routers/style_presets.py b/invokeai/app/api/routers/style_presets.py new file mode 100644 index 00000000000..dadd89debb3 --- /dev/null +++ b/invokeai/app/api/routers/style_presets.py @@ -0,0 +1,274 @@ +import csv +import io +import json +import traceback +from typing import Optional + +import pydantic +from fastapi import APIRouter, File, Form, HTTPException, Path, Response, UploadFile +from fastapi.responses import FileResponse +from PIL import Image +from pydantic import BaseModel, Field + +from invokeai.app.api.dependencies import ApiDependencies +from invokeai.app.api.routers.model_manager import IMAGE_MAX_AGE +from invokeai.app.services.style_preset_images.style_preset_images_common import StylePresetImageFileNotFoundException +from invokeai.app.services.style_preset_records.style_preset_records_common import ( + InvalidPresetImportDataError, + PresetData, + PresetType, + StylePresetChanges, + StylePresetNotFoundError, + StylePresetRecordWithImage, + StylePresetWithoutId, + UnsupportedFileTypeError, + parse_presets_from_file, +) + + +class StylePresetFormData(BaseModel): + name: str = Field(description="Preset name") + positive_prompt: str = Field(description="Positive prompt") + negative_prompt: str = Field(description="Negative prompt") + type: PresetType = Field(description="Preset type") + + +style_presets_router = APIRouter(prefix="/v1/style_presets", tags=["style_presets"]) + + +@style_presets_router.get( + "/i/{style_preset_id}", + operation_id="get_style_preset", + responses={ + 200: {"model": StylePresetRecordWithImage}, + }, +) +async def get_style_preset( + style_preset_id: str = Path(description="The style preset to get"), +) -> StylePresetRecordWithImage: + """Gets a style preset""" + try: + image = ApiDependencies.invoker.services.style_preset_image_files.get_url(style_preset_id) + style_preset = ApiDependencies.invoker.services.style_preset_records.get(style_preset_id) + return StylePresetRecordWithImage(image=image, **style_preset.model_dump()) + except StylePresetNotFoundError: + raise HTTPException(status_code=404, detail="Style preset not found") + + +@style_presets_router.patch( + "/i/{style_preset_id}", + operation_id="update_style_preset", + responses={ + 200: {"model": StylePresetRecordWithImage}, + }, +) +async def update_style_preset( + image: Optional[UploadFile] = File(description="The image file to upload", default=None), + style_preset_id: str = Path(description="The id of the style preset to update"), + data: str = Form(description="The data of the style preset to update"), +) -> StylePresetRecordWithImage: + """Updates a style preset""" + if image is not None: + if not image.content_type or not image.content_type.startswith("image"): + raise HTTPException(status_code=415, detail="Not an image") + + contents = await image.read() + try: + pil_image = Image.open(io.BytesIO(contents)) + + except Exception: + ApiDependencies.invoker.services.logger.error(traceback.format_exc()) + raise HTTPException(status_code=415, detail="Failed to read image") + + try: + ApiDependencies.invoker.services.style_preset_image_files.save(style_preset_id, pil_image) + except ValueError as e: + raise HTTPException(status_code=409, detail=str(e)) + else: + try: + ApiDependencies.invoker.services.style_preset_image_files.delete(style_preset_id) + except StylePresetImageFileNotFoundException: + pass + + try: + parsed_data = json.loads(data) + validated_data = StylePresetFormData(**parsed_data) + + name = validated_data.name + type = validated_data.type + positive_prompt = validated_data.positive_prompt + negative_prompt = validated_data.negative_prompt + + except pydantic.ValidationError: + raise HTTPException(status_code=400, detail="Invalid preset data") + + preset_data = PresetData(positive_prompt=positive_prompt, negative_prompt=negative_prompt) + changes = StylePresetChanges(name=name, preset_data=preset_data, type=type) + + style_preset_image = ApiDependencies.invoker.services.style_preset_image_files.get_url(style_preset_id) + style_preset = ApiDependencies.invoker.services.style_preset_records.update( + style_preset_id=style_preset_id, changes=changes + ) + return StylePresetRecordWithImage(image=style_preset_image, **style_preset.model_dump()) + + +@style_presets_router.delete( + "/i/{style_preset_id}", + operation_id="delete_style_preset", +) +async def delete_style_preset( + style_preset_id: str = Path(description="The style preset to delete"), +) -> None: + """Deletes a style preset""" + try: + ApiDependencies.invoker.services.style_preset_image_files.delete(style_preset_id) + except StylePresetImageFileNotFoundException: + pass + + ApiDependencies.invoker.services.style_preset_records.delete(style_preset_id) + + +@style_presets_router.post( + "/", + operation_id="create_style_preset", + responses={ + 200: {"model": StylePresetRecordWithImage}, + }, +) +async def create_style_preset( + image: Optional[UploadFile] = File(description="The image file to upload", default=None), + data: str = Form(description="The data of the style preset to create"), +) -> StylePresetRecordWithImage: + """Creates a style preset""" + + try: + parsed_data = json.loads(data) + validated_data = StylePresetFormData(**parsed_data) + + name = validated_data.name + type = validated_data.type + positive_prompt = validated_data.positive_prompt + negative_prompt = validated_data.negative_prompt + + except pydantic.ValidationError: + raise HTTPException(status_code=400, detail="Invalid preset data") + + preset_data = PresetData(positive_prompt=positive_prompt, negative_prompt=negative_prompt) + style_preset = StylePresetWithoutId(name=name, preset_data=preset_data, type=type) + new_style_preset = ApiDependencies.invoker.services.style_preset_records.create(style_preset=style_preset) + + if image is not None: + if not image.content_type or not image.content_type.startswith("image"): + raise HTTPException(status_code=415, detail="Not an image") + + contents = await image.read() + try: + pil_image = Image.open(io.BytesIO(contents)) + + except Exception: + ApiDependencies.invoker.services.logger.error(traceback.format_exc()) + raise HTTPException(status_code=415, detail="Failed to read image") + + try: + ApiDependencies.invoker.services.style_preset_image_files.save(new_style_preset.id, pil_image) + except ValueError as e: + raise HTTPException(status_code=409, detail=str(e)) + + preset_image = ApiDependencies.invoker.services.style_preset_image_files.get_url(new_style_preset.id) + return StylePresetRecordWithImage(image=preset_image, **new_style_preset.model_dump()) + + +@style_presets_router.get( + "/", + operation_id="list_style_presets", + responses={ + 200: {"model": list[StylePresetRecordWithImage]}, + }, +) +async def list_style_presets() -> list[StylePresetRecordWithImage]: + """Gets a page of style presets""" + style_presets_with_image: list[StylePresetRecordWithImage] = [] + style_presets = ApiDependencies.invoker.services.style_preset_records.get_many() + for preset in style_presets: + image = ApiDependencies.invoker.services.style_preset_image_files.get_url(preset.id) + style_preset_with_image = StylePresetRecordWithImage(image=image, **preset.model_dump()) + style_presets_with_image.append(style_preset_with_image) + + return style_presets_with_image + + +@style_presets_router.get( + "/i/{style_preset_id}/image", + operation_id="get_style_preset_image", + responses={ + 200: { + "description": "The style preset image was fetched successfully", + }, + 400: {"description": "Bad request"}, + 404: {"description": "The style preset image could not be found"}, + }, + status_code=200, +) +async def get_style_preset_image( + style_preset_id: str = Path(description="The id of the style preset image to get"), +) -> FileResponse: + """Gets an image file that previews the model""" + + try: + path = ApiDependencies.invoker.services.style_preset_image_files.get_path(style_preset_id) + + response = FileResponse( + path, + media_type="image/png", + filename=style_preset_id + ".png", + content_disposition_type="inline", + ) + response.headers["Cache-Control"] = f"max-age={IMAGE_MAX_AGE}" + return response + except Exception: + raise HTTPException(status_code=404) + + +@style_presets_router.get( + "/export", + operation_id="export_style_presets", + responses={200: {"content": {"text/csv": {}}, "description": "A CSV file with the requested data."}}, + status_code=200, +) +async def export_style_presets(): + # Create an in-memory stream to store the CSV data + output = io.StringIO() + writer = csv.writer(output) + + # Write the header + writer.writerow(["name", "prompt", "negative_prompt"]) + + style_presets = ApiDependencies.invoker.services.style_preset_records.get_many(type=PresetType.User) + + for preset in style_presets: + writer.writerow([preset.name, preset.preset_data.positive_prompt, preset.preset_data.negative_prompt]) + + csv_data = output.getvalue() + output.close() + + return Response( + content=csv_data, + media_type="text/csv", + headers={"Content-Disposition": "attachment; filename=prompt_templates.csv"}, + ) + + +@style_presets_router.post( + "/import", + operation_id="import_style_presets", +) +async def import_style_presets(file: UploadFile = File(description="The file to import")): + try: + style_presets = await parse_presets_from_file(file) + ApiDependencies.invoker.services.style_preset_records.create_many(style_presets) + except InvalidPresetImportDataError as e: + ApiDependencies.invoker.services.logger.error(traceback.format_exc()) + raise HTTPException(status_code=400, detail=str(e)) + except UnsupportedFileTypeError as e: + ApiDependencies.invoker.services.logger.error(traceback.format_exc()) + raise HTTPException(status_code=415, detail=str(e)) diff --git a/invokeai/app/api_app.py b/invokeai/app/api_app.py index 88820a0c4c2..ce619642462 100644 --- a/invokeai/app/api_app.py +++ b/invokeai/app/api_app.py @@ -30,6 +30,7 @@ images, model_manager, session_queue, + style_presets, utilities, workflows, ) @@ -55,11 +56,13 @@ torch_device_name = TorchDevice.get_torch_device_name() logger.info(f"Using torch device: {torch_device_name}") +loop = asyncio.new_event_loop() + @asynccontextmanager async def lifespan(app: FastAPI): # Add startup event to load dependencies - ApiDependencies.initialize(config=app_config, event_handler_id=event_handler_id, logger=logger) + ApiDependencies.initialize(config=app_config, event_handler_id=event_handler_id, loop=loop, logger=logger) yield # Shut down threads ApiDependencies.shutdown() @@ -106,6 +109,7 @@ async def lifespan(app: FastAPI): app.include_router(app_info.app_router, prefix="/api") app.include_router(session_queue.session_queue_router, prefix="/api") app.include_router(workflows.workflows_router, prefix="/api") +app.include_router(style_presets.style_presets_router, prefix="/api") app.openapi = get_openapi_func(app) @@ -184,8 +188,6 @@ def find_port(port: int) -> int: check_cudnn(logger) - # Start our own event loop for eventing usage - loop = asyncio.new_event_loop() config = uvicorn.Config( app=app, host=app_config.host, diff --git a/invokeai/app/invocations/compel.py b/invokeai/app/invocations/compel.py index fffb09e6549..5905df8dd70 100644 --- a/invokeai/app/invocations/compel.py +++ b/invokeai/app/invocations/compel.py @@ -80,12 +80,12 @@ def _lora_loader() -> Iterator[Tuple[LoRAModelRaw, float]]: with ( # apply all patches while the model is on the target device - text_encoder_info.model_on_device() as (model_state_dict, text_encoder), + text_encoder_info.model_on_device() as (cached_weights, text_encoder), tokenizer_info as tokenizer, ModelPatcher.apply_lora_text_encoder( text_encoder, loras=_lora_loader(), - model_state_dict=model_state_dict, + cached_weights=cached_weights, ), # Apply CLIP Skip after LoRA to prevent LoRA application from failing on skipped layers. ModelPatcher.apply_clip_skip(text_encoder, self.clip.skipped_layers), @@ -175,13 +175,13 @@ def _lora_loader() -> Iterator[Tuple[LoRAModelRaw, float]]: with ( # apply all patches while the model is on the target device - text_encoder_info.model_on_device() as (state_dict, text_encoder), + text_encoder_info.model_on_device() as (cached_weights, text_encoder), tokenizer_info as tokenizer, ModelPatcher.apply_lora( text_encoder, loras=_lora_loader(), prefix=lora_prefix, - model_state_dict=state_dict, + cached_weights=cached_weights, ), # Apply CLIP Skip after LoRA to prevent LoRA application from failing on skipped layers. ModelPatcher.apply_clip_skip(text_encoder, clip_field.skipped_layers), diff --git a/invokeai/app/invocations/controlnet_image_processors.py b/invokeai/app/invocations/controlnet_image_processors.py index 497d07e7cfd..ed9115e4e84 100644 --- a/invokeai/app/invocations/controlnet_image_processors.py +++ b/invokeai/app/invocations/controlnet_image_processors.py @@ -21,6 +21,8 @@ from controlnet_aux.util import HWC3, ade_palette from PIL import Image from pydantic import BaseModel, Field, field_validator, model_validator +from transformers import pipeline +from transformers.pipelines import DepthEstimationPipeline from invokeai.app.invocations.baseinvocation import ( BaseInvocation, @@ -44,13 +46,12 @@ from invokeai.app.services.shared.invocation_context import InvocationContext from invokeai.app.util.controlnet_utils import CONTROLNET_MODE_VALUES, CONTROLNET_RESIZE_VALUES, heuristic_resize from invokeai.backend.image_util.canny import get_canny_edges -from invokeai.backend.image_util.depth_anything import DEPTH_ANYTHING_MODELS, DepthAnythingDetector +from invokeai.backend.image_util.depth_anything.depth_anything_pipeline import DepthAnythingPipeline from invokeai.backend.image_util.dw_openpose import DWPOSE_MODELS, DWOpenposeDetector from invokeai.backend.image_util.hed import HEDProcessor from invokeai.backend.image_util.lineart import LineartProcessor from invokeai.backend.image_util.lineart_anime import LineartAnimeProcessor from invokeai.backend.image_util.util import np_to_pil, pil_to_np -from invokeai.backend.util.devices import TorchDevice class ControlField(BaseModel): @@ -592,7 +593,14 @@ def run_processor(self, image: Image.Image) -> Image.Image: return color_map -DEPTH_ANYTHING_MODEL_SIZES = Literal["large", "base", "small"] +DEPTH_ANYTHING_MODEL_SIZES = Literal["large", "base", "small", "small_v2"] +# DepthAnything V2 Small model is licensed under Apache 2.0 but not the base and large models. +DEPTH_ANYTHING_MODELS = { + "large": "LiheYoung/depth-anything-large-hf", + "base": "LiheYoung/depth-anything-base-hf", + "small": "LiheYoung/depth-anything-small-hf", + "small_v2": "depth-anything/Depth-Anything-V2-Small-hf", +} @invocation( @@ -600,28 +608,33 @@ def run_processor(self, image: Image.Image) -> Image.Image: title="Depth Anything Processor", tags=["controlnet", "depth", "depth anything"], category="controlnet", - version="1.1.2", + version="1.1.3", ) class DepthAnythingImageProcessorInvocation(ImageProcessorInvocation): """Generates a depth map based on the Depth Anything algorithm""" model_size: DEPTH_ANYTHING_MODEL_SIZES = InputField( - default="small", description="The size of the depth model to use" + default="small_v2", description="The size of the depth model to use" ) resolution: int = InputField(default=512, ge=1, description=FieldDescriptions.image_res) def run_processor(self, image: Image.Image) -> Image.Image: - def loader(model_path: Path): - return DepthAnythingDetector.load_model( - model_path, model_size=self.model_size, device=TorchDevice.choose_torch_device() - ) + def load_depth_anything(model_path: Path): + depth_anything_pipeline = pipeline(model=str(model_path), task="depth-estimation", local_files_only=True) + assert isinstance(depth_anything_pipeline, DepthEstimationPipeline) + return DepthAnythingPipeline(depth_anything_pipeline) with self._context.models.load_remote_model( - source=DEPTH_ANYTHING_MODELS[self.model_size], loader=loader - ) as model: - depth_anything_detector = DepthAnythingDetector(model, TorchDevice.choose_torch_device()) - processed_image = depth_anything_detector(image=image, resolution=self.resolution) - return processed_image + source=DEPTH_ANYTHING_MODELS[self.model_size], loader=load_depth_anything + ) as depth_anything_detector: + assert isinstance(depth_anything_detector, DepthAnythingPipeline) + depth_map = depth_anything_detector.generate_depth(image) + + # Resizing to user target specified size + new_height = int(image.size[1] * (self.resolution / image.size[0])) + depth_map = depth_map.resize((self.resolution, new_height)) + + return depth_map @invocation( diff --git a/invokeai/app/invocations/create_gradient_mask.py b/invokeai/app/invocations/create_gradient_mask.py index 089313463bf..8db0b463ae5 100644 --- a/invokeai/app/invocations/create_gradient_mask.py +++ b/invokeai/app/invocations/create_gradient_mask.py @@ -39,7 +39,7 @@ class GradientMaskOutput(BaseInvocationOutput): title="Create Gradient Mask", tags=["mask", "denoise"], category="latents", - version="1.1.0", + version="1.2.0", ) class CreateGradientMaskInvocation(BaseInvocation): """Creates mask for denoising model run.""" @@ -93,6 +93,7 @@ def invoke(self, context: InvocationContext) -> GradientMaskOutput: # redistribute blur so that the original edges are 0 and blur outwards to 1 blur_tensor = (blur_tensor - 0.5) * 2 + blur_tensor[blur_tensor < 0] = 0.0 threshold = 1 - self.minimum_denoise diff --git a/invokeai/app/invocations/denoise_latents.py b/invokeai/app/invocations/denoise_latents.py index 2787074265c..d97f92d42c0 100644 --- a/invokeai/app/invocations/denoise_latents.py +++ b/invokeai/app/invocations/denoise_latents.py @@ -37,9 +37,9 @@ from invokeai.app.util.controlnet_utils import prepare_control_image from invokeai.backend.ip_adapter.ip_adapter import IPAdapter from invokeai.backend.lora import LoRAModelRaw -from invokeai.backend.model_manager import BaseModelType +from invokeai.backend.model_manager import BaseModelType, ModelVariantType from invokeai.backend.model_patcher import ModelPatcher -from invokeai.backend.stable_diffusion import PipelineIntermediateState, set_seamless +from invokeai.backend.stable_diffusion import PipelineIntermediateState from invokeai.backend.stable_diffusion.denoise_context import DenoiseContext, DenoiseInputs from invokeai.backend.stable_diffusion.diffusers_pipeline import ( ControlNetData, @@ -60,8 +60,13 @@ from invokeai.backend.stable_diffusion.extension_callback_type import ExtensionCallbackType from invokeai.backend.stable_diffusion.extensions.controlnet import ControlNetExt from invokeai.backend.stable_diffusion.extensions.freeu import FreeUExt +from invokeai.backend.stable_diffusion.extensions.inpaint import InpaintExt +from invokeai.backend.stable_diffusion.extensions.inpaint_model import InpaintModelExt +from invokeai.backend.stable_diffusion.extensions.lora import LoRAExt from invokeai.backend.stable_diffusion.extensions.preview import PreviewExt from invokeai.backend.stable_diffusion.extensions.rescale_cfg import RescaleCFGExt +from invokeai.backend.stable_diffusion.extensions.seamless import SeamlessExt +from invokeai.backend.stable_diffusion.extensions.t2i_adapter import T2IAdapterExt from invokeai.backend.stable_diffusion.extensions_manager import ExtensionsManager from invokeai.backend.stable_diffusion.schedulers import SCHEDULER_MAP from invokeai.backend.stable_diffusion.schedulers.schedulers import SCHEDULER_NAME_VALUES @@ -498,6 +503,33 @@ def parse_controlnet_field( ) ) + @staticmethod + def parse_t2i_adapter_field( + exit_stack: ExitStack, + context: InvocationContext, + t2i_adapters: Optional[Union[T2IAdapterField, list[T2IAdapterField]]], + ext_manager: ExtensionsManager, + ) -> None: + if t2i_adapters is None: + return + + # Handle the possibility that t2i_adapters could be a list or a single T2IAdapterField. + if isinstance(t2i_adapters, T2IAdapterField): + t2i_adapters = [t2i_adapters] + + for t2i_adapter_field in t2i_adapters: + ext_manager.add_extension( + T2IAdapterExt( + node_context=context, + model_id=t2i_adapter_field.t2i_adapter_model, + image=context.images.get_pil(t2i_adapter_field.image.image_name), + weight=t2i_adapter_field.weight, + begin_step_percent=t2i_adapter_field.begin_step_percent, + end_step_percent=t2i_adapter_field.end_step_percent, + resize_mode=t2i_adapter_field.resize_mode, + ) + ) + def prep_ip_adapter_image_prompts( self, context: InvocationContext, @@ -707,7 +739,7 @@ def prep_inpaint_mask( else: masked_latents = torch.where(mask < 0.5, 0.0, latents) - return 1 - mask, masked_latents, self.denoise_mask.gradient + return mask, masked_latents, self.denoise_mask.gradient @staticmethod def prepare_noise_and_latents( @@ -765,10 +797,6 @@ def _new_invoke(self, context: InvocationContext) -> LatentsOutput: dtype = TorchDevice.choose_torch_dtype() seed, noise, latents = self.prepare_noise_and_latents(context, self.noise, self.latents) - latents = latents.to(device=device, dtype=dtype) - if noise is not None: - noise = noise.to(device=device, dtype=dtype) - _, _, latent_height, latent_width = latents.shape conditioning_data = self.get_conditioning_data( @@ -801,21 +829,6 @@ def _new_invoke(self, context: InvocationContext) -> LatentsOutput: denoising_end=self.denoising_end, ) - denoise_ctx = DenoiseContext( - inputs=DenoiseInputs( - orig_latents=latents, - timesteps=timesteps, - init_timestep=init_timestep, - noise=noise, - seed=seed, - scheduler_step_kwargs=scheduler_step_kwargs, - conditioning_data=conditioning_data, - attention_processor_cls=CustomAttnProcessor2_0, - ), - unet=None, - scheduler=scheduler, - ) - # get the unet's config so that we can pass the base to sd_step_callback() unet_config = context.models.get_config(self.unet.unet.key) @@ -833,6 +846,50 @@ def step_callback(state: PipelineIntermediateState) -> None: if self.unet.freeu_config: ext_manager.add_extension(FreeUExt(self.unet.freeu_config)) + ### lora + if self.unet.loras: + for lora_field in self.unet.loras: + ext_manager.add_extension( + LoRAExt( + node_context=context, + model_id=lora_field.lora, + weight=lora_field.weight, + ) + ) + ### seamless + if self.unet.seamless_axes: + ext_manager.add_extension(SeamlessExt(self.unet.seamless_axes)) + + ### inpaint + mask, masked_latents, is_gradient_mask = self.prep_inpaint_mask(context, latents) + # NOTE: We used to identify inpainting models by inpecting the shape of the loaded UNet model weights. Now we + # use the ModelVariantType config. During testing, there was a report of a user with models that had an + # incorrect ModelVariantType value. Re-installing the model fixed the issue. If this issue turns out to be + # prevalent, we will have to revisit how we initialize the inpainting extensions. + if unet_config.variant == ModelVariantType.Inpaint: + ext_manager.add_extension(InpaintModelExt(mask, masked_latents, is_gradient_mask)) + elif mask is not None: + ext_manager.add_extension(InpaintExt(mask, is_gradient_mask)) + + # Initialize context for modular denoise + latents = latents.to(device=device, dtype=dtype) + if noise is not None: + noise = noise.to(device=device, dtype=dtype) + denoise_ctx = DenoiseContext( + inputs=DenoiseInputs( + orig_latents=latents, + timesteps=timesteps, + init_timestep=init_timestep, + noise=noise, + seed=seed, + scheduler_step_kwargs=scheduler_step_kwargs, + conditioning_data=conditioning_data, + attention_processor_cls=CustomAttnProcessor2_0, + ), + unet=None, + scheduler=scheduler, + ) + # context for loading additional models with ExitStack() as exit_stack: # later should be smth like: @@ -840,6 +897,7 @@ def step_callback(state: PipelineIntermediateState) -> None: # ext = extension_field.to_extension(exit_stack, context, ext_manager) # ext_manager.add_extension(ext) self.parse_controlnet_field(exit_stack, context, self.control, ext_manager) + self.parse_t2i_adapter_field(exit_stack, context, self.t2i_adapter, ext_manager) # ext: t2i/ip adapter ext_manager.run_callback(ExtensionCallbackType.SETUP, denoise_ctx) @@ -871,6 +929,10 @@ def _old_invoke(self, context: InvocationContext) -> LatentsOutput: seed, noise, latents = self.prepare_noise_and_latents(context, self.noise, self.latents) mask, masked_latents, gradient_mask = self.prep_inpaint_mask(context, latents) + # At this point, the mask ranges from 0 (leave unchanged) to 1 (inpaint). + # We invert the mask here for compatibility with the old backend implementation. + if mask is not None: + mask = 1 - mask # TODO(ryand): I have hard-coded `do_classifier_free_guidance=True` to mirror the behaviour of ControlNets, # below. Investigate whether this is appropriate. @@ -913,14 +975,14 @@ def _lora_loader() -> Iterator[Tuple[LoRAModelRaw, float]]: assert isinstance(unet_info.model, UNet2DConditionModel) with ( ExitStack() as exit_stack, - unet_info.model_on_device() as (model_state_dict, unet), + unet_info.model_on_device() as (cached_weights, unet), ModelPatcher.apply_freeu(unet, self.unet.freeu_config), - set_seamless(unet, self.unet.seamless_axes), # FIXME + SeamlessExt.static_patch_model(unet, self.unet.seamless_axes), # FIXME # Apply the LoRA after unet has been moved to its target device for faster patching. ModelPatcher.apply_lora_unet( unet, loras=_lora_loader(), - model_state_dict=model_state_dict, + cached_weights=cached_weights, ), ): assert isinstance(unet, UNet2DConditionModel) diff --git a/invokeai/app/invocations/fields.py b/invokeai/app/invocations/fields.py index f9a483f84ca..9efcf2148f7 100644 --- a/invokeai/app/invocations/fields.py +++ b/invokeai/app/invocations/fields.py @@ -1,7 +1,7 @@ from enum import Enum from typing import Any, Callable, Optional, Tuple -from pydantic import BaseModel, ConfigDict, Field, RootModel, TypeAdapter +from pydantic import BaseModel, ConfigDict, Field, RootModel, TypeAdapter, model_validator from pydantic.fields import _Unset from pydantic_core import PydanticUndefined @@ -242,6 +242,31 @@ class ConditioningField(BaseModel): ) +class BoundingBoxField(BaseModel): + """A bounding box primitive value.""" + + x_min: int = Field(ge=0, description="The minimum x-coordinate of the bounding box (inclusive).") + x_max: int = Field(ge=0, description="The maximum x-coordinate of the bounding box (exclusive).") + y_min: int = Field(ge=0, description="The minimum y-coordinate of the bounding box (inclusive).") + y_max: int = Field(ge=0, description="The maximum y-coordinate of the bounding box (exclusive).") + + score: Optional[float] = Field( + default=None, + ge=0.0, + le=1.0, + description="The score associated with the bounding box. In the range [0, 1]. This value is typically set " + "when the bounding box was produced by a detector and has an associated confidence score.", + ) + + @model_validator(mode="after") + def check_coords(self): + if self.x_min > self.x_max: + raise ValueError(f"x_min ({self.x_min}) is greater than x_max ({self.x_max}).") + if self.y_min > self.y_max: + raise ValueError(f"y_min ({self.y_min}) is greater than y_max ({self.y_max}).") + return self + + class MetadataField(RootModel[dict[str, Any]]): """ Pydantic model for metadata with custom root of type dict[str, Any]. diff --git a/invokeai/app/invocations/grounding_dino.py b/invokeai/app/invocations/grounding_dino.py new file mode 100644 index 00000000000..1e3d5cea0cf --- /dev/null +++ b/invokeai/app/invocations/grounding_dino.py @@ -0,0 +1,100 @@ +from pathlib import Path +from typing import Literal + +import torch +from PIL import Image +from transformers import pipeline +from transformers.pipelines import ZeroShotObjectDetectionPipeline + +from invokeai.app.invocations.baseinvocation import BaseInvocation, invocation +from invokeai.app.invocations.fields import BoundingBoxField, ImageField, InputField +from invokeai.app.invocations.primitives import BoundingBoxCollectionOutput +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.image_util.grounding_dino.detection_result import DetectionResult +from invokeai.backend.image_util.grounding_dino.grounding_dino_pipeline import GroundingDinoPipeline + +GroundingDinoModelKey = Literal["grounding-dino-tiny", "grounding-dino-base"] +GROUNDING_DINO_MODEL_IDS: dict[GroundingDinoModelKey, str] = { + "grounding-dino-tiny": "IDEA-Research/grounding-dino-tiny", + "grounding-dino-base": "IDEA-Research/grounding-dino-base", +} + + +@invocation( + "grounding_dino", + title="Grounding DINO (Text Prompt Object Detection)", + tags=["prompt", "object detection"], + category="image", + version="1.0.0", +) +class GroundingDinoInvocation(BaseInvocation): + """Runs a Grounding DINO model. Performs zero-shot bounding-box object detection from a text prompt.""" + + # Reference: + # - https://arxiv.org/pdf/2303.05499 + # - https://huggingface.co/docs/transformers/v4.43.3/en/model_doc/grounding-dino#grounded-sam + # - https://github.com/NielsRogge/Transformers-Tutorials/blob/a39f33ac1557b02ebfb191ea7753e332b5ca933f/Grounding%20DINO/GroundingDINO_with_Segment_Anything.ipynb + + model: GroundingDinoModelKey = InputField(description="The Grounding DINO model to use.") + prompt: str = InputField(description="The prompt describing the object to segment.") + image: ImageField = InputField(description="The image to segment.") + detection_threshold: float = InputField( + description="The detection threshold for the Grounding DINO model. All detected bounding boxes with scores above this threshold will be returned.", + ge=0.0, + le=1.0, + default=0.3, + ) + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> BoundingBoxCollectionOutput: + # The model expects a 3-channel RGB image. + image_pil = context.images.get_pil(self.image.image_name, mode="RGB") + + detections = self._detect( + context=context, image=image_pil, labels=[self.prompt], threshold=self.detection_threshold + ) + + # Convert detections to BoundingBoxCollectionOutput. + bounding_boxes: list[BoundingBoxField] = [] + for detection in detections: + bounding_boxes.append( + BoundingBoxField( + x_min=detection.box.xmin, + x_max=detection.box.xmax, + y_min=detection.box.ymin, + y_max=detection.box.ymax, + score=detection.score, + ) + ) + return BoundingBoxCollectionOutput(collection=bounding_boxes) + + @staticmethod + def _load_grounding_dino(model_path: Path): + grounding_dino_pipeline = pipeline( + model=str(model_path), + task="zero-shot-object-detection", + local_files_only=True, + # TODO(ryand): Setting the torch_dtype here doesn't work. Investigate whether fp16 is supported by the + # model, and figure out how to make it work in the pipeline. + # torch_dtype=TorchDevice.choose_torch_dtype(), + ) + assert isinstance(grounding_dino_pipeline, ZeroShotObjectDetectionPipeline) + return GroundingDinoPipeline(grounding_dino_pipeline) + + def _detect( + self, + context: InvocationContext, + image: Image.Image, + labels: list[str], + threshold: float = 0.3, + ) -> list[DetectionResult]: + """Use Grounding DINO to detect bounding boxes for a set of labels in an image.""" + # TODO(ryand): I copied this "."-handling logic from the transformers example code. Test it and see if it + # actually makes a difference. + labels = [label if label.endswith(".") else label + "." for label in labels] + + with context.models.load_remote_model( + source=GROUNDING_DINO_MODEL_IDS[self.model], loader=GroundingDinoInvocation._load_grounding_dino + ) as detector: + assert isinstance(detector, GroundingDinoPipeline) + return detector.detect(image=image, candidate_labels=labels, threshold=threshold) diff --git a/invokeai/app/invocations/latents_to_image.py b/invokeai/app/invocations/latents_to_image.py index cc8a9c44a3f..35b8483f2cc 100644 --- a/invokeai/app/invocations/latents_to_image.py +++ b/invokeai/app/invocations/latents_to_image.py @@ -24,7 +24,7 @@ from invokeai.app.invocations.model import VAEField from invokeai.app.invocations.primitives import ImageOutput from invokeai.app.services.shared.invocation_context import InvocationContext -from invokeai.backend.stable_diffusion import set_seamless +from invokeai.backend.stable_diffusion.extensions.seamless import SeamlessExt from invokeai.backend.stable_diffusion.vae_tiling import patch_vae_tiling_params from invokeai.backend.util.devices import TorchDevice @@ -59,7 +59,7 @@ def invoke(self, context: InvocationContext) -> ImageOutput: vae_info = context.models.load(self.vae.vae) assert isinstance(vae_info.model, (AutoencoderKL, AutoencoderTiny)) - with set_seamless(vae_info.model, self.vae.seamless_axes), vae_info as vae: + with SeamlessExt.static_patch_model(vae_info.model, self.vae.seamless_axes), vae_info as vae: assert isinstance(vae, (AutoencoderKL, AutoencoderTiny)) latents = latents.to(vae.device) if self.fp32: diff --git a/invokeai/app/invocations/mask.py b/invokeai/app/invocations/mask.py index 6f54660847a..64d1b48e389 100644 --- a/invokeai/app/invocations/mask.py +++ b/invokeai/app/invocations/mask.py @@ -1,9 +1,10 @@ import numpy as np import torch +from PIL import Image from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, InvocationContext, invocation -from invokeai.app.invocations.fields import ImageField, InputField, TensorField, WithMetadata -from invokeai.app.invocations.primitives import MaskOutput +from invokeai.app.invocations.fields import ImageField, InputField, TensorField, WithBoard, WithMetadata +from invokeai.app.invocations.primitives import ImageOutput, MaskOutput @invocation( @@ -118,3 +119,27 @@ def invoke(self, context: InvocationContext) -> MaskOutput: height=mask.shape[1], width=mask.shape[2], ) + + +@invocation( + "tensor_mask_to_image", + title="Tensor Mask to Image", + tags=["mask"], + category="mask", + version="1.0.0", +) +class MaskTensorToImageInvocation(BaseInvocation, WithMetadata, WithBoard): + """Convert a mask tensor to an image.""" + + mask: TensorField = InputField(description="The mask tensor to convert.") + + def invoke(self, context: InvocationContext) -> ImageOutput: + mask = context.tensors.load(self.mask.tensor_name) + # Ensure that the mask is binary. + if mask.dtype != torch.bool: + mask = mask > 0.5 + mask_np = (mask.float() * 255).byte().cpu().numpy() + + mask_pil = Image.fromarray(mask_np, mode="L") + image_dto = context.images.save(image=mask_pil) + return ImageOutput.build(image_dto) diff --git a/invokeai/app/invocations/primitives.py b/invokeai/app/invocations/primitives.py index e5056e37759..3655554f3bf 100644 --- a/invokeai/app/invocations/primitives.py +++ b/invokeai/app/invocations/primitives.py @@ -7,6 +7,7 @@ from invokeai.app.invocations.baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output from invokeai.app.invocations.constants import LATENT_SCALE_FACTOR from invokeai.app.invocations.fields import ( + BoundingBoxField, ColorField, ConditioningField, DenoiseMaskField, @@ -469,3 +470,42 @@ def invoke(self, context: InvocationContext) -> ConditioningCollectionOutput: # endregion + +# region BoundingBox + + +@invocation_output("bounding_box_output") +class BoundingBoxOutput(BaseInvocationOutput): + """Base class for nodes that output a single bounding box""" + + bounding_box: BoundingBoxField = OutputField(description="The output bounding box.") + + +@invocation_output("bounding_box_collection_output") +class BoundingBoxCollectionOutput(BaseInvocationOutput): + """Base class for nodes that output a collection of bounding boxes""" + + collection: list[BoundingBoxField] = OutputField(description="The output bounding boxes.", title="Bounding Boxes") + + +@invocation( + "bounding_box", + title="Bounding Box", + tags=["primitives", "segmentation", "collection", "bounding box"], + category="primitives", + version="1.0.0", +) +class BoundingBoxInvocation(BaseInvocation): + """Create a bounding box manually by supplying box coordinates""" + + x_min: int = InputField(default=0, description="x-coordinate of the bounding box's top left vertex") + y_min: int = InputField(default=0, description="y-coordinate of the bounding box's top left vertex") + x_max: int = InputField(default=0, description="x-coordinate of the bounding box's bottom right vertex") + y_max: int = InputField(default=0, description="y-coordinate of the bounding box's bottom right vertex") + + def invoke(self, context: InvocationContext) -> BoundingBoxOutput: + bounding_box = BoundingBoxField(x_min=self.x_min, y_min=self.y_min, x_max=self.x_max, y_max=self.y_max) + return BoundingBoxOutput(bounding_box=bounding_box) + + +# endregion diff --git a/invokeai/app/invocations/segment_anything.py b/invokeai/app/invocations/segment_anything.py new file mode 100644 index 00000000000..b49b1a39e33 --- /dev/null +++ b/invokeai/app/invocations/segment_anything.py @@ -0,0 +1,161 @@ +from pathlib import Path +from typing import Literal + +import numpy as np +import torch +from PIL import Image +from transformers import AutoModelForMaskGeneration, AutoProcessor +from transformers.models.sam import SamModel +from transformers.models.sam.processing_sam import SamProcessor + +from invokeai.app.invocations.baseinvocation import BaseInvocation, invocation +from invokeai.app.invocations.fields import BoundingBoxField, ImageField, InputField, TensorField +from invokeai.app.invocations.primitives import MaskOutput +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.image_util.segment_anything.mask_refinement import mask_to_polygon, polygon_to_mask +from invokeai.backend.image_util.segment_anything.segment_anything_pipeline import SegmentAnythingPipeline + +SegmentAnythingModelKey = Literal["segment-anything-base", "segment-anything-large", "segment-anything-huge"] +SEGMENT_ANYTHING_MODEL_IDS: dict[SegmentAnythingModelKey, str] = { + "segment-anything-base": "facebook/sam-vit-base", + "segment-anything-large": "facebook/sam-vit-large", + "segment-anything-huge": "facebook/sam-vit-huge", +} + + +@invocation( + "segment_anything", + title="Segment Anything", + tags=["prompt", "segmentation"], + category="segmentation", + version="1.0.0", +) +class SegmentAnythingInvocation(BaseInvocation): + """Runs a Segment Anything Model.""" + + # Reference: + # - https://arxiv.org/pdf/2304.02643 + # - https://huggingface.co/docs/transformers/v4.43.3/en/model_doc/grounding-dino#grounded-sam + # - https://github.com/NielsRogge/Transformers-Tutorials/blob/a39f33ac1557b02ebfb191ea7753e332b5ca933f/Grounding%20DINO/GroundingDINO_with_Segment_Anything.ipynb + + model: SegmentAnythingModelKey = InputField(description="The Segment Anything model to use.") + image: ImageField = InputField(description="The image to segment.") + bounding_boxes: list[BoundingBoxField] = InputField(description="The bounding boxes to prompt the SAM model with.") + apply_polygon_refinement: bool = InputField( + description="Whether to apply polygon refinement to the masks. This will smooth the edges of the masks slightly and ensure that each mask consists of a single closed polygon (before merging).", + default=True, + ) + mask_filter: Literal["all", "largest", "highest_box_score"] = InputField( + description="The filtering to apply to the detected masks before merging them into a final output.", + default="all", + ) + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> MaskOutput: + # The models expect a 3-channel RGB image. + image_pil = context.images.get_pil(self.image.image_name, mode="RGB") + + if len(self.bounding_boxes) == 0: + combined_mask = torch.zeros(image_pil.size[::-1], dtype=torch.bool) + else: + masks = self._segment(context=context, image=image_pil) + masks = self._filter_masks(masks=masks, bounding_boxes=self.bounding_boxes) + + # masks contains bool values, so we merge them via max-reduce. + combined_mask, _ = torch.stack(masks).max(dim=0) + + mask_tensor_name = context.tensors.save(combined_mask) + height, width = combined_mask.shape + return MaskOutput(mask=TensorField(tensor_name=mask_tensor_name), width=width, height=height) + + @staticmethod + def _load_sam_model(model_path: Path): + sam_model = AutoModelForMaskGeneration.from_pretrained( + model_path, + local_files_only=True, + # TODO(ryand): Setting the torch_dtype here doesn't work. Investigate whether fp16 is supported by the + # model, and figure out how to make it work in the pipeline. + # torch_dtype=TorchDevice.choose_torch_dtype(), + ) + assert isinstance(sam_model, SamModel) + + sam_processor = AutoProcessor.from_pretrained(model_path, local_files_only=True) + assert isinstance(sam_processor, SamProcessor) + return SegmentAnythingPipeline(sam_model=sam_model, sam_processor=sam_processor) + + def _segment( + self, + context: InvocationContext, + image: Image.Image, + ) -> list[torch.Tensor]: + """Use Segment Anything (SAM) to generate masks given an image + a set of bounding boxes.""" + # Convert the bounding boxes to the SAM input format. + sam_bounding_boxes = [[bb.x_min, bb.y_min, bb.x_max, bb.y_max] for bb in self.bounding_boxes] + + with ( + context.models.load_remote_model( + source=SEGMENT_ANYTHING_MODEL_IDS[self.model], loader=SegmentAnythingInvocation._load_sam_model + ) as sam_pipeline, + ): + assert isinstance(sam_pipeline, SegmentAnythingPipeline) + masks = sam_pipeline.segment(image=image, bounding_boxes=sam_bounding_boxes) + + masks = self._process_masks(masks) + if self.apply_polygon_refinement: + masks = self._apply_polygon_refinement(masks) + + return masks + + def _process_masks(self, masks: torch.Tensor) -> list[torch.Tensor]: + """Convert the tensor output from the Segment Anything model from a tensor of shape + [num_masks, channels, height, width] to a list of tensors of shape [height, width]. + """ + assert masks.dtype == torch.bool + # [num_masks, channels, height, width] -> [num_masks, height, width] + masks, _ = masks.max(dim=1) + # Split the first dimension into a list of masks. + return list(masks.cpu().unbind(dim=0)) + + def _apply_polygon_refinement(self, masks: list[torch.Tensor]) -> list[torch.Tensor]: + """Apply polygon refinement to the masks. + + Convert each mask to a polygon, then back to a mask. This has the following effect: + - Smooth the edges of the mask slightly. + - Ensure that each mask consists of a single closed polygon + - Removes small mask pieces. + - Removes holes from the mask. + """ + # Convert tensor masks to np masks. + np_masks = [mask.cpu().numpy().astype(np.uint8) for mask in masks] + + # Apply polygon refinement. + for idx, mask in enumerate(np_masks): + shape = mask.shape + assert len(shape) == 2 # Assert length to satisfy type checker. + polygon = mask_to_polygon(mask) + mask = polygon_to_mask(polygon, shape) + np_masks[idx] = mask + + # Convert np masks back to tensor masks. + masks = [torch.tensor(mask, dtype=torch.bool) for mask in np_masks] + + return masks + + def _filter_masks(self, masks: list[torch.Tensor], bounding_boxes: list[BoundingBoxField]) -> list[torch.Tensor]: + """Filter the detected masks based on the specified mask filter.""" + assert len(masks) == len(bounding_boxes) + + if self.mask_filter == "all": + return masks + elif self.mask_filter == "largest": + # Find the largest mask. + return [max(masks, key=lambda x: float(x.sum()))] + elif self.mask_filter == "highest_box_score": + # Find the index of the bounding box with the highest score. + # Note that we fallback to -1.0 if the score is None. This is mainly to satisfy the type checker. In most + # cases the scores should all be non-None when using this filtering mode. That being said, -1.0 is a + # reasonable fallback since the expected score range is [0.0, 1.0]. + max_score_idx = max(range(len(bounding_boxes)), key=lambda i: bounding_boxes[i].score or -1.0) + return [masks[max_score_idx]] + else: + raise ValueError(f"Invalid mask filter: {self.mask_filter}") diff --git a/invokeai/app/invocations/spandrel_image_to_image.py b/invokeai/app/invocations/spandrel_image_to_image.py index 3282106a427..ae4f48ef77c 100644 --- a/invokeai/app/invocations/spandrel_image_to_image.py +++ b/invokeai/app/invocations/spandrel_image_to_image.py @@ -23,7 +23,7 @@ from invokeai.backend.tiles.utils import TBLR, Tile -@invocation("spandrel_image_to_image", title="Image-to-Image", tags=["upscale"], category="upscale", version="1.2.0") +@invocation("spandrel_image_to_image", title="Image-to-Image", tags=["upscale"], category="upscale", version="1.3.0") class SpandrelImageToImageInvocation(BaseInvocation, WithMetadata, WithBoard): """Run any spandrel image-to-image model (https://github.com/chaiNNer-org/spandrel).""" @@ -36,16 +36,6 @@ class SpandrelImageToImageInvocation(BaseInvocation, WithMetadata, WithBoard): tile_size: int = InputField( default=512, description="The tile size for tiled image-to-image. Set to 0 to disable tiling." ) - scale: float = InputField( - default=4.0, - gt=0.0, - le=16.0, - description="The final scale of the output image. If the model does not upscale the image, this will be ignored.", - ) - fit_to_multiple_of_8: bool = InputField( - default=False, - description="If true, the output image will be resized to the nearest multiple of 8 in both dimensions.", - ) @classmethod def scale_tile(cls, tile: Tile, scale: int) -> Tile: @@ -152,6 +142,47 @@ def upscale_image( return pil_image + @torch.inference_mode() + def invoke(self, context: InvocationContext) -> ImageOutput: + # Images are converted to RGB, because most models don't support an alpha channel. In the future, we may want to + # revisit this. + image = context.images.get_pil(self.image.image_name, mode="RGB") + + # Load the model. + spandrel_model_info = context.models.load(self.image_to_image_model) + + # Do the upscaling. + with spandrel_model_info as spandrel_model: + assert isinstance(spandrel_model, SpandrelImageToImageModel) + + # Upscale the image + pil_image = self.upscale_image(image, self.tile_size, spandrel_model, context.util.is_canceled) + + image_dto = context.images.save(image=pil_image) + return ImageOutput.build(image_dto) + + +@invocation( + "spandrel_image_to_image_autoscale", + title="Image-to-Image (Autoscale)", + tags=["upscale"], + category="upscale", + version="1.0.0", +) +class SpandrelImageToImageAutoscaleInvocation(SpandrelImageToImageInvocation): + """Run any spandrel image-to-image model (https://github.com/chaiNNer-org/spandrel) until the target scale is reached.""" + + scale: float = InputField( + default=4.0, + gt=0.0, + le=16.0, + description="The final scale of the output image. If the model does not upscale the image, this will be ignored.", + ) + fit_to_multiple_of_8: bool = InputField( + default=False, + description="If true, the output image will be resized to the nearest multiple of 8 in both dimensions.", + ) + @torch.inference_mode() def invoke(self, context: InvocationContext) -> ImageOutput: # Images are converted to RGB, because most models don't support an alpha channel. In the future, we may want to diff --git a/invokeai/app/services/config/config_default.py b/invokeai/app/services/config/config_default.py index 6c39760bdc8..55f7a095caf 100644 --- a/invokeai/app/services/config/config_default.py +++ b/invokeai/app/services/config/config_default.py @@ -91,6 +91,7 @@ class InvokeAIAppConfig(BaseSettings): db_dir: Path to InvokeAI databases directory. outputs_dir: Path to directory for outputs. custom_nodes_dir: Path to directory for custom nodes. + style_presets_dir: Path to directory for style presets. log_handlers: Log handler. Valid options are "console", "file=", "syslog=path|address:host:port", "http=". log_format: Log format. Use "plain" for text-only, "color" for colorized output, "legacy" for 2.3-style logging and "syslog" for syslog-style.
Valid values: `plain`, `color`, `syslog`, `legacy` log_level: Emit logging messages at this level or higher.
Valid values: `debug`, `info`, `warning`, `error`, `critical` @@ -153,6 +154,7 @@ class InvokeAIAppConfig(BaseSettings): db_dir: Path = Field(default=Path("databases"), description="Path to InvokeAI databases directory.") outputs_dir: Path = Field(default=Path("outputs"), description="Path to directory for outputs.") custom_nodes_dir: Path = Field(default=Path("nodes"), description="Path to directory for custom nodes.") + style_presets_dir: Path = Field(default=Path("style_presets"), description="Path to directory for style presets.") # LOGGING log_handlers: list[str] = Field(default=["console"], description='Log handler. Valid options are "console", "file=", "syslog=path|address:host:port", "http=".') @@ -300,6 +302,11 @@ def models_path(self) -> Path: """Path to the models directory, resolved to an absolute path..""" return self._resolve(self.models_dir) + @property + def style_presets_path(self) -> Path: + """Path to the style presets directory, resolved to an absolute path..""" + return self._resolve(self.style_presets_dir) + @property def convert_cache_path(self) -> Path: """Path to the converted cache models directory, resolved to an absolute path..""" diff --git a/invokeai/app/services/events/events_fastapievents.py b/invokeai/app/services/events/events_fastapievents.py index d514a06b67c..3c46b37fd68 100644 --- a/invokeai/app/services/events/events_fastapievents.py +++ b/invokeai/app/services/events/events_fastapievents.py @@ -1,46 +1,44 @@ -# Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) - import asyncio import threading -from queue import Empty, Queue from fastapi_events.dispatcher import dispatch from invokeai.app.services.events.events_base import EventServiceBase -from invokeai.app.services.events.events_common import ( - EventBase, -) +from invokeai.app.services.events.events_common import EventBase class FastAPIEventService(EventServiceBase): - def __init__(self, event_handler_id: int) -> None: + def __init__(self, event_handler_id: int, loop: asyncio.AbstractEventLoop) -> None: self.event_handler_id = event_handler_id - self._queue = Queue[EventBase | None]() + self._queue = asyncio.Queue[EventBase | None]() self._stop_event = threading.Event() - asyncio.create_task(self._dispatch_from_queue(stop_event=self._stop_event)) + self._loop = loop + + # We need to store a reference to the task so it doesn't get GC'd + # See: https://docs.python.org/3/library/asyncio-task.html#creating-tasks + self._background_tasks: set[asyncio.Task[None]] = set() + task = self._loop.create_task(self._dispatch_from_queue(stop_event=self._stop_event)) + self._background_tasks.add(task) + task.add_done_callback(self._background_tasks.remove) super().__init__() def stop(self, *args, **kwargs): self._stop_event.set() - self._queue.put(None) + self._loop.call_soon_threadsafe(self._queue.put_nowait, None) def dispatch(self, event: EventBase) -> None: - self._queue.put(event) + self._loop.call_soon_threadsafe(self._queue.put_nowait, event) async def _dispatch_from_queue(self, stop_event: threading.Event): """Get events on from the queue and dispatch them, from the correct thread""" while not stop_event.is_set(): try: - event = self._queue.get(block=False) + event = await self._queue.get() if not event: # Probably stopping continue # Leave the payloads as live pydantic models dispatch(event, middleware_id=self.event_handler_id, payload_schema_dump=False) - except Empty: - await asyncio.sleep(0.1) - pass - except asyncio.CancelledError as e: raise e # Raise a proper error diff --git a/invokeai/app/services/image_files/image_files_disk.py b/invokeai/app/services/image_files/image_files_disk.py index 95ab0525203..135df836103 100644 --- a/invokeai/app/services/image_files/image_files_disk.py +++ b/invokeai/app/services/image_files/image_files_disk.py @@ -1,11 +1,10 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) and the InvokeAI Team from pathlib import Path from queue import Queue -from typing import Dict, Optional, Union +from typing import Optional, Union from PIL import Image, PngImagePlugin from PIL.Image import Image as PILImageType -from send2trash import send2trash from invokeai.app.services.image_files.image_files_base import ImageFileStorageBase from invokeai.app.services.image_files.image_files_common import ( @@ -20,18 +19,12 @@ class DiskImageFileStorage(ImageFileStorageBase): """Stores images on disk""" - __output_folder: Path - __cache_ids: Queue # TODO: this is an incredibly naive cache - __cache: Dict[Path, PILImageType] - __max_cache_size: int - __invoker: Invoker - def __init__(self, output_folder: Union[str, Path]): - self.__cache = {} - self.__cache_ids = Queue() + self.__cache: dict[Path, PILImageType] = {} + self.__cache_ids = Queue[Path]() self.__max_cache_size = 10 # TODO: get this from config - self.__output_folder: Path = output_folder if isinstance(output_folder, Path) else Path(output_folder) + self.__output_folder = output_folder if isinstance(output_folder, Path) else Path(output_folder) self.__thumbnails_folder = self.__output_folder / "thumbnails" # Validate required output folders at launch self.__validate_storage_folders() @@ -103,7 +96,7 @@ def delete(self, image_name: str) -> None: image_path = self.get_path(image_name) if image_path.exists(): - send2trash(image_path) + image_path.unlink() if image_path in self.__cache: del self.__cache[image_path] @@ -111,7 +104,7 @@ def delete(self, image_name: str) -> None: thumbnail_path = self.get_path(thumbnail_name, True) if thumbnail_path.exists(): - send2trash(thumbnail_path) + thumbnail_path.unlink() if thumbnail_path in self.__cache: del self.__cache[thumbnail_path] except Exception as e: diff --git a/invokeai/app/services/invocation_services.py b/invokeai/app/services/invocation_services.py index 90ca613074e..db693dc8375 100644 --- a/invokeai/app/services/invocation_services.py +++ b/invokeai/app/services/invocation_services.py @@ -4,6 +4,8 @@ from typing import TYPE_CHECKING from invokeai.app.services.object_serializer.object_serializer_base import ObjectSerializerBase +from invokeai.app.services.style_preset_images.style_preset_images_base import StylePresetImageFileStorageBase +from invokeai.app.services.style_preset_records.style_preset_records_base import StylePresetRecordsStorageBase if TYPE_CHECKING: from logging import Logger @@ -61,6 +63,8 @@ def __init__( workflow_records: "WorkflowRecordsStorageBase", tensors: "ObjectSerializerBase[torch.Tensor]", conditioning: "ObjectSerializerBase[ConditioningFieldData]", + style_preset_records: "StylePresetRecordsStorageBase", + style_preset_image_files: "StylePresetImageFileStorageBase", ): self.board_images = board_images self.board_image_records = board_image_records @@ -85,3 +89,5 @@ def __init__( self.workflow_records = workflow_records self.tensors = tensors self.conditioning = conditioning + self.style_preset_records = style_preset_records + self.style_preset_image_files = style_preset_image_files diff --git a/invokeai/app/services/model_images/model_images_default.py b/invokeai/app/services/model_images/model_images_default.py index 36f04a93b5a..5fe8086c6a5 100644 --- a/invokeai/app/services/model_images/model_images_default.py +++ b/invokeai/app/services/model_images/model_images_default.py @@ -2,7 +2,6 @@ from PIL import Image from PIL.Image import Image as PILImageType -from send2trash import send2trash from invokeai.app.services.invoker import Invoker from invokeai.app.services.model_images.model_images_base import ModelImageFileStorageBase @@ -70,7 +69,7 @@ def delete(self, model_key: str) -> None: if not self._validate_path(path): raise ModelImageFileNotFoundException - send2trash(path) + path.unlink() except Exception as e: raise ModelImageFileDeleteException from e diff --git a/invokeai/app/services/model_install/model_install_base.py b/invokeai/app/services/model_install/model_install_base.py index 20afaeaa505..27578dd5d6b 100644 --- a/invokeai/app/services/model_install/model_install_base.py +++ b/invokeai/app/services/model_install/model_install_base.py @@ -3,7 +3,7 @@ from abc import ABC, abstractmethod from pathlib import Path -from typing import Any, Dict, List, Optional, Union +from typing import List, Optional, Union from pydantic.networks import AnyHttpUrl @@ -12,7 +12,7 @@ from invokeai.app.services.events.events_base import EventServiceBase from invokeai.app.services.invoker import Invoker from invokeai.app.services.model_install.model_install_common import ModelInstallJob, ModelSource -from invokeai.app.services.model_records import ModelRecordServiceBase +from invokeai.app.services.model_records import ModelRecordChanges, ModelRecordServiceBase from invokeai.backend.model_manager import AnyModelConfig @@ -64,7 +64,7 @@ def event_bus(self) -> Optional["EventServiceBase"]: def register_path( self, model_path: Union[Path, str], - config: Optional[Dict[str, Any]] = None, + config: Optional[ModelRecordChanges] = None, ) -> str: """ Probe and register the model at model_path. @@ -72,7 +72,7 @@ def register_path( This keeps the model in its current location. :param model_path: Filesystem Path to the model. - :param config: Dict of attributes that will override autoassigned values. + :param config: ModelRecordChanges object that will override autoassigned model record values. :returns id: The string ID of the registered model. """ @@ -92,7 +92,7 @@ def unconditionally_delete(self, key: str) -> None: def install_path( self, model_path: Union[Path, str], - config: Optional[Dict[str, Any]] = None, + config: Optional[ModelRecordChanges] = None, ) -> str: """ Probe, register and install the model in the models directory. @@ -101,7 +101,7 @@ def install_path( the models directory handled by InvokeAI. :param model_path: Filesystem Path to the model. - :param config: Dict of attributes that will override autoassigned values. + :param config: ModelRecordChanges object that will override autoassigned model record values. :returns id: The string ID of the registered model. """ @@ -109,14 +109,14 @@ def install_path( def heuristic_import( self, source: str, - config: Optional[Dict[str, Any]] = None, + config: Optional[ModelRecordChanges] = None, access_token: Optional[str] = None, inplace: Optional[bool] = False, ) -> ModelInstallJob: r"""Install the indicated model using heuristics to interpret user intentions. :param source: String source - :param config: Optional dict. Any fields in this dict + :param config: Optional ModelRecordChanges object. Any fields in this object will override corresponding autoassigned probe fields in the model's config record as described in `import_model()`. :param access_token: Optional access token for remote sources. @@ -147,7 +147,7 @@ def heuristic_import( def import_model( self, source: ModelSource, - config: Optional[Dict[str, Any]] = None, + config: Optional[ModelRecordChanges] = None, ) -> ModelInstallJob: """Install the indicated model. diff --git a/invokeai/app/services/model_install/model_install_common.py b/invokeai/app/services/model_install/model_install_common.py index c1538f543dc..8cbe31597f4 100644 --- a/invokeai/app/services/model_install/model_install_common.py +++ b/invokeai/app/services/model_install/model_install_common.py @@ -2,13 +2,14 @@ import traceback from enum import Enum from pathlib import Path -from typing import Any, Dict, Literal, Optional, Set, Union +from typing import Literal, Optional, Set, Union from pydantic import BaseModel, Field, PrivateAttr, field_validator from pydantic.networks import AnyHttpUrl from typing_extensions import Annotated from invokeai.app.services.download import DownloadJob, MultiFileDownloadJob +from invokeai.app.services.model_records import ModelRecordChanges from invokeai.backend.model_manager import AnyModelConfig, ModelRepoVariant from invokeai.backend.model_manager.config import ModelSourceType from invokeai.backend.model_manager.metadata import AnyModelRepoMetadata @@ -133,8 +134,9 @@ class ModelInstallJob(BaseModel): id: int = Field(description="Unique ID for this job") status: InstallStatus = Field(default=InstallStatus.WAITING, description="Current status of install process") error_reason: Optional[str] = Field(default=None, description="Information about why the job failed") - config_in: Dict[str, Any] = Field( - default_factory=dict, description="Configuration information (e.g. 'description') to apply to model." + config_in: ModelRecordChanges = Field( + default_factory=ModelRecordChanges, + description="Configuration information (e.g. 'description') to apply to model.", ) config_out: Optional[AnyModelConfig] = Field( default=None, description="After successful installation, this will hold the configuration object." diff --git a/invokeai/app/services/model_install/model_install_default.py b/invokeai/app/services/model_install/model_install_default.py index 5e19a349adc..e1d784f5bf4 100644 --- a/invokeai/app/services/model_install/model_install_default.py +++ b/invokeai/app/services/model_install/model_install_default.py @@ -163,26 +163,27 @@ def _put_in_queue(self, job: ModelInstallJob) -> None: def register_path( self, model_path: Union[Path, str], - config: Optional[Dict[str, Any]] = None, + config: Optional[ModelRecordChanges] = None, ) -> str: # noqa D102 model_path = Path(model_path) - config = config or {} - if not config.get("source"): - config["source"] = model_path.resolve().as_posix() - config["source_type"] = ModelSourceType.Path + config = config or ModelRecordChanges() + if not config.source: + config.source = model_path.resolve().as_posix() + config.source_type = ModelSourceType.Path return self._register(model_path, config) def install_path( self, model_path: Union[Path, str], - config: Optional[Dict[str, Any]] = None, + config: Optional[ModelRecordChanges] = None, ) -> str: # noqa D102 model_path = Path(model_path) - config = config or {} + config = config or ModelRecordChanges() + info: AnyModelConfig = ModelProbe.probe( + Path(model_path), config.model_dump(), hash_algo=self._app_config.hashing_algorithm + ) # type: ignore - info: AnyModelConfig = ModelProbe.probe(Path(model_path), config, hash_algo=self._app_config.hashing_algorithm) - - if preferred_name := config.get("name"): + if preferred_name := config.name: preferred_name = Path(preferred_name).with_suffix(model_path.suffix) dest_path = ( @@ -204,7 +205,7 @@ def install_path( def heuristic_import( self, source: str, - config: Optional[Dict[str, Any]] = None, + config: Optional[ModelRecordChanges] = None, access_token: Optional[str] = None, inplace: Optional[bool] = False, ) -> ModelInstallJob: @@ -216,7 +217,7 @@ def heuristic_import( source_obj.access_token = access_token return self.import_model(source_obj, config) - def import_model(self, source: ModelSource, config: Optional[Dict[str, Any]] = None) -> ModelInstallJob: # noqa D102 + def import_model(self, source: ModelSource, config: Optional[ModelRecordChanges] = None) -> ModelInstallJob: # noqa D102 similar_jobs = [x for x in self.list_jobs() if x.source == source and not x.in_terminal_state] if similar_jobs: self._logger.warning(f"There is already an active install job for {source}. Not enqueuing.") @@ -318,16 +319,17 @@ def _migrate_yaml(self) -> None: model_path = self._app_config.models_path / model_path model_path = model_path.resolve() - config: dict[str, Any] = {} - config["name"] = model_name - config["description"] = stanza.get("description") + config = ModelRecordChanges( + name=model_name, + description=stanza.get("description"), + ) legacy_config_path = stanza.get("config") if legacy_config_path: # In v3, these paths were relative to the root. Migrate them to be relative to the legacy_conf_dir. legacy_config_path = self._app_config.root_path / legacy_config_path if legacy_config_path.is_relative_to(self._app_config.legacy_conf_path): legacy_config_path = legacy_config_path.relative_to(self._app_config.legacy_conf_path) - config["config_path"] = str(legacy_config_path) + config.config_path = str(legacy_config_path) try: id = self.register_path(model_path=model_path, config=config) self._logger.info(f"Migrated {model_name} with id {id}") @@ -500,11 +502,11 @@ def _register_or_install(self, job: ModelInstallJob) -> None: job.total_bytes = self._stat_size(job.local_path) job.bytes = job.total_bytes self._signal_job_running(job) - job.config_in["source"] = str(job.source) - job.config_in["source_type"] = MODEL_SOURCE_TO_TYPE_MAP[job.source.__class__] + job.config_in.source = str(job.source) + job.config_in.source_type = MODEL_SOURCE_TO_TYPE_MAP[job.source.__class__] # enter the metadata, if there is any if isinstance(job.source_metadata, (HuggingFaceMetadata)): - job.config_in["source_api_response"] = job.source_metadata.api_response + job.config_in.source_api_response = job.source_metadata.api_response if job.inplace: key = self.register_path(job.local_path, job.config_in) @@ -639,11 +641,11 @@ def _move_model(self, old_path: Path, new_path: Path) -> Path: return new_path def _register( - self, model_path: Path, config: Optional[Dict[str, Any]] = None, info: Optional[AnyModelConfig] = None + self, model_path: Path, config: Optional[ModelRecordChanges] = None, info: Optional[AnyModelConfig] = None ) -> str: - config = config or {} + config = config or ModelRecordChanges() - info = info or ModelProbe.probe(model_path, config, hash_algo=self._app_config.hashing_algorithm) + info = info or ModelProbe.probe(model_path, config.model_dump(), hash_algo=self._app_config.hashing_algorithm) # type: ignore model_path = model_path.resolve() @@ -674,11 +676,13 @@ def _guess_variant(self) -> Optional[ModelRepoVariant]: precision = TorchDevice.choose_torch_dtype() return ModelRepoVariant.FP16 if precision == torch.float16 else None - def _import_local_model(self, source: LocalModelSource, config: Optional[Dict[str, Any]]) -> ModelInstallJob: + def _import_local_model( + self, source: LocalModelSource, config: Optional[ModelRecordChanges] = None + ) -> ModelInstallJob: return ModelInstallJob( id=self._next_id(), source=source, - config_in=config or {}, + config_in=config or ModelRecordChanges(), local_path=Path(source.path), inplace=source.inplace or False, ) @@ -686,7 +690,7 @@ def _import_local_model(self, source: LocalModelSource, config: Optional[Dict[st def _import_from_hf( self, source: HFModelSource, - config: Optional[Dict[str, Any]] = None, + config: Optional[ModelRecordChanges] = None, ) -> ModelInstallJob: # Add user's cached access token to HuggingFace requests if source.access_token is None: @@ -702,7 +706,7 @@ def _import_from_hf( def _import_from_url( self, source: URLModelSource, - config: Optional[Dict[str, Any]], + config: Optional[ModelRecordChanges] = None, ) -> ModelInstallJob: remote_files, metadata = self._remote_files_from_source(source) return self._import_remote_model( @@ -717,7 +721,7 @@ def _import_remote_model( source: HFModelSource | URLModelSource, remote_files: List[RemoteModelFile], metadata: Optional[AnyModelRepoMetadata], - config: Optional[Dict[str, Any]], + config: Optional[ModelRecordChanges], ) -> ModelInstallJob: if len(remote_files) == 0: raise ValueError(f"{source}: No downloadable files found") @@ -730,7 +734,7 @@ def _import_remote_model( install_job = ModelInstallJob( id=self._next_id(), source=source, - config_in=config or {}, + config_in=config or ModelRecordChanges(), source_metadata=metadata, local_path=destdir, # local path may change once the download has started due to content-disposition handling bytes=0, diff --git a/invokeai/app/services/model_records/model_records_base.py b/invokeai/app/services/model_records/model_records_base.py index 57531cf3c19..46d11d4ddf2 100644 --- a/invokeai/app/services/model_records/model_records_base.py +++ b/invokeai/app/services/model_records/model_records_base.py @@ -18,6 +18,7 @@ ControlAdapterDefaultSettings, MainModelDefaultSettings, ModelFormat, + ModelSourceType, ModelType, ModelVariantType, SchedulerPredictionType, @@ -66,10 +67,16 @@ class ModelRecordChanges(BaseModelExcludeNull): """A set of changes to apply to a model.""" # Changes applicable to all models + source: Optional[str] = Field(description="original source of the model", default=None) + source_type: Optional[ModelSourceType] = Field(description="type of model source", default=None) + source_api_response: Optional[str] = Field(description="metadata from remote source", default=None) name: Optional[str] = Field(description="Name of the model.", default=None) path: Optional[str] = Field(description="Path to the model.", default=None) description: Optional[str] = Field(description="Model description", default=None) base: Optional[BaseModelType] = Field(description="The base model.", default=None) + type: Optional[ModelType] = Field(description="Type of model", default=None) + key: Optional[str] = Field(description="Database ID for this model", default=None) + hash: Optional[str] = Field(description="hash of model file", default=None) trigger_phrases: Optional[set[str]] = Field(description="Set of trigger phrases for this model", default=None) default_settings: Optional[MainModelDefaultSettings | ControlAdapterDefaultSettings] = Field( description="Default settings for this model", default=None diff --git a/invokeai/app/services/shared/sqlite/sqlite_util.py b/invokeai/app/services/shared/sqlite/sqlite_util.py index 49fd337da2b..e35c351ff02 100644 --- a/invokeai/app/services/shared/sqlite/sqlite_util.py +++ b/invokeai/app/services/shared/sqlite/sqlite_util.py @@ -16,6 +16,7 @@ from invokeai.app.services.shared.sqlite_migrator.migrations.migration_11 import build_migration_11 from invokeai.app.services.shared.sqlite_migrator.migrations.migration_12 import build_migration_12 from invokeai.app.services.shared.sqlite_migrator.migrations.migration_13 import build_migration_13 +from invokeai.app.services.shared.sqlite_migrator.migrations.migration_14 import build_migration_14 from invokeai.app.services.shared.sqlite_migrator.sqlite_migrator_impl import SqliteMigrator @@ -49,6 +50,7 @@ def init_db(config: InvokeAIAppConfig, logger: Logger, image_files: ImageFileSto migrator.register_migration(build_migration_11(app_config=config, logger=logger)) migrator.register_migration(build_migration_12(app_config=config)) migrator.register_migration(build_migration_13()) + migrator.register_migration(build_migration_14()) migrator.run_migrations() return db diff --git a/invokeai/app/services/shared/sqlite_migrator/migrations/migration_14.py b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_14.py new file mode 100644 index 00000000000..399f5a71d20 --- /dev/null +++ b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_14.py @@ -0,0 +1,61 @@ +import sqlite3 + +from invokeai.app.services.shared.sqlite_migrator.sqlite_migrator_common import Migration + + +class Migration14Callback: + def __call__(self, cursor: sqlite3.Cursor) -> None: + self._create_style_presets(cursor) + + def _create_style_presets(self, cursor: sqlite3.Cursor) -> None: + """Create the table used to store style presets.""" + tables = [ + """--sql + CREATE TABLE IF NOT EXISTS style_presets ( + id TEXT NOT NULL PRIMARY KEY, + name TEXT NOT NULL, + preset_data TEXT NOT NULL, + type TEXT NOT NULL DEFAULT "user", + created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- Updated via trigger + updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')) + ); + """ + ] + + # Add trigger for `updated_at`. + triggers = [ + """--sql + CREATE TRIGGER IF NOT EXISTS style_presets + AFTER UPDATE + ON style_presets FOR EACH ROW + BEGIN + UPDATE style_presets SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE id = old.id; + END; + """ + ] + + # Add indexes for searchable fields + indices = [ + "CREATE INDEX IF NOT EXISTS idx_style_presets_name ON style_presets(name);", + ] + + for stmt in tables + indices + triggers: + cursor.execute(stmt) + + +def build_migration_14() -> Migration: + """ + Build the migration from database version 13 to 14.. + + This migration does the following: + - Create the table used to store style presets. + """ + migration_14 = Migration( + from_version=13, + to_version=14, + callback=Migration14Callback(), + ) + + return migration_14 diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Anime.png b/invokeai/app/services/style_preset_images/default_style_preset_images/Anime.png new file mode 100644 index 00000000000..def6dce2592 Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Anime.png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Architectural Visualization.png b/invokeai/app/services/style_preset_images/default_style_preset_images/Architectural Visualization.png new file mode 100644 index 00000000000..97a2e74772f Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Architectural Visualization.png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Character).png b/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Character).png new file mode 100644 index 00000000000..5db78ce086f Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Character).png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Fantasy).png b/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Fantasy).png new file mode 100644 index 00000000000..93c3c5c301a Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Fantasy).png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Painterly).png b/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Painterly).png new file mode 100644 index 00000000000..5d3d0c4af6e Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Painterly).png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Sci-Fi).png b/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Sci-Fi).png new file mode 100644 index 00000000000..3f287fc3359 Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Concept Art (Sci-Fi).png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Environment Art.png b/invokeai/app/services/style_preset_images/default_style_preset_images/Environment Art.png new file mode 100644 index 00000000000..a0e1cbfb423 Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Environment Art.png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Illustration.png b/invokeai/app/services/style_preset_images/default_style_preset_images/Illustration.png new file mode 100644 index 00000000000..5b5976c4f95 Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Illustration.png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Interior Design (Visualization).png b/invokeai/app/services/style_preset_images/default_style_preset_images/Interior Design (Visualization).png new file mode 100644 index 00000000000..5c784103771 Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Interior Design (Visualization).png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Line Art.png b/invokeai/app/services/style_preset_images/default_style_preset_images/Line Art.png new file mode 100644 index 00000000000..b8cdfea030f Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Line Art.png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Black and White).png b/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Black and White).png new file mode 100644 index 00000000000..b47da9fb941 Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Black and White).png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (General).png b/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (General).png new file mode 100644 index 00000000000..a034cd197bc Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (General).png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Landscape).png b/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Landscape).png new file mode 100644 index 00000000000..5985fb6c4b2 Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Landscape).png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Portrait).png b/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Portrait).png new file mode 100644 index 00000000000..7718735b23f Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Portrait).png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Studio Lighting).png b/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Studio Lighting).png new file mode 100644 index 00000000000..60bd40b1fa8 Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Photography (Studio Lighting).png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Product Rendering.png b/invokeai/app/services/style_preset_images/default_style_preset_images/Product Rendering.png new file mode 100644 index 00000000000..4a426f47692 Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Product Rendering.png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Sketch.png b/invokeai/app/services/style_preset_images/default_style_preset_images/Sketch.png new file mode 100644 index 00000000000..08d240a29e6 Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Sketch.png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/Vehicles.png b/invokeai/app/services/style_preset_images/default_style_preset_images/Vehicles.png new file mode 100644 index 00000000000..73c4c8db087 Binary files /dev/null and b/invokeai/app/services/style_preset_images/default_style_preset_images/Vehicles.png differ diff --git a/invokeai/app/services/style_preset_images/default_style_preset_images/__init__.py b/invokeai/app/services/style_preset_images/default_style_preset_images/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/invokeai/app/services/style_preset_images/style_preset_images_base.py b/invokeai/app/services/style_preset_images/style_preset_images_base.py new file mode 100644 index 00000000000..d8158ad2ae2 --- /dev/null +++ b/invokeai/app/services/style_preset_images/style_preset_images_base.py @@ -0,0 +1,33 @@ +from abc import ABC, abstractmethod +from pathlib import Path + +from PIL.Image import Image as PILImageType + + +class StylePresetImageFileStorageBase(ABC): + """Low-level service responsible for storing and retrieving image files.""" + + @abstractmethod + def get(self, style_preset_id: str) -> PILImageType: + """Retrieves a style preset image as PIL Image.""" + pass + + @abstractmethod + def get_path(self, style_preset_id: str) -> Path: + """Gets the internal path to a style preset image.""" + pass + + @abstractmethod + def get_url(self, style_preset_id: str) -> str | None: + """Gets the URL to fetch a style preset image.""" + pass + + @abstractmethod + def save(self, style_preset_id: str, image: PILImageType) -> None: + """Saves a style preset image.""" + pass + + @abstractmethod + def delete(self, style_preset_id: str) -> None: + """Deletes a style preset image.""" + pass diff --git a/invokeai/app/services/style_preset_images/style_preset_images_common.py b/invokeai/app/services/style_preset_images/style_preset_images_common.py new file mode 100644 index 00000000000..054a12b82b7 --- /dev/null +++ b/invokeai/app/services/style_preset_images/style_preset_images_common.py @@ -0,0 +1,19 @@ +class StylePresetImageFileNotFoundException(Exception): + """Raised when an image file is not found in storage.""" + + def __init__(self, message: str = "Style preset image file not found"): + super().__init__(message) + + +class StylePresetImageFileSaveException(Exception): + """Raised when an image cannot be saved.""" + + def __init__(self, message: str = "Style preset image file not saved"): + super().__init__(message) + + +class StylePresetImageFileDeleteException(Exception): + """Raised when an image cannot be deleted.""" + + def __init__(self, message: str = "Style preset image file not deleted"): + super().__init__(message) diff --git a/invokeai/app/services/style_preset_images/style_preset_images_disk.py b/invokeai/app/services/style_preset_images/style_preset_images_disk.py new file mode 100644 index 00000000000..cd2b29efd2a --- /dev/null +++ b/invokeai/app/services/style_preset_images/style_preset_images_disk.py @@ -0,0 +1,88 @@ +from pathlib import Path + +from PIL import Image +from PIL.Image import Image as PILImageType + +from invokeai.app.services.invoker import Invoker +from invokeai.app.services.style_preset_images.style_preset_images_base import StylePresetImageFileStorageBase +from invokeai.app.services.style_preset_images.style_preset_images_common import ( + StylePresetImageFileDeleteException, + StylePresetImageFileNotFoundException, + StylePresetImageFileSaveException, +) +from invokeai.app.services.style_preset_records.style_preset_records_common import PresetType +from invokeai.app.util.misc import uuid_string +from invokeai.app.util.thumbnails import make_thumbnail + + +class StylePresetImageFileStorageDisk(StylePresetImageFileStorageBase): + """Stores images on disk""" + + def __init__(self, style_preset_images_folder: Path): + self._style_preset_images_folder = style_preset_images_folder + self._validate_storage_folders() + + def start(self, invoker: Invoker) -> None: + self._invoker = invoker + + def get(self, style_preset_id: str) -> PILImageType: + try: + path = self.get_path(style_preset_id) + + return Image.open(path) + except FileNotFoundError as e: + raise StylePresetImageFileNotFoundException from e + + def save(self, style_preset_id: str, image: PILImageType) -> None: + try: + self._validate_storage_folders() + image_path = self._style_preset_images_folder / (style_preset_id + ".webp") + thumbnail = make_thumbnail(image, 256) + thumbnail.save(image_path, format="webp") + + except Exception as e: + raise StylePresetImageFileSaveException from e + + def get_path(self, style_preset_id: str) -> Path: + style_preset = self._invoker.services.style_preset_records.get(style_preset_id) + if style_preset.type is PresetType.Default: + default_images_dir = Path(__file__).parent / Path("default_style_preset_images") + path = default_images_dir / (style_preset.name + ".png") + else: + path = self._style_preset_images_folder / (style_preset_id + ".webp") + + return path + + def get_url(self, style_preset_id: str) -> str | None: + path = self.get_path(style_preset_id) + if not self._validate_path(path): + return + + url = self._invoker.services.urls.get_style_preset_image_url(style_preset_id) + + # The image URL never changes, so we must add random query string to it to prevent caching + url += f"?{uuid_string()}" + + return url + + def delete(self, style_preset_id: str) -> None: + try: + path = self.get_path(style_preset_id) + + if not self._validate_path(path): + raise StylePresetImageFileNotFoundException + + path.unlink() + + except StylePresetImageFileNotFoundException as e: + raise StylePresetImageFileNotFoundException from e + except Exception as e: + raise StylePresetImageFileDeleteException from e + + def _validate_path(self, path: Path) -> bool: + """Validates the path given for an image.""" + return path.exists() + + def _validate_storage_folders(self) -> None: + """Checks if the required folders exist and create them if they don't""" + self._style_preset_images_folder.mkdir(parents=True, exist_ok=True) diff --git a/invokeai/app/services/style_preset_records/__init__.py b/invokeai/app/services/style_preset_records/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/invokeai/app/services/style_preset_records/default_style_presets.json b/invokeai/app/services/style_preset_records/default_style_presets.json new file mode 100644 index 00000000000..1daadfa8ff7 --- /dev/null +++ b/invokeai/app/services/style_preset_records/default_style_presets.json @@ -0,0 +1,146 @@ +[ + { + "name": "Photography (General)", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt}. photography. f/2.8 macro photo, bokeh, photorealism", + "negative_prompt": "painting, digital art. sketch, blurry" + } + }, + { + "name": "Photography (Studio Lighting)", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt}, photography. f/8 photo. centered subject, studio lighting.", + "negative_prompt": "painting, digital art. sketch, blurry" + } + }, + { + "name": "Photography (Landscape)", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt}, landscape photograph, f/12, lifelike, highly detailed.", + "negative_prompt": "painting, digital art. sketch, blurry" + } + }, + { + "name": "Photography (Portrait)", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt}. photography. portraiture. catch light in eyes. one flash. rembrandt lighting. Soft box. dark shadows. High contrast. 80mm lens. F2.8.", + "negative_prompt": "painting, digital art. sketch, blurry" + } + }, + { + "name": "Photography (Black and White)", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt} photography. natural light. 80mm lens. F1.4. strong contrast, hard light. dark contrast. blurred background. black and white", + "negative_prompt": "painting, digital art. sketch, colour+" + } + }, + { + "name": "Architectural Visualization", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt}. architectural photography, f/12, luxury, aesthetically pleasing form and function.", + "negative_prompt": "painting, digital art. sketch, blurry" + } + }, + { + "name": "Concept Art (Fantasy)", + "type": "default", + "preset_data": { + "positive_prompt": "concept artwork of a {prompt}. (digital painterly art style)++, mythological, (textured 2d dry media brushpack)++, glazed brushstrokes, otherworldly. painting+, illustration+", + "negative_prompt": "photo. distorted, blurry, out of focus. sketch. (cgi, 3d.)++" + } + }, + { + "name": "Concept Art (Sci-Fi)", + "type": "default", + "preset_data": { + "positive_prompt": "(concept art)++, {prompt}, (sleek futurism)++, (textured 2d dry media)++, metallic highlights, digital painting style", + "negative_prompt": "photo. distorted, blurry, out of focus. sketch. (cgi, 3d.)++" + } + }, + { + "name": "Concept Art (Character)", + "type": "default", + "preset_data": { + "positive_prompt": "(character concept art)++, stylized painterly digital painting of {prompt}, (painterly, impasto. Dry brush.)++", + "negative_prompt": "photo. distorted, blurry, out of focus. sketch. (cgi, 3d.)++" + } + }, + { + "name": "Concept Art (Painterly)", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt} oil painting. high contrast. impasto. sfumato. chiaroscuro. Palette knife.", + "negative_prompt": "photo. smooth. border. frame" + } + }, + { + "name": "Environment Art", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt} environment artwork, hyper-realistic digital painting style with cinematic composition, atmospheric, depth and detail, voluminous. textured dry brush 2d media", + "negative_prompt": "photo, distorted, blurry, out of focus. sketch." + } + }, + { + "name": "Interior Design (Visualization)", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt} interior design photo, gentle shadows, light mid-tones, dimension, mix of smooth and textured surfaces, focus on negative space and clean lines, focus", + "negative_prompt": "photo, distorted. sketch." + } + }, + { + "name": "Product Rendering", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt} high quality product photography, 3d rendering with key lighting, shallow depth of field, simple plain background, studio lighting.", + "negative_prompt": "blurry, sketch, messy, dirty. unfinished." + } + }, + { + "name": "Sketch", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt} black and white pencil drawing, off-center composition, cross-hatching for shadows, bold strokes, textured paper. sketch+++", + "negative_prompt": "blurry, photo, painting, color. messy, dirty. unfinished. frame, borders." + } + }, + { + "name": "Line Art", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt} Line art. bold outline. simplistic. white background. 2d", + "negative_prompt": "photo. digital art. greyscale. solid black. painting" + } + }, + { + "name": "Anime", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt} anime++, bold outline, cel-shaded coloring, shounen, seinen", + "negative_prompt": "(photo)+++. greyscale. solid black. painting" + } + }, + { + "name": "Illustration", + "type": "default", + "preset_data": { + "positive_prompt": "{prompt} illustration, bold linework, illustrative details, vector art style, flat coloring", + "negative_prompt": "(photo)+++. greyscale. painting, black and white." + } + }, + { + "name": "Vehicles", + "type": "default", + "preset_data": { + "positive_prompt": "A weird futuristic normal auto, {prompt} elegant design, nice color, nice wheels", + "negative_prompt": "sketch. digital art. greyscale. painting" + } + } +] diff --git a/invokeai/app/services/style_preset_records/style_preset_records_base.py b/invokeai/app/services/style_preset_records/style_preset_records_base.py new file mode 100644 index 00000000000..a4dee2fbbd6 --- /dev/null +++ b/invokeai/app/services/style_preset_records/style_preset_records_base.py @@ -0,0 +1,42 @@ +from abc import ABC, abstractmethod + +from invokeai.app.services.style_preset_records.style_preset_records_common import ( + PresetType, + StylePresetChanges, + StylePresetRecordDTO, + StylePresetWithoutId, +) + + +class StylePresetRecordsStorageBase(ABC): + """Base class for style preset storage services.""" + + @abstractmethod + def get(self, style_preset_id: str) -> StylePresetRecordDTO: + """Get style preset by id.""" + pass + + @abstractmethod + def create(self, style_preset: StylePresetWithoutId) -> StylePresetRecordDTO: + """Creates a style preset.""" + pass + + @abstractmethod + def create_many(self, style_presets: list[StylePresetWithoutId]) -> None: + """Creates many style presets.""" + pass + + @abstractmethod + def update(self, style_preset_id: str, changes: StylePresetChanges) -> StylePresetRecordDTO: + """Updates a style preset.""" + pass + + @abstractmethod + def delete(self, style_preset_id: str) -> None: + """Deletes a style preset.""" + pass + + @abstractmethod + def get_many(self, type: PresetType | None = None) -> list[StylePresetRecordDTO]: + """Gets many workflows.""" + pass diff --git a/invokeai/app/services/style_preset_records/style_preset_records_common.py b/invokeai/app/services/style_preset_records/style_preset_records_common.py new file mode 100644 index 00000000000..36153d002d0 --- /dev/null +++ b/invokeai/app/services/style_preset_records/style_preset_records_common.py @@ -0,0 +1,139 @@ +import codecs +import csv +import json +from enum import Enum +from typing import Any, Optional + +import pydantic +from fastapi import UploadFile +from pydantic import AliasChoices, BaseModel, ConfigDict, Field, TypeAdapter + +from invokeai.app.util.metaenum import MetaEnum + + +class StylePresetNotFoundError(Exception): + """Raised when a style preset is not found""" + + +class PresetData(BaseModel, extra="forbid"): + positive_prompt: str = Field(description="Positive prompt") + negative_prompt: str = Field(description="Negative prompt") + + +PresetDataValidator = TypeAdapter(PresetData) + + +class PresetType(str, Enum, metaclass=MetaEnum): + User = "user" + Default = "default" + Project = "project" + + +class StylePresetChanges(BaseModel, extra="forbid"): + name: Optional[str] = Field(default=None, description="The style preset's new name.") + preset_data: Optional[PresetData] = Field(default=None, description="The updated data for style preset.") + type: Optional[PresetType] = Field(description="The updated type of the style preset") + + +class StylePresetWithoutId(BaseModel): + name: str = Field(description="The name of the style preset.") + preset_data: PresetData = Field(description="The preset data") + type: PresetType = Field(description="The type of style preset") + + +class StylePresetRecordDTO(StylePresetWithoutId): + id: str = Field(description="The style preset ID.") + + @classmethod + def from_dict(cls, data: dict[str, Any]) -> "StylePresetRecordDTO": + data["preset_data"] = PresetDataValidator.validate_json(data.get("preset_data", "")) + return StylePresetRecordDTOValidator.validate_python(data) + + +StylePresetRecordDTOValidator = TypeAdapter(StylePresetRecordDTO) + + +class StylePresetRecordWithImage(StylePresetRecordDTO): + image: Optional[str] = Field(description="The path for image") + + +class StylePresetImportRow(BaseModel): + name: str = Field(min_length=1, description="The name of the preset.") + positive_prompt: str = Field( + default="", + description="The positive prompt for the preset.", + validation_alias=AliasChoices("positive_prompt", "prompt"), + ) + negative_prompt: str = Field(default="", description="The negative prompt for the preset.") + + model_config = ConfigDict(str_strip_whitespace=True, extra="forbid") + + +StylePresetImportList = list[StylePresetImportRow] +StylePresetImportListTypeAdapter = TypeAdapter(StylePresetImportList) + + +class UnsupportedFileTypeError(ValueError): + """Raised when an unsupported file type is encountered""" + + pass + + +class InvalidPresetImportDataError(ValueError): + """Raised when invalid preset import data is encountered""" + + pass + + +async def parse_presets_from_file(file: UploadFile) -> list[StylePresetWithoutId]: + """Parses style presets from a file. The file must be a CSV or JSON file. + + If CSV, the file must have the following columns: + - name + - prompt (or positive_prompt) + - negative_prompt + + If JSON, the file must be a list of objects with the following keys: + - name + - prompt (or positive_prompt) + - negative_prompt + + Args: + file (UploadFile): The file to parse. + + Returns: + list[StylePresetWithoutId]: The parsed style presets. + + Raises: + UnsupportedFileTypeError: If the file type is not supported. + InvalidPresetImportDataError: If the data in the file is invalid. + """ + if file.content_type not in ["text/csv", "application/json"]: + raise UnsupportedFileTypeError() + + if file.content_type == "text/csv": + csv_reader = csv.DictReader(codecs.iterdecode(file.file, "utf-8")) + data = list(csv_reader) + else: # file.content_type == "application/json": + json_data = await file.read() + data = json.loads(json_data) + + try: + imported_presets = StylePresetImportListTypeAdapter.validate_python(data) + + style_presets: list[StylePresetWithoutId] = [] + + for imported in imported_presets: + preset_data = PresetData(positive_prompt=imported.positive_prompt, negative_prompt=imported.negative_prompt) + style_preset = StylePresetWithoutId(name=imported.name, preset_data=preset_data, type=PresetType.User) + style_presets.append(style_preset) + except pydantic.ValidationError as e: + if file.content_type == "text/csv": + msg = "Invalid CSV format: must include columns 'name', 'prompt', and 'negative_prompt' and name cannot be blank" + else: # file.content_type == "application/json": + msg = "Invalid JSON format: must be a list of objects with keys 'name', 'prompt', and 'negative_prompt' and name cannot be blank" + raise InvalidPresetImportDataError(msg) from e + finally: + file.file.close() + + return style_presets diff --git a/invokeai/app/services/style_preset_records/style_preset_records_sqlite.py b/invokeai/app/services/style_preset_records/style_preset_records_sqlite.py new file mode 100644 index 00000000000..657d73b3bda --- /dev/null +++ b/invokeai/app/services/style_preset_records/style_preset_records_sqlite.py @@ -0,0 +1,215 @@ +import json +from pathlib import Path + +from invokeai.app.services.invoker import Invoker +from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase +from invokeai.app.services.style_preset_records.style_preset_records_base import StylePresetRecordsStorageBase +from invokeai.app.services.style_preset_records.style_preset_records_common import ( + PresetType, + StylePresetChanges, + StylePresetNotFoundError, + StylePresetRecordDTO, + StylePresetWithoutId, +) +from invokeai.app.util.misc import uuid_string + + +class SqliteStylePresetRecordsStorage(StylePresetRecordsStorageBase): + def __init__(self, db: SqliteDatabase) -> None: + super().__init__() + self._lock = db.lock + self._conn = db.conn + self._cursor = self._conn.cursor() + + def start(self, invoker: Invoker) -> None: + self._invoker = invoker + self._sync_default_style_presets() + + def get(self, style_preset_id: str) -> StylePresetRecordDTO: + """Gets a style preset by ID.""" + try: + self._lock.acquire() + self._cursor.execute( + """--sql + SELECT * + FROM style_presets + WHERE id = ?; + """, + (style_preset_id,), + ) + row = self._cursor.fetchone() + if row is None: + raise StylePresetNotFoundError(f"Style preset with id {style_preset_id} not found") + return StylePresetRecordDTO.from_dict(dict(row)) + except Exception: + self._conn.rollback() + raise + finally: + self._lock.release() + + def create(self, style_preset: StylePresetWithoutId) -> StylePresetRecordDTO: + style_preset_id = uuid_string() + try: + self._lock.acquire() + self._cursor.execute( + """--sql + INSERT OR IGNORE INTO style_presets ( + id, + name, + preset_data, + type + ) + VALUES (?, ?, ?, ?); + """, + ( + style_preset_id, + style_preset.name, + style_preset.preset_data.model_dump_json(), + style_preset.type, + ), + ) + self._conn.commit() + except Exception: + self._conn.rollback() + raise + finally: + self._lock.release() + return self.get(style_preset_id) + + def create_many(self, style_presets: list[StylePresetWithoutId]) -> None: + style_preset_ids = [] + try: + self._lock.acquire() + for style_preset in style_presets: + style_preset_id = uuid_string() + style_preset_ids.append(style_preset_id) + self._cursor.execute( + """--sql + INSERT OR IGNORE INTO style_presets ( + id, + name, + preset_data, + type + ) + VALUES (?, ?, ?, ?); + """, + ( + style_preset_id, + style_preset.name, + style_preset.preset_data.model_dump_json(), + style_preset.type, + ), + ) + self._conn.commit() + except Exception: + self._conn.rollback() + raise + finally: + self._lock.release() + + return None + + def update(self, style_preset_id: str, changes: StylePresetChanges) -> StylePresetRecordDTO: + try: + self._lock.acquire() + # Change the name of a style preset + if changes.name is not None: + self._cursor.execute( + """--sql + UPDATE style_presets + SET name = ? + WHERE id = ?; + """, + (changes.name, style_preset_id), + ) + + # Change the preset data for a style preset + if changes.preset_data is not None: + self._cursor.execute( + """--sql + UPDATE style_presets + SET preset_data = ? + WHERE id = ?; + """, + (changes.preset_data.model_dump_json(), style_preset_id), + ) + + self._conn.commit() + except Exception: + self._conn.rollback() + raise + finally: + self._lock.release() + return self.get(style_preset_id) + + def delete(self, style_preset_id: str) -> None: + try: + self._lock.acquire() + self._cursor.execute( + """--sql + DELETE from style_presets + WHERE id = ?; + """, + (style_preset_id,), + ) + self._conn.commit() + except Exception: + self._conn.rollback() + raise + finally: + self._lock.release() + return None + + def get_many(self, type: PresetType | None = None) -> list[StylePresetRecordDTO]: + try: + self._lock.acquire() + main_query = """ + SELECT + * + FROM style_presets + """ + + if type is not None: + main_query += "WHERE type = ? " + + main_query += "ORDER BY LOWER(name) ASC" + + if type is not None: + self._cursor.execute(main_query, (type,)) + else: + self._cursor.execute(main_query) + + rows = self._cursor.fetchall() + style_presets = [StylePresetRecordDTO.from_dict(dict(row)) for row in rows] + + return style_presets + except Exception: + self._conn.rollback() + raise + finally: + self._lock.release() + + def _sync_default_style_presets(self) -> None: + """Syncs default style presets to the database. Internal use only.""" + + # First delete all existing default style presets + try: + self._lock.acquire() + self._cursor.execute( + """--sql + DELETE FROM style_presets + WHERE type = "default"; + """ + ) + self._conn.commit() + except Exception: + self._conn.rollback() + raise + finally: + self._lock.release() + # Next, parse and create the default style presets + with self._lock, open(Path(__file__).parent / Path("default_style_presets.json"), "r") as file: + presets = json.load(file) + for preset in presets: + style_preset = StylePresetWithoutId.model_validate(preset) + self.create(style_preset) diff --git a/invokeai/app/services/urls/urls_base.py b/invokeai/app/services/urls/urls_base.py index 477ef046240..b2e41db3e4e 100644 --- a/invokeai/app/services/urls/urls_base.py +++ b/invokeai/app/services/urls/urls_base.py @@ -13,3 +13,8 @@ def get_image_url(self, image_name: str, thumbnail: bool = False) -> str: def get_model_image_url(self, model_key: str) -> str: """Gets the URL for a model image""" pass + + @abstractmethod + def get_style_preset_image_url(self, style_preset_id: str) -> str: + """Gets the URL for a style preset image""" + pass diff --git a/invokeai/app/services/urls/urls_default.py b/invokeai/app/services/urls/urls_default.py index d570521fb8f..f62bebe9013 100644 --- a/invokeai/app/services/urls/urls_default.py +++ b/invokeai/app/services/urls/urls_default.py @@ -19,3 +19,6 @@ def get_image_url(self, image_name: str, thumbnail: bool = False) -> str: def get_model_image_url(self, model_key: str) -> str: return f"{self._base_url_v2}/models/i/{model_key}/image" + + def get_style_preset_image_url(self, style_preset_id: str) -> str: + return f"{self._base_url}/style_presets/i/{style_preset_id}/image" diff --git a/invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SD1.5.json b/invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SD1.5.json new file mode 100644 index 00000000000..7bc2810c75b --- /dev/null +++ b/invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SD1.5.json @@ -0,0 +1,1430 @@ +{ + "name": "MultiDiffusion SD1.5", + "author": "Invoke", + "description": "A workflow to upscale an input image with tiled upscaling, using SD1.5 based models.", + "version": "1.0.0", + "contact": "invoke@invoke.ai", + "tags": "tiled, upscaling, sdxl", + "notes": "", + "exposedFields": [ + { + "nodeId": "011039f6-04cf-4607-8eb1-3304eb819c8c", + "fieldName": "image" + }, + { + "nodeId": "011039f6-04cf-4607-8eb1-3304eb819c8c", + "fieldName": "scale" + }, + { + "nodeId": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "fieldName": "board" + }, + { + "nodeId": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "fieldName": "a" + }, + { + "nodeId": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "fieldName": "a" + }, + { + "nodeId": "14469dfe-9f49-4a13-89a7-eb4d45794b2b", + "fieldName": "prompt" + }, + { + "nodeId": "33fe76a0-5efd-4482-a7f0-e2abf1223dc2", + "fieldName": "prompt" + }, + { + "nodeId": "009b38e3-4e17-4ac5-958c-14891991ae28", + "fieldName": "model" + }, + { + "nodeId": "011039f6-04cf-4607-8eb1-3304eb819c8c", + "fieldName": "image_to_image_model" + }, + { + "nodeId": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "fieldName": "model" + } + ], + "meta": { + "version": "3.0.0", + "category": "default" + }, + "id": "e5b5fb01-8906-463a-963a-402dbc42f79b", + "nodes": [ + { + "id": "33fe76a0-5efd-4482-a7f0-e2abf1223dc2", + "type": "invocation", + "data": { + "id": "33fe76a0-5efd-4482-a7f0-e2abf1223dc2", + "type": "compel", + "version": "1.2.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "prompt": { + "name": "prompt", + "label": "Negative Prompt (Optional)", + "value": "blurry painting, art, sketch" + }, + "clip": { + "name": "clip", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + } + }, + "position": { + "x": -3550, + "y": -2725 + } + }, + { + "id": "14469dfe-9f49-4a13-89a7-eb4d45794b2b", + "type": "invocation", + "data": { + "id": "14469dfe-9f49-4a13-89a7-eb4d45794b2b", + "type": "compel", + "version": "1.2.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "prompt": { + "name": "prompt", + "label": "Positive Prompt (Optional)", + "value": "high quality studio lighting, photo" + }, + "clip": { + "name": "clip", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + } + }, + "position": { + "x": -3550, + "y": -3025 + } + }, + { + "id": "009b38e3-4e17-4ac5-958c-14891991ae28", + "type": "invocation", + "data": { + "id": "009b38e3-4e17-4ac5-958c-14891991ae28", + "type": "main_model_loader", + "version": "1.0.3", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "model": { + "name": "model", + "label": "", + "value": { + "key": "e7b402e5-62e5-4acb-8c39-bee6bdb758ab", + "hash": "c8659e796168d076368256b57edbc1b48d6dafc1712f1bb37cc57c7c06889a6b", + "name": "526mix", + "base": "sd-1", + "type": "main" + } + } + } + }, + "position": { + "x": -4025, + "y": -3050 + } + }, + { + "id": "71a116e1-c631-48b3-923d-acea4753b887", + "type": "invocation", + "data": { + "id": "71a116e1-c631-48b3-923d-acea4753b887", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 0.3 + } + } + }, + "position": { + "x": -3050, + "y": -1550 + } + }, + { + "id": "00e2c587-f047-4413-ad15-bd31ea53ce22", + "type": "invocation", + "data": { + "id": "00e2c587-f047-4413-ad15-bd31ea53ce22", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 0.025 + } + } + }, + "position": { + "x": -3050, + "y": -1575 + } + }, + { + "id": "96e1bcd0-326b-4b67-8b14-239da2440aec", + "type": "invocation", + "data": { + "id": "96e1bcd0-326b-4b67-8b14-239da2440aec", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 0.45 + } + } + }, + "position": { + "x": -3050, + "y": -1200 + } + }, + { + "id": "75a89685-0f82-40ed-9b88-e583673be9fc", + "type": "invocation", + "data": { + "id": "75a89685-0f82-40ed-9b88-e583673be9fc", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 0.15 + } + } + }, + "position": { + "x": -3050, + "y": -1225 + } + }, + { + "id": "1ed88043-3519-41d5-a895-07944f03de70", + "type": "invocation", + "data": { + "id": "1ed88043-3519-41d5-a895-07944f03de70", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 0.3 + } + } + }, + "position": { + "x": -3050, + "y": -1650 + } + }, + { + "id": "9b281506-4079-4a3d-ab40-b386156fcd21", + "type": "invocation", + "data": { + "id": "9b281506-4079-4a3d-ab40-b386156fcd21", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 0.032 + } + } + }, + "position": { + "x": -3050, + "y": -1850 + } + }, + { + "id": "011039f6-04cf-4607-8eb1-3304eb819c8c", + "type": "invocation", + "data": { + "id": "011039f6-04cf-4607-8eb1-3304eb819c8c", + "type": "spandrel_image_to_image_autoscale", + "version": "1.0.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "Image to Upscale", + "value": { + "image_name": "ee7009f7-a35d-488b-a2a6-21237ef5ae05.png" + } + }, + "image_to_image_model": { + "name": "image_to_image_model", + "label": "", + "value": { + "key": "38bb1a29-8ede-42ba-b77f-64b3478896eb", + "hash": "blake3:e52fdbee46a484ebe9b3b20ea0aac0a35a453ab6d0d353da00acfd35ce7a91ed", + "name": "4xNomosWebPhoto_esrgan", + "base": "sdxl", + "type": "spandrel_image_to_image" + } + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 512 + }, + "scale": { + "name": "scale", + "label": "Scale (2x, 4x, 8x, 16x)", + "value": 2 + }, + "fit_to_multiple_of_8": { + "name": "fit_to_multiple_of_8", + "label": "", + "value": true + } + } + }, + "position": { + "x": -4750, + "y": -2125 + } + }, + { + "id": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "type": "invocation", + "data": { + "id": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "type": "model_identifier", + "version": "1.0.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "model": { + "name": "model", + "label": "ControlNet Model - Choose a Tile ControlNet", + "value": { + "key": "20645e4d-ef97-4c5a-9243-b834a3483925", + "hash": "f0812e13758f91baf4e54b7dbb707b70642937d3b2098cd2b94cc36d3eba308e", + "name": "tile", + "base": "sd-1", + "type": "controlnet" + } + } + } + }, + "position": { + "x": -3450, + "y": -1450 + } + }, + { + "id": "00239057-20d4-4cd2-a010-28727b256ea2", + "type": "invocation", + "data": { + "id": "00239057-20d4-4cd2-a010-28727b256ea2", + "type": "rand_int", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": false, + "inputs": { + "low": { + "name": "low", + "label": "", + "value": 0 + }, + "high": { + "name": "high", + "label": "", + "value": 2147483647 + } + } + }, + "position": { + "x": -4025, + "y": -2075 + } + }, + { + "id": "094bc4ed-5c68-4342-84f4-51056c755796", + "type": "invocation", + "data": { + "id": "094bc4ed-5c68-4342-84f4-51056c755796", + "type": "boolean", + "version": "1.0.1", + "label": "Tiled Option", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "value": { + "name": "value", + "label": "Tiled VAE (Saves VRAM, Color Inconsistency)", + "value": true + } + } + }, + "position": { + "x": -2675, + "y": -2475 + } + }, + { + "id": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "type": "invocation", + "data": { + "id": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "type": "float_math", + "version": "1.0.1", + "label": "Creativity Input", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "Creativity Control (-10 to 10)", + "value": 0 + }, + "b": { + "name": "b", + "label": "", + "value": -1 + } + } + }, + "position": { + "x": -3500, + "y": -2350 + } + }, + { + "id": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "type": "invocation", + "data": { + "id": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "DIV" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 100 + } + } + }, + "position": { + "x": -3500, + "y": -1975 + } + }, + { + "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "type": "invocation", + "data": { + "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "A", + "value": 0 + }, + "b": { + "name": "b", + "label": "", + "value": 10 + } + } + }, + "position": { + "x": -3500, + "y": -2075 + } + }, + { + "id": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "type": "invocation", + "data": { + "id": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 4.99 + } + } + }, + "position": { + "x": -3500, + "y": -2025 + } + }, + { + "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "type": "invocation", + "data": { + "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "type": "float_math", + "version": "1.0.1", + "label": "Structural Input", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "Structural Control (-10 to 10)", + "value": 0 + }, + "b": { + "name": "b", + "label": "", + "value": 10 + } + } + }, + "position": { + "x": -3050, + "y": -2100 + } + }, + { + "id": "6636a27a-f130-4a13-b3e5-50b44e4a566f", + "type": "invocation", + "data": { + "id": "6636a27a-f130-4a13-b3e5-50b44e4a566f", + "type": "collect", + "version": "1.0.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "item": { + "name": "item", + "label": "" + } + } + }, + "position": { + "x": -2275, + "y": -2075 + } + }, + { + "id": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "type": "invocation", + "data": { + "id": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "type": "controlnet", + "version": "1.1.2", + "label": "Initial Control (Use Tile)", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "control_model": { + "name": "control_model", + "label": "" + }, + "control_weight": { + "name": "control_weight", + "label": "", + "value": 0.6 + }, + "begin_step_percent": { + "name": "begin_step_percent", + "label": "", + "value": 0 + }, + "end_step_percent": { + "name": "end_step_percent", + "label": "", + "value": 0.5 + }, + "control_mode": { + "name": "control_mode", + "label": "", + "value": "balanced" + }, + "resize_mode": { + "name": "resize_mode", + "label": "", + "value": "just_resize" + } + } + }, + "position": { + "x": -2675, + "y": -1775 + } + }, + { + "id": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "type": "invocation", + "data": { + "id": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "type": "unsharp_mask", + "version": "1.2.2", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "" + }, + "radius": { + "name": "radius", + "label": "", + "value": 2 + }, + "strength": { + "name": "strength", + "label": "", + "value": 50 + } + } + }, + "position": { + "x": -4400, + "y": -2125 + } + }, + { + "id": "117f982a-03da-49b1-bf9f-29711160ac02", + "type": "invocation", + "data": { + "id": "117f982a-03da-49b1-bf9f-29711160ac02", + "type": "i2l", + "version": "1.1.0", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": false + } + } + }, + "position": { + "x": -4025, + "y": -2125 + } + }, + { + "id": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "type": "invocation", + "data": { + "id": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "type": "l2i", + "version": "1.3.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": false, + "useCache": true, + "inputs": { + "board": { + "name": "board", + "label": "Output Board" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "latents": { + "name": "latents", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": false + } + } + }, + "position": { + "x": -2675, + "y": -2825 + } + }, + { + "id": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "type": "invocation", + "data": { + "id": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "type": "tiled_multi_diffusion_denoise_latents", + "version": "1.0.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "positive_conditioning": { + "name": "positive_conditioning", + "label": "" + }, + "negative_conditioning": { + "name": "negative_conditioning", + "label": "" + }, + "noise": { + "name": "noise", + "label": "" + }, + "latents": { + "name": "latents", + "label": "" + }, + "tile_height": { + "name": "tile_height", + "label": "", + "value": 768 + }, + "tile_width": { + "name": "tile_width", + "label": "", + "value": 768 + }, + "tile_overlap": { + "name": "tile_overlap", + "label": "", + "value": 128 + }, + "steps": { + "name": "steps", + "label": "", + "value": 25 + }, + "cfg_scale": { + "name": "cfg_scale", + "label": "", + "value": 5 + }, + "denoising_start": { + "name": "denoising_start", + "label": "", + "value": 0.6 + }, + "denoising_end": { + "name": "denoising_end", + "label": "", + "value": 1 + }, + "scheduler": { + "name": "scheduler", + "label": "", + "value": "kdpm_2" + }, + "unet": { + "name": "unet", + "label": "" + }, + "cfg_rescale_multiplier": { + "name": "cfg_rescale_multiplier", + "label": "", + "value": 0 + }, + "control": { + "name": "control", + "label": "" + } + } + }, + "position": { + "x": -3050, + "y": -2825 + } + }, + { + "id": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "type": "invocation", + "data": { + "id": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "type": "controlnet", + "version": "1.1.2", + "label": "Second Phase Control (Use Tile)", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "control_model": { + "name": "control_model", + "label": "" + }, + "control_weight": { + "name": "control_weight", + "label": "", + "value": 0.25 + }, + "begin_step_percent": { + "name": "begin_step_percent", + "label": "", + "value": 0.5 + }, + "end_step_percent": { + "name": "end_step_percent", + "label": "", + "value": 0.85 + }, + "control_mode": { + "name": "control_mode", + "label": "Control Mode", + "value": "balanced" + }, + "resize_mode": { + "name": "resize_mode", + "label": "", + "value": "just_resize" + } + } + }, + "position": { + "x": -2675, + "y": -1325 + } + }, + { + "id": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "type": "invocation", + "data": { + "id": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "type": "noise", + "version": "1.0.2", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "seed": { + "name": "seed", + "label": "", + "value": 3 + }, + "width": { + "name": "width", + "label": "", + "value": 512 + }, + "height": { + "name": "height", + "label": "", + "value": 512 + }, + "use_cpu": { + "name": "use_cpu", + "label": "", + "value": true + } + } + }, + "position": { + "x": -4025, + "y": -2025 + } + } + ], + "edges": [ + { + "id": "reactflow__edge-009b38e3-4e17-4ac5-958c-14891991ae28vae-117f982a-03da-49b1-bf9f-29711160ac02vae", + "type": "default", + "source": "009b38e3-4e17-4ac5-958c-14891991ae28", + "target": "117f982a-03da-49b1-bf9f-29711160ac02", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-009b38e3-4e17-4ac5-958c-14891991ae28vae-c3b60a50-8039-4924-90e3-8c608e1fecb5vae", + "type": "default", + "source": "009b38e3-4e17-4ac5-958c-14891991ae28", + "target": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-33fe76a0-5efd-4482-a7f0-e2abf1223dc2conditioning-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7anegative_conditioning", + "type": "default", + "source": "33fe76a0-5efd-4482-a7f0-e2abf1223dc2", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-009b38e3-4e17-4ac5-958c-14891991ae28clip-33fe76a0-5efd-4482-a7f0-e2abf1223dc2clip", + "type": "default", + "source": "009b38e3-4e17-4ac5-958c-14891991ae28", + "target": "33fe76a0-5efd-4482-a7f0-e2abf1223dc2", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-14469dfe-9f49-4a13-89a7-eb4d45794b2bconditioning-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7apositive_conditioning", + "type": "default", + "source": "14469dfe-9f49-4a13-89a7-eb4d45794b2b", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-009b38e3-4e17-4ac5-958c-14891991ae28clip-14469dfe-9f49-4a13-89a7-eb4d45794b2bclip", + "type": "default", + "source": "009b38e3-4e17-4ac5-958c-14891991ae28", + "target": "14469dfe-9f49-4a13-89a7-eb4d45794b2b", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-009b38e3-4e17-4ac5-958c-14891991ae28unet-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7aunet", + "type": "default", + "source": "009b38e3-4e17-4ac5-958c-14891991ae28", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "9b281506-4079-4a3d-ab40-b386156fcd21-75a89685-0f82-40ed-9b88-e583673be9fc-collapsed", + "type": "collapsed", + "source": "9b281506-4079-4a3d-ab40-b386156fcd21", + "target": "75a89685-0f82-40ed-9b88-e583673be9fc" + }, + { + "id": "9b281506-4079-4a3d-ab40-b386156fcd21-1ed88043-3519-41d5-a895-07944f03de70-collapsed", + "type": "collapsed", + "source": "9b281506-4079-4a3d-ab40-b386156fcd21", + "target": "1ed88043-3519-41d5-a895-07944f03de70" + }, + { + "id": "49a8cc12-aa19-48c5-b6b3-04e0b603b384-c8f5c671-8c87-4d96-a75e-a9937ac6bc03-collapsed", + "type": "collapsed", + "source": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "target": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03" + }, + { + "id": "reactflow__edge-c8f5c671-8c87-4d96-a75e-a9937ac6bc03value-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7adenoising_start", + "type": "default", + "source": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "value", + "targetHandle": "denoising_start" + }, + { + "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c-49a8cc12-aa19-48c5-b6b3-04e0b603b384-collapsed", + "type": "collapsed", + "source": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "target": "49a8cc12-aa19-48c5-b6b3-04e0b603b384" + }, + { + "id": "75a89685-0f82-40ed-9b88-e583673be9fc-96e1bcd0-326b-4b67-8b14-239da2440aec-collapsed", + "type": "collapsed", + "source": "75a89685-0f82-40ed-9b88-e583673be9fc", + "target": "96e1bcd0-326b-4b67-8b14-239da2440aec" + }, + { + "id": "00e2c587-f047-4413-ad15-bd31ea53ce22-71a116e1-c631-48b3-923d-acea4753b887-collapsed", + "type": "collapsed", + "source": "00e2c587-f047-4413-ad15-bd31ea53ce22", + "target": "71a116e1-c631-48b3-923d-acea4753b887" + }, + { + "id": "reactflow__edge-71a116e1-c631-48b3-923d-acea4753b887value-be4082d6-e238-40ea-a9df-fc0d725e8895begin_step_percent", + "type": "default", + "source": "71a116e1-c631-48b3-923d-acea4753b887", + "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "sourceHandle": "value", + "targetHandle": "begin_step_percent" + }, + { + "id": "reactflow__edge-71a116e1-c631-48b3-923d-acea4753b887value-b78f53b6-2eae-4956-97b4-7e73768d1491end_step_percent", + "type": "default", + "source": "71a116e1-c631-48b3-923d-acea4753b887", + "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "sourceHandle": "value", + "targetHandle": "end_step_percent" + }, + { + "id": "reactflow__edge-00e2c587-f047-4413-ad15-bd31ea53ce22value-71a116e1-c631-48b3-923d-acea4753b887a", + "type": "default", + "source": "00e2c587-f047-4413-ad15-bd31ea53ce22", + "target": "71a116e1-c631-48b3-923d-acea4753b887", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true + }, + { + "id": "reactflow__edge-bd094e2f-41e5-4b61-9f7b-56cf337d53favalue-00e2c587-f047-4413-ad15-bd31ea53ce22a", + "type": "default", + "source": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "target": "00e2c587-f047-4413-ad15-bd31ea53ce22", + "sourceHandle": "value", + "targetHandle": "a" + }, + { + "id": "reactflow__edge-96e1bcd0-326b-4b67-8b14-239da2440aecvalue-be4082d6-e238-40ea-a9df-fc0d725e8895control_weight", + "type": "default", + "source": "96e1bcd0-326b-4b67-8b14-239da2440aec", + "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "sourceHandle": "value", + "targetHandle": "control_weight" + }, + { + "id": "reactflow__edge-75a89685-0f82-40ed-9b88-e583673be9fcvalue-96e1bcd0-326b-4b67-8b14-239da2440aeca", + "type": "default", + "source": "75a89685-0f82-40ed-9b88-e583673be9fc", + "target": "96e1bcd0-326b-4b67-8b14-239da2440aec", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true + }, + { + "id": "reactflow__edge-9b281506-4079-4a3d-ab40-b386156fcd21value-75a89685-0f82-40ed-9b88-e583673be9fca", + "type": "default", + "source": "9b281506-4079-4a3d-ab40-b386156fcd21", + "target": "75a89685-0f82-40ed-9b88-e583673be9fc", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true + }, + { + "id": "reactflow__edge-1ed88043-3519-41d5-a895-07944f03de70value-b78f53b6-2eae-4956-97b4-7e73768d1491control_weight", + "type": "default", + "source": "1ed88043-3519-41d5-a895-07944f03de70", + "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "sourceHandle": "value", + "targetHandle": "control_weight" + }, + { + "id": "reactflow__edge-9b281506-4079-4a3d-ab40-b386156fcd21value-1ed88043-3519-41d5-a895-07944f03de70a", + "type": "default", + "source": "9b281506-4079-4a3d-ab40-b386156fcd21", + "target": "1ed88043-3519-41d5-a895-07944f03de70", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true + }, + { + "id": "reactflow__edge-bd094e2f-41e5-4b61-9f7b-56cf337d53favalue-9b281506-4079-4a3d-ab40-b386156fcd21a", + "type": "default", + "source": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "target": "9b281506-4079-4a3d-ab40-b386156fcd21", + "sourceHandle": "value", + "targetHandle": "a" + }, + { + "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeheight-8923451b-5a27-4395-b7f2-dce875fca6f5height", + "type": "default", + "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebewidth-8923451b-5a27-4395-b7f2-dce875fca6f5width", + "type": "default", + "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage-b78f53b6-2eae-4956-97b4-7e73768d1491image", + "type": "default", + "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage-be4082d6-e238-40ea-a9df-fc0d725e8895image", + "type": "default", + "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage-117f982a-03da-49b1-bf9f-29711160ac02image", + "type": "default", + "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "target": "117f982a-03da-49b1-bf9f-29711160ac02", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-011039f6-04cf-4607-8eb1-3304eb819c8cimage-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage", + "type": "default", + "source": "011039f6-04cf-4607-8eb1-3304eb819c8c", + "target": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-f936ebb3-6902-4df9-a775-6a68bac2da70model-be4082d6-e238-40ea-a9df-fc0d725e8895control_model", + "type": "default", + "source": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "sourceHandle": "model", + "targetHandle": "control_model" + }, + { + "id": "reactflow__edge-f936ebb3-6902-4df9-a775-6a68bac2da70model-b78f53b6-2eae-4956-97b4-7e73768d1491control_model", + "type": "default", + "source": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "sourceHandle": "model", + "targetHandle": "control_model" + }, + { + "id": "reactflow__edge-00239057-20d4-4cd2-a010-28727b256ea2value-8923451b-5a27-4395-b7f2-dce875fca6f5seed", + "type": "default", + "source": "00239057-20d4-4cd2-a010-28727b256ea2", + "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "sourceHandle": "value", + "targetHandle": "seed" + }, + { + "id": "reactflow__edge-094bc4ed-5c68-4342-84f4-51056c755796value-c3b60a50-8039-4924-90e3-8c608e1fecb5tiled", + "type": "default", + "source": "094bc4ed-5c68-4342-84f4-51056c755796", + "target": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "sourceHandle": "value", + "targetHandle": "tiled" + }, + { + "id": "reactflow__edge-094bc4ed-5c68-4342-84f4-51056c755796value-117f982a-03da-49b1-bf9f-29711160ac02tiled", + "type": "default", + "source": "094bc4ed-5c68-4342-84f4-51056c755796", + "target": "117f982a-03da-49b1-bf9f-29711160ac02", + "sourceHandle": "value", + "targetHandle": "tiled" + }, + { + "id": "reactflow__edge-1dd915a3-6756-48ed-b68b-ee3b4bd06c1dvalue-14e65dbe-4249-4b25-9a63-3a10cfaeb61ca", + "type": "default", + "source": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "target": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "sourceHandle": "value", + "targetHandle": "a" + }, + { + "id": "reactflow__edge-49a8cc12-aa19-48c5-b6b3-04e0b603b384value-c8f5c671-8c87-4d96-a75e-a9937ac6bc03a", + "type": "default", + "source": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "target": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true + }, + { + "id": "reactflow__edge-14e65dbe-4249-4b25-9a63-3a10cfaeb61cvalue-49a8cc12-aa19-48c5-b6b3-04e0b603b384a", + "type": "default", + "source": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "target": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true + }, + { + "id": "reactflow__edge-6636a27a-f130-4a13-b3e5-50b44e4a566fcollection-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7acontrol", + "type": "default", + "source": "6636a27a-f130-4a13-b3e5-50b44e4a566f", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "collection", + "targetHandle": "control" + }, + { + "id": "reactflow__edge-b78f53b6-2eae-4956-97b4-7e73768d1491control-6636a27a-f130-4a13-b3e5-50b44e4a566fitem", + "type": "default", + "source": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "target": "6636a27a-f130-4a13-b3e5-50b44e4a566f", + "sourceHandle": "control", + "targetHandle": "item" + }, + { + "id": "reactflow__edge-be4082d6-e238-40ea-a9df-fc0d725e8895control-6636a27a-f130-4a13-b3e5-50b44e4a566fitem", + "type": "default", + "source": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "target": "6636a27a-f130-4a13-b3e5-50b44e4a566f", + "sourceHandle": "control", + "targetHandle": "item" + }, + { + "id": "reactflow__edge-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7alatents-c3b60a50-8039-4924-90e3-8c608e1fecb5latents", + "type": "default", + "source": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "target": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-117f982a-03da-49b1-bf9f-29711160ac02latents-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7alatents", + "type": "default", + "source": "117f982a-03da-49b1-bf9f-29711160ac02", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-8923451b-5a27-4395-b7f2-dce875fca6f5noise-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7anoise", + "type": "default", + "source": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "noise", + "targetHandle": "noise" + } + ] +} \ No newline at end of file diff --git a/invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SDXL (Beta).json b/invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SDXL.json similarity index 63% rename from invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SDXL (Beta).json rename to invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SDXL.json index b2842315c46..876ca6f8e6f 100644 --- a/invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SDXL (Beta).json +++ b/invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SDXL.json @@ -1,44 +1,32 @@ { - "name": "MultiDiffusion SDXL (Beta)", + "name": "MultiDiffusion SDXL", "author": "Invoke", "description": "A workflow to upscale an input image with tiled upscaling, using SDXL based models.", - "version": "1.0.0", + "version": "1.1.0", "contact": "invoke@invoke.ai", "tags": "tiled, upscaling, sdxl", "notes": "", "exposedFields": [ { - "nodeId": "1ba845a6-eb88-49a1-a490-5fe6754f3ec9", - "fieldName": "value" + "nodeId": "011039f6-04cf-4607-8eb1-3304eb819c8c", + "fieldName": "image" }, { - "nodeId": "c3b60a50-8039-4924-90e3-8c608e1fecb5", - "fieldName": "board" + "nodeId": "011039f6-04cf-4607-8eb1-3304eb819c8c", + "fieldName": "scale" }, { - "nodeId": "5ca87ace-edf9-49c7-a424-cd42416b86a7", - "fieldName": "image" + "nodeId": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "fieldName": "board" }, { "nodeId": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", "fieldName": "a" }, - { - "nodeId": "696de0e1-cdd2-42e8-abeb-57a926bc6df6", - "fieldName": "a" - }, { "nodeId": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", "fieldName": "a" }, - { - "nodeId": "e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fd", - "fieldName": "model" - }, - { - "nodeId": "f0cd0d2f-9614-43f7-9944-a75b8d5ccd65", - "fieldName": "model_name" - }, { "nodeId": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", "fieldName": "value" @@ -48,13 +36,17 @@ "fieldName": "value" }, { - "nodeId": "094bc4ed-5c68-4342-84f4-51056c755796", - "fieldName": "value" + "nodeId": "e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fd", + "fieldName": "model" }, { "nodeId": "100b3143-b3fb-4ff3-bb3c-8d4d3f89ae3a", "fieldName": "vae_model" }, + { + "nodeId": "011039f6-04cf-4607-8eb1-3304eb819c8c", + "fieldName": "image_to_image_model" + }, { "nodeId": "f936ebb3-6902-4df9-a775-6a68bac2da70", "fieldName": "model" @@ -64,148 +56,13 @@ "version": "3.0.0", "category": "default" }, + "id": "dd607062-9e1b-48b9-89ad-9762cdfbb8f4", "nodes": [ { - "id": "f936ebb3-6902-4df9-a775-6a68bac2da70", - "type": "invocation", - "data": { - "id": "f936ebb3-6902-4df9-a775-6a68bac2da70", - "type": "model_identifier", - "version": "1.0.0", - "label": "", - "notes": "", - "isOpen": true, - "isIntermediate": true, - "useCache": true, - "inputs": { - "model": { - "name": "model", - "label": "ControlNet Model - choose xinsir's tile ControlNet", - "value": { - "key": "845b6959-1657-4164-be33-fe0f63ad1752", - "hash": "random:3b602344599a53b4e4c80a2259362e122543e6f9e8e428be76ab910f9368704b", - "name": "controlnet-tile-sdxl-1.0", - "base": "sdxl", - "type": "controlnet" - } - } - } - }, - "position": { - "x": -3983.6167650620723, - "y": -1329.1431151846386 - } - }, - { - "id": "00239057-20d4-4cd2-a010-28727b256ea2", - "type": "invocation", - "data": { - "id": "00239057-20d4-4cd2-a010-28727b256ea2", - "type": "rand_int", - "version": "1.0.1", - "label": "", - "notes": "", - "isOpen": false, - "isIntermediate": true, - "useCache": false, - "inputs": { - "low": { - "name": "low", - "label": "", - "value": 0 - }, - "high": { - "name": "high", - "label": "", - "value": 2147483647 - } - } - }, - "position": { - "x": -4000, - "y": -1800 - } - }, - { - "id": "094bc4ed-5c68-4342-84f4-51056c755796", - "type": "invocation", - "data": { - "id": "094bc4ed-5c68-4342-84f4-51056c755796", - "type": "boolean", - "version": "1.0.1", - "label": "Tiled Option", - "notes": "", - "isOpen": true, - "isIntermediate": true, - "useCache": true, - "inputs": { - "value": { - "name": "value", - "label": "Tiled VAE (Saves VRAM, Color Inconsistency)", - "value": false - } - } - }, - "position": { - "x": -2746.0467136971292, - "y": -2219.070070545694 - } - }, - { - "id": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", - "type": "invocation", - "data": { - "id": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", - "type": "string", - "version": "1.0.1", - "label": "", - "notes": "", - "isOpen": true, - "isIntermediate": true, - "useCache": true, - "inputs": { - "value": { - "name": "value", - "label": "Negative Prompt (Optional)", - "value": "" - } - } - }, - "position": { - "x": -3525, - "y": -2525 - } - }, - { - "id": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", - "type": "invocation", - "data": { - "id": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", - "type": "string", - "version": "1.0.1", - "label": "", - "notes": "", - "isOpen": true, - "isIntermediate": true, - "useCache": true, - "inputs": { - "value": { - "name": "value", - "label": "Positive Prompt (Optional)", - "value": "" - } - } - }, - "position": { - "x": -3525, - "y": -2825 - } - }, - { - "id": "6daa9526-382b-491d-964f-f53fc308664f", + "id": "71a116e1-c631-48b3-923d-acea4753b887", "type": "invocation", "data": { - "id": "6daa9526-382b-491d-964f-f53fc308664f", + "id": "71a116e1-c631-48b3-923d-acea4753b887", "type": "float_math", "version": "1.0.1", "label": "", @@ -222,25 +79,25 @@ "a": { "name": "a", "label": "", - "value": 0.35 + "value": 1 }, "b": { "name": "b", "label": "", - "value": 100 + "value": 0.3 } } }, "position": { - "x": -3500, - "y": -1450 + "x": -3050, + "y": -1550 } }, { - "id": "f1afd295-860f-48b6-a76a-90609bf2cc11", + "id": "00e2c587-f047-4413-ad15-bd31ea53ce22", "type": "invocation", "data": { - "id": "f1afd295-860f-48b6-a76a-90609bf2cc11", + "id": "00e2c587-f047-4413-ad15-bd31ea53ce22", "type": "float_math", "version": "1.0.1", "label": "", @@ -262,20 +119,20 @@ "b": { "name": "b", "label": "", - "value": 0.013 + "value": 0.025 } } }, "position": { - "x": -3500, - "y": -1550 + "x": -3050, + "y": -1575 } }, { - "id": "88ae723e-4933-4371-b52d-3ada52a59d36", + "id": "96e1bcd0-326b-4b67-8b14-239da2440aec", "type": "invocation", "data": { - "id": "88ae723e-4933-4371-b52d-3ada52a59d36", + "id": "96e1bcd0-326b-4b67-8b14-239da2440aec", "type": "float_math", "version": "1.0.1", "label": "", @@ -287,33 +144,33 @@ "operation": { "name": "operation", "label": "", - "value": "ADD" + "value": "MUL" }, "a": { "name": "a", "label": "", - "value": 0 + "value": 1 }, "b": { "name": "b", "label": "", - "value": 100 + "value": 0.45 } } }, "position": { - "x": -3500, - "y": -1500 + "x": -3050, + "y": -1200 } }, { - "id": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "id": "75a89685-0f82-40ed-9b88-e583673be9fc", "type": "invocation", "data": { - "id": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "id": "75a89685-0f82-40ed-9b88-e583673be9fc", "type": "float_math", "version": "1.0.1", - "label": "Creativity Input", + "label": "", "notes": "", "isOpen": false, "isIntermediate": true, @@ -322,30 +179,30 @@ "operation": { "name": "operation", "label": "", - "value": "MUL" + "value": "ADD" }, "a": { "name": "a", - "label": "Creativity Control (-10 to 10)", - "value": 5 + "label": "", + "value": 1 }, "b": { "name": "b", "label": "", - "value": -1 + "value": 0.15 } } }, "position": { - "x": -3500, - "y": -2125 + "x": -3050, + "y": -1225 } }, { - "id": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "id": "1ed88043-3519-41d5-a895-07944f03de70", "type": "invocation", "data": { - "id": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "id": "1ed88043-3519-41d5-a895-07944f03de70", "type": "float_math", "version": "1.0.1", "label": "", @@ -357,7 +214,7 @@ "operation": { "name": "operation", "label": "", - "value": "DIV" + "value": "ADD" }, "a": { "name": "a", @@ -367,20 +224,20 @@ "b": { "name": "b", "label": "", - "value": 100 + "value": 0.3 } } }, "position": { - "x": -3500, - "y": -1975 + "x": -3050, + "y": -1650 } }, { - "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "id": "9b281506-4079-4a3d-ab40-b386156fcd21", "type": "invocation", "data": { - "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "id": "9b281506-4079-4a3d-ab40-b386156fcd21", "type": "float_math", "version": "1.0.1", "label": "", @@ -392,139 +249,228 @@ "operation": { "name": "operation", "label": "", - "value": "ADD" + "value": "MUL" }, "a": { "name": "a", - "label": "A", - "value": 0 + "label": "", + "value": 1 }, "b": { "name": "b", "label": "", - "value": 10 + "value": 0.032 } } }, "position": { - "x": -3500, - "y": -2075 + "x": -3050, + "y": -1850 } }, { - "id": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "id": "011039f6-04cf-4607-8eb1-3304eb819c8c", "type": "invocation", "data": { - "id": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", - "type": "float_math", - "version": "1.0.1", + "id": "011039f6-04cf-4607-8eb1-3304eb819c8c", + "type": "spandrel_image_to_image_autoscale", + "version": "1.0.0", "label": "", "notes": "", - "isOpen": false, + "isOpen": true, "isIntermediate": true, "useCache": true, "inputs": { - "operation": { - "name": "operation", + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "Image to Upscale" + }, + "image_to_image_model": { + "name": "image_to_image_model", "label": "", - "value": "MUL" + "value": { + "key": "38bb1a29-8ede-42ba-b77f-64b3478896eb", + "hash": "blake3:e52fdbee46a484ebe9b3b20ea0aac0a35a453ab6d0d353da00acfd35ce7a91ed", + "name": "4xNomosWebPhoto_esrgan", + "base": "sdxl", + "type": "spandrel_image_to_image" + } }, - "a": { - "name": "a", + "tile_size": { + "name": "tile_size", "label": "", - "value": 1 + "value": 512 }, - "b": { - "name": "b", + "scale": { + "name": "scale", + "label": "Scale (2x, 4x, 8x, 16x)", + "value": 2 + }, + "fit_to_multiple_of_8": { + "name": "fit_to_multiple_of_8", "label": "", - "value": 4.99 + "value": true } } }, "position": { - "x": -3500, - "y": -2025 + "x": -4750, + "y": -2125 } }, { - "id": "e4d5ca7c-8fcf-4c59-9c58-67194c80dc73", + "id": "f936ebb3-6902-4df9-a775-6a68bac2da70", "type": "invocation", "data": { - "id": "e4d5ca7c-8fcf-4c59-9c58-67194c80dc73", - "type": "float_math", - "version": "1.0.1", + "id": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "type": "model_identifier", + "version": "1.0.0", "label": "", "notes": "", - "isOpen": false, + "isOpen": true, "isIntermediate": true, "useCache": true, "inputs": { - "operation": { - "name": "operation", - "label": "", - "value": "ADD" - }, - "a": { - "name": "a", - "label": "", - "value": 0 - }, - "b": { - "name": "b", - "label": "", - "value": 1 + "model": { + "name": "model", + "label": "ControlNet Model - Choose a Tile ControlNet", + "value": { + "key": "74f4651f-0ace-4b7b-b616-e98360257797", + "hash": "blake3:167a5b84583aaed3e5c8d660b45830e82e1c602743c689d3c27773c6c8b85b4a", + "name": "controlnet-tile-sdxl-1.0", + "base": "sdxl", + "type": "controlnet" + } } } }, "position": { - "x": -3500, - "y": -1925 + "x": -3450, + "y": -1450 } }, { - "id": "696de0e1-cdd2-42e8-abeb-57a926bc6df6", + "id": "00239057-20d4-4cd2-a010-28727b256ea2", "type": "invocation", "data": { - "id": "696de0e1-cdd2-42e8-abeb-57a926bc6df6", - "type": "float_math", + "id": "00239057-20d4-4cd2-a010-28727b256ea2", + "type": "rand_int", "version": "1.0.1", - "label": "Sharpness Input", + "label": "", "notes": "", - "isOpen": true, + "isOpen": false, "isIntermediate": true, - "useCache": true, + "useCache": false, "inputs": { - "operation": { - "name": "operation", + "low": { + "name": "low", "label": "", - "value": "ADD" - }, - "a": { - "name": "a", - "label": "Sharpness Control (-10 to 10)", "value": 0 }, - "b": { - "name": "b", + "high": { + "name": "high", "label": "", - "value": 10 + "value": 2147483647 } } }, "position": { - "x": -4750, - "y": -2275 + "x": -4025, + "y": -2075 } }, { - "id": "79390b60-4077-4f94-ad0a-4229cc73ddb2", + "id": "094bc4ed-5c68-4342-84f4-51056c755796", "type": "invocation", "data": { - "id": "79390b60-4077-4f94-ad0a-4229cc73ddb2", - "type": "float_math", + "id": "094bc4ed-5c68-4342-84f4-51056c755796", + "type": "boolean", + "version": "1.0.1", + "label": "Tiled Option", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "value": { + "name": "value", + "label": "Tiled VAE (Saves VRAM, Color Inconsistency)", + "value": true + } + } + }, + "position": { + "x": -2675, + "y": -2475 + } + }, + { + "id": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", + "type": "invocation", + "data": { + "id": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", + "type": "string", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "value": { + "name": "value", + "label": "Negative Prompt (Optional)", + "value": "" + } + } + }, + "position": { + "x": -3500, + "y": -2525 + } + }, + { + "id": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", + "type": "invocation", + "data": { + "id": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", + "type": "string", "version": "1.0.1", "label": "", "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "value": { + "name": "value", + "label": "Positive Prompt (Optional)", + "value": "" + } + } + }, + "position": { + "x": -3500, + "y": -2825 + } + }, + { + "id": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "type": "invocation", + "data": { + "id": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "type": "float_math", + "version": "1.0.1", + "label": "Creativity Input", + "notes": "", "isOpen": false, "isIntermediate": true, "useCache": true, @@ -536,26 +482,26 @@ }, "a": { "name": "a", - "label": "", - "value": 1 + "label": "Creativity Control (-10 to 10)", + "value": 0 }, "b": { "name": "b", "label": "", - "value": 3.75 + "value": -1 } } }, "position": { - "x": -4750, - "y": -2000 + "x": -3500, + "y": -2125 } }, { - "id": "4950132a-2d06-4571-b2c0-55cb37a31e9b", + "id": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", "type": "invocation", "data": { - "id": "4950132a-2d06-4571-b2c0-55cb37a31e9b", + "id": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", "type": "float_math", "version": "1.0.1", "label": "", @@ -567,33 +513,33 @@ "operation": { "name": "operation", "label": "", - "value": "ADD" + "value": "DIV" }, "a": { "name": "a", "label": "", - "value": 25 + "value": 1 }, "b": { "name": "b", "label": "", - "value": 1 + "value": 100 } } }, "position": { - "x": -4750, - "y": -1950 + "x": -3500, + "y": -1975 } }, { - "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", "type": "invocation", "data": { - "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", "type": "float_math", "version": "1.0.1", - "label": "Structural Input", + "label": "", "notes": "", "isOpen": false, "isIntermediate": true, @@ -606,7 +552,7 @@ }, "a": { "name": "a", - "label": "Structural Control (-10 to 10)", + "label": "A", "value": 0 }, "b": { @@ -618,14 +564,14 @@ }, "position": { "x": -3500, - "y": -1700 + "y": -2075 } }, { - "id": "bc53651f-208b-440c-be30-f93f72ae700e", + "id": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", "type": "invocation", "data": { - "id": "bc53651f-208b-440c-be30-f93f72ae700e", + "id": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", "type": "float_math", "version": "1.0.1", "label": "", @@ -647,25 +593,25 @@ "b": { "name": "b", "label": "", - "value": 0.025 + "value": 4.99 } } }, "position": { "x": -3500, - "y": -1650 + "y": -2025 } }, { - "id": "67346654-cac0-446a-8cde-9af4b5a029a6", + "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", "type": "invocation", "data": { - "id": "67346654-cac0-446a-8cde-9af4b5a029a6", + "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", "type": "float_math", "version": "1.0.1", - "label": "", + "label": "Structural Input", "notes": "", - "isOpen": false, + "isOpen": true, "isIntermediate": true, "useCache": true, "inputs": { @@ -676,19 +622,19 @@ }, "a": { "name": "a", - "label": "", - "value": 0.3 + "label": "Structural Control (-10 to 10)", + "value": 0 }, "b": { "name": "b", "label": "", - "value": 1 + "value": 10 } } }, "position": { - "x": -3500, - "y": -1600 + "x": -3050, + "y": -2100 } }, { @@ -711,8 +657,8 @@ } }, "position": { - "x": -3125, - "y": -1500 + "x": -2275, + "y": -2075 } }, { @@ -722,7 +668,7 @@ "id": "b78f53b6-2eae-4956-97b4-7e73768d1491", "type": "controlnet", "version": "1.1.2", - "label": "ControlNet (use xinsir's tile ControlNet)", + "label": "Initial Control (Use Tile)", "notes": "", "isOpen": true, "isIntermediate": true, @@ -764,8 +710,8 @@ } }, "position": { - "x": -3493.4229674963885, - "y": -1359.2223984776113 + "x": -2675, + "y": -1775 } }, { @@ -836,7 +782,7 @@ } }, "position": { - "x": -3525, + "x": -3500, "y": -2300 } }, @@ -857,9 +803,9 @@ "name": "vae_model", "label": "", "value": { - "key": "4bc2bddf-94d9-4efe-a8e2-5eda28710f4c", - "hash": "random:67e47a77a1fcef9c0f5cd5d889d71c191f07383a0bf587f1849b2bc3f359440a", - "name": "sdxl-vae-fp16-fix", + "key": "ff926845-090e-4d46-b81e-30289ee47474", + "hash": "9705ab1c31fa96b308734214fb7571a958621c7a9247eed82b7d277145f8d9fa", + "name": "VAEFix", "base": "sdxl", "type": "vae" } @@ -867,7 +813,7 @@ } }, "position": { - "x": -4000, + "x": -4025, "y": -2575 } }, @@ -886,12 +832,19 @@ "inputs": { "model": { "name": "model", - "label": "SDXL Model" + "label": "SDXL Model", + "value": { + "key": "ab191f73-68d2-492c-8aec-b438a8cf0f45", + "hash": "blake3:2d50e940627e3bf555f015280ec0976d5c1fa100f7bc94e95ffbfc770e98b6fe", + "name": "CustomXLv7", + "base": "sdxl", + "type": "main" + } } } }, "position": { - "x": -4000, + "x": -4025, "y": -2825 } }, @@ -963,7 +916,7 @@ } }, "position": { - "x": -3525, + "x": -3500, "y": -2600 } }, @@ -976,7 +929,7 @@ "version": "1.2.2", "label": "", "notes": "", - "isOpen": false, + "isOpen": true, "isIntermediate": true, "useCache": true, "inputs": { @@ -1006,49 +959,7 @@ }, "position": { "x": -4400, - "y": -1875 - } - }, - { - "id": "53c2d5fd-863d-4950-93e0-628f3d61b493", - "type": "invocation", - "data": { - "id": "53c2d5fd-863d-4950-93e0-628f3d61b493", - "type": "unsharp_mask", - "version": "1.2.2", - "label": "", - "notes": "", - "isOpen": false, - "isIntermediate": true, - "useCache": true, - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "image": { - "name": "image", - "label": "" - }, - "radius": { - "name": "radius", - "label": "", - "value": 2 - }, - "strength": { - "name": "strength", - "label": "", - "value": 50 - } - } - }, - "position": { - "x": -4750, - "y": -1875 + "y": -2125 } }, { @@ -1090,8 +1001,8 @@ } }, "position": { - "x": -4000, - "y": -1875 + "x": -4025, + "y": -2125 } }, { @@ -1141,8 +1052,8 @@ } }, "position": { - "x": -2750, - "y": -2575 + "x": -2675, + "y": -2825 } }, { @@ -1230,207 +1141,65 @@ } }, "position": { - "x": -3125, - "y": -2575 + "x": -3050, + "y": -2825 } }, { - "id": "1ba845a6-eb88-49a1-a490-5fe6754f3ec9", + "id": "be4082d6-e238-40ea-a9df-fc0d725e8895", "type": "invocation", "data": { - "id": "1ba845a6-eb88-49a1-a490-5fe6754f3ec9", - "type": "integer", - "version": "1.0.1", - "label": "", + "id": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "type": "controlnet", + "version": "1.1.2", + "label": "Second Phase Control (Use Tile)", "notes": "", "isOpen": true, "isIntermediate": true, "useCache": true, "inputs": { - "value": { - "name": "value", - "label": "Scale (2x, 4x)", - "value": 2 + "image": { + "name": "image", + "label": "" + }, + "control_model": { + "name": "control_model", + "label": "" + }, + "control_weight": { + "name": "control_weight", + "label": "", + "value": 0.25 + }, + "begin_step_percent": { + "name": "begin_step_percent", + "label": "", + "value": 0.5 + }, + "end_step_percent": { + "name": "end_step_percent", + "label": "", + "value": 0.85 + }, + "control_mode": { + "name": "control_mode", + "label": "Control Mode", + "value": "balanced" + }, + "resize_mode": { + "name": "resize_mode", + "label": "", + "value": "just_resize" } } }, "position": { - "x": -4400, - "y": -2175 + "x": -2675, + "y": -1325 } }, { - "id": "d350feac-9686-4e0d-bd46-a96bd2630818", - "type": "invocation", - "data": { - "id": "d350feac-9686-4e0d-bd46-a96bd2630818", - "type": "integer_math", - "version": "1.0.1", - "label": "", - "notes": "", - "isOpen": false, - "isIntermediate": true, - "useCache": true, - "inputs": { - "operation": { - "name": "operation", - "label": "", - "value": "MUL" - }, - "a": { - "name": "a", - "label": "", - "value": 1 - }, - "b": { - "name": "b", - "label": "", - "value": 1 - } - } - }, - "position": { - "x": -4400, - "y": -1950 - } - }, - { - "id": "5b256f14-caab-40ff-b8f0-9679cd542163", - "type": "invocation", - "data": { - "id": "5b256f14-caab-40ff-b8f0-9679cd542163", - "type": "integer_math", - "version": "1.0.1", - "label": "", - "notes": "", - "isOpen": false, - "isIntermediate": true, - "useCache": true, - "inputs": { - "operation": { - "name": "operation", - "label": "", - "value": "MUL" - }, - "a": { - "name": "a", - "label": "", - "value": 1 - }, - "b": { - "name": "b", - "label": "", - "value": 1 - } - } - }, - "position": { - "x": -4400, - "y": -2000 - } - }, - { - "id": "7671553a-cd4b-4e25-8332-9d5667e64493", - "type": "invocation", - "data": { - "id": "7671553a-cd4b-4e25-8332-9d5667e64493", - "type": "img_resize", - "version": "1.2.2", - "label": "", - "notes": "", - "isOpen": true, - "isIntermediate": true, - "useCache": true, - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "image": { - "name": "image", - "label": "" - }, - "width": { - "name": "width", - "label": "", - "value": 512 - }, - "height": { - "name": "height", - "label": "", - "value": 512 - }, - "resample_mode": { - "name": "resample_mode", - "label": "", - "value": "lanczos" - } - } - }, - "position": { - "x": -4375, - "y": -1825 - } - }, - { - "id": "be4082d6-e238-40ea-a9df-fc0d725e8895", - "type": "invocation", - "data": { - "id": "be4082d6-e238-40ea-a9df-fc0d725e8895", - "type": "controlnet", - "version": "1.1.2", - "label": "ControlNet (use xinsir's tile ControlNet)", - "notes": "", - "isOpen": true, - "isIntermediate": true, - "useCache": true, - "inputs": { - "image": { - "name": "image", - "label": "" - }, - "control_model": { - "name": "control_model", - "label": "" - }, - "control_weight": { - "name": "control_weight", - "label": "", - "value": 0.25 - }, - "begin_step_percent": { - "name": "begin_step_percent", - "label": "", - "value": 0.5 - }, - "end_step_percent": { - "name": "end_step_percent", - "label": "", - "value": 0.8 - }, - "control_mode": { - "name": "control_mode", - "label": "Control Mode", - "value": "balanced" - }, - "resize_mode": { - "name": "resize_mode", - "label": "", - "value": "just_resize" - } - } - }, - "position": { - "x": -3131.577032503611, - "y": -1392.1075609956667 - } - }, - { - "id": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "id": "8923451b-5a27-4395-b7f2-dce875fca6f5", "type": "invocation", "data": { "id": "8923451b-5a27-4395-b7f2-dce875fca6f5", @@ -1465,163 +1234,23 @@ } }, "position": { - "x": -4000, - "y": -1750 - } - }, - { - "id": "f0cd0d2f-9614-43f7-9944-a75b8d5ccd65", - "type": "invocation", - "data": { - "id": "f0cd0d2f-9614-43f7-9944-a75b8d5ccd65", - "type": "esrgan", - "version": "1.3.2", - "label": "", - "notes": "", - "isOpen": true, - "isIntermediate": true, - "useCache": true, - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "image": { - "name": "image", - "label": "" - }, - "model_name": { - "name": "model_name", - "label": "Upscaling Model", - "value": "RealESRGAN_x4plus.pth" - }, - "tile_size": { - "name": "tile_size", - "label": "", - "value": 500 - } - } - }, - "position": { - "x": -4750, - "y": -1825 - } - }, - { - "id": "7dbb756b-7d79-431c-a46d-d8f7b082c127", - "type": "invocation", - "data": { - "id": "7dbb756b-7d79-431c-a46d-d8f7b082c127", - "version": "1.0.1", - "label": "", - "notes": "", - "type": "float_to_int", - "inputs": { - "value": { - "name": "value", - "label": "", - "value": 0 - }, - "multiple": { - "name": "multiple", - "label": "", - "value": 8 - }, - "method": { - "name": "method", - "label": "", - "value": "Floor" - } - }, - "isOpen": false, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": -4000, - "y": -1950 - } - }, - { - "id": "5ca87ace-edf9-49c7-a424-cd42416b86a7", - "type": "invocation", - "data": { - "id": "5ca87ace-edf9-49c7-a424-cd42416b86a7", - "version": "1.0.2", - "label": "", - "notes": "", - "type": "image", - "inputs": { - "image": { - "name": "image", - "label": "Image to Upscale" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": -4750, - "y": -2850 - } - }, - { - "id": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", - "type": "invocation", - "data": { - "id": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", - "version": "1.0.1", - "label": "", - "notes": "", - "type": "float_to_int", - "inputs": { - "value": { - "name": "value", - "label": "", - "value": 8 - }, - "multiple": { - "name": "multiple", - "label": "", - "value": 8 - }, - "method": { - "name": "method", - "label": "", - "value": "Floor" - } - }, - "isOpen": false, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": -4000, - "y": -2000 + "x": -4025, + "y": -2025 } } ], "edges": [ { - "id": "reactflow__edge-f936ebb3-6902-4df9-a775-6a68bac2da70model-be4082d6-e238-40ea-a9df-fc0d725e8895control_model", - "type": "default", - "source": "f936ebb3-6902-4df9-a775-6a68bac2da70", - "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", - "sourceHandle": "model", - "targetHandle": "control_model" + "id": "9b281506-4079-4a3d-ab40-b386156fcd21-75a89685-0f82-40ed-9b88-e583673be9fc-collapsed", + "type": "collapsed", + "source": "9b281506-4079-4a3d-ab40-b386156fcd21", + "target": "75a89685-0f82-40ed-9b88-e583673be9fc" }, { - "id": "reactflow__edge-f936ebb3-6902-4df9-a775-6a68bac2da70model-b78f53b6-2eae-4956-97b4-7e73768d1491control_model", - "type": "default", - "source": "f936ebb3-6902-4df9-a775-6a68bac2da70", - "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", - "sourceHandle": "model", - "targetHandle": "control_model" + "id": "9b281506-4079-4a3d-ab40-b386156fcd21-1ed88043-3519-41d5-a895-07944f03de70-collapsed", + "type": "collapsed", + "source": "9b281506-4079-4a3d-ab40-b386156fcd21", + "target": "1ed88043-3519-41d5-a895-07944f03de70" }, { "id": "49a8cc12-aa19-48c5-b6b3-04e0b603b384-c8f5c671-8c87-4d96-a75e-a9937ac6bc03-collapsed", @@ -1630,291 +1259,264 @@ "target": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03" }, { - "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c-49a8cc12-aa19-48c5-b6b3-04e0b603b384-collapsed", - "type": "collapsed", - "source": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", - "target": "49a8cc12-aa19-48c5-b6b3-04e0b603b384" - }, - { - "id": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d-14e65dbe-4249-4b25-9a63-3a10cfaeb61c-collapsed", - "type": "collapsed", - "source": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", - "target": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c" - }, - { - "id": "reactflow__edge-00239057-20d4-4cd2-a010-28727b256ea2value-8923451b-5a27-4395-b7f2-dce875fca6f5seed", - "type": "default", - "source": "00239057-20d4-4cd2-a010-28727b256ea2", - "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", - "sourceHandle": "value", - "targetHandle": "seed" - }, - { - "id": "reactflow__edge-094bc4ed-5c68-4342-84f4-51056c755796value-c3b60a50-8039-4924-90e3-8c608e1fecb5tiled", - "type": "default", - "source": "094bc4ed-5c68-4342-84f4-51056c755796", - "target": "c3b60a50-8039-4924-90e3-8c608e1fecb5", - "sourceHandle": "value", - "targetHandle": "tiled" - }, - { - "id": "reactflow__edge-094bc4ed-5c68-4342-84f4-51056c755796value-117f982a-03da-49b1-bf9f-29711160ac02tiled", - "type": "default", - "source": "094bc4ed-5c68-4342-84f4-51056c755796", - "target": "117f982a-03da-49b1-bf9f-29711160ac02", - "sourceHandle": "value", - "targetHandle": "tiled" - }, - { - "id": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03-e4d5ca7c-8fcf-4c59-9c58-67194c80dc73-collapsed", - "type": "collapsed", - "source": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", - "target": "e4d5ca7c-8fcf-4c59-9c58-67194c80dc73" - }, - { - "id": "d350feac-9686-4e0d-bd46-a96bd2630818-7dbb756b-7d79-431c-a46d-d8f7b082c127-collapsed", - "type": "collapsed", - "source": "d350feac-9686-4e0d-bd46-a96bd2630818", - "target": "7dbb756b-7d79-431c-a46d-d8f7b082c127" - }, - { - "id": "5b256f14-caab-40ff-b8f0-9679cd542163-f5d9bf3b-2646-4b17-9894-20fd2b4218ea-collapsed", - "type": "collapsed", - "source": "5b256f14-caab-40ff-b8f0-9679cd542163", - "target": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea" - }, - { - "id": "4950132a-2d06-4571-b2c0-55cb37a31e9b-041c59cc-f9e4-4dc9-8b31-84648c5f3ebe-collapsed", - "type": "collapsed", - "source": "4950132a-2d06-4571-b2c0-55cb37a31e9b", - "target": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe" - }, - { - "id": "4950132a-2d06-4571-b2c0-55cb37a31e9b-53c2d5fd-863d-4950-93e0-628f3d61b493-collapsed", - "type": "collapsed", - "source": "4950132a-2d06-4571-b2c0-55cb37a31e9b", - "target": "53c2d5fd-863d-4950-93e0-628f3d61b493" - }, - { - "id": "reactflow__edge-f5ca24ee-21c5-4c8c-8d3c-371b5079b086value-27215391-b20e-412a-b854-7fa5927f5437style", - "type": "default", - "source": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", - "target": "27215391-b20e-412a-b854-7fa5927f5437", - "sourceHandle": "value", - "targetHandle": "style" - }, - { - "id": "reactflow__edge-f5ca24ee-21c5-4c8c-8d3c-371b5079b086value-27215391-b20e-412a-b854-7fa5927f5437prompt", - "type": "default", - "source": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", - "target": "27215391-b20e-412a-b854-7fa5927f5437", - "sourceHandle": "value", - "targetHandle": "prompt" - }, - { - "id": "reactflow__edge-c26bff37-4f12-482f-ba45-3a5d729b4c4fvalue-6142b69a-323f-4ecd-a7e5-67dc61349c51style", + "id": "reactflow__edge-c8f5c671-8c87-4d96-a75e-a9937ac6bc03value-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7adenoising_start", "type": "default", - "source": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", - "target": "6142b69a-323f-4ecd-a7e5-67dc61349c51", + "source": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", "sourceHandle": "value", - "targetHandle": "style" + "targetHandle": "denoising_start" }, { - "id": "reactflow__edge-c26bff37-4f12-482f-ba45-3a5d729b4c4fvalue-6142b69a-323f-4ecd-a7e5-67dc61349c51prompt", - "type": "default", - "source": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", - "target": "6142b69a-323f-4ecd-a7e5-67dc61349c51", - "sourceHandle": "value", - "targetHandle": "prompt" + "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c-49a8cc12-aa19-48c5-b6b3-04e0b603b384-collapsed", + "type": "collapsed", + "source": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "target": "49a8cc12-aa19-48c5-b6b3-04e0b603b384" }, { - "id": "88ae723e-4933-4371-b52d-3ada52a59d36-6daa9526-382b-491d-964f-f53fc308664f-collapsed", + "id": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d-14e65dbe-4249-4b25-9a63-3a10cfaeb61c-collapsed", "type": "collapsed", - "source": "88ae723e-4933-4371-b52d-3ada52a59d36", - "target": "6daa9526-382b-491d-964f-f53fc308664f" + "source": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "target": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c" }, { - "id": "f1afd295-860f-48b6-a76a-90609bf2cc11-88ae723e-4933-4371-b52d-3ada52a59d36-collapsed", + "id": "75a89685-0f82-40ed-9b88-e583673be9fc-96e1bcd0-326b-4b67-8b14-239da2440aec-collapsed", "type": "collapsed", - "source": "f1afd295-860f-48b6-a76a-90609bf2cc11", - "target": "88ae723e-4933-4371-b52d-3ada52a59d36" + "source": "75a89685-0f82-40ed-9b88-e583673be9fc", + "target": "96e1bcd0-326b-4b67-8b14-239da2440aec" }, { - "id": "bc53651f-208b-440c-be30-f93f72ae700e-67346654-cac0-446a-8cde-9af4b5a029a6-collapsed", + "id": "00e2c587-f047-4413-ad15-bd31ea53ce22-71a116e1-c631-48b3-923d-acea4753b887-collapsed", "type": "collapsed", - "source": "bc53651f-208b-440c-be30-f93f72ae700e", - "target": "67346654-cac0-446a-8cde-9af4b5a029a6" + "source": "00e2c587-f047-4413-ad15-bd31ea53ce22", + "target": "71a116e1-c631-48b3-923d-acea4753b887" }, { - "id": "reactflow__edge-67346654-cac0-446a-8cde-9af4b5a029a6value-be4082d6-e238-40ea-a9df-fc0d725e8895begin_step_percent", + "id": "reactflow__edge-71a116e1-c631-48b3-923d-acea4753b887value-be4082d6-e238-40ea-a9df-fc0d725e8895begin_step_percent", "type": "default", - "source": "67346654-cac0-446a-8cde-9af4b5a029a6", + "source": "71a116e1-c631-48b3-923d-acea4753b887", "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", "sourceHandle": "value", "targetHandle": "begin_step_percent" }, { - "id": "reactflow__edge-67346654-cac0-446a-8cde-9af4b5a029a6value-b78f53b6-2eae-4956-97b4-7e73768d1491end_step_percent", + "id": "reactflow__edge-71a116e1-c631-48b3-923d-acea4753b887value-b78f53b6-2eae-4956-97b4-7e73768d1491end_step_percent", "type": "default", - "source": "67346654-cac0-446a-8cde-9af4b5a029a6", + "source": "71a116e1-c631-48b3-923d-acea4753b887", "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", "sourceHandle": "value", "targetHandle": "end_step_percent" }, { - "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa-f1afd295-860f-48b6-a76a-90609bf2cc11-collapsed", - "type": "collapsed", - "source": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", - "target": "f1afd295-860f-48b6-a76a-90609bf2cc11" + "id": "reactflow__edge-00e2c587-f047-4413-ad15-bd31ea53ce22value-71a116e1-c631-48b3-923d-acea4753b887a", + "type": "default", + "source": "00e2c587-f047-4413-ad15-bd31ea53ce22", + "target": "71a116e1-c631-48b3-923d-acea4753b887", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true }, { - "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa-bc53651f-208b-440c-be30-f93f72ae700e-collapsed", - "type": "collapsed", + "id": "reactflow__edge-bd094e2f-41e5-4b61-9f7b-56cf337d53favalue-00e2c587-f047-4413-ad15-bd31ea53ce22a", + "type": "default", "source": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", - "target": "bc53651f-208b-440c-be30-f93f72ae700e" + "target": "00e2c587-f047-4413-ad15-bd31ea53ce22", + "sourceHandle": "value", + "targetHandle": "a" }, { - "id": "reactflow__edge-bc53651f-208b-440c-be30-f93f72ae700evalue-67346654-cac0-446a-8cde-9af4b5a029a6b", + "id": "reactflow__edge-96e1bcd0-326b-4b67-8b14-239da2440aecvalue-be4082d6-e238-40ea-a9df-fc0d725e8895control_weight", "type": "default", - "source": "bc53651f-208b-440c-be30-f93f72ae700e", - "target": "67346654-cac0-446a-8cde-9af4b5a029a6", + "source": "96e1bcd0-326b-4b67-8b14-239da2440aec", + "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", "sourceHandle": "value", - "targetHandle": "b", - "hidden": true + "targetHandle": "control_weight" }, { - "id": "reactflow__edge-6daa9526-382b-491d-964f-f53fc308664fvalue-b78f53b6-2eae-4956-97b4-7e73768d1491control_weight", + "id": "reactflow__edge-75a89685-0f82-40ed-9b88-e583673be9fcvalue-96e1bcd0-326b-4b67-8b14-239da2440aeca", "type": "default", - "source": "6daa9526-382b-491d-964f-f53fc308664f", - "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "source": "75a89685-0f82-40ed-9b88-e583673be9fc", + "target": "96e1bcd0-326b-4b67-8b14-239da2440aec", "sourceHandle": "value", - "targetHandle": "control_weight" + "targetHandle": "a", + "hidden": true }, { - "id": "reactflow__edge-88ae723e-4933-4371-b52d-3ada52a59d36value-6daa9526-382b-491d-964f-f53fc308664fb", + "id": "reactflow__edge-9b281506-4079-4a3d-ab40-b386156fcd21value-75a89685-0f82-40ed-9b88-e583673be9fca", "type": "default", - "source": "88ae723e-4933-4371-b52d-3ada52a59d36", - "target": "6daa9526-382b-491d-964f-f53fc308664f", + "source": "9b281506-4079-4a3d-ab40-b386156fcd21", + "target": "75a89685-0f82-40ed-9b88-e583673be9fc", "sourceHandle": "value", - "targetHandle": "b", + "targetHandle": "a", "hidden": true }, { - "id": "reactflow__edge-88ae723e-4933-4371-b52d-3ada52a59d36value-be4082d6-e238-40ea-a9df-fc0d725e8895control_weight", + "id": "reactflow__edge-1ed88043-3519-41d5-a895-07944f03de70value-b78f53b6-2eae-4956-97b4-7e73768d1491control_weight", "type": "default", - "source": "88ae723e-4933-4371-b52d-3ada52a59d36", - "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "source": "1ed88043-3519-41d5-a895-07944f03de70", + "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", "sourceHandle": "value", "targetHandle": "control_weight" }, { - "id": "reactflow__edge-f1afd295-860f-48b6-a76a-90609bf2cc11value-88ae723e-4933-4371-b52d-3ada52a59d36b", + "id": "reactflow__edge-9b281506-4079-4a3d-ab40-b386156fcd21value-1ed88043-3519-41d5-a895-07944f03de70a", "type": "default", - "source": "f1afd295-860f-48b6-a76a-90609bf2cc11", - "target": "88ae723e-4933-4371-b52d-3ada52a59d36", + "source": "9b281506-4079-4a3d-ab40-b386156fcd21", + "target": "1ed88043-3519-41d5-a895-07944f03de70", "sourceHandle": "value", - "targetHandle": "b", + "targetHandle": "a", "hidden": true }, { - "id": "reactflow__edge-bd094e2f-41e5-4b61-9f7b-56cf337d53favalue-f1afd295-860f-48b6-a76a-90609bf2cc11a", + "id": "reactflow__edge-bd094e2f-41e5-4b61-9f7b-56cf337d53favalue-9b281506-4079-4a3d-ab40-b386156fcd21a", "type": "default", "source": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", - "target": "f1afd295-860f-48b6-a76a-90609bf2cc11", + "target": "9b281506-4079-4a3d-ab40-b386156fcd21", "sourceHandle": "value", - "targetHandle": "a", - "hidden": true + "targetHandle": "a" }, { - "id": "reactflow__edge-1dd915a3-6756-48ed-b68b-ee3b4bd06c1dvalue-14e65dbe-4249-4b25-9a63-3a10cfaeb61ca", + "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeheight-8923451b-5a27-4395-b7f2-dce875fca6f5height", "type": "default", - "source": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", - "target": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", - "sourceHandle": "value", - "targetHandle": "a", - "hidden": true + "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "sourceHandle": "height", + "targetHandle": "height" }, { - "id": "reactflow__edge-e4d5ca7c-8fcf-4c59-9c58-67194c80dc73value-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7adenoising_start", + "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebewidth-8923451b-5a27-4395-b7f2-dce875fca6f5width", "type": "default", - "source": "e4d5ca7c-8fcf-4c59-9c58-67194c80dc73", - "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage-b78f53b6-2eae-4956-97b4-7e73768d1491image", + "type": "default", + "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage-be4082d6-e238-40ea-a9df-fc0d725e8895image", + "type": "default", + "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage-117f982a-03da-49b1-bf9f-29711160ac02image", + "type": "default", + "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "target": "117f982a-03da-49b1-bf9f-29711160ac02", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-011039f6-04cf-4607-8eb1-3304eb819c8cimage-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage", + "type": "default", + "source": "011039f6-04cf-4607-8eb1-3304eb819c8c", + "target": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-f936ebb3-6902-4df9-a775-6a68bac2da70model-be4082d6-e238-40ea-a9df-fc0d725e8895control_model", + "type": "default", + "source": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "sourceHandle": "model", + "targetHandle": "control_model" + }, + { + "id": "reactflow__edge-f936ebb3-6902-4df9-a775-6a68bac2da70model-b78f53b6-2eae-4956-97b4-7e73768d1491control_model", + "type": "default", + "source": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "sourceHandle": "model", + "targetHandle": "control_model" + }, + { + "id": "reactflow__edge-00239057-20d4-4cd2-a010-28727b256ea2value-8923451b-5a27-4395-b7f2-dce875fca6f5seed", + "type": "default", + "source": "00239057-20d4-4cd2-a010-28727b256ea2", + "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", "sourceHandle": "value", - "targetHandle": "denoising_start" + "targetHandle": "seed" }, { - "id": "reactflow__edge-c8f5c671-8c87-4d96-a75e-a9937ac6bc03value-e4d5ca7c-8fcf-4c59-9c58-67194c80dc73b", + "id": "reactflow__edge-094bc4ed-5c68-4342-84f4-51056c755796value-c3b60a50-8039-4924-90e3-8c608e1fecb5tiled", "type": "default", - "source": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", - "target": "e4d5ca7c-8fcf-4c59-9c58-67194c80dc73", + "source": "094bc4ed-5c68-4342-84f4-51056c755796", + "target": "c3b60a50-8039-4924-90e3-8c608e1fecb5", "sourceHandle": "value", - "targetHandle": "b", - "hidden": true + "targetHandle": "tiled" }, { - "id": "reactflow__edge-49a8cc12-aa19-48c5-b6b3-04e0b603b384value-c8f5c671-8c87-4d96-a75e-a9937ac6bc03a", + "id": "reactflow__edge-094bc4ed-5c68-4342-84f4-51056c755796value-117f982a-03da-49b1-bf9f-29711160ac02tiled", "type": "default", - "source": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", - "target": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "source": "094bc4ed-5c68-4342-84f4-51056c755796", + "target": "117f982a-03da-49b1-bf9f-29711160ac02", "sourceHandle": "value", - "targetHandle": "a", - "hidden": true + "targetHandle": "tiled" }, { - "id": "reactflow__edge-14e65dbe-4249-4b25-9a63-3a10cfaeb61cvalue-49a8cc12-aa19-48c5-b6b3-04e0b603b384a", + "id": "reactflow__edge-f5ca24ee-21c5-4c8c-8d3c-371b5079b086value-27215391-b20e-412a-b854-7fa5927f5437style", "type": "default", - "source": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", - "target": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "source": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", + "target": "27215391-b20e-412a-b854-7fa5927f5437", "sourceHandle": "value", - "targetHandle": "a", - "hidden": true + "targetHandle": "style" }, { - "id": "79390b60-4077-4f94-ad0a-4229cc73ddb2-4950132a-2d06-4571-b2c0-55cb37a31e9b-collapsed", - "type": "collapsed", - "source": "79390b60-4077-4f94-ad0a-4229cc73ddb2", - "target": "4950132a-2d06-4571-b2c0-55cb37a31e9b" + "id": "reactflow__edge-f5ca24ee-21c5-4c8c-8d3c-371b5079b086value-27215391-b20e-412a-b854-7fa5927f5437prompt", + "type": "default", + "source": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", + "target": "27215391-b20e-412a-b854-7fa5927f5437", + "sourceHandle": "value", + "targetHandle": "prompt" }, { - "id": "reactflow__edge-4950132a-2d06-4571-b2c0-55cb37a31e9bvalue-041c59cc-f9e4-4dc9-8b31-84648c5f3ebestrength", + "id": "reactflow__edge-c26bff37-4f12-482f-ba45-3a5d729b4c4fvalue-6142b69a-323f-4ecd-a7e5-67dc61349c51style", "type": "default", - "source": "4950132a-2d06-4571-b2c0-55cb37a31e9b", - "target": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "source": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", + "target": "6142b69a-323f-4ecd-a7e5-67dc61349c51", "sourceHandle": "value", - "targetHandle": "strength", - "hidden": true + "targetHandle": "style" }, { - "id": "reactflow__edge-4950132a-2d06-4571-b2c0-55cb37a31e9bvalue-53c2d5fd-863d-4950-93e0-628f3d61b493strength", + "id": "reactflow__edge-c26bff37-4f12-482f-ba45-3a5d729b4c4fvalue-6142b69a-323f-4ecd-a7e5-67dc61349c51prompt", "type": "default", - "source": "4950132a-2d06-4571-b2c0-55cb37a31e9b", - "target": "53c2d5fd-863d-4950-93e0-628f3d61b493", + "source": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", + "target": "6142b69a-323f-4ecd-a7e5-67dc61349c51", "sourceHandle": "value", - "targetHandle": "strength", - "hidden": true + "targetHandle": "prompt" }, { - "id": "reactflow__edge-79390b60-4077-4f94-ad0a-4229cc73ddb2value-4950132a-2d06-4571-b2c0-55cb37a31e9bb", + "id": "reactflow__edge-1dd915a3-6756-48ed-b68b-ee3b4bd06c1dvalue-14e65dbe-4249-4b25-9a63-3a10cfaeb61ca", "type": "default", - "source": "79390b60-4077-4f94-ad0a-4229cc73ddb2", - "target": "4950132a-2d06-4571-b2c0-55cb37a31e9b", + "source": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "target": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", "sourceHandle": "value", - "targetHandle": "b", + "targetHandle": "a", "hidden": true }, { - "id": "reactflow__edge-696de0e1-cdd2-42e8-abeb-57a926bc6df6value-79390b60-4077-4f94-ad0a-4229cc73ddb2a", + "id": "reactflow__edge-49a8cc12-aa19-48c5-b6b3-04e0b603b384value-c8f5c671-8c87-4d96-a75e-a9937ac6bc03a", "type": "default", - "source": "696de0e1-cdd2-42e8-abeb-57a926bc6df6", - "target": "79390b60-4077-4f94-ad0a-4229cc73ddb2", + "source": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "target": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", "sourceHandle": "value", - "targetHandle": "a" + "targetHandle": "a", + "hidden": true }, { - "id": "reactflow__edge-bd094e2f-41e5-4b61-9f7b-56cf337d53favalue-bc53651f-208b-440c-be30-f93f72ae700ea", + "id": "reactflow__edge-14e65dbe-4249-4b25-9a63-3a10cfaeb61cvalue-49a8cc12-aa19-48c5-b6b3-04e0b603b384a", "type": "default", - "source": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", - "target": "bc53651f-208b-440c-be30-f93f72ae700e", + "source": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "target": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", "sourceHandle": "value", "targetHandle": "a", "hidden": true @@ -1943,14 +1545,6 @@ "sourceHandle": "control", "targetHandle": "item" }, - { - "id": "reactflow__edge-7671553a-cd4b-4e25-8332-9d5667e64493image-b78f53b6-2eae-4956-97b4-7e73768d1491image", - "type": "default", - "source": "7671553a-cd4b-4e25-8332-9d5667e64493", - "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", - "sourceHandle": "image", - "targetHandle": "image" - }, { "id": "reactflow__edge-e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fdclip2-27215391-b20e-412a-b854-7fa5927f5437clip2", "type": "default", @@ -2023,38 +1617,6 @@ "sourceHandle": "clip", "targetHandle": "clip" }, - { - "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage-7671553a-cd4b-4e25-8332-9d5667e64493image", - "type": "default", - "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", - "target": "7671553a-cd4b-4e25-8332-9d5667e64493", - "sourceHandle": "image", - "targetHandle": "image" - }, - { - "id": "reactflow__edge-f0cd0d2f-9614-43f7-9944-a75b8d5ccd65image-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage", - "type": "default", - "source": "f0cd0d2f-9614-43f7-9944-a75b8d5ccd65", - "target": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", - "sourceHandle": "image", - "targetHandle": "image" - }, - { - "id": "reactflow__edge-53c2d5fd-863d-4950-93e0-628f3d61b493image-f0cd0d2f-9614-43f7-9944-a75b8d5ccd65image", - "type": "default", - "source": "53c2d5fd-863d-4950-93e0-628f3d61b493", - "target": "f0cd0d2f-9614-43f7-9944-a75b8d5ccd65", - "sourceHandle": "image", - "targetHandle": "image" - }, - { - "id": "reactflow__edge-5ca87ace-edf9-49c7-a424-cd42416b86a7image-53c2d5fd-863d-4950-93e0-628f3d61b493image", - "type": "default", - "source": "5ca87ace-edf9-49c7-a424-cd42416b86a7", - "target": "53c2d5fd-863d-4950-93e0-628f3d61b493", - "sourceHandle": "image", - "targetHandle": "image" - }, { "id": "reactflow__edge-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7alatents-c3b60a50-8039-4924-90e3-8c608e1fecb5latents", "type": "default", @@ -2078,104 +1640,6 @@ "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", "sourceHandle": "noise", "targetHandle": "noise" - }, - { - "id": "reactflow__edge-d350feac-9686-4e0d-bd46-a96bd2630818value-7dbb756b-7d79-431c-a46d-d8f7b082c127value", - "type": "default", - "source": "d350feac-9686-4e0d-bd46-a96bd2630818", - "target": "7dbb756b-7d79-431c-a46d-d8f7b082c127", - "sourceHandle": "value", - "targetHandle": "value", - "hidden": true - }, - { - "id": "reactflow__edge-5b256f14-caab-40ff-b8f0-9679cd542163value-f5d9bf3b-2646-4b17-9894-20fd2b4218eavalue", - "type": "default", - "source": "5b256f14-caab-40ff-b8f0-9679cd542163", - "target": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", - "sourceHandle": "value", - "targetHandle": "value", - "hidden": true - }, - { - "id": "reactflow__edge-7671553a-cd4b-4e25-8332-9d5667e64493height-8923451b-5a27-4395-b7f2-dce875fca6f5height", - "type": "default", - "source": "7671553a-cd4b-4e25-8332-9d5667e64493", - "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", - "sourceHandle": "height", - "targetHandle": "height" - }, - { - "id": "reactflow__edge-7671553a-cd4b-4e25-8332-9d5667e64493width-8923451b-5a27-4395-b7f2-dce875fca6f5width", - "type": "default", - "source": "7671553a-cd4b-4e25-8332-9d5667e64493", - "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", - "sourceHandle": "width", - "targetHandle": "width" - }, - { - "id": "reactflow__edge-7671553a-cd4b-4e25-8332-9d5667e64493image-117f982a-03da-49b1-bf9f-29711160ac02image", - "type": "default", - "source": "7671553a-cd4b-4e25-8332-9d5667e64493", - "target": "117f982a-03da-49b1-bf9f-29711160ac02", - "sourceHandle": "image", - "targetHandle": "image" - }, - { - "id": "reactflow__edge-7671553a-cd4b-4e25-8332-9d5667e64493image-be4082d6-e238-40ea-a9df-fc0d725e8895image", - "type": "default", - "source": "7671553a-cd4b-4e25-8332-9d5667e64493", - "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", - "sourceHandle": "image", - "targetHandle": "image" - }, - { - "id": "reactflow__edge-7dbb756b-7d79-431c-a46d-d8f7b082c127value-7671553a-cd4b-4e25-8332-9d5667e64493height", - "type": "default", - "source": "7dbb756b-7d79-431c-a46d-d8f7b082c127", - "target": "7671553a-cd4b-4e25-8332-9d5667e64493", - "sourceHandle": "value", - "targetHandle": "height" - }, - { - "id": "reactflow__edge-f5d9bf3b-2646-4b17-9894-20fd2b4218eavalue-7671553a-cd4b-4e25-8332-9d5667e64493width", - "type": "default", - "source": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", - "target": "7671553a-cd4b-4e25-8332-9d5667e64493", - "sourceHandle": "value", - "targetHandle": "width" - }, - { - "id": "reactflow__edge-5ca87ace-edf9-49c7-a424-cd42416b86a7height-d350feac-9686-4e0d-bd46-a96bd2630818a", - "type": "default", - "source": "5ca87ace-edf9-49c7-a424-cd42416b86a7", - "target": "d350feac-9686-4e0d-bd46-a96bd2630818", - "sourceHandle": "height", - "targetHandle": "a" - }, - { - "id": "reactflow__edge-1ba845a6-eb88-49a1-a490-5fe6754f3ec9value-d350feac-9686-4e0d-bd46-a96bd2630818b", - "type": "default", - "source": "1ba845a6-eb88-49a1-a490-5fe6754f3ec9", - "target": "d350feac-9686-4e0d-bd46-a96bd2630818", - "sourceHandle": "value", - "targetHandle": "b" - }, - { - "id": "reactflow__edge-1ba845a6-eb88-49a1-a490-5fe6754f3ec9value-5b256f14-caab-40ff-b8f0-9679cd542163b", - "type": "default", - "source": "1ba845a6-eb88-49a1-a490-5fe6754f3ec9", - "target": "5b256f14-caab-40ff-b8f0-9679cd542163", - "sourceHandle": "value", - "targetHandle": "b" - }, - { - "id": "reactflow__edge-5ca87ace-edf9-49c7-a424-cd42416b86a7width-5b256f14-caab-40ff-b8f0-9679cd542163a", - "type": "default", - "source": "5ca87ace-edf9-49c7-a424-cd42416b86a7", - "target": "5b256f14-caab-40ff-b8f0-9679cd542163", - "sourceHandle": "width", - "targetHandle": "a" } ] -} +} \ No newline at end of file diff --git a/invokeai/app/util/custom_openapi.py b/invokeai/app/util/custom_openapi.py index 50259c12ccc..e52028d7721 100644 --- a/invokeai/app/util/custom_openapi.py +++ b/invokeai/app/util/custom_openapi.py @@ -81,7 +81,7 @@ def openapi() -> dict[str, Any]: # Add the output map to the schema openapi_schema["components"]["schemas"]["InvocationOutputMap"] = { "type": "object", - "properties": invocation_output_map_properties, + "properties": dict(sorted(invocation_output_map_properties.items())), "required": invocation_output_map_required, } diff --git a/invokeai/backend/image_util/depth_anything/__init__.py b/invokeai/backend/image_util/depth_anything/__init__.py deleted file mode 100644 index 1adcc6b2029..00000000000 --- a/invokeai/backend/image_util/depth_anything/__init__.py +++ /dev/null @@ -1,90 +0,0 @@ -from pathlib import Path -from typing import Literal - -import cv2 -import numpy as np -import torch -import torch.nn.functional as F -from einops import repeat -from PIL import Image -from torchvision.transforms import Compose - -from invokeai.app.services.config.config_default import get_config -from invokeai.backend.image_util.depth_anything.model.dpt import DPT_DINOv2 -from invokeai.backend.image_util.depth_anything.utilities.util import NormalizeImage, PrepareForNet, Resize -from invokeai.backend.util.logging import InvokeAILogger - -config = get_config() -logger = InvokeAILogger.get_logger(config=config) - -DEPTH_ANYTHING_MODELS = { - "large": "https://huggingface.co/spaces/LiheYoung/Depth-Anything/resolve/main/checkpoints/depth_anything_vitl14.pth?download=true", - "base": "https://huggingface.co/spaces/LiheYoung/Depth-Anything/resolve/main/checkpoints/depth_anything_vitb14.pth?download=true", - "small": "https://huggingface.co/spaces/LiheYoung/Depth-Anything/resolve/main/checkpoints/depth_anything_vits14.pth?download=true", -} - - -transform = Compose( - [ - Resize( - width=518, - height=518, - resize_target=False, - keep_aspect_ratio=True, - ensure_multiple_of=14, - resize_method="lower_bound", - image_interpolation_method=cv2.INTER_CUBIC, - ), - NormalizeImage(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), - PrepareForNet(), - ] -) - - -class DepthAnythingDetector: - def __init__(self, model: DPT_DINOv2, device: torch.device) -> None: - self.model = model - self.device = device - - @staticmethod - def load_model( - model_path: Path, device: torch.device, model_size: Literal["large", "base", "small"] = "small" - ) -> DPT_DINOv2: - match model_size: - case "small": - model = DPT_DINOv2(encoder="vits", features=64, out_channels=[48, 96, 192, 384]) - case "base": - model = DPT_DINOv2(encoder="vitb", features=128, out_channels=[96, 192, 384, 768]) - case "large": - model = DPT_DINOv2(encoder="vitl", features=256, out_channels=[256, 512, 1024, 1024]) - - model.load_state_dict(torch.load(model_path.as_posix(), map_location="cpu")) - model.eval() - - model.to(device) - return model - - def __call__(self, image: Image.Image, resolution: int = 512) -> Image.Image: - if not self.model: - logger.warn("DepthAnything model was not loaded. Returning original image") - return image - - np_image = np.array(image, dtype=np.uint8) - np_image = np_image[:, :, ::-1] / 255.0 - - image_height, image_width = np_image.shape[:2] - np_image = transform({"image": np_image})["image"] - tensor_image = torch.from_numpy(np_image).unsqueeze(0).to(self.device) - - with torch.no_grad(): - depth = self.model(tensor_image) - depth = F.interpolate(depth[None], (image_height, image_width), mode="bilinear", align_corners=False)[0, 0] - depth = (depth - depth.min()) / (depth.max() - depth.min()) * 255.0 - - depth_map = repeat(depth, "h w -> h w 3").cpu().numpy().astype(np.uint8) - depth_map = Image.fromarray(depth_map) - - new_height = int(image_height * (resolution / image_width)) - depth_map = depth_map.resize((resolution, new_height)) - - return depth_map diff --git a/invokeai/backend/image_util/depth_anything/depth_anything_pipeline.py b/invokeai/backend/image_util/depth_anything/depth_anything_pipeline.py new file mode 100644 index 00000000000..b6ef5296877 --- /dev/null +++ b/invokeai/backend/image_util/depth_anything/depth_anything_pipeline.py @@ -0,0 +1,31 @@ +from typing import Optional + +import torch +from PIL import Image +from transformers.pipelines import DepthEstimationPipeline + +from invokeai.backend.raw_model import RawModel + + +class DepthAnythingPipeline(RawModel): + """Custom wrapper for the Depth Estimation pipeline from transformers adding compatibility + for Invoke's Model Management System""" + + def __init__(self, pipeline: DepthEstimationPipeline) -> None: + self._pipeline = pipeline + + def generate_depth(self, image: Image.Image) -> Image.Image: + depth_map = self._pipeline(image)["depth"] + assert isinstance(depth_map, Image.Image) + return depth_map + + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None): + if device is not None and device.type not in {"cpu", "cuda"}: + device = None + self._pipeline.model.to(device=device, dtype=dtype) + self._pipeline.device = self._pipeline.model.device + + def calc_size(self) -> int: + from invokeai.backend.model_manager.load.model_util import calc_module_size + + return calc_module_size(self._pipeline.model) diff --git a/invokeai/backend/image_util/depth_anything/model/blocks.py b/invokeai/backend/image_util/depth_anything/model/blocks.py deleted file mode 100644 index 4534f522373..00000000000 --- a/invokeai/backend/image_util/depth_anything/model/blocks.py +++ /dev/null @@ -1,145 +0,0 @@ -import torch.nn as nn - - -def _make_scratch(in_shape, out_shape, groups=1, expand=False): - scratch = nn.Module() - - out_shape1 = out_shape - out_shape2 = out_shape - out_shape3 = out_shape - if len(in_shape) >= 4: - out_shape4 = out_shape - - if expand: - out_shape1 = out_shape - out_shape2 = out_shape * 2 - out_shape3 = out_shape * 4 - if len(in_shape) >= 4: - out_shape4 = out_shape * 8 - - scratch.layer1_rn = nn.Conv2d( - in_shape[0], out_shape1, kernel_size=3, stride=1, padding=1, bias=False, groups=groups - ) - scratch.layer2_rn = nn.Conv2d( - in_shape[1], out_shape2, kernel_size=3, stride=1, padding=1, bias=False, groups=groups - ) - scratch.layer3_rn = nn.Conv2d( - in_shape[2], out_shape3, kernel_size=3, stride=1, padding=1, bias=False, groups=groups - ) - if len(in_shape) >= 4: - scratch.layer4_rn = nn.Conv2d( - in_shape[3], out_shape4, kernel_size=3, stride=1, padding=1, bias=False, groups=groups - ) - - return scratch - - -class ResidualConvUnit(nn.Module): - """Residual convolution module.""" - - def __init__(self, features, activation, bn): - """Init. - - Args: - features (int): number of features - """ - super().__init__() - - self.bn = bn - - self.groups = 1 - - self.conv1 = nn.Conv2d(features, features, kernel_size=3, stride=1, padding=1, bias=True, groups=self.groups) - - self.conv2 = nn.Conv2d(features, features, kernel_size=3, stride=1, padding=1, bias=True, groups=self.groups) - - if self.bn: - self.bn1 = nn.BatchNorm2d(features) - self.bn2 = nn.BatchNorm2d(features) - - self.activation = activation - - self.skip_add = nn.quantized.FloatFunctional() - - def forward(self, x): - """Forward pass. - - Args: - x (tensor): input - - Returns: - tensor: output - """ - - out = self.activation(x) - out = self.conv1(out) - if self.bn: - out = self.bn1(out) - - out = self.activation(out) - out = self.conv2(out) - if self.bn: - out = self.bn2(out) - - if self.groups > 1: - out = self.conv_merge(out) - - return self.skip_add.add(out, x) - - -class FeatureFusionBlock(nn.Module): - """Feature fusion block.""" - - def __init__(self, features, activation, deconv=False, bn=False, expand=False, align_corners=True, size=None): - """Init. - - Args: - features (int): number of features - """ - super(FeatureFusionBlock, self).__init__() - - self.deconv = deconv - self.align_corners = align_corners - - self.groups = 1 - - self.expand = expand - out_features = features - if self.expand: - out_features = features // 2 - - self.out_conv = nn.Conv2d(features, out_features, kernel_size=1, stride=1, padding=0, bias=True, groups=1) - - self.resConfUnit1 = ResidualConvUnit(features, activation, bn) - self.resConfUnit2 = ResidualConvUnit(features, activation, bn) - - self.skip_add = nn.quantized.FloatFunctional() - - self.size = size - - def forward(self, *xs, size=None): - """Forward pass. - - Returns: - tensor: output - """ - output = xs[0] - - if len(xs) == 2: - res = self.resConfUnit1(xs[1]) - output = self.skip_add.add(output, res) - - output = self.resConfUnit2(output) - - if (size is None) and (self.size is None): - modifier = {"scale_factor": 2} - elif size is None: - modifier = {"size": self.size} - else: - modifier = {"size": size} - - output = nn.functional.interpolate(output, **modifier, mode="bilinear", align_corners=self.align_corners) - - output = self.out_conv(output) - - return output diff --git a/invokeai/backend/image_util/depth_anything/model/dpt.py b/invokeai/backend/image_util/depth_anything/model/dpt.py deleted file mode 100644 index 9b1e84c7bda..00000000000 --- a/invokeai/backend/image_util/depth_anything/model/dpt.py +++ /dev/null @@ -1,183 +0,0 @@ -from pathlib import Path - -import torch -import torch.nn as nn -import torch.nn.functional as F - -from invokeai.backend.image_util.depth_anything.model.blocks import FeatureFusionBlock, _make_scratch - -torchhub_path = Path(__file__).parent.parent / "torchhub" - - -def _make_fusion_block(features, use_bn, size=None): - return FeatureFusionBlock( - features, - nn.ReLU(False), - deconv=False, - bn=use_bn, - expand=False, - align_corners=True, - size=size, - ) - - -class DPTHead(nn.Module): - def __init__(self, nclass, in_channels, features, out_channels, use_bn=False, use_clstoken=False): - super(DPTHead, self).__init__() - - self.nclass = nclass - self.use_clstoken = use_clstoken - - self.projects = nn.ModuleList( - [ - nn.Conv2d( - in_channels=in_channels, - out_channels=out_channel, - kernel_size=1, - stride=1, - padding=0, - ) - for out_channel in out_channels - ] - ) - - self.resize_layers = nn.ModuleList( - [ - nn.ConvTranspose2d( - in_channels=out_channels[0], out_channels=out_channels[0], kernel_size=4, stride=4, padding=0 - ), - nn.ConvTranspose2d( - in_channels=out_channels[1], out_channels=out_channels[1], kernel_size=2, stride=2, padding=0 - ), - nn.Identity(), - nn.Conv2d( - in_channels=out_channels[3], out_channels=out_channels[3], kernel_size=3, stride=2, padding=1 - ), - ] - ) - - if use_clstoken: - self.readout_projects = nn.ModuleList() - for _ in range(len(self.projects)): - self.readout_projects.append(nn.Sequential(nn.Linear(2 * in_channels, in_channels), nn.GELU())) - - self.scratch = _make_scratch( - out_channels, - features, - groups=1, - expand=False, - ) - - self.scratch.stem_transpose = None - - self.scratch.refinenet1 = _make_fusion_block(features, use_bn) - self.scratch.refinenet2 = _make_fusion_block(features, use_bn) - self.scratch.refinenet3 = _make_fusion_block(features, use_bn) - self.scratch.refinenet4 = _make_fusion_block(features, use_bn) - - head_features_1 = features - head_features_2 = 32 - - if nclass > 1: - self.scratch.output_conv = nn.Sequential( - nn.Conv2d(head_features_1, head_features_1, kernel_size=3, stride=1, padding=1), - nn.ReLU(True), - nn.Conv2d(head_features_1, nclass, kernel_size=1, stride=1, padding=0), - ) - else: - self.scratch.output_conv1 = nn.Conv2d( - head_features_1, head_features_1 // 2, kernel_size=3, stride=1, padding=1 - ) - - self.scratch.output_conv2 = nn.Sequential( - nn.Conv2d(head_features_1 // 2, head_features_2, kernel_size=3, stride=1, padding=1), - nn.ReLU(True), - nn.Conv2d(head_features_2, 1, kernel_size=1, stride=1, padding=0), - nn.ReLU(True), - nn.Identity(), - ) - - def forward(self, out_features, patch_h, patch_w): - out = [] - for i, x in enumerate(out_features): - if self.use_clstoken: - x, cls_token = x[0], x[1] - readout = cls_token.unsqueeze(1).expand_as(x) - x = self.readout_projects[i](torch.cat((x, readout), -1)) - else: - x = x[0] - - x = x.permute(0, 2, 1).reshape((x.shape[0], x.shape[-1], patch_h, patch_w)) - - x = self.projects[i](x) - x = self.resize_layers[i](x) - - out.append(x) - - layer_1, layer_2, layer_3, layer_4 = out - - layer_1_rn = self.scratch.layer1_rn(layer_1) - layer_2_rn = self.scratch.layer2_rn(layer_2) - layer_3_rn = self.scratch.layer3_rn(layer_3) - layer_4_rn = self.scratch.layer4_rn(layer_4) - - path_4 = self.scratch.refinenet4(layer_4_rn, size=layer_3_rn.shape[2:]) - path_3 = self.scratch.refinenet3(path_4, layer_3_rn, size=layer_2_rn.shape[2:]) - path_2 = self.scratch.refinenet2(path_3, layer_2_rn, size=layer_1_rn.shape[2:]) - path_1 = self.scratch.refinenet1(path_2, layer_1_rn) - - out = self.scratch.output_conv1(path_1) - out = F.interpolate(out, (int(patch_h * 14), int(patch_w * 14)), mode="bilinear", align_corners=True) - out = self.scratch.output_conv2(out) - - return out - - -class DPT_DINOv2(nn.Module): - def __init__( - self, - features, - out_channels, - encoder="vitl", - use_bn=False, - use_clstoken=False, - ): - super(DPT_DINOv2, self).__init__() - - assert encoder in ["vits", "vitb", "vitl"] - - # # in case the Internet connection is not stable, please load the DINOv2 locally - # if use_local: - # self.pretrained = torch.hub.load( - # torchhub_path / "facebookresearch_dinov2_main", - # "dinov2_{:}14".format(encoder), - # source="local", - # pretrained=False, - # ) - # else: - # self.pretrained = torch.hub.load( - # "facebookresearch/dinov2", - # "dinov2_{:}14".format(encoder), - # ) - - self.pretrained = torch.hub.load( - "facebookresearch/dinov2", - "dinov2_{:}14".format(encoder), - ) - - dim = self.pretrained.blocks[0].attn.qkv.in_features - - self.depth_head = DPTHead(1, dim, features, out_channels=out_channels, use_bn=use_bn, use_clstoken=use_clstoken) - - def forward(self, x): - h, w = x.shape[-2:] - - features = self.pretrained.get_intermediate_layers(x, 4, return_class_token=True) - - patch_h, patch_w = h // 14, w // 14 - - depth = self.depth_head(features, patch_h, patch_w) - depth = F.interpolate(depth, size=(h, w), mode="bilinear", align_corners=True) - depth = F.relu(depth) - - return depth.squeeze(1) diff --git a/invokeai/backend/image_util/depth_anything/utilities/util.py b/invokeai/backend/image_util/depth_anything/utilities/util.py deleted file mode 100644 index 5362ef6c3e0..00000000000 --- a/invokeai/backend/image_util/depth_anything/utilities/util.py +++ /dev/null @@ -1,227 +0,0 @@ -import math - -import cv2 -import numpy as np -import torch -import torch.nn.functional as F - - -def apply_min_size(sample, size, image_interpolation_method=cv2.INTER_AREA): - """Rezise the sample to ensure the given size. Keeps aspect ratio. - - Args: - sample (dict): sample - size (tuple): image size - - Returns: - tuple: new size - """ - shape = list(sample["disparity"].shape) - - if shape[0] >= size[0] and shape[1] >= size[1]: - return sample - - scale = [0, 0] - scale[0] = size[0] / shape[0] - scale[1] = size[1] / shape[1] - - scale = max(scale) - - shape[0] = math.ceil(scale * shape[0]) - shape[1] = math.ceil(scale * shape[1]) - - # resize - sample["image"] = cv2.resize(sample["image"], tuple(shape[::-1]), interpolation=image_interpolation_method) - - sample["disparity"] = cv2.resize(sample["disparity"], tuple(shape[::-1]), interpolation=cv2.INTER_NEAREST) - sample["mask"] = cv2.resize( - sample["mask"].astype(np.float32), - tuple(shape[::-1]), - interpolation=cv2.INTER_NEAREST, - ) - sample["mask"] = sample["mask"].astype(bool) - - return tuple(shape) - - -class Resize(object): - """Resize sample to given size (width, height).""" - - def __init__( - self, - width, - height, - resize_target=True, - keep_aspect_ratio=False, - ensure_multiple_of=1, - resize_method="lower_bound", - image_interpolation_method=cv2.INTER_AREA, - ): - """Init. - - Args: - width (int): desired output width - height (int): desired output height - resize_target (bool, optional): - True: Resize the full sample (image, mask, target). - False: Resize image only. - Defaults to True. - keep_aspect_ratio (bool, optional): - True: Keep the aspect ratio of the input sample. - Output sample might not have the given width and height, and - resize behaviour depends on the parameter 'resize_method'. - Defaults to False. - ensure_multiple_of (int, optional): - Output width and height is constrained to be multiple of this parameter. - Defaults to 1. - resize_method (str, optional): - "lower_bound": Output will be at least as large as the given size. - "upper_bound": Output will be at max as large as the given size. (Output size might be smaller - than given size.) - "minimal": Scale as least as possible. (Output size might be smaller than given size.) - Defaults to "lower_bound". - """ - self.__width = width - self.__height = height - - self.__resize_target = resize_target - self.__keep_aspect_ratio = keep_aspect_ratio - self.__multiple_of = ensure_multiple_of - self.__resize_method = resize_method - self.__image_interpolation_method = image_interpolation_method - - def constrain_to_multiple_of(self, x, min_val=0, max_val=None): - y = (np.round(x / self.__multiple_of) * self.__multiple_of).astype(int) - - if max_val is not None and y > max_val: - y = (np.floor(x / self.__multiple_of) * self.__multiple_of).astype(int) - - if y < min_val: - y = (np.ceil(x / self.__multiple_of) * self.__multiple_of).astype(int) - - return y - - def get_size(self, width, height): - # determine new height and width - scale_height = self.__height / height - scale_width = self.__width / width - - if self.__keep_aspect_ratio: - if self.__resize_method == "lower_bound": - # scale such that output size is lower bound - if scale_width > scale_height: - # fit width - scale_height = scale_width - else: - # fit height - scale_width = scale_height - elif self.__resize_method == "upper_bound": - # scale such that output size is upper bound - if scale_width < scale_height: - # fit width - scale_height = scale_width - else: - # fit height - scale_width = scale_height - elif self.__resize_method == "minimal": - # scale as least as possbile - if abs(1 - scale_width) < abs(1 - scale_height): - # fit width - scale_height = scale_width - else: - # fit height - scale_width = scale_height - else: - raise ValueError(f"resize_method {self.__resize_method} not implemented") - - if self.__resize_method == "lower_bound": - new_height = self.constrain_to_multiple_of(scale_height * height, min_val=self.__height) - new_width = self.constrain_to_multiple_of(scale_width * width, min_val=self.__width) - elif self.__resize_method == "upper_bound": - new_height = self.constrain_to_multiple_of(scale_height * height, max_val=self.__height) - new_width = self.constrain_to_multiple_of(scale_width * width, max_val=self.__width) - elif self.__resize_method == "minimal": - new_height = self.constrain_to_multiple_of(scale_height * height) - new_width = self.constrain_to_multiple_of(scale_width * width) - else: - raise ValueError(f"resize_method {self.__resize_method} not implemented") - - return (new_width, new_height) - - def __call__(self, sample): - width, height = self.get_size(sample["image"].shape[1], sample["image"].shape[0]) - - # resize sample - sample["image"] = cv2.resize( - sample["image"], - (width, height), - interpolation=self.__image_interpolation_method, - ) - - if self.__resize_target: - if "disparity" in sample: - sample["disparity"] = cv2.resize( - sample["disparity"], - (width, height), - interpolation=cv2.INTER_NEAREST, - ) - - if "depth" in sample: - sample["depth"] = cv2.resize(sample["depth"], (width, height), interpolation=cv2.INTER_NEAREST) - - if "semseg_mask" in sample: - # sample["semseg_mask"] = cv2.resize( - # sample["semseg_mask"], (width, height), interpolation=cv2.INTER_NEAREST - # ) - sample["semseg_mask"] = F.interpolate( - torch.from_numpy(sample["semseg_mask"]).float()[None, None, ...], (height, width), mode="nearest" - ).numpy()[0, 0] - - if "mask" in sample: - sample["mask"] = cv2.resize( - sample["mask"].astype(np.float32), - (width, height), - interpolation=cv2.INTER_NEAREST, - ) - # sample["mask"] = sample["mask"].astype(bool) - - # print(sample['image'].shape, sample['depth'].shape) - return sample - - -class NormalizeImage(object): - """Normlize image by given mean and std.""" - - def __init__(self, mean, std): - self.__mean = mean - self.__std = std - - def __call__(self, sample): - sample["image"] = (sample["image"] - self.__mean) / self.__std - - return sample - - -class PrepareForNet(object): - """Prepare sample for usage as network input.""" - - def __init__(self): - pass - - def __call__(self, sample): - image = np.transpose(sample["image"], (2, 0, 1)) - sample["image"] = np.ascontiguousarray(image).astype(np.float32) - - if "mask" in sample: - sample["mask"] = sample["mask"].astype(np.float32) - sample["mask"] = np.ascontiguousarray(sample["mask"]) - - if "depth" in sample: - depth = sample["depth"].astype(np.float32) - sample["depth"] = np.ascontiguousarray(depth) - - if "semseg_mask" in sample: - sample["semseg_mask"] = sample["semseg_mask"].astype(np.float32) - sample["semseg_mask"] = np.ascontiguousarray(sample["semseg_mask"]) - - return sample diff --git a/invokeai/backend/image_util/grounding_dino/__init__.py b/invokeai/backend/image_util/grounding_dino/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/invokeai/backend/image_util/grounding_dino/detection_result.py b/invokeai/backend/image_util/grounding_dino/detection_result.py new file mode 100644 index 00000000000..2d0c78e6812 --- /dev/null +++ b/invokeai/backend/image_util/grounding_dino/detection_result.py @@ -0,0 +1,22 @@ +from pydantic import BaseModel, ConfigDict + + +class BoundingBox(BaseModel): + """Bounding box helper class.""" + + xmin: int + ymin: int + xmax: int + ymax: int + + +class DetectionResult(BaseModel): + """Detection result from Grounding DINO.""" + + score: float + label: str + box: BoundingBox + model_config = ConfigDict( + # Allow arbitrary types for mask, since it will be a numpy array. + arbitrary_types_allowed=True + ) diff --git a/invokeai/backend/image_util/grounding_dino/grounding_dino_pipeline.py b/invokeai/backend/image_util/grounding_dino/grounding_dino_pipeline.py new file mode 100644 index 00000000000..772e8c0dd85 --- /dev/null +++ b/invokeai/backend/image_util/grounding_dino/grounding_dino_pipeline.py @@ -0,0 +1,37 @@ +from typing import Optional + +import torch +from PIL import Image +from transformers.pipelines import ZeroShotObjectDetectionPipeline + +from invokeai.backend.image_util.grounding_dino.detection_result import DetectionResult +from invokeai.backend.raw_model import RawModel + + +class GroundingDinoPipeline(RawModel): + """A wrapper class for a ZeroShotObjectDetectionPipeline that makes it compatible with the model manager's memory + management system. + """ + + def __init__(self, pipeline: ZeroShotObjectDetectionPipeline): + self._pipeline = pipeline + + def detect(self, image: Image.Image, candidate_labels: list[str], threshold: float = 0.1) -> list[DetectionResult]: + results = self._pipeline(image=image, candidate_labels=candidate_labels, threshold=threshold) + assert results is not None + results = [DetectionResult.model_validate(result) for result in results] + return results + + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None): + # HACK(ryand): The GroundingDinoPipeline does not work on MPS devices. We only allow it to be moved to CPU or + # CUDA. + if device is not None and device.type not in {"cpu", "cuda"}: + device = None + self._pipeline.model.to(device=device, dtype=dtype) + self._pipeline.device = self._pipeline.model.device + + def calc_size(self) -> int: + # HACK(ryand): Fix the circular import issue. + from invokeai.backend.model_manager.load.model_util import calc_module_size + + return calc_module_size(self._pipeline.model) diff --git a/invokeai/backend/image_util/segment_anything/__init__.py b/invokeai/backend/image_util/segment_anything/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/invokeai/backend/image_util/segment_anything/mask_refinement.py b/invokeai/backend/image_util/segment_anything/mask_refinement.py new file mode 100644 index 00000000000..2c8cf077d1c --- /dev/null +++ b/invokeai/backend/image_util/segment_anything/mask_refinement.py @@ -0,0 +1,50 @@ +# This file contains utilities for Grounded-SAM mask refinement based on: +# https://github.com/NielsRogge/Transformers-Tutorials/blob/a39f33ac1557b02ebfb191ea7753e332b5ca933f/Grounding%20DINO/GroundingDINO_with_Segment_Anything.ipynb + + +import cv2 +import numpy as np +import numpy.typing as npt + + +def mask_to_polygon(mask: npt.NDArray[np.uint8]) -> list[tuple[int, int]]: + """Convert a binary mask to a polygon. + + Returns: + list[list[int]]: List of (x, y) coordinates representing the vertices of the polygon. + """ + # Find contours in the binary mask. + contours, _ = cv2.findContours(mask.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + + # Find the contour with the largest area. + largest_contour = max(contours, key=cv2.contourArea) + + # Extract the vertices of the contour. + polygon = largest_contour.reshape(-1, 2).tolist() + + return polygon + + +def polygon_to_mask( + polygon: list[tuple[int, int]], image_shape: tuple[int, int], fill_value: int = 1 +) -> npt.NDArray[np.uint8]: + """Convert a polygon to a segmentation mask. + + Args: + polygon (list): List of (x, y) coordinates representing the vertices of the polygon. + image_shape (tuple): Shape of the image (height, width) for the mask. + fill_value (int): Value to fill the polygon with. + + Returns: + np.ndarray: Segmentation mask with the polygon filled (with value 255). + """ + # Create an empty mask. + mask = np.zeros(image_shape, dtype=np.uint8) + + # Convert polygon to an array of points. + pts = np.array(polygon, dtype=np.int32) + + # Fill the polygon with white color (255). + cv2.fillPoly(mask, [pts], color=(fill_value,)) + + return mask diff --git a/invokeai/backend/image_util/segment_anything/segment_anything_pipeline.py b/invokeai/backend/image_util/segment_anything/segment_anything_pipeline.py new file mode 100644 index 00000000000..0818fb2fbd0 --- /dev/null +++ b/invokeai/backend/image_util/segment_anything/segment_anything_pipeline.py @@ -0,0 +1,53 @@ +from typing import Optional + +import torch +from PIL import Image +from transformers.models.sam import SamModel +from transformers.models.sam.processing_sam import SamProcessor + +from invokeai.backend.raw_model import RawModel + + +class SegmentAnythingPipeline(RawModel): + """A wrapper class for the transformers SAM model and processor that makes it compatible with the model manager.""" + + def __init__(self, sam_model: SamModel, sam_processor: SamProcessor): + self._sam_model = sam_model + self._sam_processor = sam_processor + + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None): + # HACK(ryand): The SAM pipeline does not work on MPS devices. We only allow it to be moved to CPU or CUDA. + if device is not None and device.type not in {"cpu", "cuda"}: + device = None + self._sam_model.to(device=device, dtype=dtype) + + def calc_size(self) -> int: + # HACK(ryand): Fix the circular import issue. + from invokeai.backend.model_manager.load.model_util import calc_module_size + + return calc_module_size(self._sam_model) + + def segment(self, image: Image.Image, bounding_boxes: list[list[int]]) -> torch.Tensor: + """Run the SAM model. + + Args: + image (Image.Image): The image to segment. + bounding_boxes (list[list[int]]): The bounding box prompts. Each bounding box is in the format + [xmin, ymin, xmax, ymax]. + + Returns: + torch.Tensor: The segmentation masks. dtype: torch.bool. shape: [num_masks, channels, height, width]. + """ + # Add batch dimension of 1 to the bounding boxes. + boxes = [bounding_boxes] + inputs = self._sam_processor(images=image, input_boxes=boxes, return_tensors="pt").to(self._sam_model.device) + outputs = self._sam_model(**inputs) + masks = self._sam_processor.post_process_masks( + masks=outputs.pred_masks, + original_sizes=inputs.original_sizes, + reshaped_input_sizes=inputs.reshaped_input_sizes, + ) + + # There should be only one batch. + assert len(masks) == 1 + return masks[0] diff --git a/invokeai/backend/lora.py b/invokeai/backend/lora.py index 8ef81915f14..b0366cc6ceb 100644 --- a/invokeai/backend/lora.py +++ b/invokeai/backend/lora.py @@ -3,12 +3,13 @@ import bisect from pathlib import Path -from typing import Dict, List, Optional, Tuple, Union +from typing import Dict, List, Optional, Set, Tuple, Union import torch from safetensors.torch import load_file from typing_extensions import Self +import invokeai.backend.util.logging as logger from invokeai.backend.model_manager import BaseModelType from invokeai.backend.raw_model import RawModel @@ -46,9 +47,19 @@ def __init__( self.rank = None # set in layer implementation self.layer_key = layer_key - def get_weight(self, orig_weight: Optional[torch.Tensor]) -> torch.Tensor: + def get_weight(self, orig_weight: torch.Tensor) -> torch.Tensor: raise NotImplementedError() + def get_bias(self, orig_bias: torch.Tensor) -> Optional[torch.Tensor]: + return self.bias + + def get_parameters(self, orig_module: torch.nn.Module) -> Dict[str, torch.Tensor]: + params = {"weight": self.get_weight(orig_module.weight)} + bias = self.get_bias(orig_module.bias) + if bias is not None: + params["bias"] = bias + return params + def calc_size(self) -> int: model_size = 0 for val in [self.bias]: @@ -60,6 +71,17 @@ def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] if self.bias is not None: self.bias = self.bias.to(device=device, dtype=dtype) + def check_keys(self, values: Dict[str, torch.Tensor], known_keys: Set[str]): + """Log a warning if values contains unhandled keys.""" + # {"alpha", "bias_indices", "bias_values", "bias_size"} are hard-coded, because they are handled by + # `LoRALayerBase`. Sub-classes should provide the known_keys that they handled. + all_known_keys = known_keys | {"alpha", "bias_indices", "bias_values", "bias_size"} + unknown_keys = set(values.keys()) - all_known_keys + if unknown_keys: + logger.warning( + f"Unexpected keys found in LoRA/LyCORIS layer, model might work incorrectly! Keys: {unknown_keys}" + ) + # TODO: find and debug lora/locon with bias class LoRALayer(LoRALayerBase): @@ -76,14 +98,19 @@ def __init__( self.up = values["lora_up.weight"] self.down = values["lora_down.weight"] - if "lora_mid.weight" in values: - self.mid: Optional[torch.Tensor] = values["lora_mid.weight"] - else: - self.mid = None + self.mid = values.get("lora_mid.weight", None) self.rank = self.down.shape[0] + self.check_keys( + values, + { + "lora_up.weight", + "lora_down.weight", + "lora_mid.weight", + }, + ) - def get_weight(self, orig_weight: Optional[torch.Tensor]) -> torch.Tensor: + def get_weight(self, orig_weight: torch.Tensor) -> torch.Tensor: if self.mid is not None: up = self.up.reshape(self.up.shape[0], self.up.shape[1]) down = self.down.reshape(self.down.shape[0], self.down.shape[1]) @@ -125,20 +152,23 @@ def __init__(self, layer_key: str, values: Dict[str, torch.Tensor]): self.w1_b = values["hada_w1_b"] self.w2_a = values["hada_w2_a"] self.w2_b = values["hada_w2_b"] - - if "hada_t1" in values: - self.t1: Optional[torch.Tensor] = values["hada_t1"] - else: - self.t1 = None - - if "hada_t2" in values: - self.t2: Optional[torch.Tensor] = values["hada_t2"] - else: - self.t2 = None + self.t1 = values.get("hada_t1", None) + self.t2 = values.get("hada_t2", None) self.rank = self.w1_b.shape[0] + self.check_keys( + values, + { + "hada_w1_a", + "hada_w1_b", + "hada_w2_a", + "hada_w2_b", + "hada_t1", + "hada_t2", + }, + ) - def get_weight(self, orig_weight: Optional[torch.Tensor]) -> torch.Tensor: + def get_weight(self, orig_weight: torch.Tensor) -> torch.Tensor: if self.t1 is None: weight: torch.Tensor = (self.w1_a @ self.w1_b) * (self.w2_a @ self.w2_b) @@ -186,37 +216,45 @@ def __init__( ): super().__init__(layer_key, values) - if "lokr_w1" in values: - self.w1: Optional[torch.Tensor] = values["lokr_w1"] - self.w1_a = None - self.w1_b = None - else: - self.w1 = None + self.w1 = values.get("lokr_w1", None) + if self.w1 is None: self.w1_a = values["lokr_w1_a"] self.w1_b = values["lokr_w1_b"] - - if "lokr_w2" in values: - self.w2: Optional[torch.Tensor] = values["lokr_w2"] - self.w2_a = None - self.w2_b = None else: - self.w2 = None + self.w1_b = None + self.w1_a = None + + self.w2 = values.get("lokr_w2", None) + if self.w2 is None: self.w2_a = values["lokr_w2_a"] self.w2_b = values["lokr_w2_b"] - - if "lokr_t2" in values: - self.t2: Optional[torch.Tensor] = values["lokr_t2"] else: - self.t2 = None + self.w2_a = None + self.w2_b = None - if "lokr_w1_b" in values: - self.rank = values["lokr_w1_b"].shape[0] - elif "lokr_w2_b" in values: - self.rank = values["lokr_w2_b"].shape[0] + self.t2 = values.get("lokr_t2", None) + + if self.w1_b is not None: + self.rank = self.w1_b.shape[0] + elif self.w2_b is not None: + self.rank = self.w2_b.shape[0] else: self.rank = None # unscaled - def get_weight(self, orig_weight: Optional[torch.Tensor]) -> torch.Tensor: + self.check_keys( + values, + { + "lokr_w1", + "lokr_w1_a", + "lokr_w1_b", + "lokr_w2", + "lokr_w2_a", + "lokr_w2_b", + "lokr_t2", + }, + ) + + def get_weight(self, orig_weight: torch.Tensor) -> torch.Tensor: w1: Optional[torch.Tensor] = self.w1 if w1 is None: assert self.w1_a is not None @@ -272,7 +310,9 @@ def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] class FullLayer(LoRALayerBase): + # bias handled in LoRALayerBase(calc_size, to) # weight: torch.Tensor + # bias: Optional[torch.Tensor] def __init__( self, @@ -282,15 +322,12 @@ def __init__( super().__init__(layer_key, values) self.weight = values["diff"] - - if len(values.keys()) > 1: - _keys = list(values.keys()) - _keys.remove("diff") - raise NotImplementedError(f"Unexpected keys in lora diff layer: {_keys}") + self.bias = values.get("diff_b", None) self.rank = None # unscaled + self.check_keys(values, {"diff", "diff_b"}) - def get_weight(self, orig_weight: Optional[torch.Tensor]) -> torch.Tensor: + def get_weight(self, orig_weight: torch.Tensor) -> torch.Tensor: return self.weight def calc_size(self) -> int: @@ -319,8 +356,9 @@ def __init__( self.on_input = values["on_input"] self.rank = None # unscaled + self.check_keys(values, {"weight", "on_input"}) - def get_weight(self, orig_weight: Optional[torch.Tensor]) -> torch.Tensor: + def get_weight(self, orig_weight: torch.Tensor) -> torch.Tensor: weight = self.weight if not self.on_input: weight = weight.reshape(-1, 1) @@ -340,7 +378,39 @@ def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] self.on_input = self.on_input.to(device=device, dtype=dtype) -AnyLoRALayer = Union[LoRALayer, LoHALayer, LoKRLayer, FullLayer, IA3Layer] +class NormLayer(LoRALayerBase): + # bias handled in LoRALayerBase(calc_size, to) + # weight: torch.Tensor + # bias: Optional[torch.Tensor] + + def __init__( + self, + layer_key: str, + values: Dict[str, torch.Tensor], + ): + super().__init__(layer_key, values) + + self.weight = values["w_norm"] + self.bias = values.get("b_norm", None) + + self.rank = None # unscaled + self.check_keys(values, {"w_norm", "b_norm"}) + + def get_weight(self, orig_weight: torch.Tensor) -> torch.Tensor: + return self.weight + + def calc_size(self) -> int: + model_size = super().calc_size() + model_size += self.weight.nelement() * self.weight.element_size() + return model_size + + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None) -> None: + super().to(device=device, dtype=dtype) + + self.weight = self.weight.to(device=device, dtype=dtype) + + +AnyLoRALayer = Union[LoRALayer, LoHALayer, LoKRLayer, FullLayer, IA3Layer, NormLayer] class LoRAModelRaw(RawModel): # (torch.nn.Module): @@ -458,16 +528,19 @@ def from_checkpoint( state_dict = cls._convert_sdxl_keys_to_diffusers_format(state_dict) for layer_key, values in state_dict.items(): + # Detect layers according to LyCORIS detection logic(`weight_list_det`) + # https://github.com/KohakuBlueleaf/LyCORIS/tree/8ad8000efb79e2b879054da8c9356e6143591bad/lycoris/modules + # lora and locon - if "lora_down.weight" in values: + if "lora_up.weight" in values: layer: AnyLoRALayer = LoRALayer(layer_key, values) # loha - elif "hada_w1_b" in values: + elif "hada_w1_a" in values: layer = LoHALayer(layer_key, values) # lokr - elif "lokr_w1_b" in values or "lokr_w1" in values: + elif "lokr_w1" in values or "lokr_w1_a" in values: layer = LoKRLayer(layer_key, values) # diff @@ -475,9 +548,13 @@ def from_checkpoint( layer = FullLayer(layer_key, values) # ia3 - elif "weight" in values and "on_input" in values: + elif "on_input" in values: layer = IA3Layer(layer_key, values) + # norms + elif "w_norm" in values: + layer = NormLayer(layer_key, values) + else: print(f">> Encountered unknown lora layer module in {model.name}: {layer_key} - {list(values.keys())}") raise Exception("Unknown lora format!") diff --git a/invokeai/backend/model_manager/config.py b/invokeai/backend/model_manager/config.py index f6cc5929c80..332ac6c8faf 100644 --- a/invokeai/backend/model_manager/config.py +++ b/invokeai/backend/model_manager/config.py @@ -354,7 +354,7 @@ class CLIPVisionDiffusersConfig(DiffusersConfigBase): """Model config for CLIPVision.""" type: Literal[ModelType.CLIPVision] = ModelType.CLIPVision - format: Literal[ModelFormat.Diffusers] + format: Literal[ModelFormat.Diffusers] = ModelFormat.Diffusers @staticmethod def get_tag() -> Tag: @@ -365,7 +365,7 @@ class T2IAdapterConfig(DiffusersConfigBase, ControlAdapterConfigBase): """Model config for T2I.""" type: Literal[ModelType.T2IAdapter] = ModelType.T2IAdapter - format: Literal[ModelFormat.Diffusers] + format: Literal[ModelFormat.Diffusers] = ModelFormat.Diffusers @staticmethod def get_tag() -> Tag: diff --git a/invokeai/backend/model_manager/load/model_loaders/stable_diffusion.py b/invokeai/backend/model_manager/load/model_loaders/stable_diffusion.py index d90352f0e61..33ce4abc4d4 100644 --- a/invokeai/backend/model_manager/load/model_loaders/stable_diffusion.py +++ b/invokeai/backend/model_manager/load/model_loaders/stable_diffusion.py @@ -98,6 +98,9 @@ def _load_from_singlefile( ModelVariantType.Normal: StableDiffusionXLPipeline, ModelVariantType.Inpaint: StableDiffusionXLInpaintPipeline, }, + BaseModelType.StableDiffusionXLRefiner: { + ModelVariantType.Normal: StableDiffusionXLPipeline, + }, } assert isinstance(config, MainCheckpointConfig) try: diff --git a/invokeai/backend/model_manager/load/model_util.py b/invokeai/backend/model_manager/load/model_util.py index f070a429651..bc612043e34 100644 --- a/invokeai/backend/model_manager/load/model_util.py +++ b/invokeai/backend/model_manager/load/model_util.py @@ -11,6 +11,9 @@ from diffusers.schedulers.scheduling_utils import SchedulerMixin from transformers import CLIPTokenizer +from invokeai.backend.image_util.depth_anything.depth_anything_pipeline import DepthAnythingPipeline +from invokeai.backend.image_util.grounding_dino.grounding_dino_pipeline import GroundingDinoPipeline +from invokeai.backend.image_util.segment_anything.segment_anything_pipeline import SegmentAnythingPipeline from invokeai.backend.ip_adapter.ip_adapter import IPAdapter from invokeai.backend.lora import LoRAModelRaw from invokeai.backend.model_manager.config import AnyModel @@ -34,7 +37,18 @@ def calc_model_size_by_data(logger: logging.Logger, model: AnyModel) -> int: elif isinstance(model, CLIPTokenizer): # TODO(ryand): Accurately calculate the tokenizer's size. It's small enough that it shouldn't matter for now. return 0 - elif isinstance(model, (TextualInversionModelRaw, IPAdapter, LoRAModelRaw, SpandrelImageToImageModel)): + elif isinstance( + model, + ( + TextualInversionModelRaw, + IPAdapter, + LoRAModelRaw, + SpandrelImageToImageModel, + GroundingDinoPipeline, + SegmentAnythingPipeline, + DepthAnythingPipeline, + ), + ): return model.calc_size() else: # TODO(ryand): Promote this from a log to an exception once we are confident that we are handling all of the diff --git a/invokeai/backend/model_manager/starter_models.py b/invokeai/backend/model_manager/starter_models.py index e1526392f67..c460a5e86e6 100644 --- a/invokeai/backend/model_manager/starter_models.py +++ b/invokeai/backend/model_manager/starter_models.py @@ -187,164 +187,171 @@ class StarterModel(StarterModelWithoutDependencies): # endregion # region ControlNet StarterModel( - name="QRCode Monster", + name="QRCode Monster v2 (SD1.5)", base=BaseModelType.StableDiffusion1, - source="monster-labs/control_v1p_sd15_qrcode_monster", - description="Controlnet model that generates scannable creative QR codes", + source="monster-labs/control_v1p_sd15_qrcode_monster::v2", + description="ControlNet model that generates scannable creative QR codes", + type=ModelType.ControlNet, + ), + StarterModel( + name="QRCode Monster (SDXL)", + base=BaseModelType.StableDiffusionXL, + source="monster-labs/control_v1p_sdxl_qrcode_monster", + description="ControlNet model that generates scannable creative QR codes", type=ModelType.ControlNet, ), StarterModel( name="canny", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11p_sd15_canny", - description="Controlnet weights trained on sd-1.5 with canny conditioning.", + description="ControlNet weights trained on sd-1.5 with canny conditioning.", type=ModelType.ControlNet, ), StarterModel( name="inpaint", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11p_sd15_inpaint", - description="Controlnet weights trained on sd-1.5 with canny conditioning, inpaint version", + description="ControlNet weights trained on sd-1.5 with canny conditioning, inpaint version", type=ModelType.ControlNet, ), StarterModel( name="mlsd", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11p_sd15_mlsd", - description="Controlnet weights trained on sd-1.5 with canny conditioning, MLSD version", + description="ControlNet weights trained on sd-1.5 with canny conditioning, MLSD version", type=ModelType.ControlNet, ), StarterModel( name="depth", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11f1p_sd15_depth", - description="Controlnet weights trained on sd-1.5 with depth conditioning", + description="ControlNet weights trained on sd-1.5 with depth conditioning", type=ModelType.ControlNet, ), StarterModel( name="normal_bae", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11p_sd15_normalbae", - description="Controlnet weights trained on sd-1.5 with normalbae image conditioning", + description="ControlNet weights trained on sd-1.5 with normalbae image conditioning", type=ModelType.ControlNet, ), StarterModel( name="seg", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11p_sd15_seg", - description="Controlnet weights trained on sd-1.5 with seg image conditioning", + description="ControlNet weights trained on sd-1.5 with seg image conditioning", type=ModelType.ControlNet, ), StarterModel( name="lineart", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11p_sd15_lineart", - description="Controlnet weights trained on sd-1.5 with lineart image conditioning", + description="ControlNet weights trained on sd-1.5 with lineart image conditioning", type=ModelType.ControlNet, ), StarterModel( name="lineart_anime", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11p_sd15s2_lineart_anime", - description="Controlnet weights trained on sd-1.5 with anime image conditioning", + description="ControlNet weights trained on sd-1.5 with anime image conditioning", type=ModelType.ControlNet, ), StarterModel( name="openpose", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11p_sd15_openpose", - description="Controlnet weights trained on sd-1.5 with openpose image conditioning", + description="ControlNet weights trained on sd-1.5 with openpose image conditioning", type=ModelType.ControlNet, ), StarterModel( name="scribble", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11p_sd15_scribble", - description="Controlnet weights trained on sd-1.5 with scribble image conditioning", + description="ControlNet weights trained on sd-1.5 with scribble image conditioning", type=ModelType.ControlNet, ), StarterModel( name="softedge", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11p_sd15_softedge", - description="Controlnet weights trained on sd-1.5 with soft edge conditioning", + description="ControlNet weights trained on sd-1.5 with soft edge conditioning", type=ModelType.ControlNet, ), StarterModel( name="shuffle", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11e_sd15_shuffle", - description="Controlnet weights trained on sd-1.5 with shuffle image conditioning", + description="ControlNet weights trained on sd-1.5 with shuffle image conditioning", type=ModelType.ControlNet, ), StarterModel( name="tile", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11f1e_sd15_tile", - description="Controlnet weights trained on sd-1.5 with tiled image conditioning", + description="ControlNet weights trained on sd-1.5 with tiled image conditioning", type=ModelType.ControlNet, ), StarterModel( name="ip2p", base=BaseModelType.StableDiffusion1, source="lllyasviel/control_v11e_sd15_ip2p", - description="Controlnet weights trained on sd-1.5 with ip2p conditioning.", + description="ControlNet weights trained on sd-1.5 with ip2p conditioning.", type=ModelType.ControlNet, ), StarterModel( name="canny-sdxl", base=BaseModelType.StableDiffusionXL, - source="xinsir/controlnet-canny-sdxl-1.0", - description="Controlnet weights trained on sdxl-1.0 with canny conditioning, by Xinsir.", + source="xinsir/controlNet-canny-sdxl-1.0", + description="ControlNet weights trained on sdxl-1.0 with canny conditioning, by Xinsir.", type=ModelType.ControlNet, ), StarterModel( name="depth-sdxl", base=BaseModelType.StableDiffusionXL, - source="diffusers/controlnet-depth-sdxl-1.0", - description="Controlnet weights trained on sdxl-1.0 with depth conditioning.", + source="diffusers/controlNet-depth-sdxl-1.0", + description="ControlNet weights trained on sdxl-1.0 with depth conditioning.", type=ModelType.ControlNet, ), StarterModel( name="softedge-dexined-sdxl", base=BaseModelType.StableDiffusionXL, - source="SargeZT/controlnet-sd-xl-1.0-softedge-dexined", - description="Controlnet weights trained on sdxl-1.0 with dexined soft edge preprocessing.", + source="SargeZT/controlNet-sd-xl-1.0-softedge-dexined", + description="ControlNet weights trained on sdxl-1.0 with dexined soft edge preprocessing.", type=ModelType.ControlNet, ), StarterModel( name="depth-16bit-zoe-sdxl", base=BaseModelType.StableDiffusionXL, - source="SargeZT/controlnet-sd-xl-1.0-depth-16bit-zoe", - description="Controlnet weights trained on sdxl-1.0 with Zoe's preprocessor (16 bits).", + source="SargeZT/controlNet-sd-xl-1.0-depth-16bit-zoe", + description="ControlNet weights trained on sdxl-1.0 with Zoe's preprocessor (16 bits).", type=ModelType.ControlNet, ), StarterModel( name="depth-zoe-sdxl", base=BaseModelType.StableDiffusionXL, - source="diffusers/controlnet-zoe-depth-sdxl-1.0", - description="Controlnet weights trained on sdxl-1.0 with Zoe's preprocessor (32 bits).", + source="diffusers/controlNet-zoe-depth-sdxl-1.0", + description="ControlNet weights trained on sdxl-1.0 with Zoe's preprocessor (32 bits).", type=ModelType.ControlNet, ), StarterModel( name="openpose-sdxl", base=BaseModelType.StableDiffusionXL, - source="xinsir/controlnet-openpose-sdxl-1.0", - description="Controlnet weights trained on sdxl-1.0 compatible with the DWPose processor by Xinsir.", + source="xinsir/controlNet-openpose-sdxl-1.0", + description="ControlNet weights trained on sdxl-1.0 compatible with the DWPose processor by Xinsir.", type=ModelType.ControlNet, ), StarterModel( name="scribble-sdxl", base=BaseModelType.StableDiffusionXL, - source="xinsir/controlnet-scribble-sdxl-1.0", - description="Controlnet weights trained on sdxl-1.0 compatible with various lineart processors and black/white sketches by Xinsir.", + source="xinsir/controlNet-scribble-sdxl-1.0", + description="ControlNet weights trained on sdxl-1.0 compatible with various lineart processors and black/white sketches by Xinsir.", type=ModelType.ControlNet, ), StarterModel( name="tile-sdxl", base=BaseModelType.StableDiffusionXL, - source="xinsir/controlnet-tile-sdxl-1.0", - description="Controlnet weights trained on sdxl-1.0 with tiled image conditioning", + source="xinsir/controlNet-tile-sdxl-1.0", + description="ControlNet weights trained on sdxl-1.0 with tiled image conditioning", type=ModelType.ControlNet, ), # endregion diff --git a/invokeai/backend/model_patcher.py b/invokeai/backend/model_patcher.py index d30f7b31673..e2f22ba019c 100644 --- a/invokeai/backend/model_patcher.py +++ b/invokeai/backend/model_patcher.py @@ -17,8 +17,9 @@ from invokeai.backend.model_manager import AnyModel from invokeai.backend.model_manager.load.optimizations import skip_torch_weight_init from invokeai.backend.onnx.onnx_runtime import IAIOnnxRuntimeModel +from invokeai.backend.stable_diffusion.extensions.lora import LoRAExt from invokeai.backend.textual_inversion import TextualInversionManager, TextualInversionModelRaw -from invokeai.backend.util.devices import TorchDevice +from invokeai.backend.util.original_weights_storage import OriginalWeightsStorage """ loras = [ @@ -85,13 +86,13 @@ def apply_lora_unet( cls, unet: UNet2DConditionModel, loras: Iterator[Tuple[LoRAModelRaw, float]], - model_state_dict: Optional[Dict[str, torch.Tensor]] = None, + cached_weights: Optional[Dict[str, torch.Tensor]] = None, ) -> Generator[None, None, None]: with cls.apply_lora( unet, loras=loras, prefix="lora_unet_", - model_state_dict=model_state_dict, + cached_weights=cached_weights, ): yield @@ -101,9 +102,9 @@ def apply_lora_text_encoder( cls, text_encoder: CLIPTextModel, loras: Iterator[Tuple[LoRAModelRaw, float]], - model_state_dict: Optional[Dict[str, torch.Tensor]] = None, + cached_weights: Optional[Dict[str, torch.Tensor]] = None, ) -> Generator[None, None, None]: - with cls.apply_lora(text_encoder, loras=loras, prefix="lora_te_", model_state_dict=model_state_dict): + with cls.apply_lora(text_encoder, loras=loras, prefix="lora_te_", cached_weights=cached_weights): yield @classmethod @@ -113,7 +114,7 @@ def apply_lora( model: AnyModel, loras: Iterator[Tuple[LoRAModelRaw, float]], prefix: str, - model_state_dict: Optional[Dict[str, torch.Tensor]] = None, + cached_weights: Optional[Dict[str, torch.Tensor]] = None, ) -> Generator[None, None, None]: """ Apply one or more LoRAs to a model. @@ -121,66 +122,26 @@ def apply_lora( :param model: The model to patch. :param loras: An iterator that returns the LoRA to patch in and its patch weight. :param prefix: A string prefix that precedes keys used in the LoRAs weight layers. - :model_state_dict: Read-only copy of the model's state dict in CPU, for unpatching purposes. + :cached_weights: Read-only copy of the model's state dict in CPU, for unpatching purposes. """ - original_weights = {} + original_weights = OriginalWeightsStorage(cached_weights) try: - with torch.no_grad(): - for lora, lora_weight in loras: - # assert lora.device.type == "cpu" - for layer_key, layer in lora.layers.items(): - if not layer_key.startswith(prefix): - continue - - # TODO(ryand): A non-negligible amount of time is currently spent resolving LoRA keys. This - # should be improved in the following ways: - # 1. The key mapping could be more-efficiently pre-computed. This would save time every time a - # LoRA model is applied. - # 2. From an API perspective, there's no reason that the `ModelPatcher` should be aware of the - # intricacies of Stable Diffusion key resolution. It should just expect the input LoRA - # weights to have valid keys. - assert isinstance(model, torch.nn.Module) - module_key, module = cls._resolve_lora_key(model, layer_key, prefix) - - # All of the LoRA weight calculations will be done on the same device as the module weight. - # (Performance will be best if this is a CUDA device.) - device = module.weight.device - dtype = module.weight.dtype - - if module_key not in original_weights: - if model_state_dict is not None: # we were provided with the CPU copy of the state dict - original_weights[module_key] = model_state_dict[module_key + ".weight"] - else: - original_weights[module_key] = module.weight.detach().to(device="cpu", copy=True) - - layer_scale = layer.alpha / layer.rank if (layer.alpha and layer.rank) else 1.0 - - # We intentionally move to the target device first, then cast. Experimentally, this was found to - # be significantly faster for 16-bit CPU tensors being moved to a CUDA device than doing the - # same thing in a single call to '.to(...)'. - layer.to(device=device) - layer.to(dtype=torch.float32) - # TODO(ryand): Using torch.autocast(...) over explicit casting may offer a speed benefit on CUDA - # devices here. Experimentally, it was found to be very slow on CPU. More investigation needed. - layer_weight = layer.get_weight(module.weight) * (lora_weight * layer_scale) - layer.to(device=TorchDevice.CPU_DEVICE) - - assert isinstance(layer_weight, torch.Tensor) # mypy thinks layer_weight is a float|Any ??! - if module.weight.shape != layer_weight.shape: - # TODO: debug on lycoris - assert hasattr(layer_weight, "reshape") - layer_weight = layer_weight.reshape(module.weight.shape) - - assert isinstance(layer_weight, torch.Tensor) # mypy thinks layer_weight is a float|Any ??! - module.weight += layer_weight.to(dtype=dtype) - - yield # wait for context manager exit + for lora_model, lora_weight in loras: + LoRAExt.patch_model( + model=model, + prefix=prefix, + lora=lora_model, + lora_weight=lora_weight, + original_weights=original_weights, + ) + del lora_model + + yield finally: - assert hasattr(model, "get_submodule") # mypy not picking up fact that torch.nn.Module has get_submodule() with torch.no_grad(): - for module_key, weight in original_weights.items(): - model.get_submodule(module_key).weight.copy_(weight) + for param_key, weight in original_weights.get_changed_weights(): + model.get_parameter(param_key).copy_(weight) @classmethod @contextmanager diff --git a/invokeai/backend/stable_diffusion/__init__.py b/invokeai/backend/stable_diffusion/__init__.py index 440cb4410ba..6a6f2ebc49c 100644 --- a/invokeai/backend/stable_diffusion/__init__.py +++ b/invokeai/backend/stable_diffusion/__init__.py @@ -7,11 +7,9 @@ StableDiffusionGeneratorPipeline, ) from invokeai.backend.stable_diffusion.diffusion import InvokeAIDiffuserComponent # noqa: F401 -from invokeai.backend.stable_diffusion.seamless import set_seamless # noqa: F401 __all__ = [ "PipelineIntermediateState", "StableDiffusionGeneratorPipeline", "InvokeAIDiffuserComponent", - "set_seamless", ] diff --git a/invokeai/backend/stable_diffusion/extensions/base.py b/invokeai/backend/stable_diffusion/extensions/base.py index 820d5d32a37..a3d27464a0c 100644 --- a/invokeai/backend/stable_diffusion/extensions/base.py +++ b/invokeai/backend/stable_diffusion/extensions/base.py @@ -2,14 +2,14 @@ from contextlib import contextmanager from dataclasses import dataclass -from typing import TYPE_CHECKING, Callable, Dict, List, Optional +from typing import TYPE_CHECKING, Callable, Dict, List -import torch from diffusers import UNet2DConditionModel if TYPE_CHECKING: from invokeai.backend.stable_diffusion.denoise_context import DenoiseContext from invokeai.backend.stable_diffusion.extension_callback_type import ExtensionCallbackType + from invokeai.backend.util.original_weights_storage import OriginalWeightsStorage @dataclass @@ -56,5 +56,17 @@ def patch_extension(self, ctx: DenoiseContext): yield None @contextmanager - def patch_unet(self, unet: UNet2DConditionModel, cached_weights: Optional[Dict[str, torch.Tensor]] = None): - yield None + def patch_unet(self, unet: UNet2DConditionModel, original_weights: OriginalWeightsStorage): + """A context manager for applying patches to the UNet model. The context manager's lifetime spans the entire + diffusion process. Weight unpatching is handled upstream, and is achieved by saving unchanged weights by + `original_weights.save` function. Note that this enables some performance optimization by avoiding redundant + operations. All other patches (e.g. changes to tensor shapes, function monkey-patches, etc.) should be unpatched + by this context manager. + + Args: + unet (UNet2DConditionModel): The UNet model on execution device to patch. + original_weights (OriginalWeightsStorage): A storage with copy of the model's original weights in CPU, for + unpatching purposes. Extension should save tensor which being modified in this storage, also extensions + can access original weights values. + """ + yield diff --git a/invokeai/backend/stable_diffusion/extensions/freeu.py b/invokeai/backend/stable_diffusion/extensions/freeu.py index 6ec4fea3fa6..ff54e1a52f6 100644 --- a/invokeai/backend/stable_diffusion/extensions/freeu.py +++ b/invokeai/backend/stable_diffusion/extensions/freeu.py @@ -1,15 +1,15 @@ from __future__ import annotations from contextlib import contextmanager -from typing import TYPE_CHECKING, Dict, Optional +from typing import TYPE_CHECKING -import torch from diffusers import UNet2DConditionModel from invokeai.backend.stable_diffusion.extensions.base import ExtensionBase if TYPE_CHECKING: from invokeai.app.shared.models import FreeUConfig + from invokeai.backend.util.original_weights_storage import OriginalWeightsStorage class FreeUExt(ExtensionBase): @@ -21,7 +21,7 @@ def __init__( self._freeu_config = freeu_config @contextmanager - def patch_unet(self, unet: UNet2DConditionModel, cached_weights: Optional[Dict[str, torch.Tensor]] = None): + def patch_unet(self, unet: UNet2DConditionModel, original_weights: OriginalWeightsStorage): unet.enable_freeu( b1=self._freeu_config.b1, b2=self._freeu_config.b2, diff --git a/invokeai/backend/stable_diffusion/extensions/inpaint.py b/invokeai/backend/stable_diffusion/extensions/inpaint.py new file mode 100644 index 00000000000..00793591558 --- /dev/null +++ b/invokeai/backend/stable_diffusion/extensions/inpaint.py @@ -0,0 +1,120 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional + +import einops +import torch +from diffusers import UNet2DConditionModel + +from invokeai.backend.stable_diffusion.extension_callback_type import ExtensionCallbackType +from invokeai.backend.stable_diffusion.extensions.base import ExtensionBase, callback + +if TYPE_CHECKING: + from invokeai.backend.stable_diffusion.denoise_context import DenoiseContext + + +class InpaintExt(ExtensionBase): + """An extension for inpainting with non-inpainting models. See `InpaintModelExt` for inpainting with inpainting + models. + """ + + def __init__( + self, + mask: torch.Tensor, + is_gradient_mask: bool, + ): + """Initialize InpaintExt. + Args: + mask (torch.Tensor): The inpainting mask. Shape: (1, 1, latent_height, latent_width). Values are + expected to be in the range [0, 1]. A value of 1 means that the corresponding 'pixel' should not be + inpainted. + is_gradient_mask (bool): If True, mask is interpreted as a gradient mask meaning that the mask values range + from 0 to 1. If False, mask is interpreted as binary mask meaning that the mask values are either 0 or + 1. + """ + super().__init__() + self._mask = mask + self._is_gradient_mask = is_gradient_mask + + # Noise, which used to noisify unmasked part of image + # if noise provided to context, then it will be used + # if no noise provided, then noise will be generated based on seed + self._noise: Optional[torch.Tensor] = None + + @staticmethod + def _is_normal_model(unet: UNet2DConditionModel): + """Checks if the provided UNet belongs to a regular model. + The `in_channels` of a UNet vary depending on model type: + - normal - 4 + - depth - 5 + - inpaint - 9 + """ + return unet.conv_in.in_channels == 4 + + def _apply_mask(self, ctx: DenoiseContext, latents: torch.Tensor, t: torch.Tensor) -> torch.Tensor: + batch_size = latents.size(0) + mask = einops.repeat(self._mask, "b c h w -> (repeat b) c h w", repeat=batch_size) + if t.dim() == 0: + # some schedulers expect t to be one-dimensional. + # TODO: file diffusers bug about inconsistency? + t = einops.repeat(t, "-> batch", batch=batch_size) + # Noise shouldn't be re-randomized between steps here. The multistep schedulers + # get very confused about what is happening from step to step when we do that. + mask_latents = ctx.scheduler.add_noise(ctx.inputs.orig_latents, self._noise, t) + # TODO: Do we need to also apply scheduler.scale_model_input? Or is add_noise appropriately scaled already? + # mask_latents = self.scheduler.scale_model_input(mask_latents, t) + mask_latents = einops.repeat(mask_latents, "b c h w -> (repeat b) c h w", repeat=batch_size) + if self._is_gradient_mask: + threshold = (t.item()) / ctx.scheduler.config.num_train_timesteps + mask_bool = mask < 1 - threshold + masked_input = torch.where(mask_bool, latents, mask_latents) + else: + masked_input = torch.lerp(latents, mask_latents.to(dtype=latents.dtype), mask.to(dtype=latents.dtype)) + return masked_input + + @callback(ExtensionCallbackType.PRE_DENOISE_LOOP) + def init_tensors(self, ctx: DenoiseContext): + if not self._is_normal_model(ctx.unet): + raise ValueError( + "InpaintExt should be used only on normal (non-inpainting) models. This could be caused by an " + "inpainting model that was incorrectly marked as a non-inpainting model. In some cases, this can be " + "fixed by removing and re-adding the model (so that it gets re-probed)." + ) + + self._mask = self._mask.to(device=ctx.latents.device, dtype=ctx.latents.dtype) + + self._noise = ctx.inputs.noise + # 'noise' might be None if the latents have already been noised (e.g. when running the SDXL refiner). + # We still need noise for inpainting, so we generate it from the seed here. + if self._noise is None: + self._noise = torch.randn( + ctx.latents.shape, + dtype=torch.float32, + device="cpu", + generator=torch.Generator(device="cpu").manual_seed(ctx.seed), + ).to(device=ctx.latents.device, dtype=ctx.latents.dtype) + + # Use negative order to make extensions with default order work with patched latents + @callback(ExtensionCallbackType.PRE_STEP, order=-100) + def apply_mask_to_initial_latents(self, ctx: DenoiseContext): + ctx.latents = self._apply_mask(ctx, ctx.latents, ctx.timestep) + + # TODO: redo this with preview events rewrite + # Use negative order to make extensions with default order work with patched latents + @callback(ExtensionCallbackType.POST_STEP, order=-100) + def apply_mask_to_step_output(self, ctx: DenoiseContext): + timestep = ctx.scheduler.timesteps[-1] + if hasattr(ctx.step_output, "denoised"): + ctx.step_output.denoised = self._apply_mask(ctx, ctx.step_output.denoised, timestep) + elif hasattr(ctx.step_output, "pred_original_sample"): + ctx.step_output.pred_original_sample = self._apply_mask(ctx, ctx.step_output.pred_original_sample, timestep) + else: + ctx.step_output.pred_original_sample = self._apply_mask(ctx, ctx.step_output.prev_sample, timestep) + + # Restore unmasked part after the last step is completed + @callback(ExtensionCallbackType.POST_DENOISE_LOOP) + def restore_unmasked(self, ctx: DenoiseContext): + if self._is_gradient_mask: + ctx.latents = torch.where(self._mask < 1, ctx.latents, ctx.inputs.orig_latents) + else: + ctx.latents = torch.lerp(ctx.latents, ctx.inputs.orig_latents, self._mask) diff --git a/invokeai/backend/stable_diffusion/extensions/inpaint_model.py b/invokeai/backend/stable_diffusion/extensions/inpaint_model.py new file mode 100644 index 00000000000..6ee8ef6311c --- /dev/null +++ b/invokeai/backend/stable_diffusion/extensions/inpaint_model.py @@ -0,0 +1,88 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional + +import torch +from diffusers import UNet2DConditionModel + +from invokeai.backend.stable_diffusion.extension_callback_type import ExtensionCallbackType +from invokeai.backend.stable_diffusion.extensions.base import ExtensionBase, callback + +if TYPE_CHECKING: + from invokeai.backend.stable_diffusion.denoise_context import DenoiseContext + + +class InpaintModelExt(ExtensionBase): + """An extension for inpainting with inpainting models. See `InpaintExt` for inpainting with non-inpainting + models. + """ + + def __init__( + self, + mask: Optional[torch.Tensor], + masked_latents: Optional[torch.Tensor], + is_gradient_mask: bool, + ): + """Initialize InpaintModelExt. + Args: + mask (Optional[torch.Tensor]): The inpainting mask. Shape: (1, 1, latent_height, latent_width). Values are + expected to be in the range [0, 1]. A value of 1 means that the corresponding 'pixel' should not be + inpainted. + masked_latents (Optional[torch.Tensor]): Latents of initial image, with masked out by black color inpainted area. + If mask provided, then too should be provided. Shape: (1, 1, latent_height, latent_width) + is_gradient_mask (bool): If True, mask is interpreted as a gradient mask meaning that the mask values range + from 0 to 1. If False, mask is interpreted as binary mask meaning that the mask values are either 0 or + 1. + """ + super().__init__() + if mask is not None and masked_latents is None: + raise ValueError("Source image required for inpaint mask when inpaint model used!") + + # Inverse mask, because inpaint models treat mask as: 0 - remain same, 1 - inpaint + self._mask = None + if mask is not None: + self._mask = 1 - mask + self._masked_latents = masked_latents + self._is_gradient_mask = is_gradient_mask + + @staticmethod + def _is_inpaint_model(unet: UNet2DConditionModel): + """Checks if the provided UNet belongs to a regular model. + The `in_channels` of a UNet vary depending on model type: + - normal - 4 + - depth - 5 + - inpaint - 9 + """ + return unet.conv_in.in_channels == 9 + + @callback(ExtensionCallbackType.PRE_DENOISE_LOOP) + def init_tensors(self, ctx: DenoiseContext): + if not self._is_inpaint_model(ctx.unet): + raise ValueError("InpaintModelExt should be used only on inpaint models!") + + if self._mask is None: + self._mask = torch.ones_like(ctx.latents[:1, :1]) + self._mask = self._mask.to(device=ctx.latents.device, dtype=ctx.latents.dtype) + + if self._masked_latents is None: + self._masked_latents = torch.zeros_like(ctx.latents[:1]) + self._masked_latents = self._masked_latents.to(device=ctx.latents.device, dtype=ctx.latents.dtype) + + # Do last so that other extensions works with normal latents + @callback(ExtensionCallbackType.PRE_UNET, order=1000) + def append_inpaint_layers(self, ctx: DenoiseContext): + batch_size = ctx.unet_kwargs.sample.shape[0] + b_mask = torch.cat([self._mask] * batch_size) + b_masked_latents = torch.cat([self._masked_latents] * batch_size) + ctx.unet_kwargs.sample = torch.cat( + [ctx.unet_kwargs.sample, b_mask, b_masked_latents], + dim=1, + ) + + # Restore unmasked part as inpaint model can change unmasked part slightly + @callback(ExtensionCallbackType.POST_DENOISE_LOOP) + def restore_unmasked(self, ctx: DenoiseContext): + if self._is_gradient_mask: + ctx.latents = torch.where(self._mask > 0, ctx.latents, ctx.inputs.orig_latents) + else: + ctx.latents = torch.lerp(ctx.inputs.orig_latents, ctx.latents, self._mask) diff --git a/invokeai/backend/stable_diffusion/extensions/lora.py b/invokeai/backend/stable_diffusion/extensions/lora.py new file mode 100644 index 00000000000..617bdcbbafc --- /dev/null +++ b/invokeai/backend/stable_diffusion/extensions/lora.py @@ -0,0 +1,137 @@ +from __future__ import annotations + +from contextlib import contextmanager +from typing import TYPE_CHECKING, Tuple + +import torch +from diffusers import UNet2DConditionModel + +from invokeai.backend.stable_diffusion.extensions.base import ExtensionBase +from invokeai.backend.util.devices import TorchDevice + +if TYPE_CHECKING: + from invokeai.app.invocations.model import ModelIdentifierField + from invokeai.app.services.shared.invocation_context import InvocationContext + from invokeai.backend.lora import LoRAModelRaw + from invokeai.backend.util.original_weights_storage import OriginalWeightsStorage + + +class LoRAExt(ExtensionBase): + def __init__( + self, + node_context: InvocationContext, + model_id: ModelIdentifierField, + weight: float, + ): + super().__init__() + self._node_context = node_context + self._model_id = model_id + self._weight = weight + + @contextmanager + def patch_unet(self, unet: UNet2DConditionModel, original_weights: OriginalWeightsStorage): + lora_model = self._node_context.models.load(self._model_id).model + self.patch_model( + model=unet, + prefix="lora_unet_", + lora=lora_model, + lora_weight=self._weight, + original_weights=original_weights, + ) + del lora_model + + yield + + @classmethod + @torch.no_grad() + def patch_model( + cls, + model: torch.nn.Module, + prefix: str, + lora: LoRAModelRaw, + lora_weight: float, + original_weights: OriginalWeightsStorage, + ): + """ + Apply one or more LoRAs to a model. + :param model: The model to patch. + :param lora: LoRA model to patch in. + :param lora_weight: LoRA patch weight. + :param prefix: A string prefix that precedes keys used in the LoRAs weight layers. + :param original_weights: Storage with original weights, filled by weights which lora patches, used for unpatching. + """ + + if lora_weight == 0: + return + + # assert lora.device.type == "cpu" + for layer_key, layer in lora.layers.items(): + if not layer_key.startswith(prefix): + continue + + # TODO(ryand): A non-negligible amount of time is currently spent resolving LoRA keys. This + # should be improved in the following ways: + # 1. The key mapping could be more-efficiently pre-computed. This would save time every time a + # LoRA model is applied. + # 2. From an API perspective, there's no reason that the `ModelPatcher` should be aware of the + # intricacies of Stable Diffusion key resolution. It should just expect the input LoRA + # weights to have valid keys. + assert isinstance(model, torch.nn.Module) + module_key, module = cls._resolve_lora_key(model, layer_key, prefix) + + # All of the LoRA weight calculations will be done on the same device as the module weight. + # (Performance will be best if this is a CUDA device.) + device = module.weight.device + dtype = module.weight.dtype + + layer_scale = layer.alpha / layer.rank if (layer.alpha and layer.rank) else 1.0 + + # We intentionally move to the target device first, then cast. Experimentally, this was found to + # be significantly faster for 16-bit CPU tensors being moved to a CUDA device than doing the + # same thing in a single call to '.to(...)'. + layer.to(device=device) + layer.to(dtype=torch.float32) + + # TODO(ryand): Using torch.autocast(...) over explicit casting may offer a speed benefit on CUDA + # devices here. Experimentally, it was found to be very slow on CPU. More investigation needed. + for param_name, lora_param_weight in layer.get_parameters(module).items(): + param_key = module_key + "." + param_name + module_param = module.get_parameter(param_name) + + # save original weight + original_weights.save(param_key, module_param) + + if module_param.shape != lora_param_weight.shape: + # TODO: debug on lycoris + lora_param_weight = lora_param_weight.reshape(module_param.shape) + + lora_param_weight *= lora_weight * layer_scale + module_param += lora_param_weight.to(dtype=dtype) + + layer.to(device=TorchDevice.CPU_DEVICE) + + @staticmethod + def _resolve_lora_key(model: torch.nn.Module, lora_key: str, prefix: str) -> Tuple[str, torch.nn.Module]: + assert "." not in lora_key + + if not lora_key.startswith(prefix): + raise Exception(f"lora_key with invalid prefix: {lora_key}, {prefix}") + + module = model + module_key = "" + key_parts = lora_key[len(prefix) :].split("_") + + submodule_name = key_parts.pop(0) + + while len(key_parts) > 0: + try: + module = module.get_submodule(submodule_name) + module_key += "." + submodule_name + submodule_name = key_parts.pop(0) + except Exception: + submodule_name += "_" + key_parts.pop(0) + + module = module.get_submodule(submodule_name) + module_key = (module_key + "." + submodule_name).lstrip(".") + + return (module_key, module) diff --git a/invokeai/backend/stable_diffusion/extensions/seamless.py b/invokeai/backend/stable_diffusion/extensions/seamless.py new file mode 100644 index 00000000000..a96ea6e4d2e --- /dev/null +++ b/invokeai/backend/stable_diffusion/extensions/seamless.py @@ -0,0 +1,71 @@ +from __future__ import annotations + +from contextlib import contextmanager +from typing import Callable, Dict, List, Optional, Tuple + +import torch +import torch.nn as nn +from diffusers import UNet2DConditionModel +from diffusers.models.lora import LoRACompatibleConv + +from invokeai.backend.stable_diffusion.extensions.base import ExtensionBase + + +class SeamlessExt(ExtensionBase): + def __init__( + self, + seamless_axes: List[str], + ): + super().__init__() + self._seamless_axes = seamless_axes + + @contextmanager + def patch_unet(self, unet: UNet2DConditionModel, cached_weights: Optional[Dict[str, torch.Tensor]] = None): + with self.static_patch_model( + model=unet, + seamless_axes=self._seamless_axes, + ): + yield + + @staticmethod + @contextmanager + def static_patch_model( + model: torch.nn.Module, + seamless_axes: List[str], + ): + if not seamless_axes: + yield + return + + x_mode = "circular" if "x" in seamless_axes else "constant" + y_mode = "circular" if "y" in seamless_axes else "constant" + + # override conv_forward + # https://github.com/huggingface/diffusers/issues/556#issuecomment-1993287019 + def _conv_forward_asymmetric( + self, input: torch.Tensor, weight: torch.Tensor, bias: Optional[torch.Tensor] = None + ): + self.paddingX = (self._reversed_padding_repeated_twice[0], self._reversed_padding_repeated_twice[1], 0, 0) + self.paddingY = (0, 0, self._reversed_padding_repeated_twice[2], self._reversed_padding_repeated_twice[3]) + working = torch.nn.functional.pad(input, self.paddingX, mode=x_mode) + working = torch.nn.functional.pad(working, self.paddingY, mode=y_mode) + return torch.nn.functional.conv2d( + working, weight, bias, self.stride, torch.nn.modules.utils._pair(0), self.dilation, self.groups + ) + + original_layers: List[Tuple[nn.Conv2d, Callable]] = [] + try: + for layer in model.modules(): + if not isinstance(layer, torch.nn.Conv2d): + continue + + if isinstance(layer, LoRACompatibleConv) and layer.lora_layer is None: + layer.lora_layer = lambda *x: 0 + original_layers.append((layer, layer._conv_forward)) + layer._conv_forward = _conv_forward_asymmetric.__get__(layer, torch.nn.Conv2d) + + yield + + finally: + for layer, orig_conv_forward in original_layers: + layer._conv_forward = orig_conv_forward diff --git a/invokeai/backend/stable_diffusion/extensions/t2i_adapter.py b/invokeai/backend/stable_diffusion/extensions/t2i_adapter.py new file mode 100644 index 00000000000..5c290ea4e79 --- /dev/null +++ b/invokeai/backend/stable_diffusion/extensions/t2i_adapter.py @@ -0,0 +1,120 @@ +from __future__ import annotations + +import math +from typing import TYPE_CHECKING, List, Optional, Union + +import torch +from diffusers import T2IAdapter +from PIL.Image import Image + +from invokeai.app.util.controlnet_utils import prepare_control_image +from invokeai.backend.model_manager import BaseModelType +from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ConditioningMode +from invokeai.backend.stable_diffusion.extension_callback_type import ExtensionCallbackType +from invokeai.backend.stable_diffusion.extensions.base import ExtensionBase, callback + +if TYPE_CHECKING: + from invokeai.app.invocations.model import ModelIdentifierField + from invokeai.app.services.shared.invocation_context import InvocationContext + from invokeai.app.util.controlnet_utils import CONTROLNET_RESIZE_VALUES + from invokeai.backend.stable_diffusion.denoise_context import DenoiseContext + + +class T2IAdapterExt(ExtensionBase): + def __init__( + self, + node_context: InvocationContext, + model_id: ModelIdentifierField, + image: Image, + weight: Union[float, List[float]], + begin_step_percent: float, + end_step_percent: float, + resize_mode: CONTROLNET_RESIZE_VALUES, + ): + super().__init__() + self._node_context = node_context + self._model_id = model_id + self._image = image + self._weight = weight + self._resize_mode = resize_mode + self._begin_step_percent = begin_step_percent + self._end_step_percent = end_step_percent + + self._adapter_state: Optional[List[torch.Tensor]] = None + + # The max_unet_downscale is the maximum amount that the UNet model downscales the latent image internally. + model_config = self._node_context.models.get_config(self._model_id.key) + if model_config.base == BaseModelType.StableDiffusion1: + self._max_unet_downscale = 8 + elif model_config.base == BaseModelType.StableDiffusionXL: + self._max_unet_downscale = 4 + else: + raise ValueError(f"Unexpected T2I-Adapter base model type: '{model_config.base}'.") + + @callback(ExtensionCallbackType.SETUP) + def setup(self, ctx: DenoiseContext): + t2i_model: T2IAdapter + with self._node_context.models.load(self._model_id) as t2i_model: + _, _, latents_height, latents_width = ctx.inputs.orig_latents.shape + + self._adapter_state = self._run_model( + model=t2i_model, + image=self._image, + latents_height=latents_height, + latents_width=latents_width, + ) + + def _run_model( + self, + model: T2IAdapter, + image: Image, + latents_height: int, + latents_width: int, + ): + # Resize the T2I-Adapter input image. + # We select the resize dimensions so that after the T2I-Adapter's total_downscale_factor is applied, the + # result will match the latent image's dimensions after max_unet_downscale is applied. + input_height = latents_height // self._max_unet_downscale * model.total_downscale_factor + input_width = latents_width // self._max_unet_downscale * model.total_downscale_factor + + # Note: We have hard-coded `do_classifier_free_guidance=False`. This is because we only want to prepare + # a single image. If CFG is enabled, we will duplicate the resultant tensor after applying the + # T2I-Adapter model. + # + # Note: We re-use the `prepare_control_image(...)` from ControlNet for T2I-Adapter, because it has many + # of the same requirements (e.g. preserving binary masks during resize). + t2i_image = prepare_control_image( + image=image, + do_classifier_free_guidance=False, + width=input_width, + height=input_height, + num_channels=model.config["in_channels"], + device=model.device, + dtype=model.dtype, + resize_mode=self._resize_mode, + ) + + return model(t2i_image) + + @callback(ExtensionCallbackType.PRE_UNET) + def pre_unet_step(self, ctx: DenoiseContext): + # skip if model not active in current step + total_steps = len(ctx.inputs.timesteps) + first_step = math.floor(self._begin_step_percent * total_steps) + last_step = math.ceil(self._end_step_percent * total_steps) + if ctx.step_index < first_step or ctx.step_index > last_step: + return + + weight = self._weight + if isinstance(weight, list): + weight = weight[ctx.step_index] + + adapter_state = self._adapter_state + if ctx.conditioning_mode == ConditioningMode.Both: + adapter_state = [torch.cat([v] * 2) for v in adapter_state] + + if ctx.unet_kwargs.down_intrablock_additional_residuals is None: + ctx.unet_kwargs.down_intrablock_additional_residuals = [v * weight for v in adapter_state] + else: + for i, value in enumerate(adapter_state): + ctx.unet_kwargs.down_intrablock_additional_residuals[i] += value * weight diff --git a/invokeai/backend/stable_diffusion/extensions_manager.py b/invokeai/backend/stable_diffusion/extensions_manager.py index c8d585406a8..3783bb422e5 100644 --- a/invokeai/backend/stable_diffusion/extensions_manager.py +++ b/invokeai/backend/stable_diffusion/extensions_manager.py @@ -7,6 +7,7 @@ from diffusers import UNet2DConditionModel from invokeai.app.services.session_processor.session_processor_common import CanceledException +from invokeai.backend.util.original_weights_storage import OriginalWeightsStorage if TYPE_CHECKING: from invokeai.backend.stable_diffusion.denoise_context import DenoiseContext @@ -67,9 +68,15 @@ def patch_unet(self, unet: UNet2DConditionModel, cached_weights: Optional[Dict[s if self._is_canceled and self._is_canceled(): raise CanceledException - # TODO: create weight patch logic in PR with extension which uses it - with ExitStack() as exit_stack: - for ext in self._extensions: - exit_stack.enter_context(ext.patch_unet(unet, cached_weights)) + original_weights = OriginalWeightsStorage(cached_weights) + try: + with ExitStack() as exit_stack: + for ext in self._extensions: + exit_stack.enter_context(ext.patch_unet(unet, original_weights)) - yield None + yield None + + finally: + with torch.no_grad(): + for param_key, weight in original_weights.get_changed_weights(): + unet.get_parameter(param_key).copy_(weight) diff --git a/invokeai/backend/stable_diffusion/schedulers/schedulers.py b/invokeai/backend/stable_diffusion/schedulers/schedulers.py index 7d6851e278d..c8836b316ab 100644 --- a/invokeai/backend/stable_diffusion/schedulers/schedulers.py +++ b/invokeai/backend/stable_diffusion/schedulers/schedulers.py @@ -20,10 +20,14 @@ ) from diffusers.schedulers.scheduling_utils import SchedulerMixin +# TODO: add dpmpp_3s/dpmpp_3s_k when fix released +# https://github.com/huggingface/diffusers/issues/9007 + SCHEDULER_NAME_VALUES = Literal[ "ddim", "ddpm", "deis", + "deis_k", "lms", "lms_k", "pndm", @@ -33,16 +37,21 @@ "euler_k", "euler_a", "kdpm_2", + "kdpm_2_k", "kdpm_2_a", + "kdpm_2_a_k", "dpmpp_2s", "dpmpp_2s_k", "dpmpp_2m", "dpmpp_2m_k", "dpmpp_2m_sde", "dpmpp_2m_sde_k", + "dpmpp_3m", + "dpmpp_3m_k", "dpmpp_sde", "dpmpp_sde_k", "unipc", + "unipc_k", "lcm", "tcd", ] @@ -50,7 +59,8 @@ SCHEDULER_MAP: dict[SCHEDULER_NAME_VALUES, tuple[Type[SchedulerMixin], dict[str, Any]]] = { "ddim": (DDIMScheduler, {}), "ddpm": (DDPMScheduler, {}), - "deis": (DEISMultistepScheduler, {}), + "deis": (DEISMultistepScheduler, {"use_karras_sigmas": False}), + "deis_k": (DEISMultistepScheduler, {"use_karras_sigmas": True}), "lms": (LMSDiscreteScheduler, {"use_karras_sigmas": False}), "lms_k": (LMSDiscreteScheduler, {"use_karras_sigmas": True}), "pndm": (PNDMScheduler, {}), @@ -59,17 +69,28 @@ "euler": (EulerDiscreteScheduler, {"use_karras_sigmas": False}), "euler_k": (EulerDiscreteScheduler, {"use_karras_sigmas": True}), "euler_a": (EulerAncestralDiscreteScheduler, {}), - "kdpm_2": (KDPM2DiscreteScheduler, {}), - "kdpm_2_a": (KDPM2AncestralDiscreteScheduler, {}), - "dpmpp_2s": (DPMSolverSinglestepScheduler, {"use_karras_sigmas": False}), - "dpmpp_2s_k": (DPMSolverSinglestepScheduler, {"use_karras_sigmas": True}), - "dpmpp_2m": (DPMSolverMultistepScheduler, {"use_karras_sigmas": False}), - "dpmpp_2m_k": (DPMSolverMultistepScheduler, {"use_karras_sigmas": True}), - "dpmpp_2m_sde": (DPMSolverMultistepScheduler, {"use_karras_sigmas": False, "algorithm_type": "sde-dpmsolver++"}), - "dpmpp_2m_sde_k": (DPMSolverMultistepScheduler, {"use_karras_sigmas": True, "algorithm_type": "sde-dpmsolver++"}), + "kdpm_2": (KDPM2DiscreteScheduler, {"use_karras_sigmas": False}), + "kdpm_2_k": (KDPM2DiscreteScheduler, {"use_karras_sigmas": True}), + "kdpm_2_a": (KDPM2AncestralDiscreteScheduler, {"use_karras_sigmas": False}), + "kdpm_2_a_k": (KDPM2AncestralDiscreteScheduler, {"use_karras_sigmas": True}), + "dpmpp_2s": (DPMSolverSinglestepScheduler, {"use_karras_sigmas": False, "solver_order": 2}), + "dpmpp_2s_k": (DPMSolverSinglestepScheduler, {"use_karras_sigmas": True, "solver_order": 2}), + "dpmpp_2m": (DPMSolverMultistepScheduler, {"use_karras_sigmas": False, "solver_order": 2}), + "dpmpp_2m_k": (DPMSolverMultistepScheduler, {"use_karras_sigmas": True, "solver_order": 2}), + "dpmpp_2m_sde": ( + DPMSolverMultistepScheduler, + {"use_karras_sigmas": False, "solver_order": 2, "algorithm_type": "sde-dpmsolver++"}, + ), + "dpmpp_2m_sde_k": ( + DPMSolverMultistepScheduler, + {"use_karras_sigmas": True, "solver_order": 2, "algorithm_type": "sde-dpmsolver++"}, + ), + "dpmpp_3m": (DPMSolverMultistepScheduler, {"use_karras_sigmas": False, "solver_order": 3}), + "dpmpp_3m_k": (DPMSolverMultistepScheduler, {"use_karras_sigmas": True, "solver_order": 3}), "dpmpp_sde": (DPMSolverSDEScheduler, {"use_karras_sigmas": False, "noise_sampler_seed": 0}), "dpmpp_sde_k": (DPMSolverSDEScheduler, {"use_karras_sigmas": True, "noise_sampler_seed": 0}), - "unipc": (UniPCMultistepScheduler, {"cpu_only": True}), + "unipc": (UniPCMultistepScheduler, {"use_karras_sigmas": False, "cpu_only": True}), + "unipc_k": (UniPCMultistepScheduler, {"use_karras_sigmas": True, "cpu_only": True}), "lcm": (LCMScheduler, {}), "tcd": (TCDScheduler, {}), } diff --git a/invokeai/backend/stable_diffusion/seamless.py b/invokeai/backend/stable_diffusion/seamless.py deleted file mode 100644 index 23ed978c6d0..00000000000 --- a/invokeai/backend/stable_diffusion/seamless.py +++ /dev/null @@ -1,51 +0,0 @@ -from contextlib import contextmanager -from typing import Callable, List, Optional, Tuple, Union - -import torch -import torch.nn as nn -from diffusers.models.autoencoders.autoencoder_kl import AutoencoderKL -from diffusers.models.autoencoders.autoencoder_tiny import AutoencoderTiny -from diffusers.models.lora import LoRACompatibleConv -from diffusers.models.unets.unet_2d_condition import UNet2DConditionModel - - -@contextmanager -def set_seamless(model: Union[UNet2DConditionModel, AutoencoderKL, AutoencoderTiny], seamless_axes: List[str]): - if not seamless_axes: - yield - return - - # override conv_forward - # https://github.com/huggingface/diffusers/issues/556#issuecomment-1993287019 - def _conv_forward_asymmetric(self, input: torch.Tensor, weight: torch.Tensor, bias: Optional[torch.Tensor] = None): - self.paddingX = (self._reversed_padding_repeated_twice[0], self._reversed_padding_repeated_twice[1], 0, 0) - self.paddingY = (0, 0, self._reversed_padding_repeated_twice[2], self._reversed_padding_repeated_twice[3]) - working = torch.nn.functional.pad(input, self.paddingX, mode=x_mode) - working = torch.nn.functional.pad(working, self.paddingY, mode=y_mode) - return torch.nn.functional.conv2d( - working, weight, bias, self.stride, torch.nn.modules.utils._pair(0), self.dilation, self.groups - ) - - original_layers: List[Tuple[nn.Conv2d, Callable]] = [] - - try: - x_mode = "circular" if "x" in seamless_axes else "constant" - y_mode = "circular" if "y" in seamless_axes else "constant" - - conv_layers: List[torch.nn.Conv2d] = [] - - for module in model.modules(): - if isinstance(module, torch.nn.Conv2d): - conv_layers.append(module) - - for layer in conv_layers: - if isinstance(layer, LoRACompatibleConv) and layer.lora_layer is None: - layer.lora_layer = lambda *x: 0 - original_layers.append((layer, layer._conv_forward)) - layer._conv_forward = _conv_forward_asymmetric.__get__(layer, torch.nn.Conv2d) - - yield - - finally: - for layer, orig_conv_forward in original_layers: - layer._conv_forward = orig_conv_forward diff --git a/invokeai/backend/util/original_weights_storage.py b/invokeai/backend/util/original_weights_storage.py new file mode 100644 index 00000000000..af945b086f5 --- /dev/null +++ b/invokeai/backend/util/original_weights_storage.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +from typing import Dict, Iterator, Optional, Tuple + +import torch + +from invokeai.backend.util.devices import TorchDevice + + +class OriginalWeightsStorage: + """A class for tracking the original weights of a model for patch/unpatch operations.""" + + def __init__(self, cached_weights: Optional[Dict[str, torch.Tensor]] = None): + # The original weights of the model. + self._weights: dict[str, torch.Tensor] = {} + # The keys of the weights that have been changed (via `save()`) during the lifetime of this instance. + self._changed_weights: set[str] = set() + if cached_weights: + self._weights.update(cached_weights) + + def save(self, key: str, weight: torch.Tensor, copy: bool = True): + self._changed_weights.add(key) + if key in self._weights: + return + + self._weights[key] = weight.detach().to(device=TorchDevice.CPU_DEVICE, copy=copy) + + def get(self, key: str, copy: bool = False) -> Optional[torch.Tensor]: + weight = self._weights.get(key, None) + if weight is not None and copy: + weight = weight.clone() + return weight + + def contains(self, key: str) -> bool: + return key in self._weights + + def get_changed_weights(self) -> Iterator[Tuple[str, torch.Tensor]]: + for key in self._changed_weights: + yield key, self._weights[key] diff --git a/invokeai/frontend/web/package.json b/invokeai/frontend/web/package.json index f2210e4c680..1b6432a3081 100644 --- a/invokeai/frontend/web/package.json +++ b/invokeai/frontend/web/package.json @@ -53,64 +53,63 @@ }, "dependencies": { "@chakra-ui/react-use-size": "^2.1.0", - "@dagrejs/dagre": "^1.1.2", - "@dagrejs/graphlib": "^2.2.2", + "@dagrejs/dagre": "^1.1.3", + "@dagrejs/graphlib": "^2.2.3", "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", - "@fontsource-variable/inter": "^5.0.18", - "@invoke-ai/ui-library": "^0.0.25", - "@nanostores/react": "^0.7.2", + "@fontsource-variable/inter": "^5.0.20", + "@invoke-ai/ui-library": "^0.0.29", + "@nanostores/react": "^0.7.3", "@reduxjs/toolkit": "2.2.3", "@roarr/browser-log-writer": "^1.3.0", - "chakra-react-select": "^4.7.6", - "compare-versions": "^6.1.0", + "chakra-react-select": "^4.9.1", + "compare-versions": "^6.1.1", "dateformat": "^5.0.3", - "fracturedjsonjs": "^4.0.1", - "framer-motion": "^11.1.8", - "i18next": "^23.11.3", - "i18next-http-backend": "^2.5.1", + "fracturedjsonjs": "^4.0.2", + "framer-motion": "^11.3.24", + "i18next": "^23.12.2", + "i18next-http-backend": "^2.5.2", "idb-keyval": "^6.2.1", "jsondiffpatch": "^0.6.0", - "konva": "^9.3.6", + "konva": "^9.3.14", "lodash-es": "^4.17.21", - "nanostores": "^0.10.3", + "nanostores": "^0.11.2", "new-github-issue-url": "^1.0.0", - "overlayscrollbars": "^2.7.3", + "overlayscrollbars": "^2.10.0", "overlayscrollbars-react": "^0.5.6", - "query-string": "^9.0.0", + "query-string": "^9.1.0", "react": "^18.3.1", "react-colorful": "^5.6.1", "react-dom": "^18.3.1", "react-dropzone": "^14.2.3", "react-error-boundary": "^4.0.13", - "react-hook-form": "^7.51.4", + "react-hook-form": "^7.52.2", "react-hotkeys-hook": "4.5.0", - "react-i18next": "^14.1.1", - "react-icons": "^5.2.0", + "react-i18next": "^14.1.3", + "react-icons": "^5.2.1", "react-konva": "^18.2.10", "react-redux": "9.1.2", - "react-resizable-panels": "^2.0.19", + "react-resizable-panels": "^2.0.23", "react-select": "5.8.0", - "react-use": "^17.5.0", - "react-virtuoso": "^4.7.10", - "reactflow": "^11.11.3", + "react-use": "^17.5.1", + "react-virtuoso": "^4.9.0", + "reactflow": "^11.11.4", "redux-dynamic-middlewares": "^2.2.0", "redux-remember": "^5.1.0", "redux-undo": "^1.1.0", - "rfdc": "^1.3.1", + "rfdc": "^1.4.1", "roarr": "^7.21.1", "serialize-error": "^11.0.3", "socket.io-client": "^4.7.5", - "use-debounce": "^10.0.0", + "use-debounce": "^10.0.2", "use-device-pixel-ratio": "^1.1.2", "use-image": "^1.1.1", - "uuid": "^9.0.1", - "zod": "^3.23.6", - "zod-validation-error": "^3.2.0" + "uuid": "^10.0.0", + "zod": "^3.23.8", + "zod-validation-error": "^3.3.1" }, "peerDependencies": { - "@chakra-ui/react": "^2.8.2", "react": "^18.2.0", "react-dom": "^18.2.0", "ts-toolbelt": "^9.6.0" @@ -118,42 +117,45 @@ "devDependencies": { "@invoke-ai/eslint-config-react": "^0.0.14", "@invoke-ai/prettier-config-react": "^0.0.7", - "@storybook/addon-essentials": "^8.0.10", - "@storybook/addon-interactions": "^8.0.10", - "@storybook/addon-links": "^8.0.10", - "@storybook/addon-storysource": "^8.0.10", - "@storybook/manager-api": "^8.0.10", - "@storybook/react": "^8.0.10", - "@storybook/react-vite": "^8.0.10", - "@storybook/theming": "^8.0.10", + "@storybook/addon-essentials": "^8.2.8", + "@storybook/addon-interactions": "^8.2.8", + "@storybook/addon-links": "^8.2.8", + "@storybook/addon-storysource": "^8.2.8", + "@storybook/manager-api": "^8.2.8", + "@storybook/react": "^8.2.8", + "@storybook/react-vite": "^8.2.8", + "@storybook/theming": "^8.2.8", "@types/dateformat": "^5.0.2", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.12.10", - "@types/react": "^18.3.1", + "@types/node": "^20.14.15", + "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", - "@types/uuid": "^9.0.8", - "@vitejs/plugin-react-swc": "^3.6.0", + "@types/uuid": "^10.0.0", + "@vitejs/plugin-react-swc": "^3.7.0", "@vitest/coverage-v8": "^1.5.0", "@vitest/ui": "^1.5.0", "concurrently": "^8.2.2", "dpdm": "^3.14.0", "eslint": "^8.57.0", - "eslint-plugin-i18next": "^6.0.3", + "eslint-plugin-i18next": "^6.0.9", "eslint-plugin-path": "^1.3.0", - "knip": "^5.12.3", + "knip": "^5.27.2", "openapi-types": "^12.1.3", - "openapi-typescript": "^6.7.5", - "prettier": "^3.2.5", + "openapi-typescript": "^7.3.0", + "prettier": "^3.3.3", "rollup-plugin-visualizer": "^5.12.0", - "storybook": "^8.0.10", + "storybook": "^8.2.8", "ts-toolbelt": "^9.6.0", - "tsafe": "^1.6.6", - "typescript": "^5.4.5", - "vite": "^5.2.11", + "tsafe": "^1.7.2", + "typescript": "^5.5.4", + "vite": "^5.4.0", "vite-plugin-css-injected-by-js": "^3.5.1", "vite-plugin-dts": "^3.9.1", "vite-plugin-eslint": "^1.8.1", "vite-tsconfig-paths": "^4.3.2", "vitest": "^1.6.0" + }, + "engines": { + "pnpm": "8" } } diff --git a/invokeai/frontend/web/pnpm-lock.yaml b/invokeai/frontend/web/pnpm-lock.yaml index 64189f0d82c..90b52e6306c 100644 --- a/invokeai/frontend/web/pnpm-lock.yaml +++ b/invokeai/frontend/web/pnpm-lock.yaml @@ -5,18 +5,15 @@ settings: excludeLinksFromLockfile: false dependencies: - '@chakra-ui/react': - specifier: ^2.8.2 - version: 2.8.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(framer-motion@11.1.8)(react-dom@18.3.1)(react@18.3.1) '@chakra-ui/react-use-size': specifier: ^2.1.0 version: 2.1.0(react@18.3.1) '@dagrejs/dagre': - specifier: ^1.1.2 - version: 1.1.2 + specifier: ^1.1.3 + version: 1.1.3 '@dagrejs/graphlib': - specifier: ^2.2.2 - version: 2.2.2 + specifier: ^2.2.3 + version: 2.2.3 '@dnd-kit/core': specifier: ^6.1.0 version: 6.1.0(react-dom@18.3.1)(react@18.3.1) @@ -27,14 +24,14 @@ dependencies: specifier: ^3.2.2 version: 3.2.2(react@18.3.1) '@fontsource-variable/inter': - specifier: ^5.0.18 - version: 5.0.18 + specifier: ^5.0.20 + version: 5.0.20 '@invoke-ai/ui-library': - specifier: ^0.0.25 - version: 0.0.25(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@fontsource-variable/inter@5.0.18)(@internationalized/date@3.5.3)(@types/react@18.3.1)(i18next@23.11.3)(react-dom@18.3.1)(react@18.3.1) + specifier: ^0.0.29 + version: 0.0.29(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@fontsource-variable/inter@5.0.20)(@types/react@18.3.3)(i18next@23.12.2)(react-dom@18.3.1)(react@18.3.1) '@nanostores/react': - specifier: ^0.7.2 - version: 0.7.2(nanostores@0.10.3)(react@18.3.1) + specifier: ^0.7.3 + version: 0.7.3(nanostores@0.11.2)(react@18.3.1) '@reduxjs/toolkit': specifier: 2.2.3 version: 2.2.3(react-redux@9.1.2)(react@18.3.1) @@ -42,26 +39,26 @@ dependencies: specifier: ^1.3.0 version: 1.3.0 chakra-react-select: - specifier: ^4.7.6 - version: 4.7.6(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/layout@2.3.1)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@emotion/react@11.11.4)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + specifier: ^4.9.1 + version: 4.9.1(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/layout@2.3.1)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@emotion/react@11.13.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) compare-versions: - specifier: ^6.1.0 - version: 6.1.0 + specifier: ^6.1.1 + version: 6.1.1 dateformat: specifier: ^5.0.3 version: 5.0.3 fracturedjsonjs: - specifier: ^4.0.1 - version: 4.0.1 + specifier: ^4.0.2 + version: 4.0.2 framer-motion: - specifier: ^11.1.8 - version: 11.1.8(react-dom@18.3.1)(react@18.3.1) + specifier: ^11.3.24 + version: 11.3.24(react-dom@18.3.1)(react@18.3.1) i18next: - specifier: ^23.11.3 - version: 23.11.3 + specifier: ^23.12.2 + version: 23.12.2 i18next-http-backend: - specifier: ^2.5.1 - version: 2.5.1 + specifier: ^2.5.2 + version: 2.5.2 idb-keyval: specifier: ^6.2.1 version: 6.2.1 @@ -69,26 +66,26 @@ dependencies: specifier: ^0.6.0 version: 0.6.0 konva: - specifier: ^9.3.6 - version: 9.3.6 + specifier: ^9.3.14 + version: 9.3.14 lodash-es: specifier: ^4.17.21 version: 4.17.21 nanostores: - specifier: ^0.10.3 - version: 0.10.3 + specifier: ^0.11.2 + version: 0.11.2 new-github-issue-url: specifier: ^1.0.0 version: 1.0.0 overlayscrollbars: - specifier: ^2.7.3 - version: 2.7.3 + specifier: ^2.10.0 + version: 2.10.0 overlayscrollbars-react: specifier: ^0.5.6 - version: 0.5.6(overlayscrollbars@2.7.3)(react@18.3.1) + version: 0.5.6(overlayscrollbars@2.10.0)(react@18.3.1) query-string: - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^9.1.0 + version: 9.1.0 react: specifier: ^18.3.1 version: 18.3.1 @@ -105,38 +102,38 @@ dependencies: specifier: ^4.0.13 version: 4.0.13(react@18.3.1) react-hook-form: - specifier: ^7.51.4 - version: 7.51.4(react@18.3.1) + specifier: ^7.52.2 + version: 7.52.2(react@18.3.1) react-hotkeys-hook: specifier: 4.5.0 version: 4.5.0(react-dom@18.3.1)(react@18.3.1) react-i18next: - specifier: ^14.1.1 - version: 14.1.1(i18next@23.11.3)(react-dom@18.3.1)(react@18.3.1) + specifier: ^14.1.3 + version: 14.1.3(i18next@23.12.2)(react-dom@18.3.1)(react@18.3.1) react-icons: - specifier: ^5.2.0 - version: 5.2.0(react@18.3.1) + specifier: ^5.2.1 + version: 5.2.1(react@18.3.1) react-konva: specifier: ^18.2.10 - version: 18.2.10(konva@9.3.6)(react-dom@18.3.1)(react@18.3.1) + version: 18.2.10(konva@9.3.14)(react-dom@18.3.1)(react@18.3.1) react-redux: specifier: 9.1.2 - version: 9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1) + version: 9.1.2(@types/react@18.3.3)(react@18.3.1)(redux@5.0.1) react-resizable-panels: - specifier: ^2.0.19 - version: 2.0.19(react-dom@18.3.1)(react@18.3.1) + specifier: ^2.0.23 + version: 2.0.23(react-dom@18.3.1)(react@18.3.1) react-select: specifier: 5.8.0 - version: 5.8.0(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + version: 5.8.0(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) react-use: - specifier: ^17.5.0 - version: 17.5.0(react-dom@18.3.1)(react@18.3.1) + specifier: ^17.5.1 + version: 17.5.1(react-dom@18.3.1)(react@18.3.1) react-virtuoso: - specifier: ^4.7.10 - version: 4.7.10(react-dom@18.3.1)(react@18.3.1) + specifier: ^4.9.0 + version: 4.9.0(react-dom@18.3.1)(react@18.3.1) reactflow: - specifier: ^11.11.3 - version: 11.11.3(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + specifier: ^11.11.4 + version: 11.11.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) redux-dynamic-middlewares: specifier: ^2.2.0 version: 2.2.0 @@ -147,8 +144,8 @@ dependencies: specifier: ^1.1.0 version: 1.1.0 rfdc: - specifier: ^1.3.1 - version: 1.3.1 + specifier: ^1.4.1 + version: 1.4.1 roarr: specifier: ^7.21.1 version: 7.21.1 @@ -159,8 +156,8 @@ dependencies: specifier: ^4.7.5 version: 4.7.5 use-debounce: - specifier: ^10.0.0 - version: 10.0.0(react@18.3.1) + specifier: ^10.0.2 + version: 10.0.2(react@18.3.1) use-device-pixel-ratio: specifier: ^1.1.2 version: 1.1.2(react@18.3.1) @@ -168,46 +165,46 @@ dependencies: specifier: ^1.1.1 version: 1.1.1(react-dom@18.3.1)(react@18.3.1) uuid: - specifier: ^9.0.1 - version: 9.0.1 + specifier: ^10.0.0 + version: 10.0.0 zod: - specifier: ^3.23.6 - version: 3.23.6 + specifier: ^3.23.8 + version: 3.23.8 zod-validation-error: - specifier: ^3.2.0 - version: 3.2.0(zod@3.23.6) + specifier: ^3.3.1 + version: 3.3.1(zod@3.23.8) devDependencies: '@invoke-ai/eslint-config-react': specifier: ^0.0.14 - version: 0.0.14(eslint@8.57.0)(prettier@3.2.5)(typescript@5.4.5) + version: 0.0.14(eslint@8.57.0)(prettier@3.3.3)(typescript@5.5.4) '@invoke-ai/prettier-config-react': specifier: ^0.0.7 - version: 0.0.7(prettier@3.2.5) + version: 0.0.7(prettier@3.3.3) '@storybook/addon-essentials': - specifier: ^8.0.10 - version: 8.0.10(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + specifier: ^8.2.8 + version: 8.2.8(storybook@8.2.8) '@storybook/addon-interactions': - specifier: ^8.0.10 - version: 8.0.10(vitest@1.6.0) + specifier: ^8.2.8 + version: 8.2.8(storybook@8.2.8)(vitest@1.6.0) '@storybook/addon-links': - specifier: ^8.0.10 - version: 8.0.10(react@18.3.1) + specifier: ^8.2.8 + version: 8.2.8(react@18.3.1)(storybook@8.2.8) '@storybook/addon-storysource': - specifier: ^8.0.10 - version: 8.0.10 + specifier: ^8.2.8 + version: 8.2.8(storybook@8.2.8) '@storybook/manager-api': - specifier: ^8.0.10 - version: 8.0.10(react-dom@18.3.1)(react@18.3.1) + specifier: ^8.2.8 + version: 8.2.8(storybook@8.2.8) '@storybook/react': - specifier: ^8.0.10 - version: 8.0.10(react-dom@18.3.1)(react@18.3.1)(typescript@5.4.5) + specifier: ^8.2.8 + version: 8.2.8(react-dom@18.3.1)(react@18.3.1)(storybook@8.2.8)(typescript@5.5.4) '@storybook/react-vite': - specifier: ^8.0.10 - version: 8.0.10(react-dom@18.3.1)(react@18.3.1)(typescript@5.4.5)(vite@5.2.11) + specifier: ^8.2.8 + version: 8.2.8(react-dom@18.3.1)(react@18.3.1)(storybook@8.2.8)(typescript@5.5.4)(vite@5.4.0) '@storybook/theming': - specifier: ^8.0.10 - version: 8.0.10(react-dom@18.3.1)(react@18.3.1) + specifier: ^8.2.8 + version: 8.2.8(storybook@8.2.8) '@types/dateformat': specifier: ^5.0.2 version: 5.0.2 @@ -215,20 +212,20 @@ devDependencies: specifier: ^4.17.12 version: 4.17.12 '@types/node': - specifier: ^20.12.10 - version: 20.12.10 + specifier: ^20.14.15 + version: 20.14.15 '@types/react': - specifier: ^18.3.1 - version: 18.3.1 + specifier: ^18.3.3 + version: 18.3.3 '@types/react-dom': specifier: ^18.3.0 version: 18.3.0 '@types/uuid': - specifier: ^9.0.8 - version: 9.0.8 + specifier: ^10.0.0 + version: 10.0.0 '@vitejs/plugin-react-swc': - specifier: ^3.6.0 - version: 3.6.0(vite@5.2.11) + specifier: ^3.7.0 + version: 3.7.0(vite@5.4.0) '@vitest/coverage-v8': specifier: ^1.5.0 version: 1.6.0(vitest@1.6.0) @@ -245,61 +242,61 @@ devDependencies: specifier: ^8.57.0 version: 8.57.0 eslint-plugin-i18next: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^6.0.9 + version: 6.0.9 eslint-plugin-path: specifier: ^1.3.0 version: 1.3.0(eslint@8.57.0) knip: - specifier: ^5.12.3 - version: 5.12.3(@types/node@20.12.10)(typescript@5.4.5) + specifier: ^5.27.2 + version: 5.27.2(@types/node@20.14.15)(typescript@5.5.4) openapi-types: specifier: ^12.1.3 version: 12.1.3 openapi-typescript: - specifier: ^6.7.5 - version: 6.7.5 + specifier: ^7.3.0 + version: 7.3.0(typescript@5.5.4) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.3 + version: 3.3.3 rollup-plugin-visualizer: specifier: ^5.12.0 version: 5.12.0 storybook: - specifier: ^8.0.10 - version: 8.0.10(react-dom@18.3.1)(react@18.3.1) + specifier: ^8.2.8 + version: 8.2.8 ts-toolbelt: specifier: ^9.6.0 version: 9.6.0 tsafe: - specifier: ^1.6.6 - version: 1.6.6 + specifier: ^1.7.2 + version: 1.7.2 typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.5.4 vite: - specifier: ^5.2.11 - version: 5.2.11(@types/node@20.12.10) + specifier: ^5.4.0 + version: 5.4.0(@types/node@20.14.15) vite-plugin-css-injected-by-js: specifier: ^3.5.1 - version: 3.5.1(vite@5.2.11) + version: 3.5.1(vite@5.4.0) vite-plugin-dts: specifier: ^3.9.1 - version: 3.9.1(@types/node@20.12.10)(typescript@5.4.5)(vite@5.2.11) + version: 3.9.1(@types/node@20.14.15)(typescript@5.5.4)(vite@5.4.0) vite-plugin-eslint: specifier: ^1.8.1 - version: 1.8.1(eslint@8.57.0)(vite@5.2.11) + version: 1.8.1(eslint@8.57.0)(vite@5.4.0) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.11) + version: 4.3.2(typescript@5.5.4)(vite@5.4.0) vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.12.10)(@vitest/ui@1.6.0) + version: 1.6.0(@types/node@20.14.15)(@vitest/ui@1.6.0) packages: - /@adobe/css-tools@4.3.3: - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + /@adobe/css-tools@4.4.0: + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} dev: true /@ampproject/remapping@2.3.0: @@ -310,99 +307,6 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: true - /@ark-ui/anatomy@1.3.0(@internationalized/date@3.5.3): - resolution: {integrity: sha512-1yG2MrzUlix6KthjQMCNiHnkXrWwEdFAX6D+HqGJaNu0XvaGul2J+wDNtjsdX+gxiWu1nXXEEOAWlFVYMUf65w==} - dependencies: - '@zag-js/accordion': 0.32.1 - '@zag-js/anatomy': 0.32.1 - '@zag-js/avatar': 0.32.1 - '@zag-js/carousel': 0.32.1 - '@zag-js/checkbox': 0.32.1 - '@zag-js/color-picker': 0.32.1 - '@zag-js/color-utils': 0.32.1 - '@zag-js/combobox': 0.32.1 - '@zag-js/date-picker': 0.32.1 - '@zag-js/date-utils': 0.32.1(@internationalized/date@3.5.3) - '@zag-js/dialog': 0.32.1 - '@zag-js/editable': 0.32.1 - '@zag-js/file-upload': 0.32.1 - '@zag-js/hover-card': 0.32.1 - '@zag-js/menu': 0.32.1 - '@zag-js/number-input': 0.32.1 - '@zag-js/pagination': 0.32.1 - '@zag-js/pin-input': 0.32.1 - '@zag-js/popover': 0.32.1 - '@zag-js/presence': 0.32.1 - '@zag-js/progress': 0.32.1 - '@zag-js/radio-group': 0.32.1 - '@zag-js/rating-group': 0.32.1 - '@zag-js/select': 0.32.1 - '@zag-js/slider': 0.32.1 - '@zag-js/splitter': 0.32.1 - '@zag-js/switch': 0.32.1 - '@zag-js/tabs': 0.32.1 - '@zag-js/tags-input': 0.32.1 - '@zag-js/toast': 0.32.1 - '@zag-js/toggle-group': 0.32.1 - '@zag-js/tooltip': 0.32.1 - transitivePeerDependencies: - - '@internationalized/date' - dev: false - - /@ark-ui/react@1.3.0(@internationalized/date@3.5.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-JHjNoIX50+mUCTaEGMjfGQWGGi31pKsV646jZJlR/1xohpYJigzg8BvO97cTsVk8fwtur+cm11gz3Nf7f5QUnA==} - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - dependencies: - '@ark-ui/anatomy': 1.3.0(@internationalized/date@3.5.3) - '@zag-js/accordion': 0.32.1 - '@zag-js/avatar': 0.32.1 - '@zag-js/carousel': 0.32.1 - '@zag-js/checkbox': 0.32.1 - '@zag-js/color-picker': 0.32.1 - '@zag-js/color-utils': 0.32.1 - '@zag-js/combobox': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/date-picker': 0.32.1 - '@zag-js/date-utils': 0.32.1(@internationalized/date@3.5.3) - '@zag-js/dialog': 0.32.1 - '@zag-js/editable': 0.32.1 - '@zag-js/file-upload': 0.32.1 - '@zag-js/hover-card': 0.32.1 - '@zag-js/menu': 0.32.1 - '@zag-js/number-input': 0.32.1 - '@zag-js/pagination': 0.32.1 - '@zag-js/pin-input': 0.32.1 - '@zag-js/popover': 0.32.1 - '@zag-js/presence': 0.32.1 - '@zag-js/progress': 0.32.1 - '@zag-js/radio-group': 0.32.1 - '@zag-js/rating-group': 0.32.1 - '@zag-js/react': 0.32.1(react-dom@18.3.1)(react@18.3.1) - '@zag-js/select': 0.32.1 - '@zag-js/slider': 0.32.1 - '@zag-js/splitter': 0.32.1 - '@zag-js/switch': 0.32.1 - '@zag-js/tabs': 0.32.1 - '@zag-js/tags-input': 0.32.1 - '@zag-js/toast': 0.32.1 - '@zag-js/toggle-group': 0.32.1 - '@zag-js/tooltip': 0.32.1 - '@zag-js/types': 0.32.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@internationalized/date' - dev: false - - /@aw-web-design/x-default-browser@1.4.126: - resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} - hasBin: true - dependencies: - default-browser-id: 3.0.0 - dev: true - /@babel/code-frame@7.24.2: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} @@ -410,11 +314,23 @@ packages: '@babel/highlight': 7.24.5 picocolors: 1.0.0 + /@babel/code-frame@7.24.7: + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + /@babel/compat-data@7.24.4: resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} dev: true + /@babel/compat-data@7.25.2: + resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core@7.24.5: resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} engines: {node: '>=6.9.0'} @@ -438,6 +354,29 @@ packages: - supports-color dev: true + /@babel/core@7.25.2: + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + convert-source-map: 2.0.0 + debug: 4.3.6(supports-color@9.4.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator@7.24.5: resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} engines: {node: '>=6.9.0'} @@ -448,18 +387,30 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + /@babel/generator@7.25.0: + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.2 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.24.7: + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.25.2 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7: + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color dev: true /@babel/helper-compilation-targets@7.23.6: @@ -473,45 +424,56 @@ packages: semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + /@babel/helper-compilation-targets@7.25.2: + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.24.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/traverse': 7.25.3 semver: 6.3.1 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + /@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.5): + /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2): resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - debug: 4.3.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + debug: 4.3.6(supports-color@9.4.0) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -538,11 +500,14 @@ packages: '@babel/types': 7.24.5 dev: true - /@babel/helper-member-expression-to-functions@7.24.5: - resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} + /@babel/helper-member-expression-to-functions@7.24.8: + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color dev: true /@babel/helper-module-imports@7.24.3: @@ -551,6 +516,15 @@ packages: dependencies: '@babel/types': 7.24.5 + /@babel/helper-module-imports@7.24.7: + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} engines: {node: '>=6.9.0'} @@ -565,40 +539,59 @@ packages: '@babel/helper-validator-identifier': 7.24.5 dev: true - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/types': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-optimise-call-expression@7.24.7: + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.25.2 dev: true - /@babel/helper-plugin-utils@7.24.5: - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + /@babel/helper-plugin-utils@7.24.8: + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + /@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-wrap-function': 7.25.0 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + /@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.24.5 - '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color dev: true /@babel/helper-simple-access@7.24.5: @@ -608,11 +601,24 @@ packages: '@babel/types': 7.24.5 dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + /@babel/helper-simple-access@7.24.7: + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.24.7: + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color dev: true /@babel/helper-split-export-declaration@7.24.5: @@ -626,22 +632,37 @@ packages: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.24.8: + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.24.5: resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-wrap-function@7.24.5: - resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} + /@babel/helper-validator-option@7.24.8: + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function@7.25.0: + resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color dev: true /@babel/helpers@7.24.5: @@ -655,6 +676,14 @@ packages: - supports-color dev: true + /@babel/helpers@7.25.0: + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + dev: true + /@babel/highlight@7.24.5: resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} engines: {node: '>=6.9.0'} @@ -664,6 +693,15 @@ packages: js-tokens: 4.0.0 picocolors: 1.0.0 + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + /@babel/parser@7.24.5: resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} @@ -672,949 +710,1022 @@ packages: '@babel/types': 7.24.5 dev: true - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} + /@babel/parser@7.25.3: + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.25.2 + + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2): + resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==} + /@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + /@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5): - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + /@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} + /@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + /@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5): - resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} + /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} + /@babel/plugin-transform-classes@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/helper-split-export-declaration': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/traverse': 7.25.3 globals: 11.12.0 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/template': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template': 7.25.0 dev: true - /@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} + /@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==} + /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + /@babel/plugin-transform-flow-strip-types@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + /@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2): + resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + /@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-simple-access': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + /@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} + /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} + /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} + /@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} + /@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + /@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} + /@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-typescript@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==} + /@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + /@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/preset-env@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} + /@babel/preset-env@7.25.3(@babel/core@7.25.2): + resolution: {integrity: sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.5) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.0 + '@babel/compat-data': 7.25.2 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.0 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-flow@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==} + /@babel/preset-flow@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-transform-flow-strip-types': 7.25.2(@babel/core@7.25.2) dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/types': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/types': 7.25.2 esutils: 2.0.3 dev: true - /@babel/preset-typescript@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + /@babel/preset-typescript@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typescript': 7.24.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/register@7.23.7(@babel/core@7.24.5): - resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} + /@babel/register@7.24.6(@babel/core@7.25.2): + resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -1626,22 +1737,14 @@ packages: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime@7.23.9: - resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: false - - /@babel/runtime@7.24.1: - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + /@babel/runtime@7.24.5: + resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 - dev: false - /@babel/runtime@7.24.5: - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + /@babel/runtime@7.25.0: + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -1655,6 +1758,14 @@ packages: '@babel/types': 7.24.5 dev: true + /@babel/template@7.25.0: + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + /@babel/traverse@7.24.5: resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} engines: {node: '>=6.9.0'} @@ -1673,6 +1784,20 @@ packages: - supports-color dev: true + /@babel/traverse@7.25.3: + resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + debug: 4.3.6(supports-color@9.4.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + /@babel/types@7.24.5: resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} engines: {node: '>=6.9.0'} @@ -1681,6 +1806,14 @@ packages: '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 + /@babel/types@7.25.2: + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + /@base2/pretty-print-object@1.0.1: resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} dev: true @@ -1702,31 +1835,12 @@ packages: '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.3.1) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) '@chakra-ui/transition': 2.1.0(framer-motion@10.18.0)(react@18.3.1) framer-motion: 10.18.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 dev: false - /@chakra-ui/accordion@2.3.1(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react@18.3.1): - resolution: {integrity: sha512-FSXRm8iClFyU+gVaXisOSEw0/4Q+qZbFRiuhIAkVU6Boj0FxAMrlo9a8AV5TuF77rgaHytCdHk0Ng+cyUijrag==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@chakra-ui/descendant': 3.1.0(react@18.3.1) - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/react-context': 2.1.0(react@18.3.1) - '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.3.1) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) - '@chakra-ui/transition': 2.1.0(framer-motion@11.1.8)(react@18.3.1) - framer-motion: 11.1.8(react-dom@18.3.1)(react@18.3.1) - react: 18.3.1 - dev: false - /@chakra-ui/alert@2.2.2(@chakra-ui/system@2.6.2)(react@18.3.1): resolution: {integrity: sha512-jHg4LYMRNOJH830ViLuicjb3F+v6iriE/2G5T+Sd0Hna04nukNJ1MxUmBPE+vI22me2dIflfelu2v9wdB6Pojw==} peerDependencies: @@ -1737,7 +1851,7 @@ packages: '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -1755,7 +1869,7 @@ packages: '@chakra-ui/react-children-utils': 2.0.6(react@18.3.1) '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -1768,7 +1882,7 @@ packages: '@chakra-ui/react-children-utils': 2.0.6(react@18.3.1) '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -1788,7 +1902,7 @@ packages: '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -1799,7 +1913,7 @@ packages: react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -1818,7 +1932,7 @@ packages: '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) '@chakra-ui/visually-hidden': 2.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@zag-js/focus-visible': 0.16.0 react: 18.3.1 @@ -1841,7 +1955,7 @@ packages: react: '>=18' dependencies: '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -1860,7 +1974,7 @@ packages: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -1875,13 +1989,13 @@ packages: react: 18.3.1 dev: false - /@chakra-ui/css-reset@2.3.0(@emotion/react@11.11.4)(react@18.3.1): + /@chakra-ui/css-reset@2.3.0(@emotion/react@11.13.0)(react@18.3.1): resolution: {integrity: sha512-cQwwBy5O0jzvl0K7PLTLgp8ijqLPKyuEMiDXwYzl95seD3AoeuoCLyzZcJtVqaUZ573PiBdAbY/IlZcwDOItWg==} peerDependencies: '@emotion/react': '>=10.0.35' react: '>=18' dependencies: - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 dev: false @@ -1914,7 +2028,7 @@ packages: '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -1922,14 +2036,14 @@ packages: resolution: {integrity: sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==} dev: false - /@chakra-ui/focus-lock@2.1.0(@types/react@18.3.1)(react@18.3.1): + /@chakra-ui/focus-lock@2.1.0(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/dom-utils': 2.1.0 react: 18.3.1 - react-focus-lock: 2.11.1(@types/react@18.3.1)(react@18.3.1) + react-focus-lock: 2.12.1(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' dev: false @@ -1945,7 +2059,7 @@ packages: '@chakra-ui/react-types': 2.0.7(react@18.3.1) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -1968,7 +2082,7 @@ packages: react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -1979,7 +2093,7 @@ packages: react: '>=18' dependencies: '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -1991,7 +2105,7 @@ packages: dependencies: '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2006,7 +2120,7 @@ packages: '@chakra-ui/react-children-utils': 2.0.6(react@18.3.1) '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2022,7 +2136,7 @@ packages: '@chakra-ui/react-children-utils': 2.0.6(react@18.3.1) '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2047,7 +2161,7 @@ packages: '@chakra-ui/breakpoint-utils': 2.0.8 '@chakra-ui/react-env': 3.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2072,13 +2186,13 @@ packages: '@chakra-ui/react-use-outside-click': 2.2.0(react@18.3.1) '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) '@chakra-ui/transition': 2.1.0(framer-motion@10.18.0)(react@18.3.1) framer-motion: 10.18.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 dev: false - /@chakra-ui/menu@2.2.1(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react@18.3.1): + /@chakra-ui/menu@2.2.1(@chakra-ui/system@2.6.2)(framer-motion@11.3.24)(react@18.3.1): resolution: {integrity: sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -2099,13 +2213,13 @@ packages: '@chakra-ui/react-use-outside-click': 2.2.0(react@18.3.1) '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) - '@chakra-ui/transition': 2.1.0(framer-motion@11.1.8)(react@18.3.1) - framer-motion: 11.1.8(react-dom@18.3.1)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) + '@chakra-ui/transition': 2.1.0(framer-motion@11.3.24)(react@18.3.1) + framer-motion: 11.3.24(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 dev: false - /@chakra-ui/modal@2.3.1(@chakra-ui/system@2.6.2)(@types/react@18.3.1)(framer-motion@10.18.0)(react-dom@18.3.1)(react@18.3.1): + /@chakra-ui/modal@2.3.1(@chakra-ui/system@2.6.2)(@types/react@18.3.3)(framer-motion@10.18.0)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-TQv1ZaiJMZN+rR9DK0snx/OPwmtaGH1HbZtlYt4W4s6CzyK541fxLRTjIXfEzIGpvNW+b6VFuFjbcR78p4DEoQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -2114,45 +2228,19 @@ packages: react-dom: '>=18' dependencies: '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/focus-lock': 2.1.0(@types/react@18.3.1)(react@18.3.1) + '@chakra-ui/focus-lock': 2.1.0(@types/react@18.3.3)(react@18.3.1) '@chakra-ui/portal': 2.1.0(react-dom@18.3.1)(react@18.3.1) '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/react-types': 2.0.7(react@18.3.1) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) '@chakra-ui/transition': 2.1.0(framer-motion@10.18.0)(react@18.3.1) - aria-hidden: 1.2.3 + aria-hidden: 1.2.4 framer-motion: 10.18.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.1)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - dev: false - - /@chakra-ui/modal@2.3.1(@chakra-ui/system@2.6.2)(@types/react@18.3.1)(framer-motion@11.1.8)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-TQv1ZaiJMZN+rR9DK0snx/OPwmtaGH1HbZtlYt4W4s6CzyK541fxLRTjIXfEzIGpvNW+b6VFuFjbcR78p4DEoQ==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - framer-motion: '>=4.0.0' - react: '>=18' - react-dom: '>=18' - dependencies: - '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/focus-lock': 2.1.0(@types/react@18.3.1)(react@18.3.1) - '@chakra-ui/portal': 2.1.0(react-dom@18.3.1)(react@18.3.1) - '@chakra-ui/react-context': 2.1.0(react@18.3.1) - '@chakra-ui/react-types': 2.0.7(react@18.3.1) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) - '@chakra-ui/transition': 2.1.0(framer-motion@11.1.8)(react@18.3.1) - aria-hidden: 1.2.3 - framer-motion: 11.1.8(react-dom@18.3.1)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.1)(react@18.3.1) + react-remove-scroll: 2.5.10(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' dev: false @@ -2175,7 +2263,7 @@ packages: '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2199,7 +2287,7 @@ packages: '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.3.1) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2221,34 +2309,11 @@ packages: '@chakra-ui/react-use-focus-on-pointer-down': 2.1.0(react@18.3.1) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) framer-motion: 10.18.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 dev: false - /@chakra-ui/popover@2.2.1(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react@18.3.1): - resolution: {integrity: sha512-K+2ai2dD0ljvJnlrzesCDT9mNzLifE3noGKZ3QwLqd/K34Ym1W/0aL1ERSynrcG78NKoXS54SdEzkhCZ4Gn/Zg==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/popper': 3.1.0(react@18.3.1) - '@chakra-ui/react-context': 2.1.0(react@18.3.1) - '@chakra-ui/react-types': 2.0.7(react@18.3.1) - '@chakra-ui/react-use-animation-state': 2.1.0(react@18.3.1) - '@chakra-ui/react-use-disclosure': 2.1.0(react@18.3.1) - '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.3.1) - '@chakra-ui/react-use-focus-on-pointer-down': 2.1.0(react@18.3.1) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) - framer-motion: 11.1.8(react-dom@18.3.1)(react@18.3.1) - react: 18.3.1 - dev: false - /@chakra-ui/popper@3.1.0(react@18.3.1): resolution: {integrity: sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg==} peerDependencies: @@ -2279,11 +2344,11 @@ packages: react: '>=18' dependencies: '@chakra-ui/react-context': 2.1.0(react@18.3.1) - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false - /@chakra-ui/provider@2.4.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react-dom@18.3.1)(react@18.3.1): + /@chakra-ui/provider@2.4.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-w0Tef5ZCJK1mlJorcSjItCSbyvVuqpvyWdxZiVQmE6fvSJR83wZof42ux0+sfWD+I7rHSfj+f9nzhNaEWClysw==} peerDependencies: '@emotion/react': ^11.0.0 @@ -2291,13 +2356,13 @@ packages: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.4)(react@18.3.1) + '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.13.0)(react@18.3.1) '@chakra-ui/portal': 2.1.0(react-dom@18.3.1)(react@18.3.1) '@chakra-ui/react-env': 3.1.0(react@18.3.1) - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) '@chakra-ui/utils': 2.0.15 - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1) + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.0)(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false @@ -2313,7 +2378,7 @@ packages: '@chakra-ui/react-types': 2.0.7(react@18.3.1) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) '@zag-js/focus-visible': 0.16.0 react: 18.3.1 dev: false @@ -2513,7 +2578,7 @@ packages: react: 18.3.1 dev: false - /@chakra-ui/react@2.8.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(framer-motion@10.18.0)(react-dom@18.3.1)(react@18.3.1): + /@chakra-ui/react@2.8.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(@types/react@18.3.3)(framer-motion@10.18.0)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Hn0moyxxyCDKuR9ywYpqgX8dvjqwu9ArwpIb9wHNYjnODETjLwazgNIliCVBRcJvysGRiV51U2/JtJVrpeCjUQ==} peerDependencies: '@emotion/react': ^11.0.0 @@ -2532,9 +2597,9 @@ packages: '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/control-box': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/counter': 2.1.0(react@18.3.1) - '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.4)(react@18.3.1) + '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.13.0)(react@18.3.1) '@chakra-ui/editable': 3.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/focus-lock': 2.1.0(@types/react@18.3.1)(react@18.3.1) + '@chakra-ui/focus-lock': 2.1.0(@types/react@18.3.3)(react@18.3.1) '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/hooks': 2.2.1(react@18.3.1) '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) @@ -2544,14 +2609,14 @@ packages: '@chakra-ui/live-region': 2.1.0(react@18.3.1) '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/menu': 2.2.1(@chakra-ui/system@2.6.2)(framer-motion@10.18.0)(react@18.3.1) - '@chakra-ui/modal': 2.3.1(@chakra-ui/system@2.6.2)(@types/react@18.3.1)(framer-motion@10.18.0)(react-dom@18.3.1)(react@18.3.1) + '@chakra-ui/modal': 2.3.1(@chakra-ui/system@2.6.2)(@types/react@18.3.3)(framer-motion@10.18.0)(react-dom@18.3.1)(react@18.3.1) '@chakra-ui/number-input': 2.1.2(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/pin-input': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/popover': 2.2.1(@chakra-ui/system@2.6.2)(framer-motion@10.18.0)(react@18.3.1) '@chakra-ui/popper': 3.1.0(react@18.3.1) '@chakra-ui/portal': 2.1.0(react-dom@18.3.1)(react@18.3.1) '@chakra-ui/progress': 2.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/provider': 2.4.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react-dom@18.3.1)(react@18.3.1) + '@chakra-ui/provider': 2.4.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react-dom@18.3.1)(react@18.3.1) '@chakra-ui/radio': 2.1.2(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/react-env': 3.1.0(react@18.3.1) '@chakra-ui/select': 2.1.2(@chakra-ui/system@2.6.2)(react@18.3.1) @@ -2563,7 +2628,7 @@ packages: '@chakra-ui/stepper': 2.3.1(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/styled-system': 2.9.2 '@chakra-ui/switch': 2.1.2(@chakra-ui/system@2.6.2)(framer-motion@10.18.0)(react@18.3.1) - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) '@chakra-ui/table': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/tabs': 3.0.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/tag': 3.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) @@ -2575,8 +2640,8 @@ packages: '@chakra-ui/transition': 2.1.0(framer-motion@10.18.0)(react@18.3.1) '@chakra-ui/utils': 2.0.15 '@chakra-ui/visually-hidden': 2.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1) + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.0)(@types/react@18.3.3)(react@18.3.1) framer-motion: 10.18.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -2584,77 +2649,6 @@ packages: - '@types/react' dev: false - /@chakra-ui/react@2.8.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(framer-motion@11.1.8)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Hn0moyxxyCDKuR9ywYpqgX8dvjqwu9ArwpIb9wHNYjnODETjLwazgNIliCVBRcJvysGRiV51U2/JtJVrpeCjUQ==} - peerDependencies: - '@emotion/react': ^11.0.0 - '@emotion/styled': ^11.0.0 - framer-motion: '>=4.0.0' - react: '>=18' - react-dom: '>=18' - dependencies: - '@chakra-ui/accordion': 2.3.1(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react@18.3.1) - '@chakra-ui/alert': 2.2.2(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/avatar': 2.3.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/breadcrumb': 2.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/button': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/card': 2.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/checkbox': 2.3.2(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/control-box': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/counter': 2.1.0(react@18.3.1) - '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.4)(react@18.3.1) - '@chakra-ui/editable': 3.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/focus-lock': 2.1.0(@types/react@18.3.1)(react@18.3.1) - '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/hooks': 2.2.1(react@18.3.1) - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/image': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/input': 2.1.2(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/layout': 2.3.1(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/live-region': 2.1.0(react@18.3.1) - '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/menu': 2.2.1(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react@18.3.1) - '@chakra-ui/modal': 2.3.1(@chakra-ui/system@2.6.2)(@types/react@18.3.1)(framer-motion@11.1.8)(react-dom@18.3.1)(react@18.3.1) - '@chakra-ui/number-input': 2.1.2(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/pin-input': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/popover': 2.2.1(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react@18.3.1) - '@chakra-ui/popper': 3.1.0(react@18.3.1) - '@chakra-ui/portal': 2.1.0(react-dom@18.3.1)(react@18.3.1) - '@chakra-ui/progress': 2.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/provider': 2.4.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react-dom@18.3.1)(react@18.3.1) - '@chakra-ui/radio': 2.1.2(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/react-env': 3.1.0(react@18.3.1) - '@chakra-ui/select': 2.1.2(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/skeleton': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/skip-nav': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/slider': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/stat': 2.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/stepper': 2.3.1(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/styled-system': 2.9.2 - '@chakra-ui/switch': 2.1.2(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react@18.3.1) - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) - '@chakra-ui/table': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/tabs': 3.0.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/tag': 3.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/textarea': 2.1.2(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/theme': 3.3.1(@chakra-ui/styled-system@2.9.2) - '@chakra-ui/theme-utils': 2.0.21 - '@chakra-ui/toast': 7.0.2(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react-dom@18.3.1)(react@18.3.1) - '@chakra-ui/tooltip': 2.3.1(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react-dom@18.3.1)(react@18.3.1) - '@chakra-ui/transition': 2.1.0(framer-motion@11.1.8)(react@18.3.1) - '@chakra-ui/utils': 2.0.15 - '@chakra-ui/visually-hidden': 2.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1) - framer-motion: 11.1.8(react-dom@18.3.1)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - dev: false - /@chakra-ui/select@2.1.2(@chakra-ui/system@2.6.2)(react@18.3.1): resolution: {integrity: sha512-ZwCb7LqKCVLJhru3DXvKXpZ7Pbu1TDZ7N0PdQ0Zj1oyVLJyrpef1u9HR5u0amOpqcH++Ugt0f5JSmirjNlctjA==} peerDependencies: @@ -2663,7 +2657,7 @@ packages: dependencies: '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2680,7 +2674,7 @@ packages: '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/react-use-previous': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2690,7 +2684,7 @@ packages: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2710,7 +2704,7 @@ packages: '@chakra-ui/react-use-pan-event': 2.1.0(react@18.3.1) '@chakra-ui/react-use-size': 2.1.0(react@18.3.1) '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2721,7 +2715,7 @@ packages: react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2734,7 +2728,7 @@ packages: '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2747,7 +2741,7 @@ packages: '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2768,26 +2762,12 @@ packages: dependencies: '@chakra-ui/checkbox': 2.3.2(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) framer-motion: 10.18.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 dev: false - /@chakra-ui/switch@2.1.2(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react@18.3.1): - resolution: {integrity: sha512-pgmi/CC+E1v31FcnQhsSGjJnOE2OcND4cKPyTE+0F+bmGm48Q/b5UmKD9Y+CmZsrt/7V3h8KNczowupfuBfIHA==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@chakra-ui/checkbox': 2.3.2(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) - framer-motion: 11.1.8(react-dom@18.3.1)(react@18.3.1) - react: 18.3.1 - dev: false - - /@chakra-ui/system@2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1): + /@chakra-ui/system@2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1): resolution: {integrity: sha512-EGtpoEjLrUu4W1fHD+a62XR+hzC5YfsWm+6lO0Kybcga3yYEij9beegO0jZgug27V+Rf7vns95VPVP6mFd/DEQ==} peerDependencies: '@emotion/react': ^11.0.0 @@ -2800,8 +2780,8 @@ packages: '@chakra-ui/styled-system': 2.9.2 '@chakra-ui/theme-utils': 2.0.21 '@chakra-ui/utils': 2.0.15 - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1) + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.0)(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-fast-compare: 3.2.2 dev: false @@ -2814,7 +2794,7 @@ packages: dependencies: '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2833,7 +2813,7 @@ packages: '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2845,7 +2825,7 @@ packages: dependencies: '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/react-context': 2.1.0(react@18.3.1) - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2857,7 +2837,7 @@ packages: dependencies: '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false @@ -2908,36 +2888,13 @@ packages: '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/styled-system': 2.9.2 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) '@chakra-ui/theme': 3.3.1(@chakra-ui/styled-system@2.9.2) framer-motion: 10.18.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false - /@chakra-ui/toast@7.0.2(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-yvRP8jFKRs/YnkuE41BVTq9nB2v/KDRmje9u6dgDmE5+1bFt3bwjdf9gVbif4u5Ve7F7BGk5E093ARRVtvLvXA==} - peerDependencies: - '@chakra-ui/system': 2.6.2 - framer-motion: '>=4.0.0' - react: '>=18' - react-dom: '>=18' - dependencies: - '@chakra-ui/alert': 2.2.2(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/portal': 2.1.0(react-dom@18.3.1)(react@18.3.1) - '@chakra-ui/react-context': 2.1.0(react@18.3.1) - '@chakra-ui/react-use-timeout': 2.1.0(react@18.3.1) - '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/styled-system': 2.9.2 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) - '@chakra-ui/theme': 3.3.1(@chakra-ui/styled-system@2.9.2) - framer-motion: 11.1.8(react-dom@18.3.1)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@chakra-ui/tooltip@2.3.1(@chakra-ui/system@2.6.2)(framer-motion@10.18.0)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Rh39GBn/bL4kZpuEMPPRwYNnccRCL+w9OqamWHIB3Qboxs6h8cOyXfIdGxjo72lvhu1QI/a4KFqkM3St+WfC0A==} peerDependencies: @@ -2954,34 +2911,12 @@ packages: '@chakra-ui/react-use-event-listener': 2.1.0(react@18.3.1) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) framer-motion: 10.18.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false - /@chakra-ui/tooltip@2.3.1(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Rh39GBn/bL4kZpuEMPPRwYNnccRCL+w9OqamWHIB3Qboxs6h8cOyXfIdGxjo72lvhu1QI/a4KFqkM3St+WfC0A==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - framer-motion: '>=4.0.0' - react: '>=18' - react-dom: '>=18' - dependencies: - '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/popper': 3.1.0(react@18.3.1) - '@chakra-ui/portal': 2.1.0(react-dom@18.3.1)(react@18.3.1) - '@chakra-ui/react-types': 2.0.7(react@18.3.1) - '@chakra-ui/react-use-disclosure': 2.1.0(react@18.3.1) - '@chakra-ui/react-use-event-listener': 2.1.0(react@18.3.1) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) - framer-motion: 11.1.8(react-dom@18.3.1)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@chakra-ui/transition@2.1.0(framer-motion@10.18.0)(react@18.3.1): resolution: {integrity: sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==} peerDependencies: @@ -2993,14 +2928,14 @@ packages: react: 18.3.1 dev: false - /@chakra-ui/transition@2.1.0(framer-motion@11.1.8)(react@18.3.1): + /@chakra-ui/transition@2.1.0(framer-motion@11.3.24)(react@18.3.1): resolution: {integrity: sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==} peerDependencies: framer-motion: '>=4.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - framer-motion: 11.1.8(react-dom@18.3.1)(react@18.3.1) + framer-motion: 11.3.24(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 dev: false @@ -3019,19 +2954,12 @@ packages: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) react: 18.3.1 dev: false - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true - dev: true - optional: true - - /@dagrejs/dagre@1.1.2: - resolution: {integrity: sha512-F09dphqvHsbe/6C2t2unbmpr5q41BNPEfJCdn8Z7aEBpVSy/zFQ/b4SWsweQjWNsYMDvE2ffNUN8X0CeFsEGNw==} + /@dagrejs/dagre@1.1.3: + resolution: {integrity: sha512-umT7fBPECI4zgxxXW07H3vJN7W1WZcnBjk613eOEAKcwoFrYNyMZO+1SHmoC8zPZWR18DquK2wRUp9VHUE+94g==} dependencies: '@dagrejs/graphlib': 2.2.2 dev: false @@ -3041,10 +2969,10 @@ packages: engines: {node: '>17.0.0'} dev: false - /@discoveryjs/json-ext@0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - dev: true + /@dagrejs/graphlib@2.2.3: + resolution: {integrity: sha512-ivtgizOF6AFzAOT+4MARP1Cq+svPDX8MzBtNnSKWRK6WLaUTtRVhm8hl/xESkPRRv13XowKeJOYZoVm3nG8Rgw==} + engines: {node: '>17.0.0'} + dev: false /@dnd-kit/accessibility@3.1.0(react@18.3.1): resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} @@ -3105,6 +3033,24 @@ packages: stylis: 4.2.0 dev: false + /@emotion/babel-plugin@11.12.0: + resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + dependencies: + '@babel/helper-module-imports': 7.24.7 + '@babel/runtime': 7.25.0 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.0 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + dev: false + /@emotion/cache@11.11.0: resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} dependencies: @@ -3115,10 +3061,24 @@ packages: stylis: 4.2.0 dev: false + /@emotion/cache@11.13.1: + resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + dev: false + /@emotion/hash@0.9.1: resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} dev: false + /@emotion/hash@0.9.2: + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + dev: false + /@emotion/is-prop-valid@0.8.8: resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} requiresBuild: true @@ -3127,10 +3087,10 @@ packages: dev: false optional: true - /@emotion/is-prop-valid@1.2.2: - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + /@emotion/is-prop-valid@1.3.0: + resolution: {integrity: sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==} dependencies: - '@emotion/memoize': 0.8.1 + '@emotion/memoize': 0.9.0 dev: false /@emotion/memoize@0.7.4: @@ -3143,7 +3103,11 @@ packages: resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} dev: false - /@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1): + /@emotion/memoize@0.9.0: + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + dev: false + + /@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} peerDependencies: '@types/react': '*' @@ -3159,27 +3123,64 @@ packages: '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 - '@types/react': 18.3.1 + '@types/react': 18.3.3 hoist-non-react-statics: 3.3.2 react: 18.3.1 dev: false - /@emotion/serialize@1.1.4: - resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + /@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@emotion/hash': 0.9.1 + '@babel/runtime': 7.25.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 + '@types/react': 18.3.3 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@emotion/serialize@1.1.4: + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + dependencies: + '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/unitless': 0.8.1 '@emotion/utils': 1.2.1 csstype: 3.1.3 dev: false + /@emotion/serialize@1.3.0: + resolution: {integrity: sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==} + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.9.0 + '@emotion/utils': 1.4.0 + csstype: 3.1.3 + dev: false + /@emotion/sheet@1.2.2: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} dev: false - /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} + /@emotion/sheet@1.4.0: + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + dev: false + + /@emotion/styled@11.13.0(@emotion/react@11.13.0)(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -3188,63 +3189,61 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 - '@emotion/babel-plugin': 11.11.0 - '@emotion/is-prop-valid': 1.2.2 - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) - '@emotion/utils': 1.2.1 - '@types/react': 18.3.1 + '@babel/runtime': 7.25.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/is-prop-valid': 1.3.0 + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) + '@emotion/serialize': 1.3.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.0 + '@types/react': 18.3.3 react: 18.3.1 + transitivePeerDependencies: + - supports-color dev: false /@emotion/unitless@0.8.1: resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} dev: false + /@emotion/unitless@0.9.0: + resolution: {integrity: sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==} + dev: false + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1): resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} peerDependencies: react: '>=16.8.0' dependencies: react: 18.3.1 + dev: false + + /@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1): + resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.3.1 + dev: false /@emotion/utils@1.2.1: resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} dev: false + /@emotion/utils@1.4.0: + resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==} + dev: false + /@emotion/weak-memoize@0.3.1: resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} dev: false - /@ericcornelissen/bash-parser@0.5.2: - resolution: {integrity: sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ==} - engines: {node: '>=4'} - dependencies: - array-last: 1.3.0 - babylon: 6.18.0 - compose-function: 3.0.3 - deep-freeze: 0.0.1 - filter-iterator: 0.0.1 - filter-obj: 1.1.0 - has-own-property: 0.1.0 - identity-function: 1.0.0 - is-iterable: 1.1.1 - iterable-lookahead: 1.0.0 - lodash.curry: 4.1.1 - magic-string: 0.16.0 - map-obj: 2.0.0 - object-pairs: 0.1.0 - object-values: 1.0.0 - reverse-arguments: 1.0.0 - shell-quote-word: 1.0.1 - to-pascal-case: 1.0.0 - unescape-js: 1.1.4 - dev: true - - /@esbuild/aix-ppc64@0.20.2: - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + /@emotion/weak-memoize@0.4.0: + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + dev: false + + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -3252,8 +3251,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.20.2: - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -3261,8 +3260,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.20.2: - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -3270,8 +3269,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.20.2: - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -3279,8 +3278,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.20.2: - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -3288,8 +3287,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.20.2: - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -3297,8 +3296,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.20.2: - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -3306,8 +3305,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.20.2: - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -3315,8 +3314,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.20.2: - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -3324,8 +3323,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.20.2: - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -3333,8 +3332,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.20.2: - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -3342,8 +3341,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.20.2: - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -3351,8 +3350,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.20.2: - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -3360,8 +3359,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.20.2: - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -3369,8 +3368,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.20.2: - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -3378,8 +3377,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.20.2: - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -3387,8 +3386,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.20.2: - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -3396,8 +3395,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.20.2: - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -3405,8 +3404,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.20.2: - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -3414,8 +3413,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.20.2: - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -3423,8 +3422,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.20.2: - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -3432,8 +3431,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.20.2: - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -3441,8 +3440,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.20.2: - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -3487,28 +3486,12 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@fal-works/esbuild-plugin-global-externals@2.1.2: - resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - dev: true - - /@fastify/busboy@2.1.1: - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - dev: true - /@floating-ui/core@1.6.1: resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} dependencies: '@floating-ui/utils': 0.2.2 dev: false - /@floating-ui/dom@1.5.4: - resolution: {integrity: sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==} - dependencies: - '@floating-ui/core': 1.6.1 - '@floating-ui/utils': 0.2.2 - dev: false - /@floating-ui/dom@1.6.5: resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} dependencies: @@ -3520,8 +3503,8 @@ packages: resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} dev: false - /@fontsource-variable/inter@5.0.18: - resolution: {integrity: sha512-rJzSrtJ3b7djiGFvRuTe6stDfbYJGhdQSfn2SI2WfXviee7Er0yKAHE5u7FU7OWVQQQ1x3+cxdmx9NdiAkcrcA==} + /@fontsource-variable/inter@5.0.20: + resolution: {integrity: sha512-dhzG4Zls/tIrf8h0FhTNi8jT/uFwNhdTY2vKe6DYqoXDYOfEcTVZDyh1hKml1rlLT44Y7OoKoGz8w7czDW7twQ==} dev: false /@humanwhocodes/config-array@0.11.14: @@ -3544,27 +3527,15 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} dev: true - /@internationalized/date@3.5.3: - resolution: {integrity: sha512-X9bi8NAEHAjD8yzmPYT2pdJsbe+tYSEBAfowtlxJVJdZR3aK8Vg7ZUT1Fm5M47KLzp/M1p1VwAaeSma3RT7biw==} - dependencies: - '@swc/helpers': 0.5.11 - dev: false - - /@internationalized/number@3.5.2: - resolution: {integrity: sha512-4FGHTi0rOEX1giSkt5MH4/te0eHBq3cvAYsfLlpguV6pzJAReXymiYpE5wPCqKqjkUO3PIsyvk+tBiIV1pZtbA==} - dependencies: - '@swc/helpers': 0.5.11 - dev: false - - /@invoke-ai/eslint-config-react@0.0.14(eslint@8.57.0)(prettier@3.2.5)(typescript@5.4.5): + /@invoke-ai/eslint-config-react@0.0.14(eslint@8.57.0)(prettier@3.3.3)(typescript@5.5.4): resolution: {integrity: sha512-6ZUY9zgdDhv2WUoLdDKOQdU9ImnH0CBOFtRlOaNOh34IOsNRfn+JA7wqA0PKnkiNrlfPkIQWhn4GRJp68NT5bw==} peerDependencies: eslint: ^8.56.0 prettier: ^3.2.5 typescript: ^5.3.3 dependencies: - '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-config-prettier: 9.1.0(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0)(eslint@8.57.0) @@ -3572,54 +3543,53 @@ packages: eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) eslint-plugin-react-refresh: 0.4.6(eslint@8.57.0) eslint-plugin-simple-import-sort: 12.1.0(eslint@8.57.0) - eslint-plugin-storybook: 0.8.0(eslint@8.57.0)(typescript@5.4.5) + eslint-plugin-storybook: 0.8.0(eslint@8.57.0)(typescript@5.5.4) eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@7.8.0)(eslint@8.57.0) - prettier: 3.2.5 - typescript: 5.4.5 + prettier: 3.3.3 + typescript: 5.5.4 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color dev: true - /@invoke-ai/prettier-config-react@0.0.7(prettier@3.2.5): + /@invoke-ai/prettier-config-react@0.0.7(prettier@3.3.3): resolution: {integrity: sha512-vQeWzqwih116TBlIJII93L8ictj6uv7PxcSlAGNZrzG2UcaCFMsQqKCsB/qio26uihgv/EtvN6XAF96SnE0TKw==} peerDependencies: prettier: ^3.2.5 dependencies: - prettier: 3.2.5 + prettier: 3.3.3 dev: true - /@invoke-ai/ui-library@0.0.25(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@fontsource-variable/inter@5.0.18)(@internationalized/date@3.5.3)(@types/react@18.3.1)(i18next@23.11.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Fmjdlu62NXHgairYXGjcuCrxPEAl1G6Q6ban8g3excF6pDDdBeS7CmSNCyEDMxnSIOZrQlI04OhaMB17Imi9Uw==} + /@invoke-ai/ui-library@0.0.29(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@fontsource-variable/inter@5.0.20)(@types/react@18.3.3)(i18next@23.12.2)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-7SYOaiEEKk9iHk0hg2R2yVxiuV3I1x6bDEv0R3Y2tCH/Aq5XDG2tR+d7SQAPqf5+za3S+qfNFjbjl7GvEMwqmA==} peerDependencies: '@fontsource-variable/inter': ^5.0.16 react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@ark-ui/react': 1.3.0(@internationalized/date@3.5.3)(react-dom@18.3.1)(react@18.3.1) '@chakra-ui/anatomy': 2.2.2 '@chakra-ui/icons': 2.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/layout': 2.3.1(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/portal': 2.1.0(react-dom@18.3.1)(react@18.3.1) - '@chakra-ui/react': 2.8.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(framer-motion@10.18.0)(react-dom@18.3.1)(react@18.3.1) + '@chakra-ui/react': 2.8.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(@types/react@18.3.3)(framer-motion@10.18.0)(react-dom@18.3.1)(react@18.3.1) '@chakra-ui/styled-system': 2.9.2 '@chakra-ui/theme-tools': 2.1.2(@chakra-ui/styled-system@2.9.2) - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1) - '@fontsource-variable/inter': 5.0.18 - '@nanostores/react': 0.7.2(nanostores@0.9.5)(react@18.3.1) - chakra-react-select: 4.7.6(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/layout@2.3.1)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@emotion/react@11.11.4)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.0)(@types/react@18.3.3)(react@18.3.1) + '@fontsource-variable/inter': 5.0.20 + '@nanostores/react': 0.7.3(nanostores@0.11.2)(react@18.3.1) + chakra-react-select: 4.9.1(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/layout@2.3.1)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@emotion/react@11.13.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) framer-motion: 10.18.0(react-dom@18.3.1)(react@18.3.1) lodash-es: 4.17.21 - nanostores: 0.9.5 - overlayscrollbars: 2.7.3 - overlayscrollbars-react: 0.5.6(overlayscrollbars@2.7.3)(react@18.3.1) + nanostores: 0.11.2 + overlayscrollbars: 2.10.0 + overlayscrollbars-react: 0.5.6(overlayscrollbars@2.10.0)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-i18next: 14.1.1(i18next@23.11.3)(react-dom@18.3.1)(react@18.3.1) - react-icons: 5.2.0(react@18.3.1) - react-select: 5.8.0(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + react-i18next: 15.0.1(i18next@23.12.2)(react-dom@18.3.1)(react@18.3.1) + react-icons: 5.2.1(react@18.3.1) + react-select: 5.8.0(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) transitivePeerDependencies: - '@chakra-ui/form-control' - '@chakra-ui/icon' @@ -3627,10 +3597,10 @@ packages: - '@chakra-ui/menu' - '@chakra-ui/spinner' - '@chakra-ui/system' - - '@internationalized/date' - '@types/react' - i18next - react-native + - supports-color dev: false /@isaacs/cliui@8.0.2: @@ -3657,8 +3627,8 @@ packages: '@sinclair/typebox': 0.27.8 dev: true - /@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.4.5)(vite@5.2.11): - resolution: {integrity: sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==} + /@joshwooding/vite-plugin-react-docgen-typescript@0.3.1(typescript@5.5.4)(vite@5.4.0): + resolution: {integrity: sha512-pdoMZ9QaPnVlSM+SdU/wgg0nyD/8wQ7y90ttO2CMCyrrm7RxveYIJ5eNfjPaoMFqW41LZra7QO9j+xV4Y18Glw==} peerDependencies: typescript: '>= 4.3.x' vite: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -3669,9 +3639,9 @@ packages: glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.4.5) - typescript: 5.4.5 - vite: 5.2.11(@types/node@20.12.10) + react-docgen-typescript: 2.2.2(typescript@5.5.4) + typescript: 5.5.4 + vite: 5.4.0(@types/node@20.14.15) dev: true /@jridgewell/gen-mapping@0.3.5: @@ -3681,60 +3651,59 @@ packages: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 - dev: true /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/set-array@1.2.1: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@mdx-js/react@3.0.1(@types/react@18.3.1)(react@18.3.1): + /@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==} peerDependencies: '@types/react': '>=16' react: '>=16' dependencies: '@types/mdx': 2.0.13 - '@types/react': 18.3.1 + '@types/react': 18.3.3 react: 18.3.1 dev: true - /@microsoft/api-extractor-model@7.28.13(@types/node@20.12.10): + /@microsoft/api-extractor-model@7.28.13(@types/node@20.14.15): resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.12.10) + '@rushstack/node-core-library': 4.0.2(@types/node@20.14.15) transitivePeerDependencies: - '@types/node' dev: true - /@microsoft/api-extractor@7.43.0(@types/node@20.12.10): + /@microsoft/api-extractor@7.43.0(@types/node@20.14.15): resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} hasBin: true dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@20.12.10) + '@microsoft/api-extractor-model': 7.28.13(@types/node@20.14.15) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.12.10) + '@rushstack/node-core-library': 4.0.2(@types/node@20.14.15) '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@20.12.10) - '@rushstack/ts-command-line': 4.19.1(@types/node@20.12.10) + '@rushstack/terminal': 0.10.0(@types/node@20.14.15) + '@rushstack/ts-command-line': 4.19.1(@types/node@20.14.15) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -3758,36 +3727,17 @@ packages: resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} dev: true - /@nanostores/react@0.7.2(nanostores@0.10.3)(react@18.3.1): - resolution: {integrity: sha512-e3OhHJFv3NMSFYDgREdlAQqkyBTHJM91s31kOZ4OvZwJKdFk5BLk0MLbh51EOGUz9QGX2aCHfy1RvweSi7fgwA==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - nanostores: ^0.9.0 || ^0.10.0 - react: '>=18.0.0' - dependencies: - nanostores: 0.10.3 - react: 18.3.1 - dev: false - - /@nanostores/react@0.7.2(nanostores@0.9.5)(react@18.3.1): - resolution: {integrity: sha512-e3OhHJFv3NMSFYDgREdlAQqkyBTHJM91s31kOZ4OvZwJKdFk5BLk0MLbh51EOGUz9QGX2aCHfy1RvweSi7fgwA==} + /@nanostores/react@0.7.3(nanostores@0.11.2)(react@18.3.1): + resolution: {integrity: sha512-/XuLAMENRu/Q71biW4AZ4qmU070vkZgiQ28gaTSNRPm2SZF5zGAR81zPE1MaMB4SeOp6ZTst92NBaG75XSspNg==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - nanostores: ^0.9.0 || ^0.10.0 + nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0 react: '>=18.0.0' dependencies: - nanostores: 0.9.5 + nanostores: 0.11.2 react: 18.3.1 dev: false - /@ndelangen/get-tarball@3.0.9: - resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} - dependencies: - gunzip-maybe: 1.4.2 - pump: 3.0.0 - tar-fs: 2.1.1 - dev: true - /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -3796,24 +3746,11 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.scandir@3.0.0: - resolution: {integrity: sha512-ktI9+PxfHYtKjF3cLTUAh2N+b8MijCRPNwKJNqTVdL0gB0QxLU2rIRaZ1t71oEa3YBDE6bukH1sR0+CDnpp/Mg==} - engines: {node: '>=16.14.0'} - dependencies: - '@nodelib/fs.stat': 3.0.0 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.stat@3.0.0: - resolution: {integrity: sha512-2tQOI38s19P9i7X/Drt0v8iMA+KMsgdhB/dyPER+e+2Y8L1Z7QvnuRdW/uLuf5YRFUYmnj4bMA6qCuZHFI1GDQ==} - engines: {node: '>=16.14.0'} - dev: true - /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} @@ -3822,14 +3759,6 @@ packages: fastq: 1.17.1 dev: true - /@nodelib/fs.walk@2.0.0: - resolution: {integrity: sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A==} - engines: {node: '>=16.14.0'} - dependencies: - '@nodelib/fs.scandir': 3.0.0 - fastq: 1.17.1 - dev: true - /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3845,69 +3774,40 @@ packages: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@types/react': 18.3.1 - react: 18.3.1 - dev: true - - /@radix-ui/react-slot@1.0.2(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - react: 18.3.1 - dev: true - - /@reactflow/background@11.3.13(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-hkvpVEhgvfTDyCvdlitw4ioKCYLaaiRXnuEG+1QM3Np+7N1DiWF1XOv5I8AFyNoJL07yXEkbECUTsHvkBvcG5A==} + /@reactflow/background@11.3.14(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.11.3(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@reactflow/core': 11.11.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) classcat: 5.0.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.2(@types/react@18.3.1)(react@18.3.1) + zustand: 4.5.4(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/controls@11.2.13(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-3xgEg6ALIVkAQCS4NiBjb7ad8Cb3D8CtA7Vvl4Hf5Ar2PIVs6FOaeft9s2iDZGtsWP35ECDYId1rIFVhQL8r+A==} + /@reactflow/controls@11.2.14(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.11.3(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@reactflow/core': 11.11.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) classcat: 5.0.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.2(@types/react@18.3.1)(react@18.3.1) + zustand: 4.5.4(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/core@11.11.3(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-+adHdUa7fJSEM93fWfjQwyWXeI92a1eLKwWbIstoCakHpL8UjzwhEh6sn+mN2h/59MlVI7Ehr1iGTt3MsfcIFA==} + /@reactflow/core@11.11.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==} peerDependencies: react: '>=17' react-dom: '>=17' @@ -3922,19 +3822,19 @@ packages: d3-zoom: 3.0.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.2(@types/react@18.3.1)(react@18.3.1) + zustand: 4.5.4(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/minimap@11.7.13(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-m2MvdiGSyOu44LEcERDEl1Aj6x//UQRWo3HEAejNU4HQTlJnYrSN8tgrYF8TxC1+c/9UdyzQY5VYgrTwW4QWdg==} + /@reactflow/minimap@11.7.14(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.11.3(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@reactflow/core': 11.11.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@types/d3-selection': 3.0.10 '@types/d3-zoom': 3.0.8 classcat: 5.0.5 @@ -3942,46 +3842,79 @@ packages: d3-zoom: 3.0.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.2(@types/react@18.3.1)(react@18.3.1) + zustand: 4.5.4(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/node-resizer@2.2.13(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-X7ceQ2s3jFLgbkg03n2RYr4hm3jTVrzkW2W/8ANv/SZfuVmF8XJxlERuD8Eka5voKqLda0ywIZGAbw9GoHLfUQ==} + /@reactflow/node-resizer@2.2.14(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.11.3(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@reactflow/core': 11.11.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) classcat: 5.0.5 d3-drag: 3.0.0 d3-selection: 3.0.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.2(@types/react@18.3.1)(react@18.3.1) + zustand: 4.5.4(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/node-toolbar@1.3.13(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-aknvNICO10uWdthFSpgD6ctY/CTBeJUMV9co8T9Ilugr08Nb89IQ4uD0dPmr031ewMQxixtYIkw+sSDDzd2aaQ==} + /@reactflow/node-toolbar@1.3.14(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.11.3(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@reactflow/core': 11.11.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) classcat: 5.0.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.2(@types/react@18.3.1)(react@18.3.1) + zustand: 4.5.4(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' - immer dev: false + /@redocly/ajv@8.11.0: + resolution: {integrity: sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /@redocly/config@0.7.0: + resolution: {integrity: sha512-6GKxTo/9df0654Mtivvr4lQnMOp+pRj9neVywmI5+BwfZLTtkJnj2qB3D6d8FHTr4apsNOf6zTa5FojX0Evh4g==} + dev: true + + /@redocly/openapi-core@1.19.0(supports-color@9.4.0): + resolution: {integrity: sha512-ezK6qr80sXvjDgHNrk/zmRs9vwpIAeHa0T/qmo96S+ib4ThQ5a8f3qjwEqxMeVxkxCTbkaY9sYSJKOxv4ejg5w==} + engines: {node: '>=14.19.0', npm: '>=7.0.0'} + dependencies: + '@redocly/ajv': 8.11.0 + '@redocly/config': 0.7.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.5(supports-color@9.4.0) + js-levenshtein: 1.1.6 + js-yaml: 4.1.0 + lodash.isequal: 4.5.0 + minimatch: 5.1.6 + node-fetch: 2.7.0 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@reduxjs/toolkit@2.2.3(react-redux@9.1.2)(react@18.3.1): resolution: {integrity: sha512-76dll9EnJXg4EVcI5YNxZA/9hSAmZsFqzMmNRHvIlzw2WS/twfcVX3ysYrWGJMClwEmChQFC4yRq74tn6fdzRA==} peerDependencies: @@ -3995,7 +3928,7 @@ packages: dependencies: immer: 10.1.1 react: 18.3.1 - react-redux: 9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1) + react-redux: 9.1.2(@types/react@18.3.3)(react@18.3.1)(redux@5.0.1) redux: 5.0.1 redux-thunk: 3.1.0(redux@5.0.1) reselect: 5.1.0 @@ -4160,7 +4093,7 @@ packages: dev: true optional: true - /@rushstack/node-core-library@4.0.2(@types/node@20.12.10): + /@rushstack/node-core-library@4.0.2(@types/node@20.14.15): resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} peerDependencies: '@types/node': '*' @@ -4168,7 +4101,7 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 20.12.10 + '@types/node': 20.14.15 fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 @@ -4184,7 +4117,7 @@ packages: strip-json-comments: 3.1.1 dev: true - /@rushstack/terminal@0.10.0(@types/node@20.12.10): + /@rushstack/terminal@0.10.0(@types/node@20.14.15): resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} peerDependencies: '@types/node': '*' @@ -4192,15 +4125,15 @@ packages: '@types/node': optional: true dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@20.12.10) - '@types/node': 20.12.10 + '@rushstack/node-core-library': 4.0.2(@types/node@20.14.15) + '@types/node': 20.14.15 supports-color: 8.1.1 dev: true - /@rushstack/ts-command-line@4.19.1(@types/node@20.12.10): + /@rushstack/ts-command-line@4.19.1(@types/node@20.14.15): resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} dependencies: - '@rushstack/terminal': 0.10.0(@types/node@20.12.10) + '@rushstack/terminal': 0.10.0(@types/node@20.14.15) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -4212,6 +4145,11 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true + /@sindresorhus/merge-streams@2.3.0: + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + dev: true + /@snyk/github-codeowners@1.1.0: resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} engines: {node: '>=8.10'} @@ -4226,106 +4164,103 @@ packages: resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} dev: false - /@storybook/addon-actions@8.0.10: - resolution: {integrity: sha512-IEuc30UAFl7Ws0GwaY/whjBnGaViVEVjmPc+MXUym2wwwJbnCbI+BKJxPoYi/I7QJb5aUNToAE6pl2pDda2g3Q==} + /@storybook/addon-actions@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-dyajqsMNAUktpi7aiml0Fsm4ey8Nh2YwRyTDuTJZ1iJFcFyARqfr5iKH4/qElq80y0FYXGgGRJB+dKJsCdefLw==} + peerDependencies: + storybook: ^8.2.8 dependencies: - '@storybook/core-events': 8.0.10 '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 + storybook: 8.2.8 uuid: 9.0.1 dev: true - /@storybook/addon-backgrounds@8.0.10: - resolution: {integrity: sha512-445SUQqOH5xFJWlNeMu74FEgk26O9Zm/5aqnvmeteB0Q2JLaw7k2q9i/W6XFu97QkRxqA1EGbDxLR3+e1xCjaA==} + /@storybook/addon-backgrounds@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-OqXGpq8KzWwAAQWPnby/v4ayWuUAB18Twgi6zeb+QNLEQdFnSp7kz6+4mP8ZVg8RS3ACGXD31nnvvlF7GYoJjQ==} + peerDependencies: + storybook: ^8.2.8 dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 + storybook: 8.2.8 ts-dedent: 2.2.0 dev: true - /@storybook/addon-controls@8.0.10(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-MAUtIJGayNSsfn3VZ6SjQwpRkb4ky+10oVfos+xX9GQ5+7RCs+oYMuE4+aiQvvfXNdV8v0pUGPUPeUzqfJmhOA==} + /@storybook/addon-controls@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-adhg68CSFaR/r95rgyKU4ZzWwZz+MU0c4vr9hqrR1UGvg/zl33IZQQzb5j5v3Axo0O31yPMaY6LRty7pOv3+/Q==} + peerDependencies: + storybook: ^8.2.8 dependencies: - '@storybook/blocks': 8.0.10(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + dequal: 2.0.3 lodash: 4.17.21 + storybook: 8.2.8 ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - encoding - - react - - react-dom - - supports-color dev: true - /@storybook/addon-docs@8.0.10: - resolution: {integrity: sha512-y+Agoez/hXZHKUMIZHU96T5V1v0cs4ArSNfjqDg9DPYcyQ88ihJNb6ZabIgzmEaJF/NncCW+LofWeUtkTwalkw==} + /@storybook/addon-docs@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-8hqUYYveJjR3e/XdXt0vduA7TxFRIFWgXoa9jN5axa63kqfiHcfkpFYPjM8jCRhsfDIRgdrwe2qxsA0wewO1pA==} + peerDependencies: + storybook: ^8.2.8 dependencies: - '@babel/core': 7.24.5 - '@mdx-js/react': 3.0.1(@types/react@18.3.1)(react@18.3.1) - '@storybook/blocks': 8.0.10(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@storybook/client-logger': 8.0.10 - '@storybook/components': 8.0.10(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@storybook/csf-plugin': 8.0.10 - '@storybook/csf-tools': 8.0.10 + '@babel/core': 7.25.2 + '@mdx-js/react': 3.0.1(@types/react@18.3.3)(react@18.3.1) + '@storybook/blocks': 8.2.8(react-dom@18.3.1)(react@18.3.1)(storybook@8.2.8) + '@storybook/csf-plugin': 8.2.8(storybook@8.2.8) '@storybook/global': 5.0.0 - '@storybook/node-logger': 8.0.10 - '@storybook/preview-api': 8.0.10 - '@storybook/react-dom-shim': 8.0.10(react-dom@18.3.1)(react@18.3.1) - '@storybook/theming': 8.0.10(react-dom@18.3.1)(react@18.3.1) - '@storybook/types': 8.0.10 - '@types/react': 18.3.1 + '@storybook/react-dom-shim': 8.2.8(react-dom@18.3.1)(react@18.3.1)(storybook@8.2.8) + '@types/react': 18.3.3 fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rehype-external-links: 3.0.0 rehype-slug: 6.0.0 + storybook: 8.2.8 ts-dedent: 2.2.0 transitivePeerDependencies: - - encoding - supports-color dev: true - /@storybook/addon-essentials@8.0.10(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Uy3+vm7QX+b/9rhW/iFa3EYAAbV1T2LljY9Bj4aTPZHas9Bpvl5ZPnOm/PhybcE8UFHEoVTJ0v3uWb0dsUEigw==} - dependencies: - '@storybook/addon-actions': 8.0.10 - '@storybook/addon-backgrounds': 8.0.10 - '@storybook/addon-controls': 8.0.10(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@storybook/addon-docs': 8.0.10 - '@storybook/addon-highlight': 8.0.10 - '@storybook/addon-measure': 8.0.10 - '@storybook/addon-outline': 8.0.10 - '@storybook/addon-toolbars': 8.0.10 - '@storybook/addon-viewport': 8.0.10 - '@storybook/core-common': 8.0.10 - '@storybook/manager-api': 8.0.10(react-dom@18.3.1)(react@18.3.1) - '@storybook/node-logger': 8.0.10 - '@storybook/preview-api': 8.0.10 + /@storybook/addon-essentials@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-NRbFv2ociM1l/Oi/1go/ZC5bUU41n9aKD1DzIbguEKBhUs/TGAES+f5x+7DvYnt3Hvd925/FyTXuMU+vNUeiUA==} + peerDependencies: + storybook: ^8.2.8 + dependencies: + '@storybook/addon-actions': 8.2.8(storybook@8.2.8) + '@storybook/addon-backgrounds': 8.2.8(storybook@8.2.8) + '@storybook/addon-controls': 8.2.8(storybook@8.2.8) + '@storybook/addon-docs': 8.2.8(storybook@8.2.8) + '@storybook/addon-highlight': 8.2.8(storybook@8.2.8) + '@storybook/addon-measure': 8.2.8(storybook@8.2.8) + '@storybook/addon-outline': 8.2.8(storybook@8.2.8) + '@storybook/addon-toolbars': 8.2.8(storybook@8.2.8) + '@storybook/addon-viewport': 8.2.8(storybook@8.2.8) + storybook: 8.2.8 ts-dedent: 2.2.0 transitivePeerDependencies: - - '@types/react' - - encoding - - react - - react-dom - supports-color dev: true - /@storybook/addon-highlight@8.0.10: - resolution: {integrity: sha512-40GB82t1e2LCCjqXcC6Z5lq1yIpA1+Yl5E2tKeggOVwg5HHAX02ESNDdBaIOlCqMkU3WKzjGPurDNOLUAbsV2g==} + /@storybook/addon-highlight@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-IM1pPx6CCZbHV0bv3oB1qBCGDsr8soq7XLl93tc7mc4hstWSDFfNn7rx4CWycSlCqXlNTKh8cEkbrPrhV9cwbg==} + peerDependencies: + storybook: ^8.2.8 dependencies: '@storybook/global': 5.0.0 + storybook: 8.2.8 dev: true - /@storybook/addon-interactions@8.0.10(vitest@1.6.0): - resolution: {integrity: sha512-6yFNmk6+7082/8TRVyjUsKlwumalEdO0XQ5amPbVGuECzc3HFn0ELwzPrQ4TBlN5MRtX4+buoh5dc/1RUDrh9w==} + /@storybook/addon-interactions@8.2.8(storybook@8.2.8)(vitest@1.6.0): + resolution: {integrity: sha512-ggctlrSlK72xMfhviHHRslZF5tr9aHr1VFwCG/tjF7s1lM3S7OGqgHLJpcja/wNREvq9GMEvX95ZSu5NMh5CtA==} + peerDependencies: + storybook: ^8.2.8 dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.0.10 - '@storybook/test': 8.0.10(vitest@1.6.0) - '@storybook/types': 8.0.10 + '@storybook/instrumenter': 8.2.8(storybook@8.2.8) + '@storybook/test': 8.2.8(storybook@8.2.8)(vitest@1.6.0) polished: 4.3.1 + storybook: 8.2.8 ts-dedent: 2.2.0 transitivePeerDependencies: - '@jest/globals' @@ -4335,121 +4270,106 @@ packages: - vitest dev: true - /@storybook/addon-links@8.0.10(react@18.3.1): - resolution: {integrity: sha512-+mIyH2UcrgQfAyRM4+ARkB/D0OOY8UMwkZsD8dD23APZ8oru7W/NHX3lXl0WjPfQcOIx/QwWNWI3+DgVZJY3jw==} + /@storybook/addon-links@8.2.8(react@18.3.1)(storybook@8.2.8): + resolution: {integrity: sha512-2igEaSdKAFjKjioT6LGdBxZulpbVCzmlmV//sTu3sQiVnnxRjjGFt77sEeLMajrsSvg9DB1RMbDsvJ4FJTzXfQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.2.8 peerDependenciesMeta: react: optional: true dependencies: - '@storybook/csf': 0.1.7 + '@storybook/csf': 0.1.11 '@storybook/global': 5.0.0 react: 18.3.1 + storybook: 8.2.8 ts-dedent: 2.2.0 dev: true - /@storybook/addon-measure@8.0.10: - resolution: {integrity: sha512-quXQwmZJUhOxDIlbXTH6aKYQkwkDpL0UQRkUZn1xuZ2sVKJeaee73QSWqw8HDD4Rz9huS+OrAdVoq/Cz5FoC6A==} + /@storybook/addon-measure@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-oqZiX571F9NNy8o/oVyM1Pe2cJz3WJ/OpL0lVbepHrV4ir1f+SDYZdMI58jGBAtoM52cwFc2ZPbzXKQs7a513A==} + peerDependencies: + storybook: ^8.2.8 dependencies: '@storybook/global': 5.0.0 + storybook: 8.2.8 tiny-invariant: 1.3.3 dev: true - /@storybook/addon-outline@8.0.10: - resolution: {integrity: sha512-1eDO2s/vHhhSJo7W5SetqjleUBTZLI08VNP89c4j7vdRKiMZ1DYhr0dqUGIC3w7cDsawI/nQ24wancHHayAnqw==} + /@storybook/addon-outline@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-Cbk4Z0ojggiXjpbS2c4WUP56yikQdT4O7+8AuBNNjVUHNvJQADWYovi6SvDmrS5dH1iyIkB+4saXMr0syp+BDw==} + peerDependencies: + storybook: ^8.2.8 dependencies: '@storybook/global': 5.0.0 + storybook: 8.2.8 ts-dedent: 2.2.0 dev: true - /@storybook/addon-storysource@8.0.10: - resolution: {integrity: sha512-LCNgp5pWyI9ZlJMFeN0nvt9gvgHMWneDjfUoAHTOP7Smi0xz4lUDYKB4P53kgE1peHn2+nxAauSBdA1IEFBIRA==} + /@storybook/addon-storysource@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-xHH3gJttrfCXxGT6fQ2FBKreF1LFzUarX1YGxuRvZXXRSIYTUyAAlUCQT+/MskfuS6WNcpiao+4c3LCg+cx21Q==} + peerDependencies: + storybook: ^8.2.8 dependencies: - '@storybook/source-loader': 8.0.10 + '@storybook/source-loader': 8.2.8(storybook@8.2.8) estraverse: 5.3.0 + storybook: 8.2.8 tiny-invariant: 1.3.3 dev: true - /@storybook/addon-toolbars@8.0.10: - resolution: {integrity: sha512-67HP6mTJU/gjRju01Z5HjeqoRiJMDlrMvMvjGBg7w5+tPNtjYqdelfe2+kcfU+Hf6dfcuqaBDwaUUGSv+RYtRQ==} + /@storybook/addon-toolbars@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-k64G3FUpX3H/mhJ7AG1r/4Drsk6cdUtxI3yVdgWb7O3Ka7v/OFZexRXRSiV03n5q/kaqVKDu96Tuog57+7EB4w==} + peerDependencies: + storybook: ^8.2.8 + dependencies: + storybook: 8.2.8 dev: true - /@storybook/addon-viewport@8.0.10: - resolution: {integrity: sha512-NJ88Nd/tXreHLyLeF3VP+b8Fu2KtUuJ0L4JYpEMmcdaejGARTrJJOU+pcZBiUqEHFeXQ8rDY8DKXhUJZQFQ1Wg==} + /@storybook/addon-viewport@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-/JZeIgB33yhryUvWaNO+3t9akcS8nGLyAUmlljPFr3LUDDYrO/0H9tE4CgjLqtwCXBq3k3s0HLzEJOrKI9Tmbw==} + peerDependencies: + storybook: ^8.2.8 dependencies: memoizerific: 1.11.3 + storybook: 8.2.8 dev: true - /@storybook/blocks@8.0.10(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-LOaxvcO2d4dT4YoWlQ0bq/c8qA3aHoqtyuvBjwbVn+359bjMtgj/91YuP9Y2+ggZZ4p+ttgvk39PcmJlNXlJsw==} + /@storybook/blocks@8.2.8(react-dom@18.3.1)(react@18.3.1)(storybook@8.2.8): + resolution: {integrity: sha512-AHBXu9s73Xv9r1JageIL7C4eGf5XYEByai4Y6NYQsE+jF7b7e8oaSUoLW6fWSyLGuqvjRx+5P7GMNI2K1EngBA==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.2.8 peerDependenciesMeta: react: optional: true react-dom: optional: true dependencies: - '@storybook/channels': 8.0.10 - '@storybook/client-logger': 8.0.10 - '@storybook/components': 8.0.10(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@storybook/core-events': 8.0.10 - '@storybook/csf': 0.1.7 - '@storybook/docs-tools': 8.0.10 + '@storybook/csf': 0.1.11 '@storybook/global': 5.0.0 - '@storybook/icons': 1.2.9(react-dom@18.3.1)(react@18.3.1) - '@storybook/manager-api': 8.0.10(react-dom@18.3.1)(react@18.3.1) - '@storybook/preview-api': 8.0.10 - '@storybook/theming': 8.0.10(react-dom@18.3.1)(react@18.3.1) - '@storybook/types': 8.0.10 - '@types/lodash': 4.17.1 + '@storybook/icons': 1.2.10(react-dom@18.3.1)(react@18.3.1) + '@types/lodash': 4.17.7 color-convert: 2.0.1 dequal: 2.0.3 lodash: 4.17.21 - markdown-to-jsx: 7.3.2(react@18.3.1) + markdown-to-jsx: 7.4.7(react@18.3.1) memoizerific: 1.11.3 polished: 4.3.1 react: 18.3.1 react-colorful: 5.6.1(react-dom@18.3.1)(react@18.3.1) react-dom: 18.3.1(react@18.3.1) + storybook: 8.2.8 telejson: 7.2.0 - tocbot: 4.27.19 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' - - encoding - - supports-color - dev: true - - /@storybook/builder-manager@8.0.10: - resolution: {integrity: sha512-lo57jeeYuYCKYrmGOdLg25rMyiGYSTwJ+zYsQ3RvClVICjP6X0I1RCKAJDzkI0BixH6s1+w5ynD6X3PtDnhUuw==} - dependencies: - '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 8.0.10 - '@storybook/manager': 8.0.10 - '@storybook/node-logger': 8.0.10 - '@types/ejs': 3.1.5 - '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.20.2) - browser-assert: 1.2.1 - ejs: 3.1.10 - esbuild: 0.20.2 - esbuild-plugin-alias: 0.2.1 - express: 4.19.2 - fs-extra: 11.2.0 - process: 0.11.10 - util: 0.12.5 - transitivePeerDependencies: - - encoding - - supports-color dev: true - /@storybook/builder-vite@8.0.10(typescript@5.4.5)(vite@5.2.11): - resolution: {integrity: sha512-Rod/2jYvF4Ng1MjIMZEXe/3z0lPuxkRtetCTr3ECPgi83lHXpHJ+N0NVfJEMs+pXsVqkLP3iGt2hLn6D6yFMwA==} + /@storybook/builder-vite@8.2.8(storybook@8.2.8)(typescript@5.5.4)(vite@5.4.0): + resolution: {integrity: sha512-p9EJfZkX9ZsVi1Qr3jYyCJaZZ/2pt0KVTOYnDzNnhi3P/suU6O3Lp/YCV5+KOfAmlg2IgTND0EidqZinqPIBSg==} peerDependencies: '@preact/preset-vite': '*' + storybook: ^8.2.8 typescript: '>= 4.3.x' vite: ^4.0.0 || ^5.0.0 vite-plugin-glimmerx: '*' @@ -4461,434 +4381,198 @@ packages: vite-plugin-glimmerx: optional: true dependencies: - '@storybook/channels': 8.0.10 - '@storybook/client-logger': 8.0.10 - '@storybook/core-common': 8.0.10 - '@storybook/core-events': 8.0.10 - '@storybook/csf-plugin': 8.0.10 - '@storybook/node-logger': 8.0.10 - '@storybook/preview': 8.0.10 - '@storybook/preview-api': 8.0.10 - '@storybook/types': 8.0.10 + '@storybook/csf-plugin': 8.2.8(storybook@8.2.8) '@types/find-cache-dir': 3.2.1 browser-assert: 1.2.1 - es-module-lexer: 0.9.3 + es-module-lexer: 1.5.4 express: 4.19.2 find-cache-dir: 3.3.2 fs-extra: 11.2.0 magic-string: 0.30.10 + storybook: 8.2.8 ts-dedent: 2.2.0 - typescript: 5.4.5 - vite: 5.2.11(@types/node@20.12.10) + typescript: 5.5.4 + vite: 5.4.0(@types/node@20.14.15) transitivePeerDependencies: - - encoding - supports-color dev: true - /@storybook/channels@8.0.10: - resolution: {integrity: sha512-3JLxfD7czlx31dAGvAYJ4J4BNE/Y2+hhj/dsV3xlQTHKVpnWknaoeYEC1a6YScyfsH6W+XmP2rzZKzH4EkLSGQ==} + /@storybook/codemod@8.2.8: + resolution: {integrity: sha512-dqD4j6JTsS8BM2y1yHBIe5fHvsGM08qpJQXkE77aXJIm5UfUeuWC7rY0xAheX3fU5G98l3BJk0ySUGspQL5pNg==} dependencies: - '@storybook/client-logger': 8.0.10 - '@storybook/core-events': 8.0.10 - '@storybook/global': 5.0.0 - telejson: 7.2.0 + '@babel/core': 7.25.2 + '@babel/preset-env': 7.25.3(@babel/core@7.25.2) + '@babel/types': 7.25.2 + '@storybook/core': 8.2.8 + '@storybook/csf': 0.1.11 + '@types/cross-spawn': 6.0.6 + cross-spawn: 7.0.3 + globby: 14.0.2 + jscodeshift: 0.15.2(@babel/preset-env@7.25.3) + lodash: 4.17.21 + prettier: 3.3.3 + recast: 0.23.9 tiny-invariant: 1.3.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate dev: true - /@storybook/cli@8.0.10(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-KUZEO2lyvOS2sRJEFXovt6+5b65iWsh7F8e8S1cM20fCM1rZAlWtwmoxmDVXDmyEp0wTrq4FrRxKnbo9UO518w==} - hasBin: true + /@storybook/components@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-d4fI7Clogx4rgLAM7vZVr9L2EFtAkGXvpkZFuB0H0eyYaxZSbuZYvDCzRglQGQGsqD8IA8URTgPVSXC3L3k6Bg==} + peerDependencies: + storybook: ^8.2.8 dependencies: - '@babel/core': 7.24.5 - '@babel/types': 7.24.5 - '@ndelangen/get-tarball': 3.0.9 - '@storybook/codemod': 8.0.10 - '@storybook/core-common': 8.0.10 - '@storybook/core-events': 8.0.10 - '@storybook/core-server': 8.0.10(react-dom@18.3.1)(react@18.3.1) - '@storybook/csf-tools': 8.0.10 - '@storybook/node-logger': 8.0.10 - '@storybook/telemetry': 8.0.10 - '@storybook/types': 8.0.10 - '@types/semver': 7.5.8 - '@yarnpkg/fslib': 2.10.3 - '@yarnpkg/libzip': 2.3.0 - chalk: 4.1.2 - commander: 6.2.1 - cross-spawn: 7.0.3 - detect-indent: 6.1.0 - envinfo: 7.13.0 - execa: 5.1.1 - find-up: 5.0.0 - fs-extra: 11.2.0 - get-npm-tarball-url: 2.1.0 - giget: 1.2.3 - globby: 11.1.0 - jscodeshift: 0.15.2(@babel/preset-env@7.24.5) - leven: 3.1.0 - ora: 5.4.1 - prettier: 3.2.5 - prompts: 2.4.2 - read-pkg-up: 7.0.1 - semver: 7.6.0 - strip-json-comments: 3.1.1 - tempy: 1.0.1 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 + storybook: 8.2.8 + dev: true + + /@storybook/core@8.2.8: + resolution: {integrity: sha512-Wwm/Txh87hbxqU9OaxXwdGAmdRBjDn7rlZEPjNBx0tt43SQ11fKambY7nVWrWuw46YsJpdF9V/PQr4noNEXXEA==} + dependencies: + '@storybook/csf': 0.1.11 + '@types/express': 4.17.21 + '@types/node': 18.19.44 + browser-assert: 1.2.1 + esbuild: 0.21.5 + esbuild-register: 3.6.0(esbuild@0.21.5) + express: 4.19.2 + process: 0.11.10 + recast: 0.23.9 + util: 0.12.5 + ws: 8.18.0 transitivePeerDependencies: - - '@babel/preset-env' - bufferutil - - encoding - - react - - react-dom - supports-color - utf-8-validate dev: true - /@storybook/client-logger@8.0.10: - resolution: {integrity: sha512-u38SbZNAunZzxZNHMJb9jkUwFkLyWxmvp4xtiRM3u9sMUShXoTnzbw1yKrxs+kYJjg+58UQPZ1JhEBRcHt5Oww==} + /@storybook/csf-plugin@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-CEHY7xloBPE8d8h0wg2AM2kRaZkHK8/vkYMNZPbccqAYj6PQIdTuOcXZIBAhAGydyIBULZmsmmsASxM9RO5fKA==} + peerDependencies: + storybook: ^8.2.8 dependencies: - '@storybook/global': 5.0.0 + storybook: 8.2.8 + unplugin: 1.12.1 dev: true - /@storybook/codemod@8.0.10: - resolution: {integrity: sha512-t45jKGs/eyR/nKVX6QgRtMZSAjJo5aXWWk3B24xVbW6ywr0jt1LC100FkHG4Af8cApIfh8uUmS9X05hMG5zGGA==} + /@storybook/csf@0.0.1: + resolution: {integrity: sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==} dependencies: - '@babel/core': 7.24.5 - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - '@babel/types': 7.24.5 - '@storybook/csf': 0.1.7 - '@storybook/csf-tools': 8.0.10 - '@storybook/node-logger': 8.0.10 - '@storybook/types': 8.0.10 - '@types/cross-spawn': 6.0.6 - cross-spawn: 7.0.3 - globby: 11.1.0 - jscodeshift: 0.15.2(@babel/preset-env@7.24.5) lodash: 4.17.21 - prettier: 3.2.5 - recast: 0.23.6 - tiny-invariant: 1.3.3 - transitivePeerDependencies: - - supports-color dev: true - /@storybook/components@8.0.10(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-eo+oDDcm35YBB3dtDYDfcjJypNVPmRty85VWpAOBsJXpwp/fgU8csx0DM3KmhrQ4cWLf2WzcFowJwI1w+J88Sw==} + /@storybook/csf@0.1.11: + resolution: {integrity: sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==} + dependencies: + type-fest: 2.19.0 + dev: true + + /@storybook/global@5.0.0: + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + dev: true + + /@storybook/icons@1.2.10(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-310apKdDcjbbX2VSLWPwhEwAgjxTzVagrwucVZIdGPErwiAppX8KvBuWZgPo+rQLVrtH8S+pw1dbUwjcE6d7og==} + engines: {node: '>=14.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.3.1) - '@storybook/client-logger': 8.0.10 - '@storybook/csf': 0.1.7 - '@storybook/global': 5.0.0 - '@storybook/icons': 1.2.9(react-dom@18.3.1)(react@18.3.1) - '@storybook/theming': 8.0.10(react-dom@18.3.1)(react@18.3.1) - '@storybook/types': 8.0.10 - memoizerific: 1.11.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' dev: true - /@storybook/core-common@8.0.10: - resolution: {integrity: sha512-hsFlPieputaDQoxstnPa3pykTc4bUwEDgCHf8U43+/Z7qmLOQ9fpG+2CFW930rsCRghYpPreOvsmhY7lsGKWLQ==} + /@storybook/instrumenter@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-6Gk3CzoYQQXBXpW86PKqYSozOB/C9dSYiFvwPRo4XsEfjARDi8yglqkbOtG+FVqKDL66I5krcveB8bTWigqc9g==} + peerDependencies: + storybook: ^8.2.8 dependencies: - '@storybook/core-events': 8.0.10 - '@storybook/csf-tools': 8.0.10 - '@storybook/node-logger': 8.0.10 - '@storybook/types': 8.0.10 - '@yarnpkg/fslib': 2.10.3 - '@yarnpkg/libzip': 2.3.0 - chalk: 4.1.2 - cross-spawn: 7.0.3 - esbuild: 0.20.2 - esbuild-register: 3.5.0(esbuild@0.20.2) - execa: 5.1.1 - file-system-cache: 2.3.0 - find-cache-dir: 3.3.2 - find-up: 5.0.0 - fs-extra: 11.2.0 - glob: 10.3.12 - handlebars: 4.7.8 - lazy-universal-dotenv: 4.0.0 - node-fetch: 2.7.0 - picomatch: 2.3.1 - pkg-dir: 5.0.0 - pretty-hrtime: 1.0.3 - resolve-from: 5.0.0 - semver: 7.6.0 - tempy: 1.0.1 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 + '@storybook/global': 5.0.0 + '@vitest/utils': 1.6.0 + storybook: 8.2.8 util: 0.12.5 - transitivePeerDependencies: - - encoding - - supports-color dev: true - /@storybook/core-events@8.0.10: - resolution: {integrity: sha512-TuHPS6p5ZNr4vp4butLb4R98aFx0NRYCI/7VPhJEUH5rPiqNzE3PZd8DC8rnVxavsJ+jO1/y+egNKXRYkEcoPQ==} + /@storybook/manager-api@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-wzfRu3vrD9a99pN3W/RJXVtgNGNsy9PyvetjUfgQVtUZ9eXXDuA+tM7ITTu3xvONtV/rT2YEBwzOpowa+r1GNQ==} + peerDependencies: + storybook: ^8.2.8 dependencies: - ts-dedent: 2.2.0 - dev: true - - /@storybook/core-server@8.0.10(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-HYDw2QFBxg1X/d6g0rUhirOB5Jq6g90HBnyrZzxKoqKWJCNsCADSgM+h9HgtUw0jA97qBpIqmNO9n3mXFPWU/Q==} - dependencies: - '@aw-web-design/x-default-browser': 1.4.126 - '@babel/core': 7.24.5 - '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 8.0.10 - '@storybook/channels': 8.0.10 - '@storybook/core-common': 8.0.10 - '@storybook/core-events': 8.0.10 - '@storybook/csf': 0.1.7 - '@storybook/csf-tools': 8.0.10 - '@storybook/docs-mdx': 3.0.0 - '@storybook/global': 5.0.0 - '@storybook/manager': 8.0.10 - '@storybook/manager-api': 8.0.10(react-dom@18.3.1)(react@18.3.1) - '@storybook/node-logger': 8.0.10 - '@storybook/preview-api': 8.0.10 - '@storybook/telemetry': 8.0.10 - '@storybook/types': 8.0.10 - '@types/detect-port': 1.3.5 - '@types/node': 18.19.32 - '@types/pretty-hrtime': 1.0.3 - '@types/semver': 7.5.8 - better-opn: 3.0.2 - chalk: 4.1.2 - cli-table3: 0.6.4 - compression: 1.7.4 - detect-port: 1.5.1 - express: 4.19.2 - fs-extra: 11.2.0 - globby: 11.1.0 - ip: 2.0.1 - lodash: 4.17.21 - open: 8.4.2 - pretty-hrtime: 1.0.3 - prompts: 2.4.2 - read-pkg-up: 7.0.1 - semver: 7.6.0 - telejson: 7.2.0 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 - util: 0.12.5 - util-deprecate: 1.0.2 - watchpack: 2.4.1 - ws: 8.17.0 - transitivePeerDependencies: - - bufferutil - - encoding - - react - - react-dom - - supports-color - - utf-8-validate - dev: true - - /@storybook/csf-plugin@8.0.10: - resolution: {integrity: sha512-0EsyEx/06sCjI8sn40r7cABtBU1vUKPMPD+S5mJiZymm73BgdARj0qZOlLoK2LP+t2pcaB/Cn7KX/uyhhv7M2g==} - dependencies: - '@storybook/csf-tools': 8.0.10 - unplugin: 1.10.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@storybook/csf-tools@8.0.10: - resolution: {integrity: sha512-xUc6fVIKoCujf/7JZhkYjrVXeNsTSoDrZFNmqLEmtfktJVqYdXY4LuSAtlBmAIyETi09ULTuuVexrcKFwjzuBA==} - dependencies: - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - '@storybook/csf': 0.1.7 - '@storybook/types': 8.0.10 - fs-extra: 11.2.0 - recast: 0.23.6 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - supports-color + storybook: 8.2.8 dev: true - /@storybook/csf@0.0.1: - resolution: {integrity: sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==} - dependencies: - lodash: 4.17.21 - dev: true - - /@storybook/csf@0.1.7: - resolution: {integrity: sha512-53JeLZBibjQxi0Ep+/AJTfxlofJlxy1jXcSKENlnKxHjWEYyHQCumMP5yTFjf7vhNnMjEpV3zx6t23ssFiGRyw==} - dependencies: - type-fest: 2.19.0 - dev: true - - /@storybook/docs-mdx@3.0.0: - resolution: {integrity: sha512-NmiGXl2HU33zpwTv1XORe9XG9H+dRUC1Jl11u92L4xr062pZtrShLmD4VKIsOQujxhhOrbxpwhNOt+6TdhyIdQ==} - dev: true - - /@storybook/docs-tools@8.0.10: - resolution: {integrity: sha512-rg9KS81vEh13VMr4mAgs+7L4kYqoRtG7kVfV1WHxzJxjR3wYcVR0kP9gPTWV4Xha/TA3onHu9sxKxMTWha0urQ==} - dependencies: - '@storybook/core-common': 8.0.10 - '@storybook/core-events': 8.0.10 - '@storybook/preview-api': 8.0.10 - '@storybook/types': 8.0.10 - '@types/doctrine': 0.0.3 - assert: 2.1.0 - doctrine: 3.0.0 - lodash: 4.17.21 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@storybook/global@5.0.0: - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - dev: true - - /@storybook/icons@1.2.9(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-cOmylsz25SYXaJL/gvTk/dl3pyk7yBFRfeXTsHvTA3dfhoU/LWSq0NKL9nM7WBasJyn6XPSGnLS4RtKXLw5EUg==} - engines: {node: '>=14.0.0'} + /@storybook/preview-api@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-BDt1lo5oEWAaTVCsl6JUHCBFtIWI/Za4qvIdn2Lx9eCA+Ae6IDliosmu273DcvGD9R4OPF6sm1dML3TXILGGcA==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + storybook: ^8.2.8 dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + storybook: 8.2.8 dev: true - /@storybook/instrumenter@8.0.10: - resolution: {integrity: sha512-6IYjWeQFA5x68xRoW5dU4yAc1Hwq1ZBkZbXVgJbr5LJw5x+y8eKdZzIaOmSsSKOI96R7J5YWWd2WA1Q0nRurtg==} - dependencies: - '@storybook/channels': 8.0.10 - '@storybook/client-logger': 8.0.10 - '@storybook/core-events': 8.0.10 - '@storybook/global': 5.0.0 - '@storybook/preview-api': 8.0.10 - '@vitest/utils': 1.6.0 - util: 0.12.5 - dev: true - - /@storybook/manager-api@8.0.10(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-LLu6YKQLWf5QB3h3RO8IevjLrSOew7aidIQPr9DIr9xC8wA7N2fQabr+qrJdE306p3cHZ0nzhYNYZxSjm4Dvdw==} - dependencies: - '@storybook/channels': 8.0.10 - '@storybook/client-logger': 8.0.10 - '@storybook/core-events': 8.0.10 - '@storybook/csf': 0.1.7 - '@storybook/global': 5.0.0 - '@storybook/icons': 1.2.9(react-dom@18.3.1)(react@18.3.1) - '@storybook/router': 8.0.10 - '@storybook/theming': 8.0.10(react-dom@18.3.1)(react@18.3.1) - '@storybook/types': 8.0.10 - dequal: 2.0.3 - lodash: 4.17.21 - memoizerific: 1.11.3 - store2: 2.14.3 - telejson: 7.2.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - react - - react-dom - dev: true - - /@storybook/manager@8.0.10: - resolution: {integrity: sha512-bojGglUQNry48L4siURc2zQKswavLzMh69rqsfL3ZXx+i+USfRfB7593azTlaZh0q6HO4bUAjB24RfQCyifLLQ==} - dev: true - - /@storybook/node-logger@8.0.10: - resolution: {integrity: sha512-UMmaUaA3VOX/mKLsSvOnbZre2/1tZ6hazA6H0eAnClKb51jRD1AJrsBYK+uHr/CAp7t710bB5U8apPov7hayDw==} - dev: true - - /@storybook/preview-api@8.0.10: - resolution: {integrity: sha512-uZ6btF7Iloz9TnDcKLQ5ydi2YK0cnulv/8FLQhBCwSrzLLLb+T2DGz0cAeuWZEvMUNWNmkWJ9PAFQFs09/8p/Q==} - dependencies: - '@storybook/channels': 8.0.10 - '@storybook/client-logger': 8.0.10 - '@storybook/core-events': 8.0.10 - '@storybook/csf': 0.1.7 - '@storybook/global': 5.0.0 - '@storybook/types': 8.0.10 - '@types/qs': 6.9.15 - dequal: 2.0.3 - lodash: 4.17.21 - memoizerific: 1.11.3 - qs: 6.12.1 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - dev: true - - /@storybook/preview@8.0.10: - resolution: {integrity: sha512-op7gZqop8PSFyPA4tc1Zds8jG6VnskwpYUUsa44pZoEez9PKEFCf4jE+7AQwbBS3hnuCb0CKBfASN8GRyoznbw==} - dev: true - - /@storybook/react-dom-shim@8.0.10(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-3x8EWEkZebpWpp1pwXEzdabGINwOQt8odM5+hsOlDRtFZBmUqmmzK0rtn7orlcGlOXO4rd6QuZj4Tc5WV28dVQ==} + /@storybook/react-dom-shim@8.2.8(react-dom@18.3.1)(react@18.3.1)(storybook@8.2.8): + resolution: {integrity: sha512-2my3dGBOpBe30+FsSdQOIYCfxMyT68+SEq0qcXxfuax0BkhhJnZLpwvpqOna6EOVTgBD+Tk1TKmjpGwxuwp4rg==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.2.8 dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + storybook: 8.2.8 dev: true - /@storybook/react-vite@8.0.10(react-dom@18.3.1)(react@18.3.1)(typescript@5.4.5)(vite@5.2.11): - resolution: {integrity: sha512-J0Tw1jWSQYzc37AWaJCbrFQLlWsCHby0ie0yPx8DVehlnTT6xZWkohiKBq5iwMyYfF9SGrOfZ/dVRiB5q2sOIA==} + /@storybook/react-vite@8.2.8(react-dom@18.3.1)(react@18.3.1)(storybook@8.2.8)(typescript@5.5.4)(vite@5.4.0): + resolution: {integrity: sha512-xzXWyhFnLoFtJGgj8F5j/33QB4YTyEX61On6kolt7WFAjRFaUWJGYUC8cPPL4PNwsdouyCrnHvlJj77AvFlvfQ==} engines: {node: '>=18.0.0'} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.2.8 vite: ^4.0.0 || ^5.0.0 dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.4.5)(vite@5.2.11) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.1(typescript@5.5.4)(vite@5.4.0) '@rollup/pluginutils': 5.1.0 - '@storybook/builder-vite': 8.0.10(typescript@5.4.5)(vite@5.2.11) - '@storybook/node-logger': 8.0.10 - '@storybook/react': 8.0.10(react-dom@18.3.1)(react@18.3.1)(typescript@5.4.5) + '@storybook/builder-vite': 8.2.8(storybook@8.2.8)(typescript@5.5.4)(vite@5.4.0) + '@storybook/react': 8.2.8(react-dom@18.3.1)(react@18.3.1)(storybook@8.2.8)(typescript@5.5.4) find-up: 5.0.0 magic-string: 0.30.10 react: 18.3.1 react-docgen: 7.0.3 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.8 + storybook: 8.2.8 tsconfig-paths: 4.2.0 - vite: 5.2.11(@types/node@20.12.10) + vite: 5.4.0(@types/node@20.14.15) transitivePeerDependencies: - '@preact/preset-vite' - - encoding - rollup - supports-color - typescript - vite-plugin-glimmerx dev: true - /@storybook/react@8.0.10(react-dom@18.3.1)(react@18.3.1)(typescript@5.4.5): - resolution: {integrity: sha512-/MIMc02TNmiNXDzk55dm9+ujfNE5LVNeqqK+vxXWLlCZ0aXRAd1/ZLYeRFuYLgEETB7mh7IP8AXjvM68NX5HYg==} + /@storybook/react@8.2.8(react-dom@18.3.1)(react@18.3.1)(storybook@8.2.8)(typescript@5.5.4): + resolution: {integrity: sha512-Nln0DDTQ930P4J+SEkWbLSgaDe8eDd5gP6h3l4b5RwT7sRuSyHtTtYHPCnU9U7sLQ3AbMsclgtJukHXDitlccg==} engines: {node: '>=18.0.0'} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.2.8 typescript: '>= 4.2.x' peerDependenciesMeta: typescript: optional: true dependencies: - '@storybook/client-logger': 8.0.10 - '@storybook/docs-tools': 8.0.10 + '@storybook/components': 8.2.8(storybook@8.2.8) '@storybook/global': 5.0.0 - '@storybook/preview-api': 8.0.10 - '@storybook/react-dom-shim': 8.0.10(react-dom@18.3.1)(react@18.3.1) - '@storybook/types': 8.0.10 + '@storybook/manager-api': 8.2.8(storybook@8.2.8) + '@storybook/preview-api': 8.2.8(storybook@8.2.8) + '@storybook/react-dom-shim': 8.2.8(react-dom@18.3.1)(react@18.3.1)(storybook@8.2.8) + '@storybook/theming': 8.2.8(storybook@8.2.8) '@types/escodegen': 0.0.6 '@types/estree': 0.0.51 - '@types/node': 18.19.32 + '@types/node': 18.19.44 acorn: 7.4.1 acorn-jsx: 5.3.2(acorn@7.4.1) acorn-walk: 7.2.0 @@ -4900,61 +4584,38 @@ packages: react-dom: 18.3.1(react@18.3.1) react-element-to-jsx-string: 15.0.0(react-dom@18.3.1)(react@18.3.1) semver: 7.6.0 + storybook: 8.2.8 ts-dedent: 2.2.0 type-fest: 2.19.0 - typescript: 5.4.5 + typescript: 5.5.4 util-deprecate: 1.0.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@storybook/router@8.0.10: - resolution: {integrity: sha512-AZhgiet+EK0ZsPbaDgbbVTAHW2LAMCP1z/Un2uMBbdDeD0Ys29Af47AbEj/Ome5r1cqasLvzq2WXJlVXPNB0Zw==} - dependencies: - '@storybook/client-logger': 8.0.10 - memoizerific: 1.11.3 - qs: 6.12.1 dev: true - /@storybook/source-loader@8.0.10: - resolution: {integrity: sha512-bv9FRPzELjcoMJLWLDqkUNh1zY0DiCgcvM+9qsZva8pxAD4fzrX+mgCS2vZVJHRg8wMAhw/ymdXixDUodHAvsw==} + /@storybook/source-loader@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-0KGuRfk0PGj4+eO8eXFG0TUZQzHz8K2s7ududkH7PNqjy513/aPfqYpwW+5XfJWT+fM8RmlajgSgI5Kzl8ciDQ==} + peerDependencies: + storybook: ^8.2.8 dependencies: - '@storybook/csf': 0.1.7 - '@storybook/types': 8.0.10 + '@storybook/csf': 0.1.11 estraverse: 5.3.0 lodash: 4.17.21 - prettier: 3.2.5 + prettier: 3.3.3 + storybook: 8.2.8 dev: true - /@storybook/telemetry@8.0.10: - resolution: {integrity: sha512-s4Uc+KZQkdmD2d+64Qf8wYknhQZwmjf2CxjIjv9b4KLsU/nyfDheK7Fzd1jhBKb2UQUlLW5HhZkBgs1RsZcDHA==} - dependencies: - '@storybook/client-logger': 8.0.10 - '@storybook/core-common': 8.0.10 - '@storybook/csf-tools': 8.0.10 - chalk: 4.1.2 - detect-package-manager: 2.0.1 - fetch-retry: 5.0.6 - fs-extra: 11.2.0 - read-pkg-up: 7.0.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@storybook/test@8.0.10(vitest@1.6.0): - resolution: {integrity: sha512-VqjzKJiOCjaZ0CjLeKygYk8uetiaiKbpIox+BrND9GtpEBHcRZA5AeFY2P1aSCOhsaDwuh4KRBxJWFug7DhWGQ==} + /@storybook/test@8.2.8(storybook@8.2.8)(vitest@1.6.0): + resolution: {integrity: sha512-Lbt4DHP8WhnakTPw981kP85DeoONKN+zVLjFPa5ptllyT+jazZANjIdGhNUlBdIzOw3oyDXhGlWIdtqztS3pSA==} + peerDependencies: + storybook: ^8.2.8 dependencies: - '@storybook/client-logger': 8.0.10 - '@storybook/core-events': 8.0.10 - '@storybook/instrumenter': 8.0.10 - '@storybook/preview-api': 8.0.10 - '@testing-library/dom': 9.3.4 + '@storybook/csf': 0.1.11 + '@storybook/instrumenter': 8.2.8(storybook@8.2.8) + '@testing-library/dom': 10.1.0 '@testing-library/jest-dom': 6.4.5(vitest@1.6.0) - '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4) - '@vitest/expect': 1.3.1 + '@testing-library/user-event': 14.5.2(@testing-library/dom@10.1.0) + '@vitest/expect': 1.6.0 '@vitest/spy': 1.6.0 + storybook: 8.2.8 util: 0.12.5 transitivePeerDependencies: - '@jest/globals' @@ -4964,35 +4625,16 @@ packages: - vitest dev: true - /@storybook/theming@8.0.10(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-7NHt7bMC7lPkwz9KdDpa6DkLoQZz5OV6jsx/qY91kcdLo1rpnRPAiVlJvmWesFxi1oXOpVDpHHllWzf8KDBv8A==} + /@storybook/theming@8.2.8(storybook@8.2.8): + resolution: {integrity: sha512-jt5oUO82LN3z5aygNdHucBZcErSicIAwzhR5Kz9E/C9wUbhyZhbWsWyhpZaytu8LJUj2YWAIPS8kq/jGx+qLZA==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + storybook: ^8.2.8 dependencies: - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) - '@storybook/client-logger': 8.0.10 - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + storybook: 8.2.8 dev: true - /@storybook/types@8.0.10: - resolution: {integrity: sha512-S/hKS7+SqNnYIehwxdQ4M2nnlfGDdYWAXdtPCVJCmS+YF2amgAxeuisiHbUg7eypds6VL0Oxk/j2nPEHOHk9pg==} - dependencies: - '@storybook/channels': 8.0.10 - '@types/express': 4.17.21 - file-system-cache: 2.3.0 - dev: true - - /@swc/core-darwin-arm64@1.5.3: - resolution: {integrity: sha512-kRmmV2XqWegzGXvJfVVOj10OXhLgaVOOBjaX3p3Aqg7Do5ksg+bY5wi1gAN/Eul7B08Oqf7GG7WJevjDQGWPOg==} + /@swc/core-darwin-arm64@1.7.10: + resolution: {integrity: sha512-TYp4x/9w/C/yMU1olK5hTKq/Hi7BjG71UJ4V1U1WxI1JA3uokjQ/GoktDfmH5V5pX4dgGSOJwUe2RjoN8Z/XnA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -5000,8 +4642,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.5.3: - resolution: {integrity: sha512-EYs0+ovaRw6ZN9GBr2nIeC7gUXWA0q4RYR+Og3Vo0Qgv2Mt/XudF44A2lPK9X7M3JIfu6JjnxnTuvsK1Lqojfw==} + /@swc/core-darwin-x64@1.7.10: + resolution: {integrity: sha512-P3LJjAWh5yLc6p5IUwV5LgRfA3R1oDCZDMabYyb2BVQuJTD4MfegW9DhBcUUF5dhBLwq3191KpLVzE+dLTbiXw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -5009,8 +4651,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.5.3: - resolution: {integrity: sha512-RBVUTidSf4wgPdv98VrgJ4rMzMDN/3LBWdT7l+R7mNFH+mtID7ZAhTON0o/m1HkECgAgi1xcbTOVAw1xgd5KLA==} + /@swc/core-linux-arm-gnueabihf@1.7.10: + resolution: {integrity: sha512-yGOFjE7w/akRTmqGY3FvWYrqbxO7OB2N2FHj2LO5HtzXflfoABb5RyRvdEquX+17J6mEpu4EwjYNraTD/WHIEQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -5018,8 +4660,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.5.3: - resolution: {integrity: sha512-DCC6El3MiTYfv98CShxz/g2s4Pxn6tV0mldCQ0UdRqaN2ApUn7E+zTrqaj5bk7yII3A43WhE9Mr6wNPbXUeVyg==} + /@swc/core-linux-arm64-gnu@1.7.10: + resolution: {integrity: sha512-SPWsgWHfdWKKjLrYlvhxcdBJ7Ruy6crJbPoE9NfD95eJEjMnS2yZTqj2ChFsY737WeyhWYlHzgYhYOVCp83YwQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -5027,8 +4669,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.5.3: - resolution: {integrity: sha512-p04ysjYXEyaCGpJvwHm0T0nkPawXtdKBTThWnlh8M5jYULVNVA1YmC9azG2Avs1GDaLgBPVUgodmFYpdSupOYA==} + /@swc/core-linux-arm64-musl@1.7.10: + resolution: {integrity: sha512-PUi50bkNqnBL3Z/Zq6jSfwgN9A/taA6u2Zou0tjDJi7oVdpjdr7SxNgCGzMJ/nNg5D/IQn1opM1jktMvpsPAuQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -5036,8 +4678,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.5.3: - resolution: {integrity: sha512-/l4KJu0xwYm6tcVSOvF8RbXrIeIHJAhWnKvuX4ZnYKFkON968kB8Ghx+1yqBQcZf36tMzSuZUC5xBUA9u66lGA==} + /@swc/core-linux-x64-gnu@1.7.10: + resolution: {integrity: sha512-Sc+pY55gknCAmBQBR6DhlA7jZSxHaLSDb5Sevzi6DOFMXR79NpA6zWTNKwp1GK2AnRIkbAfvYLgOxS5uWTFVpg==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -5045,8 +4687,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.5.3: - resolution: {integrity: sha512-54DmSnrTXq4fYEKNR0nFAImG3+FxsHlQ6Tol/v3l+rxmg2K0FeeDOpH7wTXeWhMGhFlGrLIyLSnA+SzabfoDIA==} + /@swc/core-linux-x64-musl@1.7.10: + resolution: {integrity: sha512-g5NKx2LXaGd0K26hmEts1Cvb7ptIvq3MHSgr6/D1tRPcDZw1Sp0dYsmyOv0ho4F5GOJyiCooG3oE9FXdb7jIpQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -5054,8 +4696,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.5.3: - resolution: {integrity: sha512-piUMqoHNwDXChBfaaFIMzYgoxepfd8Ci1uXXNVEnuiRKz3FiIcNLmvXaBD7lKUwKcnGgVziH/CrndX6SldKQNQ==} + /@swc/core-win32-arm64-msvc@1.7.10: + resolution: {integrity: sha512-plRIsOcfy9t9Q/ivm5DA7I0HaIvfAWPbI+bvVRrr3C/1K2CSqnqZJjEWOAmx2LiyipijNnEaFYuLBp0IkGuJpg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -5063,8 +4705,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.5.3: - resolution: {integrity: sha512-zV5utPYBUzYhBOomCByAjKAvfVBcOCJtnszx7Zlfz7SAv/cGm8D1QzPDCvv6jDhIlUtLj6KyL8JXeFr+f95Fjw==} + /@swc/core-win32-ia32-msvc@1.7.10: + resolution: {integrity: sha512-GntrVNT23viHtbfzmlK8lfBiKeajH24GzbDT7qXhnoO20suUPcyYZxyvCb4gWM2zu8ZBTPHNlqfrNsriQCZ+lQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -5072,8 +4714,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.5.3: - resolution: {integrity: sha512-QmUiXiPIV5gBADfDh8e2jKynEhyRC+dcKP/zF9y5KqDUErYzlhocLd68uYS4uIegP6AylYlmigHgcaktGEE9VQ==} + /@swc/core-win32-x64-msvc@1.7.10: + resolution: {integrity: sha512-uXIF8GuSappe1imm6Lf7pHGepfCBjDQlS+qTqvEGE0wZAsL1IVATK9P/cH/OCLfJXeQDTLeSYmrpwjtXNt46tQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -5081,55 +4723,49 @@ packages: dev: true optional: true - /@swc/core@1.5.3: - resolution: {integrity: sha512-pSEglypnBGLHBoBcv3aYS7IM2t2LRinubYMyP88UoFIcD2pear2CeB15CbjJ2IzuvERD0ZL/bthM7cDSR9g+aQ==} + /@swc/core@1.7.10: + resolution: {integrity: sha512-l0xrFwBQ9atizhmV94yC2nwcecTk/oftofwMNPiFMGe56dqdmi2ArHaTV3PCtMlgaUH6rGCehoRMt5OrCI1ktg==} engines: {node: '>=10'} requiresBuild: true peerDependencies: - '@swc/helpers': ^0.5.0 + '@swc/helpers': '*' peerDependenciesMeta: '@swc/helpers': optional: true dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.6 + '@swc/types': 0.1.12 optionalDependencies: - '@swc/core-darwin-arm64': 1.5.3 - '@swc/core-darwin-x64': 1.5.3 - '@swc/core-linux-arm-gnueabihf': 1.5.3 - '@swc/core-linux-arm64-gnu': 1.5.3 - '@swc/core-linux-arm64-musl': 1.5.3 - '@swc/core-linux-x64-gnu': 1.5.3 - '@swc/core-linux-x64-musl': 1.5.3 - '@swc/core-win32-arm64-msvc': 1.5.3 - '@swc/core-win32-ia32-msvc': 1.5.3 - '@swc/core-win32-x64-msvc': 1.5.3 + '@swc/core-darwin-arm64': 1.7.10 + '@swc/core-darwin-x64': 1.7.10 + '@swc/core-linux-arm-gnueabihf': 1.7.10 + '@swc/core-linux-arm64-gnu': 1.7.10 + '@swc/core-linux-arm64-musl': 1.7.10 + '@swc/core-linux-x64-gnu': 1.7.10 + '@swc/core-linux-x64-musl': 1.7.10 + '@swc/core-win32-arm64-msvc': 1.7.10 + '@swc/core-win32-ia32-msvc': 1.7.10 + '@swc/core-win32-x64-msvc': 1.7.10 dev: true /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} dev: true - /@swc/helpers@0.5.11: - resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} - dependencies: - tslib: 2.6.2 - dev: false - - /@swc/types@0.1.6: - resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + /@swc/types@0.1.12: + resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} dependencies: '@swc/counter': 0.1.3 dev: true - /@testing-library/dom@9.3.4: - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + /@testing-library/dom@10.1.0: + resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} + engines: {node: '>=18'} dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.5 + '@babel/code-frame': 7.24.7 + '@babel/runtime': 7.25.0 '@types/aria-query': 5.0.4 - aria-query: 5.1.3 + aria-query: 5.3.0 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 @@ -5157,24 +4793,24 @@ packages: vitest: optional: true dependencies: - '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.5 + '@adobe/css-tools': 4.4.0 + '@babel/runtime': 7.25.0 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - vitest: 1.6.0(@types/node@20.12.10)(@vitest/ui@1.6.0) + vitest: 1.6.0(@types/node@20.14.15)(@vitest/ui@1.6.0) dev: true - /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): + /@testing-library/user-event@14.5.2(@testing-library/dom@10.1.0): resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 9.3.4 + '@testing-library/dom': 10.1.0 dev: true /@types/argparse@1.0.38: @@ -5218,19 +4854,19 @@ packages: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 20.12.10 + '@types/node': 20.14.15 dev: true /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 20.12.10 + '@types/node': 20.14.15 dev: true /@types/cross-spawn@6.0.6: resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} dependencies: - '@types/node': 20.12.10 + '@types/node': 20.14.15 dev: true /@types/d3-array@3.2.1: @@ -5292,8 +4928,8 @@ packages: '@types/d3-dsv': 3.0.7 dev: false - /@types/d3-force@3.0.9: - resolution: {integrity: sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==} + /@types/d3-force@3.0.10: + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} dev: false /@types/d3-format@3.0.4: @@ -5392,7 +5028,7 @@ packages: '@types/d3-dsv': 3.0.7 '@types/d3-ease': 3.0.2 '@types/d3-fetch': 3.0.7 - '@types/d3-force': 3.0.9 + '@types/d3-force': 3.0.10 '@types/d3-format': 3.0.4 '@types/d3-geo': 3.1.0 '@types/d3-hierarchy': 3.1.7 @@ -5416,28 +5052,16 @@ packages: resolution: {integrity: sha512-M95hNBMa/hnwErH+a+VOD/sYgTmo15OTYTM2Hr52/e0OdOuY+Crag+kd3/ioZrhg0WGbl9Sm3hR7UU+MH6rfOw==} dev: true - /@types/detect-port@1.3.5: - resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==} - dev: true - /@types/diff-match-patch@1.0.36: resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} dev: false - /@types/doctrine@0.0.3: - resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} - dev: true - /@types/doctrine@0.0.9: resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} dev: true - /@types/ejs@3.1.5: - resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} - dev: true - - /@types/emscripten@1.39.11: - resolution: {integrity: sha512-dOeX2BeNA7j6BTEqJQL3ut0bRCfsyQMd5i4FT8JfHfYhAOuJPCGh0dQFbxVJxUyQ+75x6enhDdndGb624/QszA==} + /@types/emscripten@1.39.13: + resolution: {integrity: sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==} dev: true /@types/escodegen@0.0.6: @@ -5459,10 +5083,10 @@ packages: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true - /@types/express-serve-static-core@4.19.0: - resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} + /@types/express-serve-static-core@4.19.5: + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} dependencies: - '@types/node': 20.12.10 + '@types/node': 20.14.15 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -5472,7 +5096,7 @@ packages: resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.0 + '@types/express-serve-static-core': 4.19.5 '@types/qs': 6.9.15 '@types/serve-static': 1.15.7 dev: true @@ -5489,7 +5113,7 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.12.10 + '@types/node': 20.14.15 dev: true /@types/hast@3.0.4: @@ -5523,11 +5147,15 @@ packages: /@types/lodash.mergewith@4.6.7: resolution: {integrity: sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==} dependencies: - '@types/lodash': 4.17.1 + '@types/lodash': 4.17.7 dev: false /@types/lodash@4.17.1: resolution: {integrity: sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==} + dev: true + + /@types/lodash@4.17.7: + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} /@types/mdx@2.0.13: resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} @@ -5541,30 +5169,22 @@ packages: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true - /@types/node@18.19.32: - resolution: {integrity: sha512-2bkg93YBSDKk8DLmmHnmj/Rwr18TLx7/n+I23BigFwgexUJoMHZOd8X1OFxuF/W3NN0S2W2E5sVabI5CPinNvA==} + /@types/node@18.19.44: + resolution: {integrity: sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==} dependencies: undici-types: 5.26.5 dev: true - /@types/node@20.12.10: - resolution: {integrity: sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==} + /@types/node@20.14.15: + resolution: {integrity: sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==} dependencies: undici-types: 5.26.5 dev: true - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true - /@types/parse-json@4.0.2: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} dev: false - /@types/pretty-hrtime@1.0.3: - resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} - dev: true - /@types/prop-types@15.7.12: resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -5579,23 +5199,23 @@ packages: /@types/react-dom@18.3.0: resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.3 dev: true /@types/react-reconciler@0.28.8: resolution: {integrity: sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==} dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.3 dev: false /@types/react-transition-group@4.4.10: resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.3 dev: false - /@types/react@18.3.1: - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + /@types/react@18.3.3: + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 @@ -5612,14 +5232,14 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 20.12.10 + '@types/node': 20.14.15 dev: true /@types/serve-static@1.15.7: resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.12.10 + '@types/node': 20.14.15 '@types/send': 0.17.4 dev: true @@ -5631,11 +5251,15 @@ packages: resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} dev: false + /@types/uuid@10.0.0: + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + dev: true + /@types/uuid@9.0.8: resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} dev: true - /@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -5647,10 +5271,10 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/type-utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/type-utils': 7.8.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/visitor-keys': 7.8.0 debug: 4.3.4 eslint: 8.57.0 @@ -5658,13 +5282,13 @@ packages: ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -5676,11 +5300,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 7.8.0 '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 7.8.0 debug: 4.3.4 eslint: 8.57.0 - typescript: 5.4.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color dev: true @@ -5701,7 +5325,7 @@ packages: '@typescript-eslint/visitor-keys': 7.8.0 dev: true - /@typescript-eslint/type-utils@7.8.0(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/type-utils@7.8.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -5711,12 +5335,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.5.4) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - supports-color dev: true @@ -5731,7 +5355,7 @@ packages: engines: {node: ^18.18.0 || >=20.0.0} dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5): + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5742,17 +5366,17 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 + debug: 4.3.6(supports-color@9.4.0) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.0 - tsutils: 3.21.0(typescript@5.4.5) - typescript: 5.4.5 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5): + /@typescript-eslint/typescript-estree@7.8.0(typescript@5.5.4): resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -5768,13 +5392,13 @@ packages: is-glob: 4.0.3 minimatch: 9.0.4 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5785,16 +5409,16 @@ packages: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -5805,7 +5429,7 @@ packages: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 7.8.0 '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.5.4) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -5833,13 +5457,13 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitejs/plugin-react-swc@3.6.0(vite@5.2.11): - resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} + /@vitejs/plugin-react-swc@3.7.0(vite@5.4.0): + resolution: {integrity: sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==} peerDependencies: vite: ^4 || ^5 dependencies: - '@swc/core': 1.5.3 - vite: 5.2.11(@types/node@20.12.10) + '@swc/core': 1.7.10 + vite: 5.4.0(@types/node@20.14.15) transitivePeerDependencies: - '@swc/helpers' dev: true @@ -5862,19 +5486,11 @@ packages: std-env: 3.7.0 strip-literal: 2.1.0 test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@20.12.10)(@vitest/ui@1.6.0) + vitest: 1.6.0(@types/node@20.14.15)(@vitest/ui@1.6.0) transitivePeerDependencies: - supports-color dev: true - /@vitest/expect@1.3.1: - resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} - dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 - chai: 4.4.1 - dev: true - /@vitest/expect@1.6.0: resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} dependencies: @@ -5892,707 +5508,135 @@ packages: dev: true /@vitest/snapshot@1.6.0: - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} - dependencies: - magic-string: 0.30.10 - pathe: 1.1.2 - pretty-format: 29.7.0 - dev: true - - /@vitest/spy@1.3.1: - resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} - dependencies: - tinyspy: 2.2.1 - dev: true - - /@vitest/spy@1.6.0: - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} - dependencies: - tinyspy: 2.2.1 - dev: true - - /@vitest/ui@1.6.0(vitest@1.6.0): - resolution: {integrity: sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==} - peerDependencies: - vitest: 1.6.0 - dependencies: - '@vitest/utils': 1.6.0 - fast-glob: 3.3.2 - fflate: 0.8.2 - flatted: 3.3.1 - pathe: 1.1.2 - picocolors: 1.0.0 - sirv: 2.0.4 - vitest: 1.6.0(@types/node@20.12.10)(@vitest/ui@1.6.0) - dev: true - - /@vitest/utils@1.3.1: - resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true - - /@vitest/utils@1.6.0: - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true - - /@volar/language-core@1.11.1: - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} - dependencies: - '@volar/source-map': 1.11.1 - dev: true - - /@volar/source-map@1.11.1: - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} - dependencies: - muggle-string: 0.3.1 - dev: true - - /@volar/typescript@1.11.1: - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} - dependencies: - '@volar/language-core': 1.11.1 - path-browserify: 1.0.1 - dev: true - - /@vue/compiler-core@3.4.26: - resolution: {integrity: sha512-N9Vil6Hvw7NaiyFUFBPXrAyETIGlQ8KcFMkyk6hW1Cl6NvoqvP+Y8p1Eqvx+UdqsnrnI9+HMUEJegzia3mhXmQ==} - dependencies: - '@babel/parser': 7.24.5 - '@vue/shared': 3.4.26 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.0 - dev: true - - /@vue/compiler-dom@3.4.26: - resolution: {integrity: sha512-4CWbR5vR9fMg23YqFOhr6t6WB1Fjt62d6xdFPyj8pxrYub7d+OgZaObMsoxaF9yBUHPMiPFK303v61PwAuGvZA==} - dependencies: - '@vue/compiler-core': 3.4.26 - '@vue/shared': 3.4.26 - dev: true - - /@vue/language-core@1.8.27(typescript@5.4.5): - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.4.26 - '@vue/shared': 3.4.26 - computeds: 0.0.1 - minimatch: 9.0.4 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - typescript: 5.4.5 - vue-template-compiler: 2.7.16 - dev: true - - /@vue/shared@3.4.26: - resolution: {integrity: sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ==} - dev: true - - /@xobotyi/scrollbar-width@1.9.5: - resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} - dev: false - - /@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.20.2): - resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} - engines: {node: '>=14.15.0'} - peerDependencies: - esbuild: '>=0.10.0' - dependencies: - esbuild: 0.20.2 - tslib: 2.6.2 - dev: true - - /@yarnpkg/fslib@2.10.3: - resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - dependencies: - '@yarnpkg/libzip': 2.3.0 - tslib: 1.14.1 - dev: true - - /@yarnpkg/libzip@2.3.0: - resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - dependencies: - '@types/emscripten': 1.39.11 - tslib: 1.14.1 - dev: true - - /@zag-js/accordion@0.32.1: - resolution: {integrity: sha512-16beDVpEhXFQsQRMZLmHFruhGphSprJ5XrRu6+OM2U7aTulo1w3ENUd9uI+mIs4oTVO66lYI4Lp+dFcT2UUIYA==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/anatomy@0.32.1: - resolution: {integrity: sha512-bR+tfFfkbxwhBzGGjEQG+RUnbeCjMx7tWJxykGnGdVLwAh0wKTQBEfHEOCOQh5qU8RhKUieqemAdvc7oP3Tp4w==} - dev: false - - /@zag-js/aria-hidden@0.32.1: - resolution: {integrity: sha512-kznwxvUUHDax8Kd7YNVVCzQcwGARTRaZNOcIkw7MTLE8g/pU+C4pYkwR9iqA7/8imGfjYrZfSsQqZRTb4bkS0g==} - dependencies: - '@zag-js/dom-query': 0.32.1 - dev: false - - /@zag-js/auto-resize@0.32.1: - resolution: {integrity: sha512-MO6N5gPs2xDKbFgrakn6LDWv1GgN8uhfwpsqchLJX+EaZVvLIz8cXFD+jDv3RjK+5GRWV4mIF+26SXuHRSt9Ug==} - dependencies: - '@zag-js/dom-query': 0.32.1 - dev: false - - /@zag-js/avatar@0.32.1: - resolution: {integrity: sha512-5P+95pkMX2Na4yljN1etdgYyA+3HPORjWKn0Y3JamkYIAqJwRFO+taEdSm/xcRkuT6aGA3luheUowjt8wZssyA==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/mutation-observer': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/carousel@0.32.1: - resolution: {integrity: sha512-S7dUrPtiLr42Fa+S3O18kqKVqSu2yuk67bqGDtppIZSaFOugYHK4feBkZqjKw+eF12NVRRVO2j+A40d3MvxbSA==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/checkbox@0.32.1: - resolution: {integrity: sha512-5reRreGyDZ5IlBNd5m1QrYXCehVIl/pmfKMEcAfad5DcgCaHGv5j76eahxbKln/8TEdwz4eWzBrqNtwSkKL5+w==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - '@zag-js/visually-hidden': 0.32.1 - dev: false - - /@zag-js/collection@0.32.1: - resolution: {integrity: sha512-dAzcVQ/n+xAYoxWB/65/CQinv66RNVuq5ig0fEYszBqP+HjFnOpeGkIrEvP+bFI38hFEViiGtfr6oGAsVByOVQ==} - dev: false - - /@zag-js/color-picker@0.32.1: - resolution: {integrity: sha512-ov3FC+c2WBYmEGRXWFVb2jih2Ecejj5JqBjDL9iMLBs2KNY9jnpvtH7WnZbijNY+RMDBj+C/DNI7K2NVaamSIA==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/color-utils': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dismissable': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/popper': 0.32.1 - '@zag-js/tabbable': 0.32.1 - '@zag-js/text-selection': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - '@zag-js/visually-hidden': 0.32.1 - dev: false - - /@zag-js/color-utils@0.32.1: - resolution: {integrity: sha512-AzupfOD7oD0mE+H9roTzwnLqtw1wYiJGOQKLPAwdwPQdznJUQD6sMOpxR/6RBuITVTm8Bl12Mr4+7s29LVJruw==} - dependencies: - '@zag-js/numeric-range': 0.32.1 - dev: false - - /@zag-js/combobox@0.32.1: - resolution: {integrity: sha512-skz2C5UxLD5JoYNP4hcPaQJu2cW7vycKqjDNI9ZtygSkZHOHx+JxpYiACBnr1vqzXatIOuDQm/HUuWW9yOT4eA==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/aria-hidden': 0.32.1 - '@zag-js/collection': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dismissable': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/mutation-observer': 0.32.1 - '@zag-js/popper': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/core@0.32.1: - resolution: {integrity: sha512-F9F7920/CisoLWALQACIhqbMvemgbv86qBULJ+UEe+a/9XgGwPh9UGn/H/q5EWkNpgEapz2b3pl3ONgKmXsK1A==} - dependencies: - '@zag-js/store': 0.32.1 - klona: 2.0.6 - dev: false - - /@zag-js/date-picker@0.32.1: - resolution: {integrity: sha512-n/hYmF+/R4+NuyfPRzCgeuLT6LJihKSuKzK29STPWy3sC/tBBHiqhNv1/4UKbatHUJXdBW2XF+N8Rw08RffcFQ==} - dependencies: - '@internationalized/date': 3.5.3 - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/date-utils': 0.32.1(@internationalized/date@3.5.3) - '@zag-js/dismissable': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/live-region': 0.32.1 - '@zag-js/popper': 0.32.1 - '@zag-js/text-selection': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/date-utils@0.32.1(@internationalized/date@3.5.3): - resolution: {integrity: sha512-dbBDRSVr5pRUw3rXndyGuSshZiWqQI5JQO4D2KIFGkXzorj6WzoOpcO910Z7AdM/9cCAMpCjUrka8d8o9BpJBg==} - peerDependencies: - '@internationalized/date': '>=3.0.0' - dependencies: - '@internationalized/date': 3.5.3 - dev: false - - /@zag-js/dialog@0.32.1: - resolution: {integrity: sha512-czp+qXcdAOM70SrvDo4gBpYZx6gS6HXyrpiptW3+EHa2eiCfc/Z2w+Nu+ZadOTEQGgNWlKlCLW7Ery0i9mMDsw==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/aria-hidden': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dismissable': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/remove-scroll': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - focus-trap: 7.5.4 - dev: false - - /@zag-js/dismissable@0.32.1: - resolution: {integrity: sha512-UIkG+9Eb5wrus2F2Dy4zqk0pwCV53sdnMYBxk9dpvDzBJHzW+InhVeg3UeKmPL8ELcYlhH/Bap99XCRJvxsXow==} - dependencies: - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/interact-outside': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/dom-event@0.32.1: - resolution: {integrity: sha512-wN6f5Kkf7C/YFN3wbEG3gUockSebyy1fPNL2BuL4C8PIP8vOD14hnHTzZWg5yYfO+veybIAL38r8I46C+bOVBQ==} - dependencies: - '@zag-js/text-selection': 0.32.1 - '@zag-js/types': 0.32.1 - dev: false - - /@zag-js/dom-query@0.16.0: - resolution: {integrity: sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ==} - dev: false - - /@zag-js/dom-query@0.32.1: - resolution: {integrity: sha512-u6hrQHQ0/dcUi6xJn8d2Mu1ClN4KZpPqOKrJFSaxadWjSy+x0qp48WY2CBQ6gZ3j8IwR/XjzU9bu9wY5jJfHgA==} - dev: false - - /@zag-js/editable@0.32.1: - resolution: {integrity: sha512-QEGnfp2P9nWVp9vGNWtszspvQcF3KtBRToZrv5/DT30Mpo/uPDKtqijLs0SnB/W60ELzcIRhK4J9taGoK8O8uw==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/interact-outside': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/element-rect@0.32.1: - resolution: {integrity: sha512-tAmxgxU2LsByK8PIs/Cj6cBJ8xZCVXE9RoStxthhuPL7xKYUfZvFGuhHVOHTHd6sDKEqbj6K1ds/TGPuglIh4w==} - dev: false - - /@zag-js/element-size@0.10.5: - resolution: {integrity: sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w==} - dev: false - - /@zag-js/element-size@0.32.1: - resolution: {integrity: sha512-ACklufmJQpah2UqwZUlYFaKi6uWfZBeTghtbfYHcDfzRbg2Hni612v8L1JeS4vAgjeDpcdHQpXXR4AZSpGZgNw==} - dev: false - - /@zag-js/file-upload@0.32.1: - resolution: {integrity: sha512-cD0NRIDof9Vv2DemmnYe9ZPZxOZ6b8XZl8eq4G0e8+WLYtnRXyEURl8Dw0QJpfdDPQaHnnD4CNxPTQcLgP+9Sg==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/file-utils': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - '@zag-js/visually-hidden': 0.32.1 - dev: false - - /@zag-js/file-utils@0.32.1: - resolution: {integrity: sha512-0PxTrljW51Lf9OCuYNlZuaLgF0v1NoVRzXa/osZ9HGceQjfo77R5G9u+/TP3u53W2PTxajEZ4eNzTibgpzNXFg==} - dev: false - - /@zag-js/focus-visible@0.16.0: - resolution: {integrity: sha512-a7U/HSopvQbrDU4GLerpqiMcHKEkQkNPeDZJWz38cw/6Upunh41GjHetq5TB84hxyCaDzJ6q2nEdNoBQfC0FKA==} - dependencies: - '@zag-js/dom-query': 0.16.0 - dev: false - - /@zag-js/form-utils@0.32.1: - resolution: {integrity: sha512-OemLBlHCHHm7t8wNcf78FRudRA7FegSgsNEzAjrRTyx+lJztDyHRLaoyI1gCEIg+0Kzl2nMxjOl4MStGsDj8iw==} - dependencies: - '@zag-js/mutation-observer': 0.32.1 - dev: false - - /@zag-js/hover-card@0.32.1: - resolution: {integrity: sha512-k66YK0z0P4LuK78+jnRoUPxJiM9GA0sbEEz3oPlvcFVXMMwnRTPNIw1OjksfAPI+Nvgg7H6D3A+7HCdRI/oBjw==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dismissable': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/popper': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/interact-outside@0.32.1: - resolution: {integrity: sha512-8zHuswfTAgfMCaQnp3N4WStvnL32VyxURafb21+mE4neAF/DaKfJHWnJpeUMG1Qh/eXsrMRBxVoX+nBMhHj9bg==} - dependencies: - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/tabbable': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/live-region@0.32.1: - resolution: {integrity: sha512-6/9QMLVZbTRh/G6MoJc/auN8r5vjdY9vUgNT680C2LOa2vnRR5/y0DkIpVgttNh1rSenQ/eLEYxp8hQF1rIYNw==} - dependencies: - '@zag-js/visually-hidden': 0.32.1 - dev: false - - /@zag-js/menu@0.32.1: - resolution: {integrity: sha512-IPsTljVF0N9xTwub1cpGl3GAG5ttAq3h38PdZERREzT3qRgw4v3K/I1TG2vIiDXgJz8UZzUKox6ZYdU7UIAkRA==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dismissable': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/mutation-observer': 0.32.1 - '@zag-js/popper': 0.32.1 - '@zag-js/rect-utils': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/mutation-observer@0.32.1: - resolution: {integrity: sha512-/hlObxGnhAaYYVnwRJC227md0M3kSE6mO24vkqVGwq2GglS+u4zbVcBBUuWgHdMML+ZjIQrZuVycCBMfVlHq0g==} - dev: false - - /@zag-js/number-input@0.32.1: - resolution: {integrity: sha512-atyIOvoMITb4hZtQym7yD6I7grvPW83UeMFO8hCQg3HWwd2zR4+63mouWuyMoWb4QrzVFRVQBaU8OG5xGlknEw==} - dependencies: - '@internationalized/number': 3.5.2 - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/mutation-observer': 0.32.1 - '@zag-js/number-utils': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/number-utils@0.32.1: - resolution: {integrity: sha512-x/nttU31TtFVTqFBM8e3ZH/0MCc+u15WAfk0rT6ESkoZcdb80rTzZVMokCKCUdpi/JdB1vjEeCLSnj+ig8oAIQ==} - dev: false - - /@zag-js/numeric-range@0.32.1: - resolution: {integrity: sha512-1Qe2URTenlrdsWuArlnQ+v5bBH2mHZD3XsK6jYV+C2lgatVzdcoN4GCSNTiF7w+So6J+NTeLMkVHMGCW1Kzx1g==} - dev: false - - /@zag-js/pagination@0.32.1: - resolution: {integrity: sha512-lhogzKxJnx5D2Xoni/xm5rkOuy15KWSxqBHVwe8+j5aSNqMy7+aRtEN2F2VQCDVL/v1fdciQvOCA9udm37kZ4w==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/pin-input@0.32.1: - resolution: {integrity: sha512-d18cCXKUr7INL0Xm5KyIoiTRSNsPXfIlIEMl2HrAvM3r70wtEag0PmiDNA5NS2tB4LnnX0XowchGB4HsdFS/ng==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - '@zag-js/visually-hidden': 0.32.1 - dev: false - - /@zag-js/popover@0.32.1: - resolution: {integrity: sha512-B01if49v3crCjkvtSvIX4CBdT/475nj3DttOObc36s0YOxCEt3UihMITBD5JvIKwEqjZ6oU5t0sLcUYOqQ4f2A==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/aria-hidden': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dismissable': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/popper': 0.32.1 - '@zag-js/remove-scroll': 0.32.1 - '@zag-js/tabbable': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - focus-trap: 7.5.4 - dev: false - - /@zag-js/popper@0.32.1: - resolution: {integrity: sha512-aQgogW1N4VreNACSQhXQoZeXtQQtB//FXUvt1CBnW2DtmZ6YkNnaAfn186Q2lkw2/T0chITRy3eYeviwMmMrqg==} - dependencies: - '@floating-ui/dom': 1.5.4 - '@zag-js/dom-query': 0.32.1 - '@zag-js/element-rect': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/presence@0.32.1: - resolution: {integrity: sha512-8189QMUf/L1dztAZdurx18ZwPyWlq58Mrd+GdATSaf8JstgrI1ovzVs606inQghWptKHMsH7dUIaV9UkhbSx3Q==} - dependencies: - '@zag-js/core': 0.32.1 - '@zag-js/types': 0.32.1 - dev: false - - /@zag-js/progress@0.32.1: - resolution: {integrity: sha512-ClkQvNYnuIpKfAPUceZXY5E2m/3NnIm21cvHe4gAoJ88YdqEHd5rIRoHP63g8ET8Ct/2KkBRkgR+LrQnGQOomA==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false - - /@zag-js/radio-group@0.32.1: - resolution: {integrity: sha512-NvdSjwRF38qIh0oM68jERf71uiwV2JFTrGeQEs3EIqONzULwL6jR2p4P1wm3JJNBAkSYBKZMER5cVUUcqM3kjQ==} + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/element-rect': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - '@zag-js/visually-hidden': 0.32.1 - dev: false + magic-string: 0.30.10 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true - /@zag-js/rating-group@0.32.1: - resolution: {integrity: sha512-RBaFRCw7P00bgTrEjUHT3h/OGRO8XmXKkQYqqhm1tsVbeTsT47iwHoc6XnMEiGBonaJDwN/J0oFasw7GNg5sow==} + /@vitest/spy@1.6.0: + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false + tinyspy: 2.2.1 + dev: true - /@zag-js/react@0.32.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-b1SB7hXXv1K6CmXkcy5Y7mb0YRWkyvulyhK8VW5O5hIAPuGxOTx70psmVeZbmVzhjdORCiro9jKx8Ec0LfolFg==} + /@vitest/ui@1.6.0(vitest@1.6.0): + resolution: {integrity: sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==} peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' + vitest: 1.6.0 dependencies: - '@zag-js/core': 0.32.1 - '@zag-js/store': 0.32.1 - '@zag-js/types': 0.32.1 - proxy-compare: 2.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@zag-js/rect-utils@0.32.1: - resolution: {integrity: sha512-cI07kgldjUZP+SLhXeG9VSl47nrENlC96Fs7jWcTfHj62rhdY8WsBJ0tiTztvwar9m1chwxXZwJowHN+nPIgDQ==} - dev: false + '@vitest/utils': 1.6.0 + fast-glob: 3.3.2 + fflate: 0.8.2 + flatted: 3.3.1 + pathe: 1.1.2 + picocolors: 1.0.0 + sirv: 2.0.4 + vitest: 1.6.0(@types/node@20.14.15)(@vitest/ui@1.6.0) + dev: true - /@zag-js/remove-scroll@0.32.1: - resolution: {integrity: sha512-LyXt2rNMSKb9MKeJRyKTgpk4R7jdA+9kEQTSG5qyA94jo1og7FVgA1W/E+pNkdxDEk1VplL768VU6y7E/L3DHg==} + /@vitest/utils@1.6.0: + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} dependencies: - '@zag-js/dom-query': 0.32.1 - dev: false + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true - /@zag-js/select@0.32.1: - resolution: {integrity: sha512-jSzmTKCN1Fk/ZDDWM8TVGOtwgpYUDgyceegjYT+hW1mmEetu4tQcEvAr0557NOzh8akqLvcVFbg/kMj0IriKAA==} + /@volar/language-core@1.11.1: + resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/collection': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dismissable': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/mutation-observer': 0.32.1 - '@zag-js/popper': 0.32.1 - '@zag-js/tabbable': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - '@zag-js/visually-hidden': 0.32.1 - dev: false + '@volar/source-map': 1.11.1 + dev: true - /@zag-js/slider@0.32.1: - resolution: {integrity: sha512-iZSB3Y8/Maakxem0Ha3rBRa8AyAplhN5K50Bgz+wsv0VEzNNUmK4QgaTWReWd6SfeTRpnC5ftKCcfM2aQrLm6g==} + /@volar/source-map@1.11.1: + resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/element-size': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/numeric-range': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false + muggle-string: 0.3.1 + dev: true - /@zag-js/splitter@0.32.1: - resolution: {integrity: sha512-NdHLUXtQAlnz6QpdPwcqZCqYul7LaVqsp0hgtXR2PN4HbH+VAaDfY76pUk6LBerUcykChGZvtM9U0A5FCo1x4A==} + /@volar/typescript@1.11.1: + resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/number-utils': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + dev: true - /@zag-js/store@0.32.1: - resolution: {integrity: sha512-hKwzpqAPljw06oOI+eO+Is2udpmY9GsGfmdoqvZVYoK4f5sawpZY9EC/84tbK9QKWUDTbFS+0Ujc254GUThmDA==} + /@vue/compiler-core@3.4.26: + resolution: {integrity: sha512-N9Vil6Hvw7NaiyFUFBPXrAyETIGlQ8KcFMkyk6hW1Cl6NvoqvP+Y8p1Eqvx+UdqsnrnI9+HMUEJegzia3mhXmQ==} dependencies: - proxy-compare: 2.5.1 - dev: false + '@babel/parser': 7.24.5 + '@vue/shared': 3.4.26 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + dev: true - /@zag-js/switch@0.32.1: - resolution: {integrity: sha512-+5w/AtINA+jpORX1cuUrnyIFXrfjhqV7667EKK/zbPi0Pf1E10+TEihpfFjY6bgms9CSNWZVEb6w2f2C0PNBDA==} + /@vue/compiler-dom@3.4.26: + resolution: {integrity: sha512-4CWbR5vR9fMg23YqFOhr6t6WB1Fjt62d6xdFPyj8pxrYub7d+OgZaObMsoxaF9yBUHPMiPFK303v61PwAuGvZA==} dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - '@zag-js/visually-hidden': 0.32.1 - dev: false + '@vue/compiler-core': 3.4.26 + '@vue/shared': 3.4.26 + dev: true - /@zag-js/tabbable@0.32.1: - resolution: {integrity: sha512-fMXtVgBiX7z3Qmdv+McrfihiSkqsDbNX2nn3e63L7jdy9ZpgnR3jG9BwUZvv7hvzkuOAFhhdKgBYYT+fkBavGg==} + /@vue/language-core@1.8.27(typescript@5.5.4): + resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@zag-js/dom-query': 0.32.1 - dev: false + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.4.26 + '@vue/shared': 3.4.26 + computeds: 0.0.1 + minimatch: 9.0.4 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + typescript: 5.5.4 + vue-template-compiler: 2.7.16 + dev: true - /@zag-js/tabs@0.32.1: - resolution: {integrity: sha512-5l8/k2Pw9Kbfsvvx6HWcVqK7Ns7ca+nyPGLSZtZLMp/Zn2q3xSG32C1U3oDaYtQVIQSiEHdnMjw0C2v+CxGDMA==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/element-rect': 0.32.1 - '@zag-js/tabbable': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false + /@vue/shared@3.4.26: + resolution: {integrity: sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ==} + dev: true - /@zag-js/tags-input@0.32.1: - resolution: {integrity: sha512-oliLhiMpRNbWFixHF+Oe7hySQBp7NKtL/s8rN5dLT1G1GFRMzuuht/QnmL1h8EoGGpTwaaokMo4zl4uVzHbwyw==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/auto-resize': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/form-utils': 0.32.1 - '@zag-js/interact-outside': 0.32.1 - '@zag-js/live-region': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 + /@xobotyi/scrollbar-width@1.9.5: + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} dev: false - /@zag-js/text-selection@0.32.1: - resolution: {integrity: sha512-aK1uswWYF76PFoxGL+3HW/kth9uldFWSW4lOh89NfEcc6Ym7qS5B+P0HKJVM9DuQbihvQX9dyc9PvM7/LJTSRA==} + /@yarnpkg/fslib@2.10.3: + resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} dependencies: - '@zag-js/dom-query': 0.32.1 - dev: false + '@yarnpkg/libzip': 2.3.0 + tslib: 1.14.1 + dev: true - /@zag-js/toast@0.32.1: - resolution: {integrity: sha512-HrfVzFX7ANS9qOewCr8qOCbgko635bZxYKMv+ojjo4U/TtwkGb43+lVU7/qwZj0z18/OtXBH5YQjFwQZXg5x8g==} + /@yarnpkg/libzip@2.3.0: + resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 - dev: false + '@types/emscripten': 1.39.13 + tslib: 1.14.1 + dev: true - /@zag-js/toggle-group@0.32.1: - resolution: {integrity: sha512-MM1XI4J45rRCZiDHcMtZWud0+bWMu6IcMnrbd9oig330YAF3RzcjTlxX93YRY35F04OUMBq5el9qe3qc2vyMuw==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 + /@zag-js/dom-query@0.16.0: + resolution: {integrity: sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ==} dev: false - /@zag-js/tooltip@0.32.1: - resolution: {integrity: sha512-+rsmDYTELFBHoYKg5iKShGfRD3H9FJDaZRq915Uc9YnyePMXCnWRgnVp+lk3zI+FDgysQm67SDLRJsR24Iioqg==} - dependencies: - '@zag-js/anatomy': 0.32.1 - '@zag-js/core': 0.32.1 - '@zag-js/dom-event': 0.32.1 - '@zag-js/dom-query': 0.32.1 - '@zag-js/popper': 0.32.1 - '@zag-js/types': 0.32.1 - '@zag-js/utils': 0.32.1 + /@zag-js/element-size@0.10.5: + resolution: {integrity: sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w==} dev: false - /@zag-js/types@0.32.1: - resolution: {integrity: sha512-BLfqb+im4vtXXJqhd2ZUg/4LquEd1qPt9XN56XVjudGDTftN8n3EDpuail7VKxdL59W4jR7wW8lvl4sSgrQKWw==} + /@zag-js/focus-visible@0.16.0: + resolution: {integrity: sha512-a7U/HSopvQbrDU4GLerpqiMcHKEkQkNPeDZJWz38cw/6Upunh41GjHetq5TB84hxyCaDzJ6q2nEdNoBQfC0FKA==} dependencies: - csstype: 3.1.3 - dev: false - - /@zag-js/utils@0.32.1: - resolution: {integrity: sha512-jrcmWYcA3L6TO4fZbPFvpSGEy2Z/mbWt6bPQbmcVgq/BltSS0YxxfPl+eD+S/rZI9aneszwsr04Z5TpladFiVA==} - dev: false - - /@zag-js/visually-hidden@0.32.1: - resolution: {integrity: sha512-Vzieo4vNulzY/0zqmVfeYW/LcFJp5xtEoyUgR1FBctH8uBPBRhTIEXxKtoMablW6/vccOVo7zcu0UrR5Vx+eYQ==} + '@zag-js/dom-query': 0.16.0 dev: false /accepts@1.3.8: @@ -6641,9 +5685,19 @@ packages: hasBin: true dev: true - /address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base@7.1.1(supports-color@9.4.0): + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.6(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color dev: true /aggregate-error@3.1.0: @@ -6709,10 +5763,6 @@ packages: picomatch: 2.3.1 dev: true - /app-root-dir@1.0.2: - resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} - dev: true - /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -6723,29 +5773,19 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /aria-hidden@1.2.3: - resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + /aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} dependencies: - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.3 - dev: true - /aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: dequal: 2.0.3 dev: true - /arity-n@1.0.4: - resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} - dev: true - /array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -6770,13 +5810,6 @@ packages: is-string: 1.0.7 dev: true - /array-last@1.3.0: - resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 4.0.0 - dev: true - /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -6859,16 +5892,6 @@ packages: is-shared-array-buffer: 1.0.3 dev: true - /assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - dependencies: - call-bind: 1.0.7 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.5 - util: 0.12.5 - dev: true - /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true @@ -6877,11 +5900,7 @@ packages: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} dependencies: - tslib: 2.6.2 - dev: true - - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + tslib: 2.6.3 dev: true /attr-accept@2.2.2: @@ -6896,12 +5915,12 @@ packages: possible-typed-array-names: 1.0.0 dev: true - /babel-core@7.0.0-bridge.0(@babel/core@7.24.5): + /babel-core@7.0.0-bridge.0(@babel/core@7.25.2): resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 dev: true /babel-plugin-macros@3.1.0: @@ -6913,47 +5932,42 @@ packages: resolve: 1.22.8 dev: false - /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5): + /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/compat-data': 7.25.2 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + /babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.0 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.5): + /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /babylon@6.18.0: - resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} - hasBin: true - dev: true - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -6962,18 +5976,6 @@ packages: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: true - /better-opn@3.0.2: - resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} - engines: {node: '>=12.0.0'} - dependencies: - open: 8.4.2 - dev: true - - /big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - dev: true - /binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -7011,13 +6013,6 @@ packages: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} dev: false - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - dependencies: - big-integer: 1.6.52 - dev: true - /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -7038,14 +6033,15 @@ packages: fill-range: 7.0.1 dev: true - /browser-assert@1.2.1: - resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 dev: true - /browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - dependencies: - pako: 0.2.9 + /browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} dev: true /browserslist@4.23.0: @@ -7059,6 +6055,17 @@ packages: update-browserslist-db: 1.0.15(browserslist@4.23.0) dev: true + /browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.6 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + dev: true + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -7070,11 +6077,6 @@ packages: ieee754: 1.2.1 dev: true - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true - /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -7104,6 +6106,10 @@ packages: resolution: {integrity: sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==} dev: true + /caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + dev: true + /chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} @@ -7117,8 +6123,8 @@ packages: type-detect: 4.0.8 dev: true - /chakra-react-select@4.7.6(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/layout@2.3.1)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@emotion/react@11.11.4)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ZL43hyXPnWf1g/HjsZDecbeJ4F2Q6tTPYJozlKWkrQ7lIX7ORP0aZYwmc5/Wly4UNzMimj2Vuosl6MmIXH+G2g==} + /chakra-react-select@4.9.1(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/layout@2.3.1)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@emotion/react@11.13.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-jmgfN+S/wnTaCp3pW30GYDIZ5J8jWcT1gIbhpw6RdKV+atm/U4/sT+gaHOHHhRL8xeaYip+iI/m8MPGREkve0w==} peerDependencies: '@chakra-ui/form-control': ^2.0.0 '@chakra-ui/icon': ^3.0.0 @@ -7135,13 +6141,13 @@ packages: '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/layout': 2.3.1(@chakra-ui/system@2.6.2)(react@18.3.1) '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/menu': 2.2.1(@chakra-ui/system@2.6.2)(framer-motion@11.1.8)(react@18.3.1) + '@chakra-ui/menu': 2.2.1(@chakra-ui/system@2.6.2)(framer-motion@11.3.24)(react@18.3.1) '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/system': 2.6.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@chakra-ui/system': 2.6.2(@emotion/react@11.13.0)(@emotion/styled@11.13.0)(react@18.3.1) + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-select: 5.7.7(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + react-select: 5.8.0(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) transitivePeerDependencies: - '@types/react' dev: false @@ -7186,7 +6192,7 @@ packages: engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -7196,10 +6202,6 @@ packages: fsevents: 2.3.3 dev: true - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true - /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -7232,15 +6234,6 @@ packages: engines: {node: '>=6'} dev: true - /cli-table3@0.6.4: - resolution: {integrity: sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==} - engines: {node: 10.* || >= 12.*} - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - dev: true - /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -7288,6 +6281,10 @@ packages: resolution: {integrity: sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==} dev: false + /colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + dev: true + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: false @@ -7313,38 +6310,10 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true - /compare-versions@6.1.0: - resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} + /compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} dev: false - /compose-function@3.0.3: - resolution: {integrity: sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==} - dependencies: - arity-n: 1.0.4 - dev: true - - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /compute-scroll-into-view@3.0.3: resolution: {integrity: sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==} dev: false @@ -7417,14 +6386,10 @@ packages: toggle-selection: 1.0.6 dev: false - /core-js-compat@3.37.0: - resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + /core-js-compat@3.38.0: + resolution: {integrity: sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==} dependencies: - browserslist: 4.23.0 - dev: true - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + browserslist: 4.23.3 dev: true /cosmiconfig@7.1.0: @@ -7455,9 +6420,11 @@ packages: which: 2.0.2 dev: true - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 dev: true /css-box-model@1.2.1: @@ -7469,7 +6436,7 @@ packages: /css-in-js-utils@3.1.0: resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} dependencies: - hyphenate-style-name: 1.0.4 + hyphenate-style-name: 1.1.0 dev: false /css-tree@1.1.3: @@ -7628,58 +6595,34 @@ packages: dependencies: ms: 2.1.2 - /decode-uri-component@0.4.1: - resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} - engines: {node: '>=14.16'} - dev: false - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + /debug@4.3.6(supports-color@9.4.0): + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: - type-detect: 4.0.8 - dev: true + ms: 2.1.2 + supports-color: 9.4.0 - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - dev: true + /decode-uri-component@0.4.1: + resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} + engines: {node: '>=14.16'} + dev: false - /deep-freeze@0.0.1: - resolution: {integrity: sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==} + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 dev: true /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - dev: true - /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} requiresBuild: true @@ -7712,20 +6655,6 @@ packages: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} dev: true - /del@6.1.1: - resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} - engines: {node: '>=10'} - dependencies: - globby: 11.1.0 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 2.2.0 - is-path-inside: 3.0.3 - p-map: 4.0.0 - rimraf: 3.0.2 - slash: 3.0.0 - dev: true - /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -7750,23 +6679,6 @@ packages: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false - /detect-package-manager@2.0.1: - resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} - engines: {node: '>=12'} - dependencies: - execa: 5.1.1 - dev: true - - /detect-port@1.5.1: - resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} - hasBin: true - dependencies: - address: 1.2.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} dev: false @@ -7816,16 +6728,6 @@ packages: csstype: 3.1.3 dev: false - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: true - - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: true - /dpdm@3.14.0: resolution: {integrity: sha512-YJzsFSyEtj88q5eTELg3UWU7TVZkG1dpbF4JDQ3t1b07xuzXmdoGeSz9TKOke1mUuOpWlk4q+pBh+aHzD6GBTg==} hasBin: true @@ -7835,19 +6737,10 @@ packages: glob: 10.3.12 ora: 5.4.1 tslib: 2.6.2 - typescript: 5.4.5 + typescript: 5.5.4 yargs: 17.7.2 dev: true - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - dev: true - /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true @@ -7864,18 +6757,14 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true - /ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - jake: 10.9.1 - dev: true - /electron-to-chromium@1.4.757: resolution: {integrity: sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw==} dev: true + /electron-to-chromium@1.5.6: + resolution: {integrity: sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -7889,12 +6778,6 @@ packages: engines: {node: '>= 0.8'} dev: true - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - /engine.io-client@6.5.3: resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} dependencies: @@ -7914,6 +6797,14 @@ packages: engines: {node: '>=10.0.0'} dev: false + /enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -7929,6 +6820,7 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 + dev: false /error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -7998,20 +6890,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true - /es-iterator-helpers@1.0.19: resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} engines: {node: '>= 0.4'} @@ -8032,8 +6910,8 @@ packages: safe-array-concat: 1.1.2 dev: true - /es-module-lexer@0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + /es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} dev: true /es-object-atoms@1.0.0: @@ -8067,50 +6945,46 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-plugin-alias@0.2.1: - resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} - dev: true - - /esbuild-register@3.5.0(esbuild@0.20.2): - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + /esbuild-register@3.6.0(esbuild@0.21.5): + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.3.4 - esbuild: 0.20.2 + debug: 4.3.6(supports-color@9.4.0) + esbuild: 0.21.5 transitivePeerDependencies: - supports-color dev: true - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 dev: true /escalade@3.1.2: @@ -8182,7 +7056,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.5.4) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -8190,8 +7064,8 @@ packages: - supports-color dev: true - /eslint-plugin-i18next@6.0.3: - resolution: {integrity: sha512-RtQXYfg6PZCjejIQ/YG+dUj/x15jPhufJ9hUDGH0kCpJ6CkVMAWOQ9exU1CrbPmzeykxLjrXkjAaOZF/V7+DOA==} + /eslint-plugin-i18next@6.0.9: + resolution: {integrity: sha512-tAof/p58sN4Az+P6kqu+RijqddalHhz0X6fe+exyBJAUvN9Yk1plOKl8XMySCIQS+vnRWbzzThgHXeDe++uEXQ==} engines: {node: '>=0.10.0'} dependencies: lodash: 4.17.21 @@ -8208,7 +7082,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -8295,14 +7169,14 @@ packages: eslint: 8.57.0 dev: true - /eslint-plugin-storybook@0.8.0(eslint@8.57.0)(typescript@5.4.5): + /eslint-plugin-storybook@0.8.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==} engines: {node: '>= 18'} peerDependencies: eslint: '>=6' dependencies: '@storybook/csf': 0.0.1 - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 requireindex: 1.2.0 ts-dedent: 2.2.0 @@ -8321,7 +7195,7 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-rule-composer: 0.3.0 dev: true @@ -8549,10 +7423,6 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-loops@1.1.3: - resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} - dev: false - /fast-printf@1.6.9: resolution: {integrity: sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==} engines: {node: '>=10.0'} @@ -8574,8 +7444,10 @@ packages: reusify: 1.0.4 dev: true - /fetch-retry@5.0.6: - resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} + /fd-package-json@1.2.0: + resolution: {integrity: sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==} + dependencies: + walk-up-path: 3.0.1 dev: true /fflate@0.8.2: @@ -8589,13 +7461,6 @@ packages: flat-cache: 3.2.0 dev: true - /file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - dependencies: - flat-cache: 4.0.1 - dev: true - /file-selector@0.6.0: resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} engines: {node: '>= 12'} @@ -8603,19 +7468,6 @@ packages: tslib: 2.6.2 dev: false - /file-system-cache@2.3.0: - resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} - dependencies: - fs-extra: 11.1.1 - ramda: 0.29.0 - dev: true - - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - dependencies: - minimatch: 5.1.6 - dev: true - /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -8623,13 +7475,11 @@ packages: to-regex-range: 5.0.1 dev: true - /filter-iterator@0.0.1: - resolution: {integrity: sha512-v4lhL7Qa8XpbW3LN46CEnmhGk3eHZwxfNl5at20aEkreesht4YKb/Ba3BUIbnPhAC/r3dmu7ABaGk6MAvh2alA==} - dev: true - - /filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 dev: true /filter-obj@5.1.0: @@ -8706,34 +7556,20 @@ packages: rimraf: 3.0.2 dev: true - /flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - dev: true - /flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true - /flow-parser@0.235.1: - resolution: {integrity: sha512-s04193L4JE+ntEcQXbD6jxRRlyj9QXcgEl2W6xSjH4l9x4b0eHoCHfbYHjqf9LdZFUiM5LhgpiqsvLj/AyOyYQ==} + /flow-parser@0.243.0: + resolution: {integrity: sha512-HCDBfH+kZcY5etWYeAqatjW78gkIryzb9XixRsA8lGI1uyYc7aCpElkkO4H+KIpoyQMiY0VAZPI4cyac3wQe8w==} engines: {node: '>=0.4.0'} dev: true - /focus-lock@1.3.3: - resolution: {integrity: sha512-hfXkZha7Xt4RQtrL1HBfspAuIj89Y0fb6GX0dfJilb8S2G/lvL4akPAcHq6xoD2NuZnDMCnZL/zQesMyeu6Psg==} + /focus-lock@1.3.5: + resolution: {integrity: sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ==} engines: {node: '>=10'} dependencies: - tslib: 2.6.2 - dev: false - - /focus-trap@7.5.4: - resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - dependencies: - tabbable: 6.2.0 + tslib: 2.6.3 dev: false /for-each@0.3.3: @@ -8755,8 +7591,8 @@ packages: engines: {node: '>= 0.6'} dev: true - /fracturedjsonjs@4.0.1: - resolution: {integrity: sha512-KMhSx7o45aPVj4w27dwdQyKJkNU8oBqw8UiK/s3VzsQB3+pKQ/3AqG/YOEQblV2BDuYE5dKp0OMf8RDsshrjTA==} + /fracturedjsonjs@4.0.2: + resolution: {integrity: sha512-+vGJH9wK0EEhbbn50V2sOebLRaar1VL3EXr02kxchIwpkhQk0ItrPjIOtYPYuU9hNFpVzxjrPgzjtMJih+ae4A==} dev: false /framer-motion@10.18.0(react-dom@18.3.1)(react@18.3.1): @@ -8772,13 +7608,13 @@ packages: dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - tslib: 2.6.2 + tslib: 2.6.3 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 dev: false - /framer-motion@11.1.8(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-W2OGZmNfUarhh6A/rLXernq/JthjekbgeRWqzigPpbaShe/+HfQKUDSjiEdL302XOlINtO+SCFCiR1hlqN3uOA==} + /framer-motion@11.3.24(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-kl0YI7HwAtyV0VOAWuU/rXoOS8+z5qSkMN6rZS+a9oe6fIha6SC3vjJN6u/hBpvjrg5MQNdSnqnjYxm0WYTX9g==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 @@ -8807,19 +7643,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true - - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - /fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -8903,11 +7726,6 @@ packages: engines: {node: '>=6'} dev: false - /get-npm-tarball-url@2.1.0: - resolution: {integrity: sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==} - engines: {node: '>=12.17'} - dev: true - /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -8935,7 +7753,7 @@ packages: consola: 3.2.3 defu: 6.1.4 node-fetch-native: 1.6.4 - nypm: 0.3.8 + nypm: 0.3.9 ohash: 1.1.3 pathe: 1.1.2 tar: 6.2.1 @@ -8969,10 +7787,6 @@ packages: glob: 7.2.3 dev: true - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - /glob@10.3.12: resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} engines: {node: '>=16 || 14 >=14.17'} @@ -8999,7 +7813,6 @@ packages: /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - dev: true /globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} @@ -9027,6 +7840,18 @@ packages: slash: 3.0.0 dev: true + /globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 + ignore: 5.3.1 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + dev: true + /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true @@ -9044,31 +7869,6 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true - dependencies: - browserify-zlib: 0.1.4 - is-deflate: 1.0.0 - is-gzip: 1.0.0 - peek-stream: 1.1.3 - pumpify: 1.5.1 - through2: 2.0.5 - dev: true - - /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.17.4 - dev: true - /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true @@ -9082,10 +7882,6 @@ packages: engines: {node: '>=8'} dev: true - /has-own-property@0.1.0: - resolution: {integrity: sha512-14qdBKoonU99XDhWcFKZTShK+QV47qU97u8zzoVo9cL5TZ3BmBHXogItSt9qJjR0KUMFRhcCW8uGIGl8nkl7Aw==} - dev: true - /has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: @@ -9141,10 +7937,6 @@ packages: react-is: 16.13.1 dev: false - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true @@ -9171,6 +7963,16 @@ packages: toidentifier: 1.0.1 dev: true + /https-proxy-agent@7.0.5(supports-color@9.4.0): + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1(supports-color@9.4.0) + debug: 4.3.6(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color + dev: true + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -9181,20 +7983,20 @@ packages: engines: {node: '>=16.17.0'} dev: true - /hyphenate-style-name@1.0.4: - resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + /hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} dev: false - /i18next-http-backend@2.5.1: - resolution: {integrity: sha512-+rNX1tghdVxdfjfPt0bI1sNg5ahGW9kA7OboG7b4t03Fp69NdDlRIze6yXhIbN8rbHxJ8IP4dzRm/okZ15lkQg==} + /i18next-http-backend@2.5.2: + resolution: {integrity: sha512-+K8HbDfrvc1/2X8jpb7RLhI9ZxBDpx3xogYkQwGKlWAUXLSEGXzgdt3EcUjLlBCdMwdQY+K+EUF6oh8oB6rwHw==} dependencies: cross-fetch: 4.0.0 transitivePeerDependencies: - encoding dev: false - /i18next@23.11.3: - resolution: {integrity: sha512-Pq/aSKowir7JM0rj+Wa23Kb6KKDUGno/HjG+wRQu0PxoTbpQ4N89MAT0rFGvXmLkRLNMb1BbBOKGozl01dabzg==} + /i18next@23.12.2: + resolution: {integrity: sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==} dependencies: '@babel/runtime': 7.24.5 dev: false @@ -9210,10 +8012,6 @@ packages: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} dev: false - /identity-function@1.0.0: - resolution: {integrity: sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw==} - dev: true - /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true @@ -9249,6 +8047,11 @@ packages: engines: {node: '>=8'} dev: true + /index-to-position@0.1.2: + resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} + engines: {node: '>=18'} + dev: true + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -9260,11 +8063,10 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /inline-style-prefixer@7.0.0: - resolution: {integrity: sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==} + /inline-style-prefixer@7.0.1: + resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} dependencies: css-in-js-utils: 3.1.0 - fast-loops: 1.1.3 dev: false /internal-slot@1.0.7: @@ -9282,10 +8084,6 @@ packages: loose-envify: 1.4.0 dev: false - /ip@2.0.1: - resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} - dev: true - /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -9314,6 +8112,7 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: false /is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} @@ -9367,10 +8166,6 @@ packages: has-tostringtag: 1.0.2 dev: true - /is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - dev: true - /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -9407,34 +8202,16 @@ packages: is-extglob: 2.1.1 dev: true - /is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - engines: {node: '>=0.10.0'} - dev: true - /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} dev: true - /is-iterable@1.1.1: - resolution: {integrity: sha512-EdOZCr0NsGE00Pot+x1ZFx9MJK3C6wy91geZpXwvwexDLJvA4nzYyZf7r+EIwSeVsOLDdBz7ATg9NqKTzuNYuQ==} - engines: {node: '>= 4'} - dev: true - /is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} dev: true - /is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - dev: true - /is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -9447,21 +8224,11 @@ packages: has-tostringtag: 1.0.2 dev: true - /is-number@4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - dev: true - /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - dev: true - /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -9561,10 +8328,6 @@ packages: is-docker: 2.2.1 dev: true - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true @@ -9611,11 +8374,6 @@ packages: istanbul-lib-report: 3.0.1 dev: true - /iterable-lookahead@1.0.0: - resolution: {integrity: sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ==} - engines: {node: '>=4'} - dev: true - /iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: @@ -9644,19 +8402,8 @@ packages: '@pkgjs/parseargs': 0.11.0 dev: true - /jake@10.9.1: - resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} - engines: {node: '>=10'} - hasBin: true - dependencies: - async: 3.2.5 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - dev: true - - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + /jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true dev: true @@ -9668,6 +8415,11 @@ packages: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} dev: false + /js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -9682,7 +8434,7 @@ packages: argparse: 2.0.1 dev: true - /jscodeshift@0.15.2(@babel/preset-env@7.24.5): + /jscodeshift@0.15.2(@babel/preset-env@7.25.3): resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} hasBin: true peerDependencies: @@ -9691,25 +8443,25 @@ packages: '@babel/preset-env': optional: true dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - '@babel/preset-flow': 7.24.1(@babel/core@7.24.5) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.5) - '@babel/register': 7.23.7(@babel/core@7.24.5) - babel-core: 7.0.0-bridge.0(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/parser': 7.25.3 + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.25.2) + '@babel/preset-env': 7.25.3(@babel/core@7.25.2) + '@babel/preset-flow': 7.24.7(@babel/core@7.25.2) + '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/register': 7.24.6(@babel/core@7.25.2) + babel-core: 7.0.0-bridge.0(@babel/core@7.25.2) chalk: 4.1.2 - flow-parser: 0.235.1 + flow-parser: 0.243.0 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 neo-async: 2.6.2 node-dir: 0.1.17 - recast: 0.23.6 + recast: 0.23.9 temp: 0.8.4 write-file-atomic: 2.4.3 transitivePeerDependencies: @@ -9725,7 +8477,6 @@ packages: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true - dev: true /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -9733,11 +8484,16 @@ packages: /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: false /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true @@ -9805,58 +8561,42 @@ packages: engines: {node: '>=6'} dev: true - /klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - dev: false - - /knip@5.12.3(@types/node@20.12.10)(typescript@5.4.5): - resolution: {integrity: sha512-LL+NsE+3H0TkUnQW6icHQ+5qSrPENmjHJyMHgzjiZPmunstrIsaRG+QjahnzoH/FjMjVJwrdwVOSvksa8ixFbw==} + /knip@5.27.2(@types/node@20.14.15)(typescript@5.5.4): + resolution: {integrity: sha512-Mya1XEDq1oygibQf0uocQd02Fil8RtvNVhcFAcxypjcc6zakT7wsJtS0xvuwEitilfI0tiFC9PghmJQ3DMKuTg==} engines: {node: '>=18.6.0'} hasBin: true peerDependencies: '@types/node': '>=18' typescript: '>=5.0.4' dependencies: - '@ericcornelissen/bash-parser': 0.5.2 - '@nodelib/fs.walk': 2.0.0 + '@nodelib/fs.walk': 1.2.8 '@snyk/github-codeowners': 1.1.0 - '@types/node': 20.12.10 + '@types/node': 20.14.15 easy-table: 1.2.0 + enhanced-resolve: 5.17.1 fast-glob: 3.3.2 - file-entry-cache: 8.0.0 - jiti: 1.21.0 + jiti: 1.21.6 js-yaml: 4.1.0 minimist: 1.2.8 picocolors: 1.0.0 picomatch: 4.0.2 pretty-ms: 9.0.0 - resolve: 1.22.8 smol-toml: 1.1.4 strip-json-comments: 5.0.1 summary: 2.1.0 - typescript: 5.4.5 - zod: 3.23.6 - zod-validation-error: 3.2.0(zod@3.23.6) + typescript: 5.5.4 + zod: 3.23.8 + zod-validation-error: 3.3.1(zod@3.23.8) dev: true /kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} dev: true - /konva@9.3.6: - resolution: {integrity: sha512-dqR8EbcM0hjuilZCBP6xauQ5V3kH3m9kBcsDkqPypQuRgsXbcXUrxqYxhNbdvKZpYNW8Amq94jAD/C0NY3qfBQ==} + /konva@9.3.14: + resolution: {integrity: sha512-Gmm5lyikGYJyogKQA7Fy6dKkfNh350V6DwfZkid0RVrGYP2cfCsxuMxgF5etKeCv7NjXYpJxKqi1dYkIkX/dcA==} dev: false - /lazy-universal-dotenv@4.0.0: - resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} - engines: {node: '>=14.0.0'} - dependencies: - app-root-dir: 1.0.2 - dotenv: 16.4.5 - dotenv-expand: 10.0.0 - dev: true - /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -9872,6 +8612,7 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false /liqe@3.8.0: resolution: {integrity: sha512-cZ1rDx4XzxONBTskSPBp7/KwJ9qbUdF8EPnY4VjKXwHF1Krz9lgnlMTh1G7kd+KtPYvUte1mhuZeQSnk7KiSBg==} @@ -9920,10 +8661,6 @@ packages: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} dev: false - /lodash.curry@4.1.1: - resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - dev: true - /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true @@ -9991,17 +8728,11 @@ packages: hasBin: true dev: true - /magic-string@0.16.0: - resolution: {integrity: sha512-c4BEos3y6G2qO0B9X7K0FVLOPT9uGrjYwYRLFmDqyl5YMboUviyecnXWp94fJTSMwPw2/sf+CEYt5AGpmklkkQ==} - dependencies: - vlq: 0.2.3 - dev: true - /magic-string@0.27.0: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 dev: true /magic-string@0.30.10: @@ -10040,17 +8771,12 @@ packages: semver: 7.6.0 dev: true - /map-obj@2.0.0: - resolution: {integrity: sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==} - engines: {node: '>=4'} - dev: true - /map-or-similar@1.5.0: resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} dev: true - /markdown-to-jsx@7.3.2(react@18.3.1): - resolution: {integrity: sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==} + /markdown-to-jsx@7.4.7(react@18.3.1): + resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} engines: {node: '>= 10'} peerDependencies: react: '>= 0.14.0' @@ -10103,6 +8829,14 @@ packages: picomatch: 2.3.1 dev: true + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: true + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -10191,10 +8925,6 @@ packages: yallist: 4.0.0 dev: true - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true - /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -10210,6 +8940,15 @@ packages: ufo: 1.5.3 dev: true + /mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + dependencies: + acorn: 8.12.1 + pathe: 1.1.2 + pkg-types: 1.1.3 + ufo: 1.5.4 + dev: true + /moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} dev: false @@ -10234,17 +8973,17 @@ packages: resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} dev: true - /nano-css@5.6.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==} + /nano-css@5.6.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==} peerDependencies: react: '*' react-dom: '*' dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 css-tree: 1.1.3 csstype: 3.1.3 fastest-stable-stringify: 2.0.2 - inline-style-prefixer: 7.0.0 + inline-style-prefixer: 7.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rtl-css-js: 1.16.1 @@ -10258,16 +8997,11 @@ packages: hasBin: true dev: true - /nanostores@0.10.3: - resolution: {integrity: sha512-Nii8O1XqmawqSCf9o2aWqVxhKRN01+iue9/VEd1TiJCr9VT5XxgPFbF1Edl1XN6pwJcZRsl8Ki+z01yb/T/C2g==} + /nanostores@0.11.2: + resolution: {integrity: sha512-6bucNxMJA5rNV554WQl+MWGng0QVMzlRgpKTHHfIbVLrhQ+yRXBychV9ECGVuuUfCMQPjfIG9bj8oJFZ9hYP/Q==} engines: {node: ^18.0.0 || >=20.0.0} dev: false - /nanostores@0.9.5: - resolution: {integrity: sha512-Z+p+g8E7yzaWwOe5gEUB2Ox0rCEeXWYIZWmYvw/ajNYX8DlXdMvMDj8DWfM/subqPAcsf8l8Td4iAwO1DeIIRQ==} - engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} - dev: false - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -10322,13 +9056,8 @@ packages: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 + /node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} dev: true /normalize-path@3.0.0: @@ -10350,8 +9079,8 @@ packages: path-key: 4.0.0 dev: true - /nypm@0.3.8: - resolution: {integrity: sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==} + /nypm@0.3.9: + resolution: {integrity: sha512-BI2SdqqTHg2d4wJh8P9A1W+bslg33vOE9IZDY6eR2QC+Pu1iNBVZUqczrd43rJb+fMzHU7ltAYKsEFY/kHMFcw==} engines: {node: ^14.16.0 || >=16.10.0} hasBin: true dependencies: @@ -10359,7 +9088,8 @@ packages: consola: 3.2.3 execa: 8.0.1 pathe: 1.1.2 - ufo: 1.5.3 + pkg-types: 1.1.3 + ufo: 1.5.4 dev: true /object-assign@4.1.1: @@ -10370,27 +9100,10 @@ packages: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - dev: true - /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - /object-pairs@0.1.0: - resolution: {integrity: sha512-3ECr6K831I4xX/Mduxr9UC+HPOz/d6WKKYj9p4cmC8Lg8p7g8gitzsxNX5IWlSIgFWN/a4JgrJaoAMKn20oKwA==} - dev: true - - /object-values@1.0.0: - resolution: {integrity: sha512-+8hwcz/JnQ9EpLIXzN0Rs7DLsBpJNT/xYehtB/jU93tHYr5BFEO8E+JGQNOSqE7opVzz5cGksKFHt7uUJVLSjQ==} - engines: {node: '>=0.10.0'} - dev: true - /object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} @@ -10458,11 +9171,6 @@ packages: ee-first: 1.1.1 dev: true - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -10496,16 +9204,20 @@ packages: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} dev: true - /openapi-typescript@6.7.5: - resolution: {integrity: sha512-ZD6dgSZi0u1QCP55g8/2yS5hNJfIpgqsSGHLxxdOjvY7eIrXzj271FJEQw33VwsZ6RCtO/NOuhxa7GBWmEudyA==} + /openapi-typescript@7.3.0(typescript@5.5.4): + resolution: {integrity: sha512-EkljRjYWOPwGXiK++uI9MkGv2Y7uhbkZbi9V1z3r3EpmWVO6aFTHXSLNvxIWo6UT6LCTYgEYkUB3BWQjwwXthg==} hasBin: true + peerDependencies: + typescript: ^5.x dependencies: + '@redocly/openapi-core': 1.19.0(supports-color@9.4.0) ansi-colors: 4.1.3 - fast-glob: 3.3.2 - js-yaml: 4.1.0 + parse-json: 8.1.0 supports-color: 9.4.0 - undici: 5.28.4 + typescript: 5.5.4 yargs-parser: 21.1.1 + transitivePeerDependencies: + - encoding dev: true /optionator@0.9.4: @@ -10535,18 +9247,18 @@ packages: wcwidth: 1.0.1 dev: true - /overlayscrollbars-react@0.5.6(overlayscrollbars@2.7.3)(react@18.3.1): + /overlayscrollbars-react@0.5.6(overlayscrollbars@2.10.0)(react@18.3.1): resolution: {integrity: sha512-E5To04bL5brn9GVCZ36SnfGanxa2I2MDkWoa4Cjo5wol7l+diAgi4DBc983V7l2nOk/OLJ6Feg4kySspQEGDBw==} peerDependencies: overlayscrollbars: ^2.0.0 react: '>=16.8.0' dependencies: - overlayscrollbars: 2.7.3 + overlayscrollbars: 2.10.0 react: 18.3.1 dev: false - /overlayscrollbars@2.7.3: - resolution: {integrity: sha512-HmNo8RPtuGUjBhUbVpZBHH7SHci5iSAdg5zSekCZVsjzaM6z8MIr3F9RXrzf4y7m+fOY0nx0+y0emr1fqQmfoA==} + /overlayscrollbars@2.10.0: + resolution: {integrity: sha512-diNMeEafWTE0A4GJfwRpdBp2rE/BEvrhptBdBcDu8/UeytWcdCy9Td8tZWnztJeJ26f8/uHCWfPnPUC/dtgJdw==} dev: false /p-limit@2.3.0: @@ -10603,10 +9315,6 @@ packages: engines: {node: '>=6'} dev: true - /pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - dev: true - /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -10621,6 +9329,16 @@ packages: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + dev: false + + /parse-json@8.1.0: + resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} + engines: {node: '>=18'} + dependencies: + '@babel/code-frame': 7.24.7 + index-to-position: 0.1.2 + type-fest: 4.24.0 + dev: true /parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} @@ -10680,6 +9398,11 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + /path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + dev: true + /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true @@ -10688,17 +9411,12 @@ packages: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true - /peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} - dependencies: - buffer-from: 1.1.2 - duplexify: 3.7.1 - through2: 2.0.5 - dev: true - /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -10733,13 +9451,6 @@ packages: find-up: 4.1.0 dev: true - /pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} - dependencies: - find-up: 5.0.0 - dev: true - /pkg-types@1.1.0: resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} dependencies: @@ -10748,6 +9459,19 @@ packages: pathe: 1.1.2 dev: true + /pkg-types@1.1.3: + resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} + dependencies: + confbox: 0.1.7 + mlly: 1.7.1 + pathe: 1.1.2 + dev: true + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + /polished@4.3.1: resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} engines: {node: '>=10'} @@ -10760,12 +9484,12 @@ packages: engines: {node: '>= 0.4'} dev: true - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + /postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 dev: true @@ -10774,8 +9498,8 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + /prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true dev: true @@ -10798,11 +9522,6 @@ packages: react-is: 18.3.1 dev: true - /pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - dev: true - /pretty-ms@9.0.0: resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} engines: {node: '>=18'} @@ -10810,10 +9529,6 @@ packages: parse-ms: 4.0.0 dev: true - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -10842,32 +9557,6 @@ packages: ipaddr.js: 1.9.1 dev: true - /proxy-compare@2.5.1: - resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} - dev: false - - /pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - dev: true - /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -10880,15 +9569,8 @@ packages: side-channel: 1.0.6 dev: true - /qs@6.12.1: - resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.6 - dev: true - - /query-string@9.0.0: - resolution: {integrity: sha512-4EWwcRGsO2H+yzq6ddHcVqkCQ2EFUSfDMEjF8ryp8ReymyZhIuaFRGLomeOQLkrzacMHoyky2HW0Qe30UbzkKw==} + /query-string@9.1.0: + resolution: {integrity: sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==} engines: {node: '>=18'} dependencies: decode-uri-component: 0.4.1 @@ -10904,10 +9586,6 @@ packages: resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} dev: false - /ramda@0.29.0: - resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} - dev: true - /randexp@0.4.6: resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} engines: {node: '>=0.12'} @@ -10936,7 +9614,7 @@ packages: peerDependencies: react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.25.0 react: 18.3.1 dev: false @@ -10949,12 +9627,12 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /react-docgen-typescript@2.2.2(typescript@5.4.5): + /react-docgen-typescript@2.2.2(typescript@5.5.4): resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} peerDependencies: typescript: '>= 4.3.x' dependencies: - typescript: 5.4.5 + typescript: 5.5.4 dev: true /react-docgen@7.0.3: @@ -11022,8 +9700,8 @@ packages: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} dev: false - /react-focus-lock@2.11.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-IXLwnTBrLTlKTpASZXqqXJ8oymWrgAlOfuuDYN4XCuN1YJ72dwX198UCaF1QqGUk5C3QOnlMik//n3ufcfe8Ig==} + /react-focus-lock@2.12.1(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-lfp8Dve4yJagkHiFrC1bGtib3mF2ktqwPJw4/WGcgPW+pJ/AVQA5X2vI7xgp13FcxFEpYBBHpXai/N2DBNC0Jw==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11031,21 +9709,21 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.9 - '@types/react': 18.3.1 - focus-lock: 1.3.3 + '@babel/runtime': 7.25.0 + '@types/react': 18.3.3 + focus-lock: 1.3.5 prop-types: 15.8.1 react: 18.3.1 react-clientside-effect: 1.2.6(react@18.3.1) - use-callback-ref: 1.3.1(@types/react@18.3.1)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.1)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) dev: false - /react-hook-form@7.51.4(react@18.3.1): - resolution: {integrity: sha512-V14i8SEkh+V1gs6YtD0hdHYnoL4tp/HX/A45wWQN15CYr9bFRmmRdYStSO5L65lCCZRF+kYiSKhm9alqbcdiVA==} - engines: {node: '>=12.22.0'} + /react-hook-form@7.52.2(react@18.3.1): + resolution: {integrity: sha512-pqfPEbERnxxiNMPd0bzmt1tuaPcVccywFDpyk2uV5xCIBphHV5T8SVnX9/o3kplPE1zzKt77+YIoq+EMwJp56A==} + engines: {node: '>=18.0.0'} peerDependencies: - react: ^16.8.0 || ^17 || ^18 + react: ^16.8.0 || ^17 || ^18 || ^19 dependencies: react: 18.3.1 dev: false @@ -11060,8 +9738,8 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /react-i18next@14.1.1(i18next@23.11.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-QSiKw+ihzJ/CIeIYWrarCmXJUySHDwQr5y8uaNIkbxoGRm/5DukkxZs+RPla79IKyyDPzC/DRlgQCABHtrQuQQ==} + /react-i18next@14.1.3(i18next@23.12.2)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-wZnpfunU6UIAiJ+bxwOiTmBOAaB14ha97MjOEnLGac2RJ+h/maIYXZuTHlmyqQVX1UVHmU1YDTQ5vxLmwfXTjw==} peerDependencies: i18next: '>= 23.2.3' react: '>= 16.8.0' @@ -11075,13 +9753,33 @@ packages: dependencies: '@babel/runtime': 7.24.5 html-parse-stringify: 3.0.1 - i18next: 23.11.3 + i18next: 23.12.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react-i18next@15.0.1(i18next@23.12.2)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-NwxLqNM6CLbeGA9xPsjits0EnXdKgCRSS6cgkgOdNcPXqL+1fYNl8fBg1wmnnHvFy812Bt4IWTPE9zjoPmFj3w==} + peerDependencies: + i18next: '>= 23.2.3' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@babel/runtime': 7.25.0 + html-parse-stringify: 3.0.1 + i18next: 23.12.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false - /react-icons@5.2.0(react@18.3.1): - resolution: {integrity: sha512-n52Y7Eb4MgQZHsSZOhSXv1zs2668/hBYKfSRIvKh42yExjyhZu0d1IK2CLLZ3BZB1oo13lDfwx2vOh2z9FTV6Q==} + /react-icons@5.2.1(react@18.3.1): + resolution: {integrity: sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==} peerDependencies: react: '*' dependencies: @@ -11103,7 +9801,7 @@ packages: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} dev: true - /react-konva@18.2.10(konva@9.3.6)(react-dom@18.3.1)(react@18.3.1): + /react-konva@18.2.10(konva@9.3.14)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-ohcX1BJINL43m4ynjZ24MxFI1syjBdrXhqVxYVDw2rKgr3yuS0x/6m1Y2Z4sl4T/gKhfreBx8KHisd0XC6OT1g==} peerDependencies: konva: ^8.0.1 || ^7.2.5 || ^9.0.0 @@ -11112,7 +9810,7 @@ packages: dependencies: '@types/react-reconciler': 0.28.8 its-fine: 1.2.5(react@18.3.1) - konva: 9.3.6 + konva: 9.3.14 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-reconciler: 0.29.2(react@18.3.1) @@ -11130,7 +9828,7 @@ packages: scheduler: 0.23.2 dev: false - /react-redux@9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1): + /react-redux@9.1.2(@types/react@18.3.3)(react@18.3.1)(redux@5.0.1): resolution: {integrity: sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==} peerDependencies: '@types/react': ^18.2.25 @@ -11142,15 +9840,15 @@ packages: redux: optional: true dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.3 '@types/use-sync-external-store': 0.0.3 react: 18.3.1 redux: 5.0.1 use-sync-external-store: 1.2.2(react@18.3.1) dev: false - /react-remove-scroll-bar@2.3.5(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==} + /react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11159,14 +9857,14 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.3 react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.1)(react@18.3.1) - tslib: 2.6.2 + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.3 dev: false - /react-remove-scroll@2.5.7(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + /react-remove-scroll@2.5.10(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11175,17 +9873,17 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.3 react: 18.3.1 - react-remove-scroll-bar: 2.3.5(@types/react@18.3.1)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.1)(react@18.3.1) - tslib: 2.6.2 - use-callback-ref: 1.3.1(@types/react@18.3.1)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.1)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.3 + use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) dev: false - /react-resizable-panels@2.0.19(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-v3E41kfKSuCPIvJVb4nL4mIZjjKIn/gh6YqZF/gDfQDolv/8XnhJBek4EiV2gOr3hhc5A3kOGOayk3DhanpaQw==} + /react-resizable-panels@2.0.23(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-8ZKTwTU11t/FYwiwhMdtZYYyFxic5U5ysRu2YwfkAgDbUJXFvnWSJqhnzkSlW+mnDoNAzDCrJhdOSXBPA76wug==} peerDependencies: react: ^16.14.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 @@ -11194,28 +9892,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /react-select@5.7.7(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-HhashZZJDRlfF/AKj0a0Lnfs3sRdw/46VJIRd8IbB9/Ovr74+ZIwkAdSBjSPXsFMG+u72c5xShqwLSKIJllzqw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@floating-ui/dom': 1.6.5 - '@types/react-transition-group': 4.4.10 - memoize-one: 6.0.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) - use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.1)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - dev: false - - /react-select@5.8.0(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + /react-select@5.8.0(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11223,7 +9900,7 @@ packages: dependencies: '@babel/runtime': 7.24.5 '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) '@floating-ui/dom': 1.6.5 '@types/react-transition-group': 4.4.10 memoize-one: 6.0.0 @@ -11231,12 +9908,12 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) - use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.1)(react@18.3.1) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' dev: false - /react-style-singleton@2.2.1(@types/react@18.3.1)(react@18.3.1): + /react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -11246,11 +9923,11 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.3 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): @@ -11277,8 +9954,8 @@ packages: tslib: 2.6.2 dev: false - /react-use@17.5.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-PbfwSPMwp/hoL847rLnm/qkjg3sTRCvn6YhUZiHaUa3FA6/aNoFX79ul5Xt70O1rK+9GxSVqkY0eTwMdsR/bWg==} + /react-use@17.5.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-LG/uPEVRflLWMwi3j/sZqR00nF6JGqTTDblkXK2nzXsIvij06hXl1V/MZIlwj1OKIQUtlh1l9jK8gLsRyCQxMg==} peerDependencies: react: '*' react-dom: '*' @@ -11289,7 +9966,7 @@ packages: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.6.1(react-dom@18.3.1)(react@18.3.1) + nano-css: 5.6.2(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-universal-interface: 0.6.2(react@18.3.1)(tslib@2.6.2) @@ -11301,8 +9978,8 @@ packages: tslib: 2.6.2 dev: false - /react-virtuoso@4.7.10(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-l+fnBf/G1Fp6pHCnhFq2Ra4lkZtT6c5XrS9rCS0OA6de7WGLZviCo0y61CUZZG79TeAw3L7O4czeNPiqh9CIrg==} + /react-virtuoso@4.9.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-MiiSGKqvYPfAK3FUe852n2L3M5IXMKP0pUgYQ/UTk90A/l2UNQOvaEUvAZp+0ytL0kOCNk8i8/J8FMKvIq7kqg==} engines: {node: '>=10'} peerDependencies: react: '>=16 || >=17 || >= 18' @@ -11318,18 +9995,18 @@ packages: dependencies: loose-envify: 1.4.0 - /reactflow@11.11.3(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-wusd1Xpn1wgsSEv7UIa4NNraCwH9syBtubBy4xVNXg3b+CDKM+sFaF3hnMx0tr0et4km9urIDdNvwm34QiZong==} + /reactflow@11.11.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/background': 11.3.13(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@reactflow/controls': 11.2.13(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@reactflow/core': 11.11.3(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@reactflow/minimap': 11.7.13(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@reactflow/node-resizer': 2.2.13(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@reactflow/node-toolbar': 1.3.13(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@reactflow/background': 11.3.14(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@reactflow/controls': 11.2.14(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@reactflow/core': 11.11.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@reactflow/minimap': 11.7.14(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@reactflow/node-resizer': 2.2.14(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@reactflow/node-toolbar': 1.3.14(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -11337,37 +10014,6 @@ packages: - immer dev: false - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: true - /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -11384,15 +10030,15 @@ packages: picomatch: 2.3.1 dev: true - /recast@0.23.6: - resolution: {integrity: sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ==} + /recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} engines: {node: '>= 4'} dependencies: ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.6.2 + tslib: 2.6.3 dev: true /redent@3.0.0: @@ -11461,7 +10107,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.25.0 dev: true /regexp.prototype.flags@1.5.2: @@ -11519,6 +10165,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + /requireindex@1.1.0: resolution: {integrity: sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==} engines: {node: '>=0.10.5'} @@ -11541,11 +10192,6 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - /resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} dependencies: @@ -11588,16 +10234,13 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /reverse-arguments@1.0.0: - resolution: {integrity: sha512-/x8uIPdTafBqakK0TmPNJzgkLP+3H+yxpUJhCQHsLBg1rYEVNR2D8BRYNWQhVBjyOd7oo1dZRVzIkwMY2oqfYQ==} - dev: true - - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + /rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} dev: false /rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 @@ -11672,7 +10315,7 @@ packages: /rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.25.0 dev: false /run-parallel@1.2.0: @@ -11697,10 +10340,6 @@ packages: isarray: 2.0.5 dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true @@ -11763,6 +10402,12 @@ packages: lru-cache: 6.0.0 dev: true + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: true + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -11853,10 +10498,6 @@ packages: engines: {node: '>=8'} dev: true - /shell-quote-word@1.0.1: - resolution: {integrity: sha512-lT297f1WLAdq0A4O+AknIFRP6kkiI3s8C913eJ0XqBxJbZPGWUNkRQk2u8zk4bEAjUJ5i+fSLwB6z1HzeT+DEg==} - dev: true - /shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} dev: true @@ -11902,6 +10543,11 @@ packages: engines: {node: '>=8'} dev: true + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + /smol-toml@1.1.4: resolution: {integrity: sha512-Y0OT8HezWsTNeEOSVxDnKOW/AyNXHQ4BwJNbAXlLTF5wWsBvrcHhIkE5Rf8kQMLmgf7nDX3PVOlgC6/Aiggu3Q==} engines: {node: '>= 18', pnpm: '>= 8'} @@ -11970,28 +10616,6 @@ packages: resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} dev: true - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - dev: true - - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - dev: true - - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true - /split-on-first@3.0.0: resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} engines: {node: '>=12'} @@ -12039,36 +10663,45 @@ packages: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.7 - dev: true - - /store2@2.14.3: - resolution: {integrity: sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==} - dev: true - - /storybook@8.0.10(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-9/4oxISopLyr5xz7Du27mmQgcIfB7UTLlNzkK4IklWTiSgsOgYgZpsmIwymoXNtkrvh+QsqskdcUP1C7nNiEtw==} + /storybook@8.2.8: + resolution: {integrity: sha512-sh4CNCXkieVgJ5GXrCOESS0BjRbQ9wG7BVnurQPl6izNnB9zR8rag+aUmjPZWBwbj55V1BFA5A/vEsCov21qjg==} hasBin: true dependencies: - '@storybook/cli': 8.0.10(react-dom@18.3.1)(react@18.3.1) + '@babel/core': 7.25.2 + '@babel/types': 7.25.2 + '@storybook/codemod': 8.2.8 + '@storybook/core': 8.2.8 + '@types/semver': 7.5.8 + '@yarnpkg/fslib': 2.10.3 + '@yarnpkg/libzip': 2.3.0 + chalk: 4.1.2 + commander: 6.2.1 + cross-spawn: 7.0.3 + detect-indent: 6.1.0 + envinfo: 7.13.0 + execa: 5.1.1 + fd-package-json: 1.2.0 + find-up: 5.0.0 + fs-extra: 11.2.0 + giget: 1.2.3 + globby: 14.0.2 + jscodeshift: 0.15.2(@babel/preset-env@7.25.3) + leven: 3.1.0 + ora: 5.4.1 + prettier: 3.3.3 + prompts: 2.4.2 + semver: 7.6.3 + strip-json-comments: 3.1.1 + tempy: 3.1.0 + tiny-invariant: 1.3.3 + ts-dedent: 2.2.0 transitivePeerDependencies: - '@babel/preset-env' - bufferutil - - encoding - - react - - react-dom - supports-color - utf-8-validate dev: true - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - dev: true - /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -12092,10 +10725,6 @@ packages: strip-ansi: 7.1.0 dev: true - /string.fromcodepoint@0.2.1: - resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==} - dev: true - /string.prototype.matchall@4.0.11: resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} engines: {node: '>= 0.4'} @@ -12141,12 +10770,6 @@ packages: es-object-atoms: 1.0.0 dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: true - /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: @@ -12247,34 +10870,14 @@ packages: /supports-color@9.4.0: resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} engines: {node: '>=12'} - dev: true /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: false - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: true - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 dev: true /tar@6.2.1: @@ -12295,9 +10898,9 @@ packages: memoizerific: 1.11.3 dev: true - /temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} + /temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} dev: true /temp@0.8.4: @@ -12307,15 +10910,14 @@ packages: rimraf: 2.6.3 dev: true - /tempy@1.0.1: - resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} - engines: {node: '>=10'} + /tempy@3.1.0: + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} dependencies: - del: 6.1.1 - is-stream: 2.0.1 - temp-dir: 2.0.0 - type-fest: 0.16.0 - unique-string: 2.0.0 + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 dev: true /test-exclude@6.0.0: @@ -12336,13 +10938,6 @@ packages: engines: {node: '>=10'} dev: false - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: true - /tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -12364,16 +10959,6 @@ packages: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - /to-no-case@1.0.2: - resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} - dev: true - - /to-pascal-case@1.0.0: - resolution: {integrity: sha512-QGMWHqM6xPrcQW57S23c5/3BbYb0Tbe9p+ur98ckRnGDwD4wbbtDiYI38CfmMKNB5Iv0REjs5SNDntTwvDxzZA==} - dependencies: - to-space-case: 1.0.0 - dev: true - /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -12381,16 +10966,6 @@ packages: is-number: 7.0.0 dev: true - /to-space-case@1.0.0: - resolution: {integrity: sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==} - dependencies: - to-no-case: 1.0.2 - dev: true - - /tocbot@4.27.19: - resolution: {integrity: sha512-0yu8k0L3gCQ1OVNZnKqpbZp+kLd6qtlNEBxsb+e0G/bS0EXMl2tWqWi1Oy9knRX8rTPYfOxd/sI/OzAj3JowGg==} - dev: true - /toggle-selection@1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} dev: false @@ -12413,13 +10988,13 @@ packages: hasBin: true dev: true - /ts-api-utils@1.3.0(typescript@5.4.5): + /ts-api-utils@1.3.0(typescript@5.5.4): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.4.5 + typescript: 5.5.4 dev: true /ts-dedent@2.2.0: @@ -12439,11 +11014,11 @@ packages: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} dev: true - /tsafe@1.6.6: - resolution: {integrity: sha512-gzkapsdbMNwBnTIjgO758GujLCj031IgHK/PKr2mrmkCSJMhSOR5FeOuSxKLMUoYc0vAA4RGEYYbjt/v6afD3g==} + /tsafe@1.7.2: + resolution: {integrity: sha512-dAPfQLhCfCRre5qs+Z5Q2a7s2CV7RxffZUmvj7puGaePYjECzWREJFd3w4XSFe/T5tbxgowfItA/JSSZ6Ma3dA==} dev: true - /tsconfck@3.0.3(typescript@5.4.5): + /tsconfck@3.0.3(typescript@5.5.4): resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} engines: {node: ^18 || >=20} hasBin: true @@ -12453,7 +11028,7 @@ packages: typescript: optional: true dependencies: - typescript: 5.4.5 + typescript: 5.5.4 dev: true /tsconfig-paths@3.15.0: @@ -12485,14 +11060,17 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsutils@3.21.0(typescript@5.4.5): + /tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + /tsutils@3.21.0(typescript@5.5.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.4.5 + typescript: 5.5.4 dev: true /type-check@0.4.0: @@ -12507,30 +11085,25 @@ packages: engines: {node: '>=4'} dev: true - /type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} - dev: true - /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} dev: true /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} + /type-fest@4.24.0: + resolution: {integrity: sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==} + engines: {node: '>=16'} + dev: true + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -12589,8 +11162,8 @@ packages: hasBin: true dev: true - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + /typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true dev: true @@ -12599,13 +11172,9 @@ packages: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} dev: true - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true + /ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} dev: true - optional: true /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -12620,19 +11189,6 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true - /undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} - dependencies: - '@fastify/busboy': 2.1.1 - dev: true - - /unescape-js@1.1.4: - resolution: {integrity: sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==} - dependencies: - string.fromcodepoint: 0.2.1 - dev: true - /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -12656,11 +11212,16 @@ packages: engines: {node: '>=4'} dev: true - /unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} dependencies: - crypto-random-string: 2.0.0 + crypto-random-string: 4.0.0 dev: true /unist-util-is@6.0.0: @@ -12699,19 +11260,14 @@ packages: engines: {node: '>= 0.8'} dev: true - /unplugin@1.10.1: - resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} + /unplugin@1.12.1: + resolution: {integrity: sha512-aXEH9c5qi3uYZHo0niUtxDlT9ylG/luMW/dZslSCkbtC31wCyFkmM0kyoBBh+Grhn7CL+/kvKLfN61/EdxPxMQ==} engines: {node: '>=14.0.0'} dependencies: - acorn: 8.11.3 + acorn: 8.12.1 chokidar: 3.6.0 webpack-sources: 3.2.3 - webpack-virtual-modules: 0.6.1 - dev: true - - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} + webpack-virtual-modules: 0.6.2 dev: true /update-browserslist-db@1.0.15(browserslist@4.23.0): @@ -12725,14 +11281,25 @@ packages: picocolors: 1.0.0 dev: true + /update-browserslist-db@1.1.0(browserslist@4.23.3): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 dev: true - /use-callback-ref@1.3.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} + /use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -12741,13 +11308,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.3 react: 18.3.1 - tslib: 2.6.2 + tslib: 2.6.3 dev: false - /use-debounce@10.0.0(react@18.3.1): - resolution: {integrity: sha512-XRjvlvCB46bah9IBXVnq/ACP2lxqXyZj0D9hj4K5OzNroMDpTEBg8Anuh1/UfRTRs7pLhQ+RiNxxwZu9+MVl1A==} + /use-debounce@10.0.2(react@18.3.1): + resolution: {integrity: sha512-MwBiJK2dk+2qhMDVDCPRPeLuIekKfH2t1UYMnrW9pwcJJGFDbTLliSMBz2UKGmE1PJs8l3XoMqbIU1MemMAJ8g==} engines: {node: '>= 16.0.0'} peerDependencies: react: '>=16.8.0' @@ -12773,7 +11340,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /use-isomorphic-layout-effect@1.1.2(@types/react@18.3.1)(react@18.3.1): + /use-isomorphic-layout-effect@1.1.2(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' @@ -12782,11 +11349,11 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.3 react: 18.3.1 dev: false - /use-sidecar@1.1.2(@types/react@18.3.1)(react@18.3.1): + /use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -12796,10 +11363,10 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.3 detect-node-es: 1.1.0 react: 18.3.1 - tslib: 2.6.2 + tslib: 2.6.3 dev: false /use-sync-external-store@1.2.0(react@18.3.1): @@ -12837,15 +11404,14 @@ packages: engines: {node: '>= 0.4.0'} dev: true + /uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + dev: false + /uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true - - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 dev: true /validator@13.11.0: @@ -12858,7 +11424,7 @@ packages: engines: {node: '>= 0.8'} dev: true - /vite-node@1.6.0(@types/node@20.12.10): + /vite-node@1.6.0(@types/node@20.14.15): resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -12867,27 +11433,28 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.11(@types/node@20.12.10) + vite: 5.4.0(@types/node@20.14.15) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser dev: true - /vite-plugin-css-injected-by-js@3.5.1(vite@5.2.11): + /vite-plugin-css-injected-by-js@3.5.1(vite@5.4.0): resolution: {integrity: sha512-9ioqwDuEBxW55gNoWFEDhfLTrVKXEEZgl5adhWmmqa88EQGKfTmexy4v1Rh0pAS6RhKQs2bUYQArprB32JpUZQ==} peerDependencies: vite: '>2.0.0-0' dependencies: - vite: 5.2.11(@types/node@20.12.10) + vite: 5.4.0(@types/node@20.14.15) dev: true - /vite-plugin-dts@3.9.1(@types/node@20.12.10)(typescript@5.4.5)(vite@5.2.11): + /vite-plugin-dts@3.9.1(@types/node@20.14.15)(typescript@5.5.4)(vite@5.4.0): resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -12897,22 +11464,22 @@ packages: vite: optional: true dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.12.10) + '@microsoft/api-extractor': 7.43.0(@types/node@20.14.15) '@rollup/pluginutils': 5.1.0 - '@vue/language-core': 1.8.27(typescript@5.4.5) + '@vue/language-core': 1.8.27(typescript@5.5.4) debug: 4.3.4 kolorist: 1.8.0 magic-string: 0.30.10 - typescript: 5.4.5 - vite: 5.2.11(@types/node@20.12.10) - vue-tsc: 1.8.27(typescript@5.4.5) + typescript: 5.5.4 + vite: 5.4.0(@types/node@20.14.15) + vue-tsc: 1.8.27(typescript@5.5.4) transitivePeerDependencies: - '@types/node' - rollup - supports-color dev: true - /vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@5.2.11): + /vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@5.4.0): resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==} peerDependencies: eslint: '>=7' @@ -12922,10 +11489,10 @@ packages: '@types/eslint': 8.56.10 eslint: 8.57.0 rollup: 2.79.1 - vite: 5.2.11(@types/node@20.12.10) + vite: 5.4.0(@types/node@20.14.15) dev: true - /vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.11): + /vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.4.0): resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} peerDependencies: vite: '*' @@ -12935,15 +11502,15 @@ packages: dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 3.0.3(typescript@5.4.5) - vite: 5.2.11(@types/node@20.12.10) + tsconfck: 3.0.3(typescript@5.5.4) + vite: 5.4.0(@types/node@20.14.15) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@5.2.11(@types/node@20.12.10): - resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + /vite@5.4.0(@types/node@20.14.15): + resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -12951,6 +11518,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -12963,6 +11531,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -12970,15 +11540,15 @@ packages: terser: optional: true dependencies: - '@types/node': 20.12.10 - esbuild: 0.20.2 - postcss: 8.4.38 + '@types/node': 20.14.15 + esbuild: 0.21.5 + postcss: 8.4.41 rollup: 4.17.2 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest@1.6.0(@types/node@20.12.10)(@vitest/ui@1.6.0): + /vitest@1.6.0(@types/node@20.14.15)(@vitest/ui@1.6.0): resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -13003,7 +11573,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.12.10 + '@types/node': 20.14.15 '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 '@vitest/snapshot': 1.6.0 @@ -13022,23 +11592,20 @@ packages: strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.2.11(@types/node@20.12.10) - vite-node: 1.6.0(@types/node@20.12.10) + vite: 5.4.0(@types/node@20.14.15) + vite-node: 1.6.0(@types/node@20.14.15) why-is-node-running: 2.2.2 transitivePeerDependencies: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser dev: true - /vlq@0.2.3: - resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} - dev: true - /void-elements@3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} @@ -13051,24 +11618,20 @@ packages: he: 1.2.0 dev: true - /vue-tsc@1.8.27(typescript@5.4.5): + /vue-tsc@1.8.27(typescript@5.5.4): resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} hasBin: true peerDependencies: typescript: '*' dependencies: '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.4.5) + '@vue/language-core': 1.8.27(typescript@5.5.4) semver: 7.6.0 - typescript: 5.4.5 + typescript: 5.5.4 dev: true - /watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 + /walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} dev: true /wcwidth@1.0.1: @@ -13085,8 +11648,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack-virtual-modules@0.6.1: - resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} + /webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} dev: true /whatwg-url@5.0.0: @@ -13166,10 +11729,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true - /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -13213,8 +11772,8 @@ packages: optional: true dev: false - /ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + /ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -13231,11 +11790,6 @@ packages: engines: {node: '>=0.4.0'} dev: false - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true - /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -13249,6 +11803,10 @@ packages: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true + /yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + dev: true + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -13294,19 +11852,19 @@ packages: commander: 9.5.0 dev: true - /zod-validation-error@3.2.0(zod@3.23.6): - resolution: {integrity: sha512-cYlPR6zuyrgmu2wRTdumEAJGuwI7eHVHGT+VyneAQxmRAKtGRL1/7pjz4wfLhz4J05f5qoSZc3rGacswgyTjjw==} + /zod-validation-error@3.3.1(zod@3.23.8): + resolution: {integrity: sha512-uFzCZz7FQis256dqw4AhPQgD6f3pzNca/Zh62RNELavlumQB3nDIUFbF5JQfFLcMbO1s02Q7Xg/gpcOBlEnYZA==} engines: {node: '>=18.0.0'} peerDependencies: zod: ^3.18.0 dependencies: - zod: 3.23.6 + zod: 3.23.8 - /zod@3.23.6: - resolution: {integrity: sha512-RTHJlZhsRbuA8Hmp/iNL7jnfc4nZishjsanDAfEY1QpDQZCahUp3xDzl+zfweE9BklxMUcgBgS1b7Lvie/ZVwA==} + /zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - /zustand@4.5.2(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} + /zustand@4.5.4(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==} engines: {node: '>=12.7.0'} peerDependencies: '@types/react': '>=16.8' @@ -13320,7 +11878,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.3 react: 18.3.1 use-sync-external-store: 1.2.0(react@18.3.1) dev: false diff --git a/invokeai/frontend/web/public/locales/ar.json b/invokeai/frontend/web/public/locales/ar.json index ee370d1e421..bb04edfa8b3 100644 --- a/invokeai/frontend/web/public/locales/ar.json +++ b/invokeai/frontend/web/public/locales/ar.json @@ -77,10 +77,6 @@ "title": "استعادة الوجوه", "desc": "استعادة الصورة الحالية" }, - "upscale": { - "title": "تحسين الحجم", - "desc": "تحسين حجم الصورة الحالية" - }, "showInfo": { "title": "عرض المعلومات", "desc": "عرض معلومات البيانات الخاصة بالصورة الحالية" @@ -255,8 +251,6 @@ "type": "نوع", "strength": "قوة", "upscaling": "تصغير", - "upscale": "تصغير", - "upscaleImage": "تصغير الصورة", "scale": "مقياس", "imageFit": "ملائمة الصورة الأولية لحجم الخرج", "scaleBeforeProcessing": "تحجيم قبل المعالجة", diff --git a/invokeai/frontend/web/public/locales/de.json b/invokeai/frontend/web/public/locales/de.json index 352b6ffcbf2..7633c70ca85 100644 --- a/invokeai/frontend/web/public/locales/de.json +++ b/invokeai/frontend/web/public/locales/de.json @@ -91,7 +91,8 @@ "viewingDesc": "Bilder in großer Galerie ansehen", "tab": "Tabulator", "enabled": "Aktiviert", - "disabled": "Ausgeschaltet" + "disabled": "Ausgeschaltet", + "dontShowMeThese": "Zeig mir diese nicht" }, "gallery": { "galleryImageSize": "Bildgröße", @@ -106,7 +107,6 @@ "download": "Runterladen", "setCurrentImage": "Setze aktuelle Bild", "featuresWillReset": "Wenn Sie dieses Bild löschen, werden diese Funktionen sofort zurückgesetzt.", - "deleteImageBin": "Gelöschte Bilder werden an den Papierkorb Ihres Betriebssystems gesendet.", "unableToLoad": "Galerie kann nicht geladen werden", "downloadSelection": "Auswahl herunterladen", "currentlyInUse": "Dieses Bild wird derzeit in den folgenden Funktionen verwendet:", @@ -187,10 +187,6 @@ "title": "Gesicht restaurieren", "desc": "Das aktuelle Bild restaurieren" }, - "upscale": { - "title": "Hochskalieren", - "desc": "Das aktuelle Bild hochskalieren" - }, "showInfo": { "title": "Info anzeigen", "desc": "Metadaten des aktuellen Bildes anzeigen" @@ -433,8 +429,6 @@ "type": "Art", "strength": "Stärke", "upscaling": "Hochskalierung", - "upscale": "Hochskalieren (Shift + U)", - "upscaleImage": "Bild hochskalieren", "scale": "Maßstab", "imageFit": "Ausgangsbild an Ausgabegröße anpassen", "scaleBeforeProcessing": "Skalieren vor der Verarbeitung", @@ -634,7 +628,10 @@ "private": "Private Ordner", "shared": "Geteilte Ordner", "archiveBoard": "Ordner archivieren", - "archived": "Archiviert" + "archived": "Archiviert", + "noBoards": "Kein {boardType}} Ordner", + "hideBoards": "Ordner verstecken", + "viewBoards": "Ordner ansehen" }, "controlnet": { "showAdvanced": "Zeige Erweitert", @@ -949,6 +946,21 @@ "paragraphs": [ "Reduziert das Ausgangsbild auf die Breite und Höhe des Ausgangsbildes. Empfohlen zu aktivieren." ] + }, + "structure": { + "paragraphs": [ + "Die Struktur steuert, wie genau sich das Ausgabebild an das Layout des Originals hält. Eine niedrige Struktur erlaubt größere Änderungen, während eine hohe Struktur die ursprüngliche Komposition und das Layout strikter beibehält." + ] + }, + "creativity": { + "paragraphs": [ + "Die Kreativität bestimmt den Grad der Freiheit, die dem Modell beim Hinzufügen von Details gewährt wird. Eine niedrige Kreativität hält sich eng an das Originalbild, während eine hohe Kreativität mehr Veränderungen zulässt. Bei der Verwendung eines Prompts erhöht eine hohe Kreativität den Einfluss des Prompts." + ] + }, + "scale": { + "paragraphs": [ + "Die Skalierung steuert die Größe des Ausgabebildes und basiert auf einem Vielfachen der Auflösung des Originalbildes. So würde z. B. eine 2-fache Hochskalierung eines 1024x1024px Bildes eine 2048x2048px große Ausgabe erzeugen." + ] } }, "invocationCache": { diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index 8fc600d6c96..1737bd4f297 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -31,13 +31,16 @@ "deleteBoard": "Delete Board", "deleteBoardAndImages": "Delete Board and Images", "deleteBoardOnly": "Delete Board Only", - "deletedBoardsCannotbeRestored": "Deleted boards cannot be restored", + "deletedBoardsCannotbeRestored": "Deleted boards cannot be restored. Selecting 'Delete Board Only' will move images to an uncategorized state.", + "deletedPrivateBoardsCannotbeRestored": "Deleted boards cannot be restored. Selecting 'Delete Board Only' will move images to a private uncategorized state for the image's creator.", + "hideBoards": "Hide Boards", "loading": "Loading...", "menuItemAutoAdd": "Auto-add to this Board", "move": "Move", "movingImagesToBoard_one": "Moving {{count}} image to board:", "movingImagesToBoard_other": "Moving {{count}} images to board:", "myBoard": "My Board", + "noBoards": "No {{boardType}} Boards", "noMatching": "No matching Boards", "private": "Private Boards", "searchBoard": "Search Boards...", @@ -46,6 +49,7 @@ "topMessage": "This board contains images used in the following features:", "unarchiveBoard": "Unarchive Board", "uncategorized": "Uncategorized", + "viewBoards": "View Boards", "downloadBoard": "Download Board", "imagesWithCount_one": "{{count}} image", "imagesWithCount_other": "{{count}} images", @@ -102,6 +106,7 @@ "negativePrompt": "Negative Prompt", "discordLabel": "Discord", "dontAskMeAgain": "Don't ask me again", + "dontShowMeThese": "Don't show me these", "editor": "Editor", "error": "Error", "file": "File", @@ -195,6 +200,7 @@ "delete": "Delete", "depthAnything": "Depth Anything", "depthAnythingDescription": "Depth map generation using the Depth Anything technique", + "depthAnythingSmallV2": "Small V2", "depthMidas": "Depth (Midas)", "depthMidasDescription": "Depth map generation using Midas", "depthZoe": "Depth (Zoe)", @@ -368,15 +374,18 @@ "dropToUpload": "$t(gallery.drop) to Upload", "deleteImage_one": "Delete Image", "deleteImage_other": "Delete {{count}} Images", - "deleteImageBin": "Deleted images will be sent to your operating system's Bin.", "deleteImagePermanent": "Deleted images cannot be restored.", "displayBoardSearch": "Display Board Search", "displaySearch": "Display Search", "download": "Download", + "exitBoardSearch": "Exit Board Search", + "exitSearch": "Exit Search", "featuresWillReset": "If you delete this image, those features will immediately be reset.", "galleryImageSize": "Image Size", "gallerySettings": "Gallery Settings", + "go": "Go", "image": "image", + "jump": "Jump", "loading": "Loading", "loadMore": "Load More", "newestFirst": "Newest First", @@ -636,9 +645,9 @@ "title": "Undo Stroke" }, "unifiedCanvasHotkeys": "Unified Canvas", - "upscale": { - "desc": "Upscale the current image", - "title": "Upscale" + "postProcess": { + "desc": "Process the current image using the selected post-processing model", + "title": "Process Image" }, "toggleViewer": { "desc": "Switches between the Image Viewer and workspace for the current tab.", @@ -1035,8 +1044,8 @@ "symmetry": "Symmetry", "tileSize": "Tile Size", "type": "Type", - "upscale": "Upscale (Shift + U)", - "upscaleImage": "Upscale Image", + "postProcessing": "Post-Processing (Shift + U)", + "processImage": "Process Image", "upscaling": "Upscaling", "useAll": "Use All", "useSize": "Use Size", @@ -1044,11 +1053,7 @@ "remixImage": "Remix Image", "usePrompt": "Use Prompt", "useSeed": "Use Seed", - "width": "Width", - "isAllowedToUpscale": { - "useX2Model": "Image is too large to upscale with x4 model, use x2 model", - "tooLarge": "Image is too large to upscale, select smaller image" - } + "width": "Width" }, "dynamicPrompts": { "showDynamicPrompts": "Show Dynamic Prompts", @@ -1092,6 +1097,8 @@ "displayInProgress": "Display Progress Images", "enableImageDebugging": "Enable Image Debugging", "enableInformationalPopovers": "Enable Informational Popovers", + "informationalPopoversDisabled": "Informational Popovers Disabled", + "informationalPopoversDisabledDesc": "Informational popovers have been disabled. Enable them in Settings.", "enableInvisibleWatermark": "Enable Invisible Watermark", "enableNSFWChecker": "Enable NSFW Checker", "general": "General", @@ -1134,6 +1141,8 @@ "imageSavingFailed": "Image Saving Failed", "imageUploaded": "Image Uploaded", "imageUploadFailed": "Image Upload Failed", + "importFailed": "Import Failed", + "importSuccessful": "Import Successful", "invalidUpload": "Invalid Upload", "loadedWithWarnings": "Workflow Loaded with Warnings", "maskSavedAssets": "Mask Saved to Assets", @@ -1499,6 +1508,30 @@ "seamlessTilingYAxis": { "heading": "Seamless Tiling Y Axis", "paragraphs": ["Seamlessly tile an image along the vertical axis."] + }, + "upscaleModel": { + "heading": "Upscale Model", + "paragraphs": [ + "The upscale model scales the image to the output size before details are added. Any supported upscale model may be used, but some are specialized for different kinds of images, like photos or line drawings." + ] + }, + "scale": { + "heading": "Scale", + "paragraphs": [ + "Scale controls the output image size, and is based on a multiple of the input image resolution. For example a 2x upscale on a 1024x1024 image would produce a 2048 x 2048 output." + ] + }, + "creativity": { + "heading": "Creativity", + "paragraphs": [ + "Creativity controls the amount of freedom granted to the model when adding details. Low creativity stays close to the original image, while high creativity allows for more change. When using a prompt, high creativity increases the influence of the prompt." + ] + }, + "structure": { + "heading": "Structure", + "paragraphs": [ + "Structure controls how closely the output image will keep to the layout of the original. Low structure allows major changes, while high structure strictly maintains the original composition and layout." + ] } }, "unifiedCanvas": { @@ -1642,10 +1675,15 @@ "layers_other": "Layers" }, "upscaling": { + "upscale": "Upscale", "creativity": "Creativity", + "exceedsMaxSize": "Upscale settings exceed max size limit", + "exceedsMaxSizeDetails": "Max upscale limit is {{maxUpscaleDimension}}x{{maxUpscaleDimension}} pixels. Please try a smaller image or decrease your scale selection.", "structure": "Structure", "upscaleModel": "Upscale Model", + "postProcessingModel": "Post-Processing Model", "scale": "Scale", + "postProcessingMissingModelWarning": "Visit the Model Manager to install a post-processing (image to image) model.", "missingModelsWarning": "Visit the Model Manager to install the required models:", "mainModelDesc": "Main model (SD1.5 or SDXL architecture)", "tileControlNetModelDesc": "Tile ControlNet model for the chosen main model architecture", @@ -1654,6 +1692,59 @@ "missingUpscaleModel": "Missing upscale model", "missingTileControlNetModel": "No valid tile ControlNet models installed" }, + "stylePresets": { + "active": "Active", + "choosePromptTemplate": "Choose Prompt Template", + "clearTemplateSelection": "Clear Template Selection", + "copyTemplate": "Copy Template", + "createPromptTemplate": "Create Prompt Template", + "defaultTemplates": "Default Templates", + "deleteImage": "Delete Image", + "deleteTemplate": "Delete Template", + "deleteTemplate2": "Are you sure you want to delete this template? This cannot be undone.", + "exportPromptTemplates": "Export My Prompt Templates (CSV)", + "editTemplate": "Edit Template", + "exportDownloaded": "Export Downloaded", + "exportFailed": "Unable to generate and download CSV", + "flatten": "Flatten selected template into current prompt", + "importTemplates": "Import Prompt Templates (CSV/JSON)", + "acceptedColumnsKeys": "Accepted columns/keys:", + "nameColumn": "'name'", + "positivePromptColumn": "'prompt' or 'positive_prompt'", + "negativePromptColumn": "'negative_prompt'", + "insertPlaceholder": "Insert placeholder", + "myTemplates": "My Templates", + "name": "Name", + "negativePrompt": "Negative Prompt", + "noTemplates": "No templates", + "noMatchingTemplates": "No matching templates", + "promptTemplatesDesc1": "Prompt templates add text to the prompts you write in the prompt box.", + "promptTemplatesDesc2": "Use the placeholder string
{{placeholder}}
to specify where your prompt should be included in the template.", + "promptTemplatesDesc3": "If you omit the placeholder, the template will be appended to the end of your prompt.", + "positivePrompt": "Positive Prompt", + "preview": "Preview", + "private": "Private", + "promptTemplateCleared": "Prompt Template Cleared", + "searchByName": "Search by name", + "shared": "Shared", + "sharedTemplates": "Shared Templates", + "templateActions": "Template Actions", + "templateDeleted": "Prompt template deleted", + "toggleViewMode": "Toggle View Mode", + "type": "Type", + "unableToDeleteTemplate": "Unable to delete prompt template", + "updatePromptTemplate": "Update Prompt Template", + "uploadImage": "Upload Image", + "useForTemplate": "Use For Prompt Template", + "viewList": "View Template List", + "viewModeTooltip": "This is how your prompt will look with your currently selected template. To edit your prompt, click anywhere in the text box." + }, + "upsell": { + "inviteTeammates": "Invite Teammates", + "professional": "Professional", + "professionalUpsell": "Available in Invoke’s Professional Edition. Click here or visit invoke.com/pricing for more details.", + "shareAccess": "Share Access" + }, "ui": { "tabs": { "generation": "Generation", diff --git a/invokeai/frontend/web/public/locales/es.json b/invokeai/frontend/web/public/locales/es.json index 52ee3b5fe3f..237ec7a9054 100644 --- a/invokeai/frontend/web/public/locales/es.json +++ b/invokeai/frontend/web/public/locales/es.json @@ -88,7 +88,6 @@ "deleteImage_one": "Eliminar Imagen", "deleteImage_many": "", "deleteImage_other": "", - "deleteImageBin": "Las imágenes eliminadas se enviarán a la papelera de tu sistema operativo.", "deleteImagePermanent": "Las imágenes eliminadas no se pueden restaurar.", "assets": "Activos", "autoAssignBoardOnClick": "Asignación automática de tableros al hacer clic" @@ -151,10 +150,6 @@ "title": "Restaurar rostros", "desc": "Restaurar rostros en la imagen actual" }, - "upscale": { - "title": "Aumentar resolución", - "desc": "Aumentar la resolución de la imagen actual" - }, "showInfo": { "title": "Mostrar información", "desc": "Mostar metadatos de la imagen actual" @@ -360,8 +355,6 @@ "type": "Tipo", "strength": "Fuerza", "upscaling": "Aumento de resolución", - "upscale": "Aumentar resolución", - "upscaleImage": "Aumentar la resolución de la imagen", "scale": "Escala", "imageFit": "Ajuste tamaño de imagen inicial al tamaño objetivo", "scaleBeforeProcessing": "Redimensionar antes de procesar", @@ -408,7 +401,12 @@ "showProgressInViewer": "Mostrar las imágenes del progreso en el visor", "ui": "Interfaz del usuario", "generation": "Generación", - "beta": "Beta" + "beta": "Beta", + "reloadingIn": "Recargando en", + "intermediatesClearedFailed": "Error limpiando los intermediarios", + "intermediatesCleared_one": "Borrado {{count}} intermediario", + "intermediatesCleared_many": "Borrados {{count}} intermediarios", + "intermediatesCleared_other": "Borrados {{count}} intermediarios" }, "toast": { "uploadFailed": "Error al subir archivo", @@ -426,7 +424,12 @@ "parameterSet": "Conjunto de parámetros", "parameterNotSet": "Parámetro no configurado", "problemCopyingImage": "No se puede copiar la imagen", - "errorCopied": "Error al copiar" + "errorCopied": "Error al copiar", + "baseModelChanged": "Modelo base cambiado", + "addedToBoard": "Añadido al tablero", + "baseModelChangedCleared_one": "Borrado o desactivado {{count}} submodelo incompatible", + "baseModelChangedCleared_many": "Borrados o desactivados {{count}} submodelos incompatibles", + "baseModelChangedCleared_other": "Borrados o desactivados {{count}} submodelos incompatibles" }, "tooltip": { "feature": { @@ -540,7 +543,13 @@ "downloadBoard": "Descargar panel", "deleteBoardOnly": "Borrar solo el panel", "myBoard": "Mi panel", - "noMatching": "No hay paneles que coincidan" + "noMatching": "No hay paneles que coincidan", + "imagesWithCount_one": "{{count}} imagen", + "imagesWithCount_many": "{{count}} imágenes", + "imagesWithCount_other": "{{count}} imágenes", + "assetsWithCount_one": "{{count}} activo", + "assetsWithCount_many": "{{count}} activos", + "assetsWithCount_other": "{{count}} activos" }, "accordions": { "compositing": { @@ -590,6 +599,27 @@ "balanced": "Equilibrado", "beginEndStepPercent": "Inicio / Final Porcentaje de pasos", "detectResolution": "Detectar resolución", - "beginEndStepPercentShort": "Inicio / Final %" + "beginEndStepPercentShort": "Inicio / Final %", + "t2i_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.t2iAdapter))", + "controlnet": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.controlNet))", + "ip_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.ipAdapter))", + "addControlNet": "Añadir $t(common.controlNet)", + "addIPAdapter": "Añadir $t(common.ipAdapter)", + "controlAdapter_one": "Adaptador de control", + "controlAdapter_many": "Adaptadores de control", + "controlAdapter_other": "Adaptadores de control", + "addT2IAdapter": "Añadir $t(common.t2iAdapter)" + }, + "queue": { + "back": "Atrás", + "front": "Delante", + "batchQueuedDesc_one": "Se agregó {{count}} sesión a {{direction}} la cola", + "batchQueuedDesc_many": "Se agregaron {{count}} sesiones a {{direction}} la cola", + "batchQueuedDesc_other": "Se agregaron {{count}} sesiones a {{direction}} la cola" + }, + "upsell": { + "inviteTeammates": "Invitar compañeros de equipo", + "shareAccess": "Compartir acceso", + "professionalUpsell": "Disponible en la edición profesional de Invoke. Haz clic aquí o visita invoke.com/pricing para obtener más detalles." } } diff --git a/invokeai/frontend/web/public/locales/fr.json b/invokeai/frontend/web/public/locales/fr.json index 558545b2f4e..efc181c59a2 100644 --- a/invokeai/frontend/web/public/locales/fr.json +++ b/invokeai/frontend/web/public/locales/fr.json @@ -130,10 +130,6 @@ "title": "Restaurer les visages", "desc": "Restaurer l'image actuelle" }, - "upscale": { - "title": "Agrandir", - "desc": "Agrandir l'image actuelle" - }, "showInfo": { "title": "Afficher les informations", "desc": "Afficher les informations de métadonnées de l'image actuelle" @@ -308,8 +304,6 @@ "type": "Type", "strength": "Force", "upscaling": "Agrandissement", - "upscale": "Agrandir", - "upscaleImage": "Image en Agrandissement", "scale": "Echelle", "imageFit": "Ajuster Image Initiale à la Taille de Sortie", "scaleBeforeProcessing": "Echelle Avant Traitement", diff --git a/invokeai/frontend/web/public/locales/he.json b/invokeai/frontend/web/public/locales/he.json index dbbb3cbec44..def170fdbc9 100644 --- a/invokeai/frontend/web/public/locales/he.json +++ b/invokeai/frontend/web/public/locales/he.json @@ -90,10 +90,6 @@ "desc": "שחזור התמונה הנוכחית", "title": "שחזור פרצופים" }, - "upscale": { - "title": "הגדלת קנה מידה", - "desc": "הגדל את התמונה הנוכחית" - }, "showInfo": { "title": "הצג מידע", "desc": "הצגת פרטי מטא-נתונים של התמונה הנוכחית" @@ -263,8 +259,6 @@ "seed": "זרע", "type": "סוג", "strength": "חוזק", - "upscale": "הגדלת קנה מידה", - "upscaleImage": "הגדלת קנה מידת התמונה", "denoisingStrength": "חוזק מנטרל הרעש", "scaleBeforeProcessing": "שנה קנה מידה לפני עיבוד", "scaledWidth": "קנה מידה לאחר שינוי W", diff --git a/invokeai/frontend/web/public/locales/it.json b/invokeai/frontend/web/public/locales/it.json index eced64a1e3b..a7b7df1a820 100644 --- a/invokeai/frontend/web/public/locales/it.json +++ b/invokeai/frontend/web/public/locales/it.json @@ -89,7 +89,8 @@ "enabled": "Abilitato", "disabled": "Disabilitato", "comparingDesc": "Confronta due immagini", - "comparing": "Confronta" + "comparing": "Confronta", + "dontShowMeThese": "Non mostrare più" }, "gallery": { "galleryImageSize": "Dimensione dell'immagine", @@ -101,7 +102,6 @@ "deleteImage_many": "Elimina {{count}} immagini", "deleteImage_other": "Elimina {{count}} immagini", "deleteImagePermanent": "Le immagini eliminate non possono essere ripristinate.", - "deleteImageBin": "Le immagini eliminate verranno spostate nel cestino del tuo sistema operativo.", "assets": "Risorse", "autoAssignBoardOnClick": "Assegna automaticamente la bacheca al clic", "featuresWillReset": "Se elimini questa immagine, quelle funzionalità verranno immediatamente ripristinate.", @@ -150,7 +150,13 @@ "showArchivedBoards": "Mostra le bacheche archiviate", "searchImages": "Ricerca per metadati", "displayBoardSearch": "Mostra la ricerca nelle Bacheche", - "displaySearch": "Mostra la ricerca" + "displaySearch": "Mostra la ricerca", + "selectAllOnPage": "Seleziona tutto nella pagina", + "selectAllOnBoard": "Seleziona tutto nella bacheca", + "exitBoardSearch": "Esci da Ricerca bacheca", + "exitSearch": "Esci dalla ricerca", + "go": "Vai", + "jump": "Salta" }, "hotkeys": { "keyboardShortcuts": "Tasti di scelta rapida", @@ -210,10 +216,6 @@ "title": "Restaura volti", "desc": "Restaura l'immagine corrente" }, - "upscale": { - "title": "Amplia", - "desc": "Amplia l'immagine corrente" - }, "showInfo": { "title": "Mostra informazioni", "desc": "Mostra le informazioni sui metadati dell'immagine corrente" @@ -377,6 +379,10 @@ "toggleViewer": { "title": "Attiva/disattiva il visualizzatore di immagini", "desc": "Passa dal visualizzatore immagini all'area di lavoro per la scheda corrente." + }, + "postProcess": { + "desc": "Elabora l'immagine corrente utilizzando il modello di post-elaborazione selezionato", + "title": "Elabora immagine" } }, "modelManager": { @@ -505,8 +511,6 @@ "type": "Tipo", "strength": "Forza", "upscaling": "Ampliamento", - "upscale": "Amplia (Shift + U)", - "upscaleImage": "Amplia Immagine", "scale": "Scala", "imageFit": "Adatta l'immagine iniziale alle dimensioni di output", "scaleBeforeProcessing": "Scala prima dell'elaborazione", @@ -569,10 +573,6 @@ }, "useCpuNoise": "Usa la CPU per generare rumore", "iterations": "Iterazioni", - "isAllowedToUpscale": { - "useX2Model": "L'immagine è troppo grande per l'ampliamento con il modello x4, utilizza il modello x2", - "tooLarge": "L'immagine è troppo grande per l'ampliamento, seleziona un'immagine più piccola" - }, "imageActions": "Azioni Immagine", "cfgRescaleMultiplier": "Moltiplicatore riscala CFG", "useSize": "Usa Dimensioni", @@ -591,7 +591,10 @@ "infillColorValue": "Colore di riempimento", "globalSettings": "Impostazioni globali", "globalPositivePromptPlaceholder": "Prompt positivo globale", - "globalNegativePromptPlaceholder": "Prompt negativo globale" + "globalNegativePromptPlaceholder": "Prompt negativo globale", + "processImage": "Elabora Immagine", + "sendToUpscale": "Invia a Ampliare", + "postProcessing": "Post-elaborazione (Shift + U)" }, "settings": { "models": "Modelli", @@ -625,7 +628,9 @@ "enableNSFWChecker": "Abilita controllo NSFW", "enableInvisibleWatermark": "Abilita filigrana invisibile", "enableInformationalPopovers": "Abilita testo informativo a comparsa", - "reloadingIn": "Ricaricando in" + "reloadingIn": "Ricaricando in", + "informationalPopoversDisabled": "Testo informativo a comparsa disabilitato", + "informationalPopoversDisabledDesc": "I testi informativi a comparsa sono disabilitati. Attivali nelle impostazioni." }, "toast": { "uploadFailed": "Caricamento fallito", @@ -696,7 +701,9 @@ "baseModelChanged": "Modello base modificato", "sessionRef": "Sessione: {{sessionId}}", "somethingWentWrong": "Qualcosa è andato storto", - "outOfMemoryErrorDesc": "Le impostazioni della generazione attuale superano la capacità del sistema. Modifica le impostazioni e riprova." + "outOfMemoryErrorDesc": "Le impostazioni della generazione attuale superano la capacità del sistema. Modifica le impostazioni e riprova.", + "importFailed": "Importazione non riuscita", + "importSuccessful": "Importazione riuscita" }, "tooltip": { "feature": { @@ -922,7 +929,7 @@ "missingInvocationTemplate": "Modello di invocazione mancante", "missingFieldTemplate": "Modello di campo mancante", "singleFieldType": "{{name}} (Singola)", - "imageAccessError": "Impossibile trovare l'immagine {{image_name}}, ripristino delle impostazioni predefinite", + "imageAccessError": "Impossibile trovare l'immagine {{image_name}}, ripristino ai valori predefiniti", "boardAccessError": "Impossibile trovare la bacheca {{board_id}}, ripristino ai valori predefiniti", "modelAccessError": "Impossibile trovare il modello {{key}}, ripristino ai valori predefiniti" }, @@ -946,7 +953,7 @@ "deleteBoardOnly": "solo la Bacheca", "deleteBoard": "Elimina Bacheca", "deleteBoardAndImages": "Bacheca e Immagini", - "deletedBoardsCannotbeRestored": "Le bacheche eliminate non possono essere ripristinate", + "deletedBoardsCannotbeRestored": "Le bacheche eliminate non possono essere ripristinate. Selezionando \"Elimina solo bacheca\" le immagini verranno spostate nella bacheca \"Non categorizzato\".", "movingImagesToBoard_one": "Spostare {{count}} immagine nella bacheca:", "movingImagesToBoard_many": "Spostare {{count}} immagini nella bacheca:", "movingImagesToBoard_other": "Spostare {{count}} immagini nella bacheca:", @@ -964,7 +971,11 @@ "boards": "Bacheche", "private": "Bacheche private", "shared": "Bacheche condivise", - "addPrivateBoard": "Aggiungi una Bacheca Privata" + "addPrivateBoard": "Aggiungi una Bacheca Privata", + "noBoards": "Nessuna bacheca {{boardType}}", + "hideBoards": "Nascondi bacheche", + "viewBoards": "Visualizza bacheche", + "deletedPrivateBoardsCannotbeRestored": "Le bacheche cancellate non possono essere ripristinate. Selezionando 'Cancella solo bacheca', le immagini verranno spostate nella bacheca \"Non categorizzato\" privata dell'autore dell'immagine." }, "controlnet": { "contentShuffleDescription": "Rimescola il contenuto di un'immagine", @@ -1508,6 +1519,30 @@ "paragraphs": [ "Metodo con cui applicare l'adattatore IP corrente." ] + }, + "scale": { + "heading": "Scala", + "paragraphs": [ + "La scala controlla la dimensione dell'immagine di uscita e si basa su un multiplo della risoluzione dell'immagine di ingresso. Ad esempio, un ampliamento 2x su un'immagine 1024x1024 produrrebbe in uscita a 2048x2048." + ] + }, + "upscaleModel": { + "paragraphs": [ + "Il modello di ampliamento (Upscale), scala l'immagine alle dimensioni di uscita prima di aggiungere i dettagli. È possibile utilizzare qualsiasi modello di ampliamento supportato, ma alcuni sono specializzati per diversi tipi di immagini, come foto o disegni al tratto." + ], + "heading": "Modello di ampliamento" + }, + "creativity": { + "heading": "Creatività", + "paragraphs": [ + "La creatività controlla quanta libertà è concessa al modello quando si aggiungono dettagli. Una creatività bassa rimane vicina all'immagine originale, mentre una creatività alta consente più cambiamenti. Quando si usa un prompt, una creatività alta aumenta l'influenza del prompt." + ] + }, + "structure": { + "heading": "Struttura", + "paragraphs": [ + "La struttura determina quanto l'immagine finale rispecchierà il layout dell'originale. Una struttura bassa permette cambiamenti significativi, mentre una struttura alta conserva la composizione e il layout originali." + ] } }, "sdxl": { @@ -1684,7 +1719,76 @@ "models": "Modelli", "modelsTab": "$t(ui.tabs.models) $t(common.tab)", "queue": "Coda", - "queueTab": "$t(ui.tabs.queue) $t(common.tab)" + "queueTab": "$t(ui.tabs.queue) $t(common.tab)", + "upscaling": "Ampliamento", + "upscalingTab": "$t(ui.tabs.upscaling) $t(common.tab)" } + }, + "upscaling": { + "creativity": "Creatività", + "structure": "Struttura", + "upscaleModel": "Modello di Ampliamento", + "scale": "Scala", + "missingModelsWarning": "Visita Gestione modelli per installare i modelli richiesti:", + "mainModelDesc": "Modello principale (architettura SD1.5 o SDXL)", + "tileControlNetModelDesc": "Modello Tile ControlNet per l'architettura del modello principale scelto", + "upscaleModelDesc": "Modello per l'ampliamento (da immagine a immagine)", + "missingUpscaleInitialImage": "Immagine iniziale mancante per l'ampliamento", + "missingUpscaleModel": "Modello per l’ampliamento mancante", + "missingTileControlNetModel": "Nessun modello ControlNet Tile valido installato", + "postProcessingModel": "Modello di post-elaborazione", + "postProcessingMissingModelWarning": "Visita Gestione modelli per installare un modello di post-elaborazione (da immagine a immagine).", + "exceedsMaxSize": "Le impostazioni di ampliamento superano il limite massimo delle dimensioni", + "exceedsMaxSizeDetails": "Il limite massimo di ampliamento è {{maxUpscaleDimension}}x{{maxUpscaleDimension}} pixel. Prova un'immagine più piccola o diminuisci la scala selezionata." + }, + "upsell": { + "inviteTeammates": "Invita collaboratori", + "shareAccess": "Condividi l'accesso", + "professional": "Professionale", + "professionalUpsell": "Disponibile nell'edizione Professional di Invoke. Fai clic qui o visita invoke.com/pricing per ulteriori dettagli." + }, + "stylePresets": { + "active": "Attivo", + "choosePromptTemplate": "Scegli un modello di prompt", + "clearTemplateSelection": "Cancella selezione modello", + "copyTemplate": "Copia modello", + "createPromptTemplate": "Crea modello di prompt", + "defaultTemplates": "Modelli predefiniti", + "deleteImage": "Elimina immagine", + "deleteTemplate": "Elimina modello", + "editTemplate": "Modifica modello", + "flatten": "Unisci il modello selezionato al prompt corrente", + "insertPlaceholder": "Inserisci segnaposto", + "myTemplates": "I miei modelli", + "name": "Nome", + "negativePrompt": "Prompt Negativo", + "noMatchingTemplates": "Nessun modello corrispondente", + "promptTemplatesDesc1": "I modelli di prompt aggiungono testo ai prompt che scrivi nelle caselle dei prompt.", + "promptTemplatesDesc3": "Se si omette il segnaposto, il modello verrà aggiunto alla fine del prompt.", + "positivePrompt": "Prompt Positivo", + "preview": "Anteprima", + "private": "Privato", + "searchByName": "Cerca per nome", + "shared": "Condiviso", + "sharedTemplates": "Modelli condivisi", + "templateDeleted": "Modello di prompt eliminato", + "toggleViewMode": "Attiva/disattiva visualizzazione", + "uploadImage": "Carica immagine", + "useForTemplate": "Usa per modello di prompt", + "viewList": "Visualizza l'elenco dei modelli", + "viewModeTooltip": "Ecco come apparirà il tuo prompt con il modello attualmente selezionato. Per modificare il tuo prompt, clicca in un punto qualsiasi della casella di testo.", + "deleteTemplate2": "Vuoi davvero eliminare questo modello? Questa operazione non può essere annullata.", + "unableToDeleteTemplate": "Impossibile eliminare il modello di prompt", + "updatePromptTemplate": "Aggiorna il modello di prompt", + "type": "Tipo", + "promptTemplatesDesc2": "Utilizza la stringa segnaposto
{{placeholder}}
per specificare dove inserire il tuo prompt nel modello.", + "importTemplates": "Importa modelli di prompt (CSV/JSON)", + "exportDownloaded": "Esportazione completata", + "exportFailed": "Impossibile generare e scaricare il file CSV", + "exportPromptTemplates": "Esporta i miei modelli di prompt (CSV)", + "positivePromptColumn": "'prompt' o 'positive_prompt'", + "noTemplates": "Nessun modello", + "acceptedColumnsKeys": "Colonne/chiavi accettate:", + "templateActions": "Azioni modello" } } diff --git a/invokeai/frontend/web/public/locales/ja.json b/invokeai/frontend/web/public/locales/ja.json index 6d5775ecd63..884b12b8d3c 100644 --- a/invokeai/frontend/web/public/locales/ja.json +++ b/invokeai/frontend/web/public/locales/ja.json @@ -109,7 +109,6 @@ "drop": "ドロップ", "dropOrUpload": "$t(gallery.drop) またはアップロード", "deleteImage_other": "画像を削除", - "deleteImageBin": "削除された画像はOSのゴミ箱に送られます。", "deleteImagePermanent": "削除された画像は復元できません。", "download": "ダウンロード", "unableToLoad": "ギャラリーをロードできません", @@ -199,10 +198,6 @@ "title": "顔の修復", "desc": "現在の画像を修復" }, - "upscale": { - "title": "アップスケール", - "desc": "現在の画像をアップスケール" - }, "showInfo": { "title": "情報を見る", "desc": "現在の画像のメタデータ情報を表示" @@ -427,8 +422,6 @@ "shuffle": "シャッフル", "strength": "強度", "upscaling": "アップスケーリング", - "upscale": "アップスケール", - "upscaleImage": "画像をアップスケール", "scale": "Scale", "scaleBeforeProcessing": "処理前のスケール", "scaledWidth": "幅のスケール", diff --git a/invokeai/frontend/web/public/locales/ko.json b/invokeai/frontend/web/public/locales/ko.json index db9cd0ca673..431004534f7 100644 --- a/invokeai/frontend/web/public/locales/ko.json +++ b/invokeai/frontend/web/public/locales/ko.json @@ -70,7 +70,6 @@ "gallerySettings": "갤러리 설정", "deleteSelection": "선택 항목 삭제", "featuresWillReset": "이 이미지를 삭제하면 해당 기능이 즉시 재설정됩니다.", - "deleteImageBin": "삭제된 이미지는 운영 체제의 Bin으로 전송됩니다.", "assets": "자산", "problemDeletingImagesDesc": "하나 이상의 이미지를 삭제할 수 없습니다", "noImagesInGallery": "보여줄 이미지가 없음", @@ -258,10 +257,6 @@ "desc": "캔버스 브러시를 선택", "title": "브러시 선택" }, - "upscale": { - "desc": "현재 이미지를 업스케일", - "title": "업스케일" - }, "previousImage": { "title": "이전 이미지", "desc": "갤러리에 이전 이미지 표시" diff --git a/invokeai/frontend/web/public/locales/nl.json b/invokeai/frontend/web/public/locales/nl.json index afcce621638..04052ba092d 100644 --- a/invokeai/frontend/web/public/locales/nl.json +++ b/invokeai/frontend/web/public/locales/nl.json @@ -97,7 +97,6 @@ "noImagesInGallery": "Geen afbeeldingen om te tonen", "deleteImage_one": "Verwijder afbeelding", "deleteImage_other": "", - "deleteImageBin": "Verwijderde afbeeldingen worden naar de prullenbak van je besturingssysteem gestuurd.", "deleteImagePermanent": "Verwijderde afbeeldingen kunnen niet worden hersteld.", "assets": "Eigen onderdelen", "autoAssignBoardOnClick": "Ken automatisch bord toe bij klikken", @@ -168,10 +167,6 @@ "title": "Herstel gezichten", "desc": "Herstelt de huidige afbeelding" }, - "upscale": { - "title": "Schaal op", - "desc": "Schaalt de huidige afbeelding op" - }, "showInfo": { "title": "Toon info", "desc": "Toont de metagegevens van de huidige afbeelding" @@ -412,8 +407,6 @@ "type": "Soort", "strength": "Sterkte", "upscaling": "Opschalen", - "upscale": "Vergroot (Shift + U)", - "upscaleImage": "Schaal afbeelding op", "scale": "Schaal", "imageFit": "Pas initiële afbeelding in uitvoergrootte", "scaleBeforeProcessing": "Schalen voor verwerking", @@ -473,10 +466,6 @@ }, "imageNotProcessedForControlAdapter": "De afbeelding van controle-adapter #{{number}} is niet verwerkt" }, - "isAllowedToUpscale": { - "useX2Model": "Afbeelding is te groot om te vergroten met het x4-model. Gebruik hiervoor het x2-model", - "tooLarge": "Afbeelding is te groot om te vergoten. Kies een kleinere afbeelding" - }, "patchmatchDownScaleSize": "Verklein", "useCpuNoise": "Gebruik CPU-ruis", "imageActions": "Afbeeldingshandeling", diff --git a/invokeai/frontend/web/public/locales/pl.json b/invokeai/frontend/web/public/locales/pl.json index b7592c3faec..0fccbded4a4 100644 --- a/invokeai/frontend/web/public/locales/pl.json +++ b/invokeai/frontend/web/public/locales/pl.json @@ -78,10 +78,6 @@ "title": "Popraw twarze", "desc": "Uruchamia proces poprawiania twarzy dla aktywnego obrazu" }, - "upscale": { - "title": "Powiększ", - "desc": "Uruchamia proces powiększania aktywnego obrazu" - }, "showInfo": { "title": "Pokaż informacje", "desc": "Pokazuje metadane zapisane w aktywnym obrazie" @@ -232,8 +228,6 @@ "type": "Metoda", "strength": "Siła", "upscaling": "Powiększanie", - "upscale": "Powiększ", - "upscaleImage": "Powiększ obraz", "scale": "Skala", "imageFit": "Przeskaluj oryginalny obraz", "scaleBeforeProcessing": "Tryb skalowania", diff --git a/invokeai/frontend/web/public/locales/pt.json b/invokeai/frontend/web/public/locales/pt.json index 3003a1732b9..a8a675f22fb 100644 --- a/invokeai/frontend/web/public/locales/pt.json +++ b/invokeai/frontend/web/public/locales/pt.json @@ -160,10 +160,6 @@ "title": "Restaurar Rostos", "desc": "Restaurar a imagem atual" }, - "upscale": { - "title": "Redimensionar", - "desc": "Redimensionar a imagem atual" - }, "showInfo": { "title": "Mostrar Informações", "desc": "Mostrar metadados de informações da imagem atual" @@ -275,8 +271,6 @@ "showOptionsPanel": "Mostrar Painel de Opções", "strength": "Força", "upscaling": "Redimensionando", - "upscale": "Redimensionar", - "upscaleImage": "Redimensionar Imagem", "scaleBeforeProcessing": "Escala Antes do Processamento", "images": "Imagems", "steps": "Passos", diff --git a/invokeai/frontend/web/public/locales/pt_BR.json b/invokeai/frontend/web/public/locales/pt_BR.json index c966c6db50d..1572d4fe0bc 100644 --- a/invokeai/frontend/web/public/locales/pt_BR.json +++ b/invokeai/frontend/web/public/locales/pt_BR.json @@ -80,10 +80,6 @@ "title": "Restaurar Rostos", "desc": "Restaurar a imagem atual" }, - "upscale": { - "title": "Redimensionar", - "desc": "Redimensionar a imagem atual" - }, "showInfo": { "title": "Mostrar Informações", "desc": "Mostrar metadados de informações da imagem atual" @@ -268,8 +264,6 @@ "type": "Tipo", "strength": "Força", "upscaling": "Redimensionando", - "upscale": "Redimensionar", - "upscaleImage": "Redimensionar Imagem", "scale": "Escala", "imageFit": "Caber Imagem Inicial No Tamanho de Saída", "scaleBeforeProcessing": "Escala Antes do Processamento", diff --git a/invokeai/frontend/web/public/locales/ru.json b/invokeai/frontend/web/public/locales/ru.json index ecceaf42aa6..c459c26d4c2 100644 --- a/invokeai/frontend/web/public/locales/ru.json +++ b/invokeai/frontend/web/public/locales/ru.json @@ -91,7 +91,8 @@ "enabled": "Включено", "disabled": "Отключено", "comparingDesc": "Сравнение двух изображений", - "comparing": "Сравнение" + "comparing": "Сравнение", + "dontShowMeThese": "Не показывай мне это" }, "gallery": { "galleryImageSize": "Размер изображений", @@ -100,7 +101,6 @@ "loadMore": "Показать больше", "noImagesInGallery": "Изображений нет", "deleteImagePermanent": "Удаленные изображения невозможно восстановить.", - "deleteImageBin": "Удаленные изображения будут отправлены в корзину вашей операционной системы.", "deleteImage_one": "Удалить изображение", "deleteImage_few": "Удалить {{count}} изображения", "deleteImage_many": "Удалить {{count}} изображений", @@ -154,7 +154,11 @@ "showArchivedBoards": "Показать архивированные доски", "searchImages": "Поиск по метаданным", "displayBoardSearch": "Отобразить поиск досок", - "displaySearch": "Отобразить поиск" + "displaySearch": "Отобразить поиск", + "exitBoardSearch": "Выйти из поиска досок", + "go": "Перейти", + "exitSearch": "Выйти из поиска", + "jump": "Пыгнуть" }, "hotkeys": { "keyboardShortcuts": "Горячие клавиши", @@ -214,10 +218,6 @@ "title": "Восстановить лица", "desc": "Восстановить лица на текущем изображении" }, - "upscale": { - "title": "Увеличение", - "desc": "Увеличить текущеее изображение" - }, "showInfo": { "title": "Показать метаданные", "desc": "Показать метаданные из текущего изображения" @@ -381,6 +381,10 @@ "toggleViewer": { "title": "Переключить просмотр изображений", "desc": "Переключение между средством просмотра изображений и рабочей областью для текущей вкладки." + }, + "postProcess": { + "desc": "Обработайте текущее изображение с помощью выбранной модели постобработки", + "title": "Обработать изображение" } }, "modelManager": { @@ -512,8 +516,6 @@ "type": "Тип", "strength": "Сила", "upscaling": "Увеличение", - "upscale": "Увеличить", - "upscaleImage": "Увеличить изображение", "scale": "Масштаб", "imageFit": "Уместить изображение", "scaleBeforeProcessing": "Масштабировать", @@ -573,10 +575,6 @@ "ipAdapterNoImageSelected": "изображение IP-адаптера не выбрано" } }, - "isAllowedToUpscale": { - "useX2Model": "Изображение слишком велико для увеличения с помощью модели x4. Используйте модель x2", - "tooLarge": "Изображение слишком велико для увеличения. Выберите изображение меньшего размера" - }, "cfgRescaleMultiplier": "Множитель масштабирования CFG", "patchmatchDownScaleSize": "уменьшить", "useCpuNoise": "Использовать шум CPU", @@ -600,7 +598,10 @@ "infillColorValue": "Цвет заливки", "globalSettings": "Глобальные настройки", "globalNegativePromptPlaceholder": "Глобальный негативный запрос", - "globalPositivePromptPlaceholder": "Глобальный запрос" + "globalPositivePromptPlaceholder": "Глобальный запрос", + "postProcessing": "Постобработка (Shift + U)", + "processImage": "Обработка изображения", + "sendToUpscale": "Отправить на увеличение" }, "settings": { "models": "Модели", @@ -634,7 +635,9 @@ "intermediatesCleared_many": "Очищено {{count}} промежуточных", "clearIntermediatesDesc1": "Очистка промежуточных элементов приведет к сбросу состояния Canvas и ControlNet.", "intermediatesClearedFailed": "Проблема очистки промежуточных", - "reloadingIn": "Перезагрузка через" + "reloadingIn": "Перезагрузка через", + "informationalPopoversDisabled": "Информационные всплывающие окна отключены", + "informationalPopoversDisabledDesc": "Информационные всплывающие окна были отключены. Включите их в Настройках." }, "toast": { "uploadFailed": "Загрузка не удалась", @@ -705,7 +708,9 @@ "sessionRef": "Сессия: {{sessionId}}", "outOfMemoryError": "Ошибка нехватки памяти", "outOfMemoryErrorDesc": "Ваши текущие настройки генерации превышают возможности системы. Пожалуйста, измените настройки и повторите попытку.", - "somethingWentWrong": "Что-то пошло не так" + "somethingWentWrong": "Что-то пошло не так", + "importFailed": "Импорт неудачен", + "importSuccessful": "Импорт успешен" }, "tooltip": { "feature": { @@ -1028,7 +1033,8 @@ "composition": "Только композиция", "hed": "HED", "beginEndStepPercentShort": "Начало/конец %", - "setControlImageDimensionsForce": "Скопируйте размер в Ш/В (игнорируйте модель)" + "setControlImageDimensionsForce": "Скопируйте размер в Ш/В (игнорируйте модель)", + "depthAnythingSmallV2": "Small V2" }, "boards": { "autoAddBoard": "Авто добавление Доски", @@ -1053,7 +1059,7 @@ "downloadBoard": "Скачать доску", "deleteBoard": "Удалить доску", "deleteBoardAndImages": "Удалить доску и изображения", - "deletedBoardsCannotbeRestored": "Удаленные доски не подлежат восстановлению", + "deletedBoardsCannotbeRestored": "Удаленные доски не могут быть восстановлены. Выбор «Удалить только доску» переведет изображения в состояние без категории.", "assetsWithCount_one": "{{count}} ассет", "assetsWithCount_few": "{{count}} ассета", "assetsWithCount_many": "{{count}} ассетов", @@ -1068,7 +1074,11 @@ "boards": "Доски", "addPrivateBoard": "Добавить личную доску", "private": "Личные доски", - "shared": "Общие доски" + "shared": "Общие доски", + "hideBoards": "Скрыть доски", + "viewBoards": "Просмотреть доски", + "noBoards": "Нет досок {{boardType}}", + "deletedPrivateBoardsCannotbeRestored": "Удаленные доски не могут быть восстановлены. Выбор «Удалить только доску» переведет изображения в приватное состояние без категории для создателя изображения." }, "dynamicPrompts": { "seedBehaviour": { @@ -1428,6 +1438,30 @@ "paragraphs": [ "Метод, с помощью которого применяется текущий IP-адаптер." ] + }, + "structure": { + "paragraphs": [ + "Структура контролирует, насколько точно выходное изображение будет соответствовать макету оригинала. Низкая структура допускает значительные изменения, в то время как высокая структура строго сохраняет исходную композицию и макет." + ], + "heading": "Структура" + }, + "scale": { + "paragraphs": [ + "Масштаб управляет размером выходного изображения и основывается на кратном разрешении входного изображения. Например, при увеличении в 2 раза изображения 1024x1024 на выходе получится 2048 x 2048." + ], + "heading": "Масштаб" + }, + "creativity": { + "paragraphs": [ + "Креативность контролирует степень свободы, предоставляемой модели при добавлении деталей. При низкой креативности модель остается близкой к оригинальному изображению, в то время как высокая креативность позволяет вносить больше изменений. При использовании подсказки высокая креативность увеличивает влияние подсказки." + ], + "heading": "Креативность" + }, + "upscaleModel": { + "heading": "Модель увеличения", + "paragraphs": [ + "Модель увеличения масштаба масштабирует изображение до выходного размера перед добавлением деталей. Можно использовать любую поддерживаемую модель масштабирования, но некоторые из них специализированы для различных видов изображений, например фотографий или линейных рисунков." + ] } }, "metadata": { @@ -1704,7 +1738,78 @@ "canvasTab": "$t(ui.tabs.canvas) $t(common.tab)", "queueTab": "$t(ui.tabs.queue) $t(common.tab)", "modelsTab": "$t(ui.tabs.models) $t(common.tab)", - "queue": "Очередь" + "queue": "Очередь", + "upscaling": "Увеличение", + "upscalingTab": "$t(ui.tabs.upscaling) $t(common.tab)" } + }, + "upscaling": { + "exceedsMaxSize": "Параметры масштабирования превышают максимальный размер", + "exceedsMaxSizeDetails": "Максимальный предел масштабирования составляет {{maxUpscaleDimension}}x{{maxUpscaleDimension}} пикселей. Пожалуйста, попробуйте использовать меньшее изображение или уменьшите масштаб.", + "structure": "Структура", + "missingTileControlNetModel": "Не установлены подходящие модели ControlNet", + "missingUpscaleInitialImage": "Отсутствует увеличиваемое изображение", + "missingUpscaleModel": "Отсутствует увеличивающая модель", + "creativity": "Креативность", + "upscaleModel": "Модель увеличения", + "scale": "Масштаб", + "mainModelDesc": "Основная модель (архитектура SD1.5 или SDXL)", + "upscaleModelDesc": "Модель увеличения (img2img)", + "postProcessingModel": "Модель постобработки", + "tileControlNetModelDesc": "Модель ControlNet для выбранной архитектуры основной модели", + "missingModelsWarning": "Зайдите в Менеджер моделей чтоб установить необходимые модели:", + "postProcessingMissingModelWarning": "Посетите Менеджер моделей, чтобы установить модель постобработки (img2img)." + }, + "stylePresets": { + "noMatchingTemplates": "Нет подходящих шаблонов", + "promptTemplatesDesc1": "Шаблоны подсказок добавляют текст к подсказкам, которые вы пишете в окне подсказок.", + "sharedTemplates": "Общие шаблоны", + "templateDeleted": "Шаблон запроса удален", + "toggleViewMode": "Переключить режим просмотра", + "type": "Тип", + "unableToDeleteTemplate": "Не получилось удалить шаблон запроса", + "viewModeTooltip": "Вот как будет выглядеть ваш запрос с выбранным шаблоном. Чтобы его отредактировать, щелкните в любом месте текстового поля.", + "viewList": "Просмотреть список шаблонов", + "active": "Активно", + "choosePromptTemplate": "Выберите шаблон запроса", + "defaultTemplates": "Стандартные шаблоны", + "deleteImage": "Удалить изображение", + "deleteTemplate": "Удалить шаблон", + "deleteTemplate2": "Вы уверены, что хотите удалить этот шаблон? Это нельзя отменить.", + "editTemplate": "Редактировать шаблон", + "exportPromptTemplates": "Экспорт моих шаблонов запроса (CSV)", + "exportDownloaded": "Экспорт скачан", + "exportFailed": "Невозможно сгенерировать и загрузить CSV", + "flatten": "Объединить выбранный шаблон с текущим запросом", + "acceptedColumnsKeys": "Принимаемые столбцы/ключи:", + "positivePromptColumn": "'prompt' или 'positive_prompt'", + "insertPlaceholder": "Вставить заполнитель", + "name": "Имя", + "negativePrompt": "Негативный запрос", + "promptTemplatesDesc3": "Если вы не используете заполнитель, шаблон будет добавлен в конец запроса.", + "positivePrompt": "Позитивный запрос", + "preview": "Предпросмотр", + "private": "Приватный", + "templateActions": "Действия с шаблоном", + "updatePromptTemplate": "Обновить шаблон запроса", + "uploadImage": "Загрузить изображение", + "useForTemplate": "Использовать для шаблона запроса", + "clearTemplateSelection": "Очистить выбор шаблона", + "copyTemplate": "Копировать шаблон", + "createPromptTemplate": "Создать шаблон запроса", + "importTemplates": "Импортировать шаблоны запроса (CSV/JSON)", + "nameColumn": "'name'", + "negativePromptColumn": "'negative_prompt'", + "myTemplates": "Мои шаблоны", + "noTemplates": "Нет шаблонов", + "promptTemplatesDesc2": "Используйте строку-заполнитель
{{placeholder}}
, чтобы указать место, куда должен быть включен ваш запрос в шаблоне.", + "searchByName": "Поиск по имени", + "shared": "Общий" + }, + "upsell": { + "inviteTeammates": "Пригласите членов команды", + "professional": "Профессионал", + "professionalUpsell": "Доступно в профессиональной версии Invoke. Нажмите здесь или посетите invoke.com/pricing для получения более подробной информации.", + "shareAccess": "Поделиться доступом" } } diff --git a/invokeai/frontend/web/public/locales/sv.json b/invokeai/frontend/web/public/locales/sv.json index 2c51027244a..a9ebd9f4912 100644 --- a/invokeai/frontend/web/public/locales/sv.json +++ b/invokeai/frontend/web/public/locales/sv.json @@ -90,10 +90,6 @@ "title": "Återskapa ansikten", "desc": "Återskapa nuvarande bild" }, - "upscale": { - "title": "Skala upp", - "desc": "Skala upp nuvarande bild" - }, "showInfo": { "title": "Visa info", "desc": "Visa metadata för nuvarande bild" diff --git a/invokeai/frontend/web/public/locales/tr.json b/invokeai/frontend/web/public/locales/tr.json index 415bd2d7443..5f0abc10408 100644 --- a/invokeai/frontend/web/public/locales/tr.json +++ b/invokeai/frontend/web/public/locales/tr.json @@ -278,7 +278,6 @@ "enable": "Aç" }, "gallery": { - "deleteImageBin": "Silinen görseller işletim sisteminin çöp kutusuna gönderilir.", "deleteImagePermanent": "Silinen görseller geri getirilemez.", "assets": "Özkaynaklar", "autoAssignBoardOnClick": "Tıklanan Panoya Otomatik Atama", @@ -416,10 +415,6 @@ "desc": "Maske/Taban katmanları arasında geçiş yapar", "title": "Katmanı Gizle-Göster" }, - "upscale": { - "title": "Büyüt", - "desc": "Seçili görseli büyüt" - }, "setSeed": { "title": "Tohumu Kullan", "desc": "Seçili görselin tohumunu kullan" @@ -626,10 +621,6 @@ "controlNetControlMode": "Yönetim Kipi", "general": "Genel", "seamlessYAxis": "Dikişsiz Döşeme Y Ekseni", - "isAllowedToUpscale": { - "tooLarge": "Görsel, büyütme işlemi için çok büyük, daha küçük bir boyut seçin", - "useX2Model": "Görsel 4 kat büyütme işlemi için çok geniş, 2 kat büyütmeyi kullanın" - }, "maskBlur": "Bulandırma", "images": "Görseller", "info": "Bilgi", @@ -641,7 +632,6 @@ "copyImage": "Görseli Kopyala", "height": "Boy", "width": "En", - "upscale": "Büyüt (Shift + U)", "useSize": "Boyutu Kullan", "symmetry": "Bakışım", "tileSize": "Döşeme Boyutu", @@ -657,7 +647,6 @@ "showOptionsPanel": "Yan Paneli Göster (O ya da T)", "shuffle": "Kar", "usePrompt": "İstemi Kullan", - "upscaleImage": "Görseli Büyüt", "setToOptimalSizeTooSmall": "$t(parameters.setToOptimalSize) (çok küçük olabilir)", "setToOptimalSizeTooLarge": "$t(parameters.setToOptimalSize) (çok büyük olabilir)", "cfgRescaleMultiplier": "CFG Rescale Çarpanı", diff --git a/invokeai/frontend/web/public/locales/uk.json b/invokeai/frontend/web/public/locales/uk.json index 9bb38c21b3e..0ade5c7a1f3 100644 --- a/invokeai/frontend/web/public/locales/uk.json +++ b/invokeai/frontend/web/public/locales/uk.json @@ -85,10 +85,6 @@ "title": "Відновити обличчя", "desc": "Відновити обличчя на поточному зображенні" }, - "upscale": { - "title": "Збільшення", - "desc": "Збільшити поточне зображення" - }, "showInfo": { "title": "Показати метадані", "desc": "Показати метадані з поточного зображення" @@ -276,8 +272,6 @@ "type": "Тип", "strength": "Сила", "upscaling": "Збільшення", - "upscale": "Збільшити", - "upscaleImage": "Збільшити зображення", "scale": "Масштаб", "imageFit": "Вмістити зображення", "scaleBeforeProcessing": "Масштабувати", diff --git a/invokeai/frontend/web/public/locales/zh_CN.json b/invokeai/frontend/web/public/locales/zh_CN.json index c4bb52e7cc2..dad9ad1c21d 100644 --- a/invokeai/frontend/web/public/locales/zh_CN.json +++ b/invokeai/frontend/web/public/locales/zh_CN.json @@ -6,7 +6,7 @@ "settingsLabel": "设置", "img2img": "图生图", "unifiedCanvas": "统一画布", - "nodes": "工作流编辑器", + "nodes": "工作流", "upload": "上传", "load": "加载", "statusDisconnected": "未连接", @@ -86,7 +86,12 @@ "editing": "编辑中", "green": "绿", "blue": "蓝", - "editingDesc": "在控制图层画布上编辑" + "editingDesc": "在控制图层画布上编辑", + "goTo": "前往", + "dontShowMeThese": "请勿显示这些内容", + "beta": "测试版", + "toResolve": "解决", + "tab": "标签页" }, "gallery": { "galleryImageSize": "预览大小", @@ -94,8 +99,7 @@ "autoSwitchNewImages": "自动切换到新图像", "loadMore": "加载更多", "noImagesInGallery": "无图像可用于显示", - "deleteImage_other": "删除图片", - "deleteImageBin": "被删除的图片会发送到你操作系统的回收站。", + "deleteImage_other": "删除{{count}}张图片", "deleteImagePermanent": "删除的图片无法被恢复。", "assets": "素材", "autoAssignBoardOnClick": "点击后自动分配面板", @@ -133,7 +137,24 @@ "hover": "悬停", "selectAllOnPage": "选择本页全部", "swapImages": "交换图像", - "compareOptions": "比较选项" + "compareOptions": "比较选项", + "exitBoardSearch": "退出面板搜索", + "exitSearch": "退出搜索", + "oldestFirst": "最旧在前", + "sortDirection": "排序方向", + "showStarredImagesFirst": "优先显示收藏的图片", + "compareHelp3": "按 C 键对调正在比较的图片。", + "showArchivedBoards": "显示已归档的面板", + "newestFirst": "最新在前", + "compareHelp4": "按 ZEsc 键退出。", + "searchImages": "按元数据搜索", + "jump": "跳过", + "compareHelp2": "按 M 键切换不同的比较模式。", + "displayBoardSearch": "显示面板搜索", + "displaySearch": "显示搜索", + "stretchToFit": "拉伸以适应", + "exitCompare": "退出对比", + "compareHelp1": "在点击图库中的图片或使用箭头键切换比较图片时,请按住Alt 键。" }, "hotkeys": { "keyboardShortcuts": "快捷键", @@ -193,10 +214,6 @@ "title": "面部修复", "desc": "对当前图像进行面部修复" }, - "upscale": { - "title": "放大", - "desc": "对当前图像进行放大" - }, "showInfo": { "title": "显示信息", "desc": "显示当前图像的元数据" @@ -352,7 +369,19 @@ "desc": "打开和关闭选项和图库面板", "title": "开关选项和图库" }, - "clearSearch": "清除检索项" + "clearSearch": "清除检索项", + "toggleViewer": { + "desc": "在当前标签页的图片查看模式和编辑工作区之间切换.", + "title": "切换图片查看器" + }, + "postProcess": { + "desc": "使用选定的后期处理模型对当前图像进行处理", + "title": "处理图像" + }, + "remixImage": { + "title": "重新混合图像", + "desc": "使用当前图像的所有参数,但不包括随机种子" + } }, "modelManager": { "modelManager": "模型管理器", @@ -400,14 +429,72 @@ "modelConversionFailed": "模型转换失败", "baseModel": "基底模型", "convertingModelBegin": "模型转换中. 请稍候.", - "predictionType": "预测类型(适用于 Stable Diffusion 2.x 模型和部分 Stable Diffusion 1.x 模型)", + "predictionType": "预测类型", "advanced": "高级", "modelType": "模型类别", "variant": "变体", "vae": "VAE", "alpha": "Alpha", "vaePrecision": "VAE 精度", - "noModelSelected": "无选中的模型" + "noModelSelected": "无选中的模型", + "modelImageUpdateFailed": "模型图像更新失败", + "scanFolder": "扫描文件夹", + "path": "路径", + "pathToConfig": "配置路径", + "cancel": "取消", + "hfTokenUnableToVerify": "无法验证HuggingFace token", + "install": "安装", + "simpleModelPlaceholder": "本地文件或diffusers文件夹的URL或路径", + "hfTokenInvalidErrorMessage": "无效或缺失的HuggingFace token.", + "noModelsInstalledDesc1": "安装模型时使用", + "inplaceInstallDesc": "安装模型时,不复制文件,直接从原位置加载。如果关闭此选项,模型文件将在安装过程中被复制到Invoke管理的模型文件夹中.", + "installAll": "安装全部", + "noModelsInstalled": "无已安装的模型", + "urlOrLocalPathHelper": "链接应该指向单个文件.本地路径可以指向单个文件,或者对于单个扩散模型(diffusers model),可以指向一个文件夹.", + "modelSettings": "模型设置", + "useDefaultSettings": "使用默认设置", + "scanPlaceholder": "本地文件夹路径", + "installRepo": "安装仓库", + "modelImageDeleted": "模型图像已删除", + "modelImageDeleteFailed": "模型图像删除失败", + "scanFolderHelper": "此文件夹将进行递归扫描以寻找模型.对于大型文件夹,这可能需要一些时间.", + "scanResults": "扫描结果", + "noMatchingModels": "无匹配的模型", + "pruneTooltip": "清理队列中已完成的导入任务", + "urlOrLocalPath": "链接或本地路径", + "localOnly": "仅本地", + "hfTokenHelperText": "需要HuggingFace token才能使用Checkpoint模型。点击此处创建或获取您的token.", + "huggingFaceHelper": "如果在此代码库中检测到多个模型,系统将提示您选择其中一个进行安装.", + "hfTokenUnableToVerifyErrorMessage": "无法验证HuggingFace token.可能是网络问题所致.请稍后再试.", + "hfTokenSaved": "HuggingFace token已保存", + "imageEncoderModelId": "图像编码器模型ID", + "modelImageUpdated": "模型图像已更新", + "modelName": "模型名称", + "prune": "清理", + "repoVariant": "代码库版本", + "defaultSettings": "默认设置", + "inplaceInstall": "就地安装", + "main": "主界面", + "starterModels": "初始模型", + "installQueue": "安装队列", + "hfTokenInvalidErrorMessage2": "更新于其中 ", + "hfTokenInvalid": "无效或缺失的HuggingFace token", + "mainModelTriggerPhrases": "主模型触发词", + "typePhraseHere": "在此输入触发词", + "triggerPhrases": "触发词", + "metadata": "元数据", + "deleteModelImage": "删除模型图片", + "edit": "编辑", + "source": "来源", + "uploadImage": "上传图像", + "addModels": "添加模型", + "textualInversions": "文本逆向生成", + "upcastAttention": "是否为高精度权重", + "defaultSettingsSaved": "默认设置已保存", + "huggingFacePlaceholder": "所有者或模型名称", + "huggingFaceRepoID": "HuggingFace仓库ID", + "loraTriggerPhrases": "LoRA 触发词", + "ipAdapters": "IP适配器" }, "parameters": { "images": "图像", @@ -422,8 +509,6 @@ "type": "种类", "strength": "强度", "upscaling": "放大", - "upscale": "放大 (Shift + U)", - "upscaleImage": "放大图像", "scale": "等级", "imageFit": "使生成图像长宽适配初始图像", "scaleBeforeProcessing": "处理前缩放", @@ -452,7 +537,7 @@ "scheduler": "调度器", "general": "通用", "controlNetControlMode": "控制模式", - "maskBlur": "模糊", + "maskBlur": "遮罩模糊", "invoke": { "noNodesInGraph": "节点图中无节点", "noModelSelected": "无已选中的模型", @@ -466,7 +551,21 @@ "noPrompts": "没有已生成的提示词", "noControlImageForControlAdapter": "有 #{{number}} 个 Control Adapter 缺失控制图像", "noModelForControlAdapter": "有 #{{number}} 个 Control Adapter 没有选择模型。", - "incompatibleBaseModelForControlAdapter": "有 #{{number}} 个 Control Adapter 模型与主模型不兼容。" + "incompatibleBaseModelForControlAdapter": "有 #{{number}} 个 Control Adapter 模型与主模型不兼容。", + "layer": { + "initialImageNoImageSelected": "未选择初始图像", + "controlAdapterImageNotProcessed": "Control Adapter图像尚未处理", + "ipAdapterNoModelSelected": "未选择IP adapter", + "controlAdapterNoModelSelected": "未选择Control Adapter模型", + "controlAdapterNoImageSelected": "未选择Control Adapter图像", + "rgNoPromptsOrIPAdapters": "无文本提示或IP Adapters", + "controlAdapterIncompatibleBaseModel": "Control Adapter的基础模型不兼容", + "ipAdapterIncompatibleBaseModel": "IP Adapter的基础模型不兼容", + "t2iAdapterIncompatibleDimensions": "T2I Adapter需要图像尺寸为{{multiple}}的倍数", + "ipAdapterNoImageSelected": "未选择IP Adapter图像", + "rgNoRegion": "未选择区域" + }, + "imageNotProcessedForControlAdapter": "Control Adapter #{{number}} 的图像未处理" }, "patchmatchDownScaleSize": "缩小", "clipSkip": "CLIP 跳过层", @@ -474,10 +573,6 @@ "coherenceMode": "模式", "imageActions": "图像操作", "iterations": "迭代数", - "isAllowedToUpscale": { - "useX2Model": "图像太大,无法使用 x4 模型,使用 x2 模型作为替代", - "tooLarge": "图像太大无法进行放大,请选择更小的图像" - }, "cfgRescaleMultiplier": "CFG 重缩放倍数", "useSize": "使用尺寸", "setToOptimalSize": "优化模型大小", @@ -485,7 +580,21 @@ "lockAspectRatio": "锁定纵横比", "swapDimensions": "交换尺寸", "aspect": "纵横", - "setToOptimalSizeTooLarge": "$t(parameters.setToOptimalSize) (可能过大)" + "setToOptimalSizeTooLarge": "$t(parameters.setToOptimalSize) (可能过大)", + "globalNegativePromptPlaceholder": "全局反向提示词", + "remixImage": "重新混合图像", + "coherenceEdgeSize": "边缘尺寸", + "postProcessing": "后处理(Shift + U)", + "infillMosaicTileWidth": "瓦片宽度", + "sendToUpscale": "发送到放大", + "processImage": "处理图像", + "globalPositivePromptPlaceholder": "全局正向提示词", + "globalSettings": "全局设置", + "infillMosaicTileHeight": "瓦片高度", + "infillMosaicMinColor": "最小颜色", + "infillMosaicMaxColor": "最大颜色", + "infillColorValue": "填充颜色", + "coherenceMinDenoise": "最小去噪" }, "settings": { "models": "模型", @@ -515,7 +624,9 @@ "enableNSFWChecker": "启用成人内容检测器", "enableInvisibleWatermark": "启用不可见水印", "enableInformationalPopovers": "启用信息弹窗", - "reloadingIn": "重新加载中" + "reloadingIn": "重新加载中", + "informationalPopoversDisabled": "信息提示框已禁用", + "informationalPopoversDisabledDesc": "信息提示框已被禁用.请在设置中重新启用." }, "toast": { "uploadFailed": "上传失败", @@ -524,16 +635,16 @@ "canvasMerged": "画布已合并", "sentToImageToImage": "已发送到图生图", "sentToUnifiedCanvas": "已发送到统一画布", - "parametersNotSet": "参数未设定", + "parametersNotSet": "参数未恢复", "metadataLoadFailed": "加载元数据失败", "uploadFailedInvalidUploadDesc": "必须是单张的 PNG 或 JPEG 图片", "connected": "服务器连接", - "parameterSet": "参数已设定", - "parameterNotSet": "参数未设定", + "parameterSet": "参数已恢复", + "parameterNotSet": "参数未恢复", "serverError": "服务器错误", "canceled": "处理取消", "problemCopyingImage": "无法复制图像", - "modelAddedSimple": "已添加模型", + "modelAddedSimple": "模型已加入队列", "imageSavingFailed": "图像保存失败", "canvasSentControlnetAssets": "画布已发送到 ControlNet & 素材", "problemCopyingCanvasDesc": "无法导出基础层", @@ -563,12 +674,28 @@ "canvasSavedGallery": "画布已保存到图库", "imageUploadFailed": "图像上传失败", "problemImportingMask": "导入遮罩时出现问题", - "baseModelChangedCleared_other": "基础模型已更改, 已清除或禁用 {{count}} 个不兼容的子模型", + "baseModelChangedCleared_other": "已清除或禁用{{count}}个不兼容的子模型", "setAsCanvasInitialImage": "设为画布初始图像", "invalidUpload": "无效的上传", "problemDeletingWorkflow": "删除工作流时出现问题", "workflowDeleted": "已删除工作流", - "problemRetrievingWorkflow": "检索工作流时发生问题" + "problemRetrievingWorkflow": "检索工作流时发生问题", + "baseModelChanged": "基础模型已更改", + "problemDownloadingImage": "无法下载图像", + "outOfMemoryError": "内存不足错误", + "parameters": "参数", + "resetInitialImage": "重置初始图像", + "parameterNotSetDescWithMessage": "无法恢复 {{parameter}}: {{message}}", + "parameterSetDesc": "已恢复 {{parameter}}", + "parameterNotSetDesc": "无法恢复{{parameter}}", + "sessionRef": "会话: {{sessionId}}", + "somethingWentWrong": "出现错误", + "prunedQueue": "已清理队列", + "uploadInitialImage": "上传初始图像", + "outOfMemoryErrorDesc": "您当前的生成设置已超出系统处理能力.请调整设置后再次尝试.", + "parametersSet": "参数已恢复", + "errorCopied": "错误信息已复制", + "modelImportCanceled": "模型导入已取消" }, "unifiedCanvas": { "layer": "图层", @@ -622,7 +749,15 @@ "antialiasing": "抗锯齿", "showResultsOn": "显示结果 (开)", "showResultsOff": "显示结果 (关)", - "saveMask": "保存 $t(unifiedCanvas.mask)" + "saveMask": "保存 $t(unifiedCanvas.mask)", + "coherenceModeBoxBlur": "盒子模糊", + "showBoundingBox": "显示边界框", + "coherenceModeGaussianBlur": "高斯模糊", + "coherenceModeStaged": "分阶段", + "hideBoundingBox": "隐藏边界框", + "initialFitImageSize": "在拖放时调整图像大小以适配", + "invertBrushSizeScrollDirection": "反转滚动操作以调整画笔大小", + "discardCurrent": "放弃当前设置" }, "accessibility": { "invokeProgressBar": "Invoke 进度条", @@ -752,11 +887,11 @@ "unableToExtractSchemaNameFromRef": "无法从参考中提取架构名", "unknownOutput": "未知输出:{{name}}", "unknownErrorValidatingWorkflow": "验证工作流时出现未知错误", - "collectionFieldType": "{{name}} 合集", + "collectionFieldType": "{{name}}(合集)", "unknownNodeType": "未知节点类型", "targetNodeDoesNotExist": "无效的边缘:{{node}} 的目标/输入节点不存在", "unknownFieldType": "$t(nodes.unknownField) 类型:{{type}}", - "collectionOrScalarFieldType": "{{name}} 合集 | 标量", + "collectionOrScalarFieldType": "{{name}} (单一项目或项目集合)", "nodeVersion": "节点版本", "deletedInvalidEdge": "已删除无效的边缘 {{source}} -> {{target}}", "unknownInput": "未知输入:{{name}}", @@ -765,7 +900,27 @@ "newWorkflow": "新建工作流", "newWorkflowDesc": "是否创建一个新的工作流?", "newWorkflowDesc2": "当前工作流有未保存的更改。", - "unsupportedAnyOfLength": "联合(union)数据类型数目过多 ({{count}})" + "unsupportedAnyOfLength": "联合(union)数据类型数目过多 ({{count}})", + "resetToDefaultValue": "重置为默认值", + "clearWorkflowDesc2": "您当前的工作流有未保存的更改.", + "missingNode": "缺少调用节点", + "missingInvocationTemplate": "缺少调用模版", + "noFieldsViewMode": "此工作流程未选择任何要显示的字段.请查看完整工作流程以进行配置.", + "reorderLinearView": "调整线性视图顺序", + "viewMode": "在线性视图中使用", + "showEdgeLabelsHelp": "在边缘上显示标签,指示连接的节点", + "cannotMixAndMatchCollectionItemTypes": "集合项目类型不能混用", + "missingFieldTemplate": "缺少字段模板", + "editMode": "在工作流编辑器中编辑", + "showEdgeLabels": "显示边缘标签", + "clearWorkflowDesc": "是否清除当前工作流并创建新的?", + "graph": "图表", + "noGraph": "无图表", + "edit": "编辑", + "clearWorkflow": "清除工作流", + "imageAccessError": "无法找到图像 {{image_name}},正在恢复默认设置", + "boardAccessError": "无法找到面板 {{board_id}},正在恢复默认设置", + "modelAccessError": "无法找到模型 {{key}},正在恢复默认设置" }, "controlnet": { "resize": "直接缩放", @@ -805,7 +960,7 @@ "mediapipeFaceDescription": "使用 Mediapipe 检测面部", "depthZoeDescription": "使用 Zoe 生成深度图", "hedDescription": "整体嵌套边缘检测", - "setControlImageDimensions": "设定控制图像尺寸宽/高为", + "setControlImageDimensions": "复制尺寸到宽度/高度(为模型优化)", "amult": "角度倍率 (a_mult)", "bgth": "背景移除阈值 (bg_th)", "lineartAnimeDescription": "动漫风格线稿处理", @@ -816,7 +971,7 @@ "addControlNet": "添加 $t(common.controlNet)", "addIPAdapter": "添加 $t(common.ipAdapter)", "safe": "保守模式", - "scribble": "草绘 (scribble)", + "scribble": "草绘", "maxFaces": "最大面部数", "pidi": "PIDI", "normalBae": "Normal BAE", @@ -931,7 +1086,8 @@ "steps": "步数", "posStylePrompt": "正向样式提示词", "refiner": "Refiner", - "freePromptStyle": "手动输入样式提示词" + "freePromptStyle": "手动输入样式提示词", + "refinerSteps": "精炼步数" }, "metadata": { "positivePrompt": "正向提示词", @@ -958,7 +1114,12 @@ "recallParameters": "召回参数", "noRecallParameters": "未找到要召回的参数", "vae": "VAE", - "cfgRescaleMultiplier": "$t(parameters.cfgRescaleMultiplier)" + "cfgRescaleMultiplier": "$t(parameters.cfgRescaleMultiplier)", + "allPrompts": "所有提示", + "parsingFailed": "解析失败", + "recallParameter": "调用{{label}}", + "imageDimensions": "图像尺寸", + "parameterSet": "已设置参数{{parameter}}" }, "models": { "noMatchingModels": "无相匹配的模型", @@ -971,7 +1132,8 @@ "esrganModel": "ESRGAN 模型", "addLora": "添加 LoRA", "lora": "LoRA", - "defaultVAE": "默认 VAE" + "defaultVAE": "默认 VAE", + "concepts": "概念" }, "boards": { "autoAddBoard": "自动添加面板", @@ -993,8 +1155,23 @@ "deleteBoardOnly": "仅删除面板", "deleteBoard": "删除面板", "deleteBoardAndImages": "删除面板和图像", - "deletedBoardsCannotbeRestored": "已删除的面板无法被恢复", - "movingImagesToBoard_other": "移动 {{count}} 张图像到面板:" + "deletedBoardsCannotbeRestored": "删除的面板无法恢复。选择“仅删除面板”选项后,相关图片将会被移至未分类区域。", + "movingImagesToBoard_other": "移动 {{count}} 张图像到面板:", + "selectedForAutoAdd": "已选中自动添加", + "hideBoards": "隐藏面板", + "noBoards": "没有{{boardType}}类型的面板", + "unarchiveBoard": "恢复面板", + "viewBoards": "查看面板", + "addPrivateBoard": "创建私密面板", + "addSharedBoard": "创建共享面板", + "boards": "面板", + "imagesWithCount_other": "{{count}}张图片", + "deletedPrivateBoardsCannotbeRestored": "删除的面板无法恢复。选择“仅删除面板”后,相关图片将会被移至图片创建者的私密未分类区域。", + "private": "私密面板", + "shared": "共享面板", + "archiveBoard": "归档面板", + "archived": "已归档", + "assetsWithCount_other": "{{count}}项资源" }, "dynamicPrompts": { "seedBehaviour": { @@ -1036,32 +1213,33 @@ "paramVAEPrecision": { "heading": "VAE 精度", "paragraphs": [ - "VAE 编解码过程种使用的精度。FP16/半精度以微小的图像变化为代价提高效率。" + "在VAE编码和解码过程中使用的精度.", + "Fp16/半精度更高效,但可能会造成图像的一些微小差异." ] }, "compositingCoherenceMode": { "heading": "模式", "paragraphs": [ - "一致性层模式。" + "用于将新生成的遮罩区域与原图像融合的方法." ] }, "controlNetResizeMode": { "heading": "缩放模式", "paragraphs": [ - "ControlNet 输入图像适应输出图像大小的方法。" + "调整Control Adapter输入图像大小以适应输出图像尺寸的方法." ] }, "clipSkip": { "paragraphs": [ - "选择要跳过 CLIP 模型多少层。", - "部分模型跳过特定数值的层时效果会更好。" + "跳过CLIP模型的层数.", + "某些模型更适合结合CLIP Skip功能使用." ], "heading": "CLIP 跳过层" }, "paramModel": { "heading": "模型", "paragraphs": [ - "用于去噪过程的模型。" + "用于图像生成的模型.不同的模型经过训练,专门用于产生不同的美学效果和内容." ] }, "paramIterations": { @@ -1093,19 +1271,21 @@ "paramScheduler": { "heading": "调度器", "paragraphs": [ - "调度器 (采样器) 定义如何在图像迭代过程中添加噪声,或者定义如何根据一个模型的输出来更新采样。" + "生成过程中所使用的调度器.", + "每个调度器决定了在生成过程中如何逐步向图像添加噪声,或者如何根据模型的输出更新样本." ] }, "controlNetWeight": { "heading": "权重", "paragraphs": [ - "ControlNet 对生成图像的影响强度。" + "Control Adapter的权重.权重越高,对最终图像的影响越大." ] }, "paramCFGScale": { "heading": "CFG 等级", "paragraphs": [ - "控制提示词对生成过程的影响程度。" + "控制提示对生成过程的影响程度.", + "较高的CFG比例值可能会导致生成结果过度饱和和扭曲. " ] }, "paramSteps": { @@ -1123,28 +1303,29 @@ ] }, "lora": { - "heading": "LoRA 权重", + "heading": "LoRA", "paragraphs": [ - "更高的 LoRA 权重会对最终图像产生更大的影响。" + "与基础模型结合使用的轻量级模型." ] }, "infillMethod": { "heading": "填充方法", "paragraphs": [ - "填充选定区域的方式。" + "在重绘过程中使用的填充方法." ] }, "controlNetBeginEnd": { "heading": "开始 / 结束步数百分比", "paragraphs": [ - "去噪过程中在哪部分步数应用 ControlNet。", - "在组合处理开始阶段应用 ControlNet,且在引导细节生成的结束阶段应用 ControlNet。" + "去噪过程中将应用Control Adapter 的部分.", + "通常,在去噪过程初期应用的Control Adapters用于指导整体构图,而在后期应用的Control Adapters则用于调整细节。" ] }, "scaleBeforeProcessing": { "heading": "处理前缩放", "paragraphs": [ - "生成图像前将所选区域缩放为最适合模型的大小。" + "\"自动\"选项会在图像生成之前将所选区域调整到最适合模型的大小.", + "\"手动\"选项允许您在图像生成之前自行选择所选区域的宽度和高度." ] }, "paramDenoisingStrength": { @@ -1158,13 +1339,13 @@ "heading": "种子", "paragraphs": [ "控制用于生成的起始噪声。", - "禁用 “随机种子” 来以相同设置生成相同的结果。" + "禁用\"随机\"选项,以使用相同的生成设置产生一致的结果." ] }, "controlNetControlMode": { "heading": "控制模式", "paragraphs": [ - "给提示词或 ControlNet 增加更大的权重。" + "在提示词和ControlNet之间分配更多的权重." ] }, "dynamicPrompts": { @@ -1205,7 +1386,171 @@ "paramCFGRescaleMultiplier": { "heading": "CFG 重缩放倍数", "paragraphs": [ - "CFG 引导的重缩放倍率,用于通过 zero-terminal SNR (ztsnr) 训练的模型。推荐设为 0.7。" + "CFG指导的重缩放乘数,适用于使用零终端信噪比(ztsnr)训练的模型.", + "对于这些模型,建议的数值为0.7." + ] + }, + "imageFit": { + "paragraphs": [ + "将初始图像调整到与输出图像相同的宽度和高度.建议启用此功能." + ], + "heading": "将初始图像适配到输出大小" + }, + "paramAspect": { + "paragraphs": [ + "生成图像的宽高比.调整宽高比会相应地更新图像的宽度和高度.", + "选择\"优化\"将把图像的宽度和高度设置为所选模型的最优尺寸." + ], + "heading": "宽高比" + }, + "refinerSteps": { + "paragraphs": [ + "在图像生成过程中的细化阶段将执行的步骤数.", + "与生成步骤相似." + ], + "heading": "步数" + }, + "compositingMaskBlur": { + "heading": "遮罩模糊", + "paragraphs": [ + "遮罩的模糊范围." + ] + }, + "compositingCoherenceMinDenoise": { + "paragraphs": [ + "连贯模式下的最小去噪力度", + "在图像修复或重绘过程中,连贯区域的最小去噪力度" + ], + "heading": "最小去噪" + }, + "loraWeight": { + "paragraphs": [ + "LoRA的权重,权重越高对最终图像的影响越大." + ], + "heading": "权重" + }, + "paramHrf": { + "heading": "启用高分辨率修复", + "paragraphs": [ + "以高于模型最优分辨率的大分辨率生成高质量图像.这通常用于防止生成图像中出现重复内容." + ] + }, + "compositingCoherenceEdgeSize": { + "paragraphs": [ + "连贯处理的边缘尺寸." + ], + "heading": "边缘尺寸" + }, + "paramWidth": { + "paragraphs": [ + "生成图像的宽度.必须是8的倍数." + ], + "heading": "宽度" + }, + "refinerScheduler": { + "paragraphs": [ + "在图像生成过程中的细化阶段所使用的调度程序.", + "与生成调度程序相似." + ], + "heading": "调度器" + }, + "seamlessTilingXAxis": { + "paragraphs": [ + "沿水平轴将图像进行无缝平铺." + ], + "heading": "无缝平铺X轴" + }, + "paramUpscaleMethod": { + "heading": "放大方法", + "paragraphs": [ + "用于高分辨率修复的图像放大方法." + ] + }, + "refinerModel": { + "paragraphs": [ + "在图像生成过程中的细化阶段所使用的模型.", + "与生成模型相似." + ], + "heading": "精炼模型" + }, + "paramHeight": { + "paragraphs": [ + "生成图像的高度.必须是8的倍数." + ], + "heading": "高" + }, + "patchmatchDownScaleSize": { + "heading": "缩小", + "paragraphs": [ + "在填充之前图像缩小的程度.", + "较高的缩小比例会提升处理速度,但可能会降低图像质量." + ] + }, + "seamlessTilingYAxis": { + "heading": "Y轴上的无缝平铺", + "paragraphs": [ + "沿垂直轴将图像进行无缝平铺." + ] + }, + "ipAdapterMethod": { + "paragraphs": [ + "当前IP Adapter的应用方法." + ], + "heading": "方法" + }, + "controlNetProcessor": { + "paragraphs": [ + "处理输入图像以引导生成过程的方法.不同的处理器会在生成图像中产生不同的效果或风格." + ], + "heading": "处理器" + }, + "refinerPositiveAestheticScore": { + "paragraphs": [ + "根据训练数据,对生成结果进行加权,使其更接近于具有高美学评分的图像." + ], + "heading": "正面美学评分" + }, + "refinerStart": { + "paragraphs": [ + "在图像生成过程中精炼阶段开始被使用的时刻.", + "0表示精炼器将全程参与图像生成,0.8表示细化器仅在生成过程的最后20%阶段被使用." + ], + "heading": "精炼开始" + }, + "refinerCfgScale": { + "paragraphs": [ + "控制提示对生成过程的影响程度.", + "与生成CFG Scale相似." + ] + }, + "structure": { + "heading": "结构", + "paragraphs": [ + "结构决定了输出图像在多大程度上保持原始图像的布局.较低的结构设置允许进行较大的变化,而较高的结构设置则会严格保持原始图像的构图和布局." + ] + }, + "creativity": { + "paragraphs": [ + "创造力决定了模型在添加细节时的自由度.较低的创造力会使生成结果更接近原始图像,而较高的创造力则允许更多的变化.在使用提示时,较高的创造力会增加提示对生成结果的影响." + ], + "heading": "创造力" + }, + "refinerNegativeAestheticScore": { + "paragraphs": [ + "根据训练数据,对生成结果进行加权,使其更接近于具有低美学评分的图像." + ], + "heading": "负面美学评分" + }, + "upscaleModel": { + "heading": "放大模型", + "paragraphs": [ + "上采样模型在添加细节之前将图像放大到输出尺寸.虽然可以使用任何支持的上采样模型,但有些模型更适合处理特定类型的图像,例如照片或线条画." + ] + }, + "scale": { + "heading": "缩放", + "paragraphs": [ + "比例控制决定了输出图像的大小,它是基于输入图像分辨率的倍数来计算的.例如对一张1024x1024的图像进行2倍上采样,将会得到一张2048x2048的输出图像." ] } }, @@ -1265,7 +1610,16 @@ "updated": "已更新", "userWorkflows": "我的工作流", "projectWorkflows": "项目工作流", - "opened": "已打开" + "opened": "已打开", + "noRecentWorkflows": "没有最近的工作流", + "workflowCleared": "工作流已清除", + "saveWorkflowToProject": "保存工作流到项目", + "noWorkflows": "无工作流", + "convertGraph": "转换图表", + "loadWorkflow": "$t(common.load) 工作流", + "noUserWorkflows": "没有用户工作流", + "loadFromGraph": "从图表加载工作流", + "autoLayout": "自动布局" }, "app": { "storeNotInitialized": "商店尚未初始化" @@ -1293,5 +1647,70 @@ "prompt": { "addPromptTrigger": "添加提示词触发器", "noMatchingTriggers": "没有匹配的触发器" + }, + "controlLayers": { + "autoNegative": "自动反向", + "opacityFilter": "透明度滤镜", + "deleteAll": "删除所有", + "moveForward": "向前移动", + "layers_other": "层", + "globalControlAdapterLayer": "全局 $t(controlnet.controlAdapter_one) $t(unifiedCanvas.layer)", + "moveBackward": "向后移动", + "regionalGuidance": "区域导向", + "controlLayers": "控制层", + "moveToBack": "移动到后面", + "brushSize": "笔刷尺寸", + "moveToFront": "移动到前面", + "addLayer": "添加层", + "deletePrompt": "删除提示词", + "resetRegion": "重置区域", + "debugLayers": "调试图层", + "maskPreviewColor": "遮罩预览颜色", + "addPositivePrompt": "添加 $t(common.positivePrompt)", + "addNegativePrompt": "添加 $t(common.negativePrompt)", + "addIPAdapter": "添加 $t(common.ipAdapter)", + "globalIPAdapterLayer": "全局 $t(common.ipAdapter) $t(unifiedCanvas.layer)", + "globalInitialImage": "全局初始图像", + "noLayersAdded": "没有层被添加", + "globalIPAdapter": "全局 $t(common.ipAdapter)", + "resetProcessor": "重置处理器至默认值", + "globalMaskOpacity": "全局遮罩透明度", + "rectangle": "矩形", + "opacity": "透明度", + "clearProcessor": "清除处理器", + "globalControlAdapter": "全局 $t(controlnet.controlAdapter_one)" + }, + "ui": { + "tabs": { + "generation": "生成", + "queue": "队列", + "canvas": "画布", + "upscaling": "放大中", + "workflows": "工作流", + "models": "模型" + } + }, + "upscaling": { + "structure": "结构", + "upscaleModel": "放大模型", + "missingUpscaleModel": "缺少放大模型", + "missingTileControlNetModel": "没有安装有效的tile ControlNet 模型", + "missingUpscaleInitialImage": "缺少用于放大的原始图像", + "creativity": "创造力", + "postProcessingModel": "后处理模型", + "scale": "缩放", + "tileControlNetModelDesc": "根据所选的主模型架构,选择相应的Tile ControlNet模型", + "upscaleModelDesc": "图像放大(图像到图像转换)模型", + "postProcessingMissingModelWarning": "请访问 模型管理器来安装一个后处理(图像到图像转换)模型.", + "missingModelsWarning": "请访问模型管理器 安装所需的模型:", + "mainModelDesc": "主模型(SD1.5或SDXL架构)", + "exceedsMaxSize": "放大设置超出了最大尺寸限制", + "exceedsMaxSizeDetails": "最大放大限制是 {{maxUpscaleDimension}}x{{maxUpscaleDimension}} 像素.请尝试一个较小的图像或减少您的缩放选择." + }, + "upsell": { + "inviteTeammates": "邀请团队成员", + "professional": "专业", + "professionalUpsell": "可在 Invoke 的专业版中使用.点击此处或访问 invoke.com/pricing 了解更多详情.", + "shareAccess": "共享访问权限" } } diff --git a/invokeai/frontend/web/scripts/typegen.js b/invokeai/frontend/web/scripts/typegen.js index fa2d791350d..c57e855b2e2 100644 --- a/invokeai/frontend/web/scripts/typegen.js +++ b/invokeai/frontend/web/scripts/typegen.js @@ -1,26 +1,40 @@ /* eslint-disable no-console */ import fs from 'node:fs'; -import openapiTS from 'openapi-typescript'; +import openapiTS, { astToString } from 'openapi-typescript'; +import ts from 'typescript'; const OPENAPI_URL = 'http://127.0.0.1:9090/openapi.json'; const OUTPUT_FILE = 'src/services/api/schema.ts'; async function generateTypes(schema) { process.stdout.write(`Generating types ${OUTPUT_FILE}...`); + + // Use https://ts-ast-viewer.com to figure out how to create these AST nodes - define a type and use the bottom-left pane's output + // `Blob` type + const BLOB = ts.factory.createTypeReferenceNode(ts.factory.createIdentifier('Blob')); + // `null` type + const NULL = ts.factory.createLiteralTypeNode(ts.factory.createNull()); + // `Record` type + const RECORD_STRING_UNKNOWN = ts.factory.createTypeReferenceNode(ts.factory.createIdentifier('Record'), [ + ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), + ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword), + ]); + const types = await openapiTS(schema, { exportType: true, transform: (schemaObject) => { if ('format' in schemaObject && schemaObject.format === 'binary') { - return schemaObject.nullable ? 'Blob | null' : 'Blob'; + return schemaObject.nullable ? ts.factory.createUnionTypeNode([BLOB, NULL]) : BLOB; } if (schemaObject.title === 'MetadataField') { // This is `Record` by default, but it actually accepts any a dict of any valid JSON value. - return 'Record'; + return RECORD_STRING_UNKNOWN; } }, + defaultNonNullable: false, }); - fs.writeFileSync(OUTPUT_FILE, types); + fs.writeFileSync(OUTPUT_FILE, astToString(types)); process.stdout.write(`\nOK!\r\n`); } diff --git a/invokeai/frontend/web/src/app/components/App.tsx b/invokeai/frontend/web/src/app/components/App.tsx index 2d878d96e78..41f3d97051d 100644 --- a/invokeai/frontend/web/src/app/components/App.tsx +++ b/invokeai/frontend/web/src/app/components/App.tsx @@ -13,9 +13,13 @@ import ChangeBoardModal from 'features/changeBoardModal/components/ChangeBoardMo import DeleteImageModal from 'features/deleteImageModal/components/DeleteImageModal'; import { DynamicPromptsModal } from 'features/dynamicPrompts/components/DynamicPromptsPreviewModal'; import { useStarterModelsToast } from 'features/modelManagerV2/hooks/useStarterModelsToast'; +import { StylePresetModal } from 'features/stylePresets/components/StylePresetForm/StylePresetModal'; import { configChanged } from 'features/system/store/configSlice'; import { languageSelector } from 'features/system/store/systemSelectors'; import InvokeTabs from 'features/ui/components/InvokeTabs'; +import type { InvokeTabName } from 'features/ui/store/tabMap'; +import { setActiveTab } from 'features/ui/store/uiSlice'; +import { useGetAndLoadLibraryWorkflow } from 'features/workflowLibrary/hooks/useGetAndLoadLibraryWorkflow'; import { AnimatePresence } from 'framer-motion'; import i18n from 'i18n'; import { size } from 'lodash-es'; @@ -34,9 +38,11 @@ interface Props { imageName: string; action: 'sendToImg2Img' | 'sendToCanvas' | 'useAllParameters'; }; + selectedWorkflowId?: string; + destination?: InvokeTabName | undefined; } -const App = ({ config = DEFAULT_CONFIG, selectedImage }: Props) => { +const App = ({ config = DEFAULT_CONFIG, selectedImage, selectedWorkflowId, destination }: Props) => { const language = useAppSelector(languageSelector); const logger = useLogger('system'); const dispatch = useAppDispatch(); @@ -67,6 +73,20 @@ const App = ({ config = DEFAULT_CONFIG, selectedImage }: Props) => { } }, [dispatch, config, logger]); + const { getAndLoadWorkflow } = useGetAndLoadLibraryWorkflow(); + + useEffect(() => { + if (selectedWorkflowId) { + getAndLoadWorkflow(selectedWorkflowId); + } + }, [selectedWorkflowId, getAndLoadWorkflow]); + + useEffect(() => { + if (destination) { + dispatch(setActiveTab(destination)); + } + }, [dispatch, destination]); + useEffect(() => { dispatch(appStarted()); }, [dispatch]); @@ -95,6 +115,7 @@ const App = ({ config = DEFAULT_CONFIG, selectedImage }: Props) => { + ); diff --git a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx index 1dd1a265fb1..5804902408a 100644 --- a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx +++ b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx @@ -19,6 +19,7 @@ import type { PartialAppConfig } from 'app/types/invokeai'; import Loading from 'common/components/Loading/Loading'; import AppDndContext from 'features/dnd/components/AppDndContext'; import type { WorkflowCategory } from 'features/nodes/types/workflow'; +import type { InvokeTabName } from 'features/ui/store/tabMap'; import type { PropsWithChildren, ReactNode } from 'react'; import React, { lazy, memo, useEffect, useMemo } from 'react'; import { Provider } from 'react-redux'; @@ -43,6 +44,8 @@ interface Props extends PropsWithChildren { imageName: string; action: 'sendToImg2Img' | 'sendToCanvas' | 'useAllParameters'; }; + selectedWorkflowId?: string; + destination?: InvokeTabName; customStarUi?: CustomStarUi; socketOptions?: Partial; isDebugging?: boolean; @@ -62,6 +65,8 @@ const InvokeAIUI = ({ projectUrl, queueId, selectedImage, + selectedWorkflowId, + destination, customStarUi, socketOptions, isDebugging = false, @@ -218,7 +223,12 @@ const InvokeAIUI = ({ }> - + diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts index aad9a2a289f..a1ce52b407d 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts @@ -1,5 +1,6 @@ import type { TypedStartListening } from '@reduxjs/toolkit'; import { createListenerMiddleware } from '@reduxjs/toolkit'; +import { addAdHocPostProcessingRequestedListener } from 'app/store/middleware/listenerMiddleware/listeners/addAdHocPostProcessingRequestedListener'; import { addCommitStagingAreaImageListener } from 'app/store/middleware/listenerMiddleware/listeners/addCommitStagingAreaImageListener'; import { addAnyEnqueuedListener } from 'app/store/middleware/listenerMiddleware/listeners/anyEnqueued'; import { addAppConfigReceivedListener } from 'app/store/middleware/listenerMiddleware/listeners/appConfigReceived'; @@ -47,7 +48,6 @@ import { addModelLoadEventListener } from 'app/store/middleware/listenerMiddlewa import { addSocketQueueItemStatusChangedEventListener } from 'app/store/middleware/listenerMiddleware/listeners/socketio/socketQueueItemStatusChanged'; import { addStagingAreaImageSavedListener } from 'app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved'; import { addUpdateAllNodesRequestedListener } from 'app/store/middleware/listenerMiddleware/listeners/updateAllNodesRequested'; -import { addUpscaleRequestedListener } from 'app/store/middleware/listenerMiddleware/listeners/upscaleRequested'; import { addWorkflowLoadRequestedListener } from 'app/store/middleware/listenerMiddleware/listeners/workflowLoadRequested'; import type { AppDispatch, RootState } from 'app/store/store'; @@ -142,7 +142,7 @@ addModelsLoadedListener(startAppListening); addAppConfigReceivedListener(startAppListening); // Ad-hoc upscale workflwo -addUpscaleRequestedListener(startAppListening); +addAdHocPostProcessingRequestedListener(startAppListening); // Prompts addDynamicPromptsListener(startAppListening); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addAdHocPostProcessingRequestedListener.ts similarity index 58% rename from invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts rename to invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addAdHocPostProcessingRequestedListener.ts index ce480a35733..65f3198b910 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addAdHocPostProcessingRequestedListener.ts @@ -2,46 +2,28 @@ import { createAction } from '@reduxjs/toolkit'; import { logger } from 'app/logging/logger'; import type { AppStartListening } from 'app/store/middleware/listenerMiddleware'; import { parseify } from 'common/util/serialize'; -import { buildAdHocUpscaleGraph } from 'features/nodes/util/graph/buildAdHocUpscaleGraph'; -import { createIsAllowedToUpscaleSelector } from 'features/parameters/hooks/useIsAllowedToUpscale'; +import { buildAdHocPostProcessingGraph } from 'features/nodes/util/graph/buildAdHocPostProcessingGraph'; import { toast } from 'features/toast/toast'; import { t } from 'i18next'; import { queueApi } from 'services/api/endpoints/queue'; import type { BatchConfig, ImageDTO } from 'services/api/types'; -export const upscaleRequested = createAction<{ imageDTO: ImageDTO }>(`upscale/upscaleRequested`); +export const adHocPostProcessingRequested = createAction<{ imageDTO: ImageDTO }>(`upscaling/postProcessingRequested`); -export const addUpscaleRequestedListener = (startAppListening: AppStartListening) => { +export const addAdHocPostProcessingRequestedListener = (startAppListening: AppStartListening) => { startAppListening({ - actionCreator: upscaleRequested, + actionCreator: adHocPostProcessingRequested, effect: async (action, { dispatch, getState }) => { const log = logger('session'); const { imageDTO } = action.payload; - const { image_name } = imageDTO; const state = getState(); - const { isAllowedToUpscale, detailTKey } = createIsAllowedToUpscaleSelector(imageDTO)(state); - - // if we can't upscale, show a toast and return - if (!isAllowedToUpscale) { - log.error( - { imageDTO }, - t(detailTKey ?? 'parameters.isAllowedToUpscale.tooLarge') // should never coalesce - ); - toast({ - id: 'NOT_ALLOWED_TO_UPSCALE', - title: t(detailTKey ?? 'parameters.isAllowedToUpscale.tooLarge'), // should never coalesce - status: 'error', - }); - return; - } - const enqueueBatchArg: BatchConfig = { prepend: true, batch: { - graph: buildAdHocUpscaleGraph({ - image_name, + graph: await buildAdHocPostProcessingGraph({ + image: imageDTO, state, }), runs: 1, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts index 1581da9b375..23d3cbc9afb 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts @@ -10,32 +10,32 @@ import { import { boardsApi } from 'services/api/endpoints/boards'; import { imagesApi } from 'services/api/endpoints/images'; +// Type inference doesn't work for this if you inline it in the listener for some reason +const matchAnyBoardDeleted = isAnyOf( + imagesApi.endpoints.deleteBoard.matchFulfilled, + imagesApi.endpoints.deleteBoardAndImages.matchFulfilled +); + export const addArchivedOrDeletedBoardListener = (startAppListening: AppStartListening) => { /** * The auto-add board shouldn't be set to an archived board or deleted board. When we archive a board, delete * a board, or change a the archived board visibility flag, we may need to reset the auto-add board. */ startAppListening({ - matcher: isAnyOf( - // If a board is deleted, we'll need to reset the auto-add board - imagesApi.endpoints.deleteBoard.matchFulfilled, - imagesApi.endpoints.deleteBoardAndImages.matchFulfilled - ), + matcher: matchAnyBoardDeleted, effect: async (action, { dispatch, getState }) => { const state = getState(); - const queryArgs = selectListBoardsQueryArgs(state); - const queryResult = boardsApi.endpoints.listAllBoards.select(queryArgs)(state); + const deletedBoardId = action.meta.arg.originalArgs; const { autoAddBoardId, selectedBoardId } = state.gallery; - if (!queryResult.data) { - return; - } - - if (!queryResult.data.find((board) => board.board_id === selectedBoardId)) { + // If the deleted board was currently selected, we should reset the selected board to uncategorized + if (deletedBoardId === selectedBoardId) { dispatch(boardIdSelected({ boardId: 'none' })); dispatch(galleryViewChanged('images')); } - if (!queryResult.data.find((board) => board.board_id === autoAddBoardId)) { + + // If the deleted board was selected for auto-add, we should reset the auto-add board to uncategorized + if (deletedBoardId === autoAddBoardId) { dispatch(autoAddBoardIdChanged('none')); } }, @@ -46,14 +46,8 @@ export const addArchivedOrDeletedBoardListener = (startAppListening: AppStartLis matcher: boardsApi.endpoints.updateBoard.matchFulfilled, effect: async (action, { dispatch, getState }) => { const state = getState(); - const queryArgs = selectListBoardsQueryArgs(state); - const queryResult = boardsApi.endpoints.listAllBoards.select(queryArgs)(state); const { shouldShowArchivedBoards } = state.gallery; - if (!queryResult.data) { - return; - } - const wasArchived = action.meta.arg.originalArgs.changes.archived === true; if (wasArchived && !shouldShowArchivedBoards) { @@ -71,7 +65,7 @@ export const addArchivedOrDeletedBoardListener = (startAppListening: AppStartLis const shouldShowArchivedBoards = action.payload; // We only need to take action if we have just hidden archived boards. - if (!shouldShowArchivedBoards) { + if (shouldShowArchivedBoards) { return; } @@ -86,14 +80,16 @@ export const addArchivedOrDeletedBoardListener = (startAppListening: AppStartLis // Handle the case where selected board is archived const selectedBoard = queryResult.data.find((b) => b.board_id === selectedBoardId); - if (selectedBoard && selectedBoard.archived) { + if (!selectedBoard || selectedBoard.archived) { + // If we can't find the selected board or it's archived, we should reset the selected board to uncategorized dispatch(boardIdSelected({ boardId: 'none' })); dispatch(galleryViewChanged('images')); } // Handle the case where auto-add board is archived const autoAddBoard = queryResult.data.find((b) => b.board_id === autoAddBoardId); - if (autoAddBoard && autoAddBoard.archived) { + if (!autoAddBoard || autoAddBoard.archived) { + // If we can't find the auto-add board or it's archived, we should reset the selected board to uncategorized dispatch(autoAddBoardIdChanged('none')); } }, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts index 2ace69c54ea..9d02fcbfa54 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts @@ -10,7 +10,7 @@ import { heightChanged, widthChanged } from 'features/controlLayers/store/contro import { loraRemoved } from 'features/lora/store/loraSlice'; import { calculateNewSize } from 'features/parameters/components/ImageSize/calculateNewSize'; import { modelChanged, vaeSelected } from 'features/parameters/store/generationSlice'; -import { upscaleModelChanged } from 'features/parameters/store/upscaleSlice'; +import { postProcessingModelChanged, upscaleModelChanged } from 'features/parameters/store/upscaleSlice'; import { zParameterModel, zParameterVAEModel } from 'features/parameters/types/parameterSchemas'; import { getIsSizeOptimal, getOptimalDimension } from 'features/parameters/util/optimalDimension'; import { refinerModelChanged } from 'features/sdxl/store/sdxlSlice'; @@ -186,21 +186,23 @@ const handleControlAdapterModels: ModelHandler = (models, state, dispatch, _log) }; const handleSpandrelImageToImageModels: ModelHandler = (models, state, dispatch, _log) => { - const currentUpscaleModel = state.upscale.upscaleModel; + const { upscaleModel: currentUpscaleModel, postProcessingModel: currentPostProcessingModel } = state.upscale; const upscaleModels = models.filter(isSpandrelImageToImageModelConfig); + const firstModel = upscaleModels[0] || null; - if (currentUpscaleModel) { - const isCurrentUpscaleModelAvailable = upscaleModels.some((m) => m.key === currentUpscaleModel.key); - if (isCurrentUpscaleModelAvailable) { - return; - } - } + const isCurrentUpscaleModelAvailable = currentUpscaleModel + ? upscaleModels.some((m) => m.key === currentUpscaleModel.key) + : false; - const firstModel = upscaleModels[0]; - if (firstModel) { + if (!isCurrentUpscaleModelAvailable) { dispatch(upscaleModelChanged(firstModel)); - return; } - dispatch(upscaleModelChanged(null)); + const isCurrentPostProcessingModelAvailable = currentPostProcessingModel + ? upscaleModels.some((m) => m.key === currentPostProcessingModel.key) + : false; + + if (!isCurrentPostProcessingModelAvailable) { + dispatch(postProcessingModelChanged(firstModel)); + } }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/promptChanged.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/promptChanged.ts index 4633eb45a57..2b4da169eba 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/promptChanged.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/promptChanged.ts @@ -11,6 +11,9 @@ import { promptsChanged, } from 'features/dynamicPrompts/store/dynamicPromptsSlice'; import { getShouldProcessPrompt } from 'features/dynamicPrompts/util/getShouldProcessPrompt'; +import { getPresetModifiedPrompts } from 'features/nodes/util/graph/graphBuilderUtils'; +import { activeStylePresetIdChanged } from 'features/stylePresets/store/stylePresetSlice'; +import { stylePresetsApi } from 'services/api/endpoints/stylePresets'; import { utilitiesApi } from 'services/api/endpoints/utilities'; import { socketConnected } from 'services/events/actions'; @@ -19,7 +22,11 @@ const matcher = isAnyOf( combinatorialToggled, maxPromptsChanged, maxPromptsReset, - socketConnected + socketConnected, + activeStylePresetIdChanged, + stylePresetsApi.endpoints.deleteStylePreset.matchFulfilled, + stylePresetsApi.endpoints.updateStylePreset.matchFulfilled, + stylePresetsApi.endpoints.listStylePresets.matchFulfilled ); export const addDynamicPromptsListener = (startAppListening: AppStartListening) => { @@ -28,7 +35,7 @@ export const addDynamicPromptsListener = (startAppListening: AppStartListening) effect: async (action, { dispatch, getState, cancelActiveListeners, delay }) => { cancelActiveListeners(); const state = getState(); - const { positivePrompt } = state.controlLayers.present; + const { positivePrompt } = getPresetModifiedPrompts(state); const { maxPrompts } = state.dynamicPrompts; if (state.config.disabledFeatures.includes('dynamicPrompting')) { diff --git a/invokeai/frontend/web/src/app/store/store.ts b/invokeai/frontend/web/src/app/store/store.ts index 1a4093dfc51..cacea30e482 100644 --- a/invokeai/frontend/web/src/app/store/store.ts +++ b/invokeai/frontend/web/src/app/store/store.ts @@ -25,10 +25,10 @@ import { nodesPersistConfig, nodesSlice, nodesUndoableConfig } from 'features/no import { workflowSettingsPersistConfig, workflowSettingsSlice } from 'features/nodes/store/workflowSettingsSlice'; import { workflowPersistConfig, workflowSlice } from 'features/nodes/store/workflowSlice'; import { generationPersistConfig, generationSlice } from 'features/parameters/store/generationSlice'; -import { postprocessingPersistConfig, postprocessingSlice } from 'features/parameters/store/postprocessingSlice'; import { upscalePersistConfig, upscaleSlice } from 'features/parameters/store/upscaleSlice'; import { queueSlice } from 'features/queue/store/queueSlice'; import { sdxlPersistConfig, sdxlSlice } from 'features/sdxl/store/sdxlSlice'; +import { stylePresetPersistConfig, stylePresetSlice } from 'features/stylePresets/store/stylePresetSlice'; import { configSlice } from 'features/system/store/configSlice'; import { systemPersistConfig, systemSlice } from 'features/system/store/systemSlice'; import { uiPersistConfig, uiSlice } from 'features/ui/store/uiSlice'; @@ -53,7 +53,6 @@ const allReducers = { [gallerySlice.name]: gallerySlice.reducer, [generationSlice.name]: generationSlice.reducer, [nodesSlice.name]: undoable(nodesSlice.reducer, nodesUndoableConfig), - [postprocessingSlice.name]: postprocessingSlice.reducer, [systemSlice.name]: systemSlice.reducer, [configSlice.name]: configSlice.reducer, [uiSlice.name]: uiSlice.reducer, @@ -71,6 +70,7 @@ const allReducers = { [workflowSettingsSlice.name]: workflowSettingsSlice.reducer, [api.reducerPath]: api.reducer, [upscaleSlice.name]: upscaleSlice.reducer, + [stylePresetSlice.name]: stylePresetSlice.reducer, }; const rootReducer = combineReducers(allReducers); @@ -104,7 +104,6 @@ const persistConfigs: { [key in keyof typeof allReducers]?: PersistConfig } = { [galleryPersistConfig.name]: galleryPersistConfig, [generationPersistConfig.name]: generationPersistConfig, [nodesPersistConfig.name]: nodesPersistConfig, - [postprocessingPersistConfig.name]: postprocessingPersistConfig, [systemPersistConfig.name]: systemPersistConfig, [workflowPersistConfig.name]: workflowPersistConfig, [uiPersistConfig.name]: uiPersistConfig, @@ -117,6 +116,7 @@ const persistConfigs: { [key in keyof typeof allReducers]?: PersistConfig } = { [controlLayersPersistConfig.name]: controlLayersPersistConfig, [workflowSettingsPersistConfig.name]: workflowSettingsPersistConfig, [upscalePersistConfig.name]: upscalePersistConfig, + [stylePresetPersistConfig.name]: stylePresetPersistConfig, }; const unserialize: UnserializeFunction = (data, key) => { @@ -167,8 +167,8 @@ export const createStore = (uniqueStoreKey?: string, persist = true) => reducer: rememberedRootReducer, middleware: (getDefaultMiddleware) => getDefaultMiddleware({ - serializableCheck: false, - immutableCheck: false, + serializableCheck: import.meta.env.MODE === 'development', + immutableCheck: import.meta.env.MODE === 'development', }) .concat(api.middleware) .concat(dynamicMiddlewares) diff --git a/invokeai/frontend/web/src/app/types/invokeai.ts b/invokeai/frontend/web/src/app/types/invokeai.ts index 6d7416d95d3..ffc4e1960bc 100644 --- a/invokeai/frontend/web/src/app/types/invokeai.ts +++ b/invokeai/frontend/web/src/app/types/invokeai.ts @@ -65,14 +65,18 @@ export type AppConfig = { */ shouldUpdateImagesOnConnect: boolean; shouldFetchMetadataFromApi: boolean; + /** + * Sets a size limit for outputs on the upscaling tab. This is a maximum dimension, so the actual max number of pixels + * will be the square of this value. + */ + maxUpscaleDimension?: number; allowPrivateBoards: boolean; + allowPrivateStylePresets: boolean; disabledTabs: InvokeTabName[]; disabledFeatures: AppFeature[]; disabledSDFeatures: SDFeature[]; - canRestoreDeletedImagesFromBin: boolean; nodesAllowlist: string[] | undefined; nodesDenylist: string[] | undefined; - maxUpscalePixels?: number; metadataFetchDebounce?: number; workflowFetchDebounce?: number; isLocal?: boolean; diff --git a/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx b/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx index 1a23c458cf5..229f9ba6d95 100644 --- a/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx +++ b/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx @@ -47,6 +47,7 @@ export const IAINoContentFallback = memo((props: IAINoImageFallbackProps) => { userSelect: 'none', opacity: 0.7, color: 'base.500', + fontSize: 'md', ...sx, }), [sx] @@ -55,11 +56,7 @@ export const IAINoContentFallback = memo((props: IAINoImageFallbackProps) => { return ( {icon && } - {props.label && ( - - {props.label} - - )} + {props.label && {props.label}} ); }); diff --git a/invokeai/frontend/web/src/common/components/InformationalPopover/InformationalPopover.tsx b/invokeai/frontend/web/src/common/components/InformationalPopover/InformationalPopover.tsx index 935212ee58d..cb295bb0f4c 100644 --- a/invokeai/frontend/web/src/common/components/InformationalPopover/InformationalPopover.tsx +++ b/invokeai/frontend/web/src/common/components/InformationalPopover/InformationalPopover.tsx @@ -10,9 +10,12 @@ import { PopoverContent, PopoverTrigger, Portal, + Spacer, Text, } from '@invoke-ai/ui-library'; -import { useAppSelector } from 'app/store/storeHooks'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { setShouldEnableInformationalPopovers } from 'features/system/store/systemSlice'; +import { toast } from 'features/toast/toast'; import { merge, omit } from 'lodash-es'; import type { ReactElement } from 'react'; import { memo, useCallback, useMemo } from 'react'; @@ -71,7 +74,7 @@ type ContentProps = { const Content = ({ data, feature }: ContentProps) => { const { t } = useTranslation(); - + const dispatch = useAppDispatch(); const heading = useMemo(() => t(`popovers.${feature}.heading`), [feature, t]); const paragraphs = useMemo( @@ -82,16 +85,25 @@ const Content = ({ data, feature }: ContentProps) => { [feature, t] ); - const handleClick = useCallback(() => { + const onClickLearnMore = useCallback(() => { if (!data?.href) { return; } window.open(data.href); }, [data?.href]); + const onClickDontShowMeThese = useCallback(() => { + dispatch(setShouldEnableInformationalPopovers(false)); + toast({ + title: t('settings.informationalPopoversDisabled'), + description: t('settings.informationalPopoversDisabledDesc'), + status: 'info', + }); + }, [dispatch, t]); + return ( - - + + {heading && ( @@ -116,20 +128,19 @@ const Content = ({ data, feature }: ContentProps) => { {paragraphs.map((p) => ( {p} ))} - {data?.href && ( - <> - - + + {data?.href && ( + - - )} + )} + diff --git a/invokeai/frontend/web/src/common/components/InformationalPopover/constants.ts b/invokeai/frontend/web/src/common/components/InformationalPopover/constants.ts index f973d98f1a5..de28f722239 100644 --- a/invokeai/frontend/web/src/common/components/InformationalPopover/constants.ts +++ b/invokeai/frontend/web/src/common/components/InformationalPopover/constants.ts @@ -53,7 +53,11 @@ export type Feature = | 'refinerCfgScale' | 'scaleBeforeProcessing' | 'seamlessTilingXAxis' - | 'seamlessTilingYAxis'; + | 'seamlessTilingYAxis' + | 'upscaleModel' + | 'scale' + | 'creativity' + | 'structure'; export type PopoverData = PopoverProps & { image?: string; diff --git a/invokeai/frontend/web/src/common/hooks/useAssertSingleton.ts b/invokeai/frontend/web/src/common/hooks/useAssertSingleton.ts new file mode 100644 index 00000000000..0f7cc9db6f5 --- /dev/null +++ b/invokeai/frontend/web/src/common/hooks/useAssertSingleton.ts @@ -0,0 +1,18 @@ +import { useEffect } from 'react'; +import { assert } from 'tsafe'; + +const IDS = new Set(); + +/** + * Asserts that there is only one instance of a singleton entity. It can be a hook or a component. + * @param id The ID of the singleton entity. + */ +export function useAssertSingleton(id: string) { + useEffect(() => { + assert(!IDS.has(id), `There should be only one instance of ${id}`); + IDS.add(id); + return () => { + IDS.delete(id); + }; + }, [id]); +} diff --git a/invokeai/frontend/web/src/common/hooks/useCopyImageToClipboard.ts b/invokeai/frontend/web/src/common/hooks/useCopyImageToClipboard.ts index 233b8410341..345ea98e136 100644 --- a/invokeai/frontend/web/src/common/hooks/useCopyImageToClipboard.ts +++ b/invokeai/frontend/web/src/common/hooks/useCopyImageToClipboard.ts @@ -1,4 +1,4 @@ -import { useImageUrlToBlob } from 'common/hooks/useImageUrlToBlob'; +import { convertImageUrlToBlob } from 'common/util/convertImageUrlToBlob'; import { copyBlobToClipboard } from 'features/system/util/copyBlobToClipboard'; import { toast } from 'features/toast/toast'; import { useCallback, useMemo } from 'react'; @@ -6,7 +6,6 @@ import { useTranslation } from 'react-i18next'; export const useCopyImageToClipboard = () => { const { t } = useTranslation(); - const imageUrlToBlob = useImageUrlToBlob(); const isClipboardAPIAvailable = useMemo(() => { return Boolean(navigator.clipboard) && Boolean(window.ClipboardItem); @@ -23,7 +22,7 @@ export const useCopyImageToClipboard = () => { }); } try { - const blob = await imageUrlToBlob(image_url); + const blob = await convertImageUrlToBlob(image_url); if (!blob) { throw new Error('Unable to create Blob'); @@ -45,7 +44,7 @@ export const useCopyImageToClipboard = () => { }); } }, - [imageUrlToBlob, isClipboardAPIAvailable, t] + [isClipboardAPIAvailable, t] ); return { isClipboardAPIAvailable, copyImageToClipboard }; diff --git a/invokeai/frontend/web/src/common/hooks/useImageUrlToBlob.ts b/invokeai/frontend/web/src/common/hooks/useImageUrlToBlob.ts deleted file mode 100644 index 31faf5f22f1..00000000000 --- a/invokeai/frontend/web/src/common/hooks/useImageUrlToBlob.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { $authToken } from 'app/store/nanostores/authToken'; -import { useCallback } from 'react'; - -/** - * Converts an image URL to a Blob by creating an element, drawing it to canvas - * and then converting the canvas to a Blob. - * - * @returns A function that takes a URL and returns a Promise that resolves with a Blob - */ -export const useImageUrlToBlob = () => { - const imageUrlToBlob = useCallback( - async (url: string) => - new Promise((resolve) => { - const img = new Image(); - img.onload = () => { - const canvas = document.createElement('canvas'); - canvas.width = img.width; - canvas.height = img.height; - - const context = canvas.getContext('2d'); - if (!context) { - return; - } - context.drawImage(img, 0, 0); - resolve( - new Promise((resolve) => { - canvas.toBlob(function (blob) { - resolve(blob); - }, 'image/png'); - }) - ); - }; - img.crossOrigin = $authToken.get() ? 'use-credentials' : 'anonymous'; - img.src = url; - }), - [] - ); - - return imageUrlToBlob; -}; diff --git a/invokeai/frontend/web/src/common/hooks/useIsReadyToEnqueue.ts b/invokeai/frontend/web/src/common/hooks/useIsReadyToEnqueue.ts index ba2117f2075..7ea53115858 100644 --- a/invokeai/frontend/web/src/common/hooks/useIsReadyToEnqueue.ts +++ b/invokeai/frontend/web/src/common/hooks/useIsReadyToEnqueue.ts @@ -16,6 +16,7 @@ import { selectWorkflowSettingsSlice } from 'features/nodes/store/workflowSettin import { isInvocationNode } from 'features/nodes/types/invocation'; import { selectGenerationSlice } from 'features/parameters/store/generationSlice'; import { selectUpscalelice } from 'features/parameters/store/upscaleSlice'; +import { selectConfigSlice } from 'features/system/store/configSlice'; import { selectSystemSlice } from 'features/system/store/systemSlice'; import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; import i18n from 'i18next'; @@ -42,6 +43,7 @@ const createSelector = (templates: Templates) => selectControlLayersSlice, activeTabNameSelector, selectUpscalelice, + selectConfigSlice, ], ( controlAdapters, @@ -52,7 +54,8 @@ const createSelector = (templates: Templates) => dynamicPrompts, controlLayers, activeTabName, - upscale + upscale, + config ) => { const { model } = generation; const { size } = controlLayers.present; @@ -209,6 +212,16 @@ const createSelector = (templates: Templates) => } else if (activeTabName === 'upscaling') { if (!upscale.upscaleInitialImage) { reasons.push({ content: i18n.t('upscaling.missingUpscaleInitialImage') }); + } else if (config.maxUpscaleDimension) { + const { width, height } = upscale.upscaleInitialImage; + const { scale } = upscale; + + const maxPixels = config.maxUpscaleDimension ** 2; + const upscaledPixels = width * scale * height * scale; + + if (upscaledPixels > maxPixels) { + reasons.push({ content: i18n.t('upscaling.exceedsMaxSize') }); + } } if (!upscale.upscaleModel) { reasons.push({ content: i18n.t('upscaling.missingUpscaleModel') }); diff --git a/invokeai/frontend/web/src/common/util/convertImageUrlToBlob.ts b/invokeai/frontend/web/src/common/util/convertImageUrlToBlob.ts new file mode 100644 index 00000000000..44062fa025b --- /dev/null +++ b/invokeai/frontend/web/src/common/util/convertImageUrlToBlob.ts @@ -0,0 +1,39 @@ +import { $authToken } from 'app/store/nanostores/authToken'; + +/** + * Converts an image URL to a Blob by creating an element, drawing it to canvas + * and then converting the canvas to a Blob. + * + * @returns A function that takes a URL and returns a Promise that resolves with a Blob + */ + +export const convertImageUrlToBlob = async (url: string) => + new Promise((resolve, reject) => { + const img = new Image(); + img.onload = () => { + const canvas = document.createElement('canvas'); + canvas.width = img.width; + canvas.height = img.height; + + const context = canvas.getContext('2d'); + if (!context) { + reject(new Error('Failed to get canvas context')); + return; + } + context.drawImage(img, 0, 0); + canvas.toBlob((blob) => { + if (blob) { + resolve(blob); + } else { + reject(new Error('Failed to convert image to blob')); + } + }, 'image/png'); + }; + + img.onerror = () => { + reject(new Error('Image failed to load. The URL may be invalid or the object may not exist.')); + }; + + img.crossOrigin = $authToken.get() ? 'use-credentials' : 'anonymous'; + img.src = url; + }); diff --git a/invokeai/frontend/web/src/features/controlAdapters/components/processors/DepthAnyThingProcessor.tsx b/invokeai/frontend/web/src/features/controlAdapters/components/processors/DepthAnyThingProcessor.tsx index a5b04624378..3f248a82bec 100644 --- a/invokeai/frontend/web/src/features/controlAdapters/components/processors/DepthAnyThingProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlAdapters/components/processors/DepthAnyThingProcessor.tsx @@ -42,6 +42,7 @@ const DepthAnythingProcessor = (props: Props) => { const options: { label: string; value: DepthAnythingModelSize }[] = useMemo( () => [ + { label: t('controlnet.depthAnythingSmallV2'), value: 'small_v2' }, { label: t('controlnet.small'), value: 'small' }, { label: t('controlnet.base'), value: 'base' }, { label: t('controlnet.large'), value: 'large' }, diff --git a/invokeai/frontend/web/src/features/controlAdapters/store/constants.ts b/invokeai/frontend/web/src/features/controlAdapters/store/constants.ts index 152e977e5c6..1e01e5627ec 100644 --- a/invokeai/frontend/web/src/features/controlAdapters/store/constants.ts +++ b/invokeai/frontend/web/src/features/controlAdapters/store/constants.ts @@ -94,7 +94,7 @@ export const CONTROLNET_PROCESSORS: ControlNetProcessorsDict = { buildDefaults: (baseModel?: BaseModelType) => ({ id: 'depth_anything_image_processor', type: 'depth_anything_image_processor', - model_size: 'small', + model_size: 'small_v2', resolution: baseModel === 'sdxl' ? 1024 : 512, }), }, diff --git a/invokeai/frontend/web/src/features/controlAdapters/store/types.ts b/invokeai/frontend/web/src/features/controlAdapters/store/types.ts index b76a729263e..cceb3d594ea 100644 --- a/invokeai/frontend/web/src/features/controlAdapters/store/types.ts +++ b/invokeai/frontend/web/src/features/controlAdapters/store/types.ts @@ -84,7 +84,7 @@ export type RequiredDepthAnythingImageProcessorInvocation = O.Required< 'type' | 'model_size' | 'resolution' | 'offload' >; -const zDepthAnythingModelSize = z.enum(['large', 'base', 'small']); +const zDepthAnythingModelSize = z.enum(['large', 'base', 'small', 'small_v2']); export type DepthAnythingModelSize = z.infer; export const isDepthAnythingModelSize = (v: unknown): v is DepthAnythingModelSize => zDepthAnythingModelSize.safeParse(v).success; diff --git a/invokeai/frontend/web/src/features/controlLayers/components/ControlAndIPAdapter/processors/DepthAnythingProcessor.tsx b/invokeai/frontend/web/src/features/controlLayers/components/ControlAndIPAdapter/processors/DepthAnythingProcessor.tsx index b5da990b6fb..3cf61581ea4 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/ControlAndIPAdapter/processors/DepthAnythingProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/ControlAndIPAdapter/processors/DepthAnythingProcessor.tsx @@ -24,6 +24,7 @@ export const DepthAnythingProcessor = memo(({ onChange, config }: Props) => { const options: { label: string; value: DepthAnythingModelSize }[] = useMemo( () => [ + { label: t('controlnet.depthAnythingSmallV2'), value: 'small_v2' }, { label: t('controlnet.small'), value: 'small' }, { label: t('controlnet.base'), value: 'base' }, { label: t('controlnet.large'), value: 'large' }, diff --git a/invokeai/frontend/web/src/features/controlLayers/util/controlAdapters.ts b/invokeai/frontend/web/src/features/controlLayers/util/controlAdapters.ts index 13435bdb7cf..0330eceee17 100644 --- a/invokeai/frontend/web/src/features/controlLayers/util/controlAdapters.ts +++ b/invokeai/frontend/web/src/features/controlLayers/util/controlAdapters.ts @@ -36,7 +36,7 @@ const zContentShuffleProcessorConfig = z.object({ }); export type ContentShuffleProcessorConfig = z.infer; -const zDepthAnythingModelSize = z.enum(['large', 'base', 'small']); +const zDepthAnythingModelSize = z.enum(['large', 'base', 'small', 'small_v2']); export type DepthAnythingModelSize = z.infer; export const isDepthAnythingModelSize = (v: unknown): v is DepthAnythingModelSize => zDepthAnythingModelSize.safeParse(v).success; @@ -298,7 +298,7 @@ export const CA_PROCESSOR_DATA: CAProcessorsData = { buildDefaults: () => ({ id: 'depth_anything_image_processor', type: 'depth_anything_image_processor', - model_size: 'small', + model_size: 'small_v2', }), buildNode: (image, config) => ({ ...config, diff --git a/invokeai/frontend/web/src/features/deleteImageModal/components/DeleteImageModal.tsx b/invokeai/frontend/web/src/features/deleteImageModal/components/DeleteImageModal.tsx index f4b7438dffa..3df7a02f431 100644 --- a/invokeai/frontend/web/src/features/deleteImageModal/components/DeleteImageModal.tsx +++ b/invokeai/frontend/web/src/features/deleteImageModal/components/DeleteImageModal.tsx @@ -56,7 +56,6 @@ const DeleteImageModal = () => { const dispatch = useAppDispatch(); const { t } = useTranslation(); const shouldConfirmOnDelete = useAppSelector((s) => s.system.shouldConfirmOnDelete); - const canRestoreDeletedImagesFromBin = useAppSelector((s) => s.config.canRestoreDeletedImagesFromBin); const isModalOpen = useAppSelector((s) => s.deleteImageModal.isModalOpen); const { imagesToDelete, imagesUsage, imageUsageSummary } = useAppSelector(selectImageUsages); @@ -90,7 +89,7 @@ const DeleteImageModal = () => { - {canRestoreDeletedImagesFromBin ? t('gallery.deleteImageBin') : t('gallery.deleteImagePermanent')} + {t('gallery.deleteImagePermanent')} {t('common.areYouSure')} {t('common.dontAskMeAgain')} diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardTooltip.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardTooltip.tsx new file mode 100644 index 00000000000..63ba2991cfc --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardTooltip.tsx @@ -0,0 +1,47 @@ +import { Flex, Image, Text } from '@invoke-ai/ui-library'; +import { skipToken } from '@reduxjs/toolkit/query'; +import { useTranslation } from 'react-i18next'; +import { useGetBoardAssetsTotalQuery, useGetBoardImagesTotalQuery } from 'services/api/endpoints/boards'; +import { useGetImageDTOQuery } from 'services/api/endpoints/images'; +import type { BoardDTO } from 'services/api/types'; + +type Props = { + board: BoardDTO | null; +}; + +export const BoardTooltip = ({ board }: Props) => { + const { t } = useTranslation(); + const { imagesTotal } = useGetBoardImagesTotalQuery(board?.board_id || 'none', { + selectFromResult: ({ data }) => { + return { imagesTotal: data?.total ?? 0 }; + }, + }); + const { assetsTotal } = useGetBoardAssetsTotalQuery(board?.board_id || 'none', { + selectFromResult: ({ data }) => { + return { assetsTotal: data?.total ?? 0 }; + }, + }); + const { currentData: coverImage } = useGetImageDTOQuery(board?.cover_image_name ?? skipToken); + + return ( + + {coverImage && ( + + )} + + + {t('boards.imagesWithCount', { count: imagesTotal })}, {t('boards.assetsWithCount', { count: assetsTotal })} + + {board?.archived && ({t('boards.archived')})} + + + ); +}; diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardTotalsTooltip.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardTotalsTooltip.tsx deleted file mode 100644 index b4c89a002df..00000000000 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardTotalsTooltip.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { useTranslation } from 'react-i18next'; -import { useGetBoardAssetsTotalQuery, useGetBoardImagesTotalQuery } from 'services/api/endpoints/boards'; - -type Props = { - board_id: string; - isArchived: boolean; -}; - -export const BoardTotalsTooltip = ({ board_id, isArchived }: Props) => { - const { t } = useTranslation(); - const { imagesTotal } = useGetBoardImagesTotalQuery(board_id, { - selectFromResult: ({ data }) => { - return { imagesTotal: data?.total ?? 0 }; - }, - }); - const { assetsTotal } = useGetBoardAssetsTotalQuery(board_id, { - selectFromResult: ({ data }) => { - return { assetsTotal: data?.total ?? 0 }; - }, - }); - return `${t('boards.imagesWithCount', { count: imagesTotal })}, ${t('boards.assetsWithCount', { count: assetsTotal })}${isArchived ? ` (${t('boards.archived')})` : ''}`; -}; diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx index 4325281e0f8..d5a96e5966b 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx @@ -1,13 +1,10 @@ -import { Box, Flex, Text } from '@invoke-ai/ui-library'; +import { Button, Collapse, Flex, Icon, Text, useDisclosure } from '@invoke-ai/ui-library'; import { EMPTY_ARRAY } from 'app/store/constants'; import { useAppSelector } from 'app/store/storeHooks'; -import { overlayScrollbarsParams } from 'common/components/OverlayScrollbars/constants'; -import DeleteBoardModal from 'features/gallery/components/Boards/DeleteBoardModal'; import { selectListBoardsQueryArgs } from 'features/gallery/store/gallerySelectors'; -import { OverlayScrollbarsComponent } from 'overlayscrollbars-react'; -import type { CSSProperties } from 'react'; -import { memo, useMemo, useState } from 'react'; +import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; +import { PiCaretDownBold } from 'react-icons/pi'; import { useListAllBoardsQuery } from 'services/api/endpoints/boards'; import type { BoardDTO } from 'services/api/types'; @@ -15,101 +12,111 @@ import AddBoardButton from './AddBoardButton'; import GalleryBoard from './GalleryBoard'; import NoBoardBoard from './NoBoardBoard'; -const overlayScrollbarsStyles: CSSProperties = { - height: '100%', - width: '100%', +type Props = { + isPrivate: boolean; + setBoardToDelete: (board?: BoardDTO) => void; }; -const BoardsList = () => { +export const BoardsList = ({ isPrivate, setBoardToDelete }: Props) => { + const { t } = useTranslation(); const selectedBoardId = useAppSelector((s) => s.gallery.selectedBoardId); const boardSearchText = useAppSelector((s) => s.gallery.boardSearchText); - const allowPrivateBoards = useAppSelector((s) => s.config.allowPrivateBoards); const queryArgs = useAppSelector(selectListBoardsQueryArgs); const { data: boards } = useListAllBoardsQuery(queryArgs); - const [boardToDelete, setBoardToDelete] = useState(); - const { t } = useTranslation(); + const allowPrivateBoards = useAppSelector((s) => s.config.allowPrivateBoards); + const { isOpen, onToggle } = useDisclosure({ defaultIsOpen: true }); + + const filteredBoards = useMemo(() => { + if (!boards) { + return EMPTY_ARRAY; + } + + return boards.filter((board) => { + if (boardSearchText.length) { + return board.is_private === isPrivate && board.board_name.toLowerCase().includes(boardSearchText.toLowerCase()); + } else { + return board.is_private === isPrivate; + } + }); + }, [boardSearchText, boards, isPrivate]); + + const boardElements = useMemo(() => { + const elements = []; + if (allowPrivateBoards && isPrivate && !boardSearchText.length) { + elements.push(); + } + + if (!allowPrivateBoards && !boardSearchText.length) { + elements.push(); + } + + filteredBoards.forEach((board) => { + elements.push( + + ); + }); + + return elements; + }, [allowPrivateBoards, isPrivate, boardSearchText.length, filteredBoards, selectedBoardId, setBoardToDelete]); - const { filteredPrivateBoards, filteredSharedBoards } = useMemo(() => { - const filteredBoards = boardSearchText - ? boards?.filter((board) => board.board_name.toLowerCase().includes(boardSearchText.toLowerCase())) - : boards; - const filteredPrivateBoards = filteredBoards?.filter((board) => board.is_private) ?? EMPTY_ARRAY; - const filteredSharedBoards = filteredBoards?.filter((board) => !board.is_private) ?? EMPTY_ARRAY; - return { filteredPrivateBoards, filteredSharedBoards }; - }, [boardSearchText, boards]); + const boardListTitle = useMemo(() => { + if (allowPrivateBoards) { + return isPrivate ? t('boards.private') : t('boards.shared'); + } else { + return t('boards.boards'); + } + }, [isPrivate, allowPrivateBoards, t]); return ( - <> - - - - {allowPrivateBoards && ( - - - - {t('boards.private')} - - - - - - {filteredPrivateBoards.map((board) => ( - - ))} - - - )} - - - - {allowPrivateBoards ? t('boards.shared') : t('boards.boards')} - - - - - {!allowPrivateBoards && } - {filteredSharedBoards.map((board) => ( - - ))} - + + + {allowPrivateBoards ? ( + + ) : ( + + {boardListTitle} + + )} + + + + + {boardElements.length ? ( + boardElements + ) : ( + + {t('boards.noBoards', { boardType: boardSearchText.length ? 'Matching' : '' })} + + )} + + + ); }; -export default memo(BoardsList); diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsListWrapper.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsListWrapper.tsx new file mode 100644 index 00000000000..637dbd304a3 --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsListWrapper.tsx @@ -0,0 +1,35 @@ +import { Box } from '@invoke-ai/ui-library'; +import { useAppSelector } from 'app/store/storeHooks'; +import { overlayScrollbarsParams } from 'common/components/OverlayScrollbars/constants'; +import DeleteBoardModal from 'features/gallery/components/Boards/DeleteBoardModal'; +import { OverlayScrollbarsComponent } from 'overlayscrollbars-react'; +import type { CSSProperties } from 'react'; +import { memo, useState } from 'react'; +import type { BoardDTO } from 'services/api/types'; + +import { BoardsList } from './BoardsList'; + +const overlayScrollbarsStyles: CSSProperties = { + height: '100%', + width: '100%', +}; + +const BoardsListWrapper = () => { + const allowPrivateBoards = useAppSelector((s) => s.config.allowPrivateBoards); + const [boardToDelete, setBoardToDelete] = useState(); + + return ( + <> + + + + {allowPrivateBoards && } + + + + + + + ); +}; +export default memo(BoardsListWrapper); diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx index fb53a137957..931c1e6cbb7 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx @@ -40,7 +40,7 @@ const BoardsSearch = () => { ); return ( - + {(ref) => ( - } - openDelay={1000} - placement="left" - closeOnScroll - > + } openDelay={1000} placement="left" closeOnScroll p={2}> @@ -168,7 +165,7 @@ const GalleryBoard = ({ board, isSelected, setBoardToDelete }: GalleryBoardProps {board.archived && !editingDisclosure.isOpen && } {!editingDisclosure.isOpen && {board.image_count}} - {t('unifiedCanvas.move')}} /> + {t('unifiedCanvas.move')}} /> )} @@ -197,8 +194,8 @@ const CoverImage = ({ board }: { board: BoardDTO }) => { src={coverImage.thumbnail_url} draggable={false} objectFit="cover" - w={8} - h={8} + w={10} + h={10} borderRadius="base" borderBottomRadius="lg" /> @@ -206,8 +203,8 @@ const CoverImage = ({ board }: { board: BoardDTO }) => { } return ( - - + + ); }; diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx index 14bf3d5742d..c8b3ceb4318 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx @@ -4,7 +4,7 @@ import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import IAIDroppable from 'common/components/IAIDroppable'; import type { RemoveFromBoardDropData } from 'features/dnd/types'; import { AutoAddBadge } from 'features/gallery/components/Boards/AutoAddBadge'; -import { BoardTotalsTooltip } from 'features/gallery/components/Boards/BoardsList/BoardTotalsTooltip'; +import { BoardTooltip } from 'features/gallery/components/Boards/BoardsList/BoardTooltip'; import NoBoardBoardContextMenu from 'features/gallery/components/Boards/NoBoardBoardContextMenu'; import { autoAddBoardIdChanged, boardIdSelected } from 'features/gallery/store/gallerySlice'; import { memo, useCallback, useMemo } from 'react'; @@ -46,25 +46,16 @@ const NoBoardBoard = memo(({ isSelected }: Props) => { [] ); - const filteredOut = useMemo(() => { - return boardSearchText ? !boardName.toLowerCase().includes(boardSearchText.toLowerCase()) : false; - }, [boardName, boardSearchText]); - const { t } = useTranslation(); - if (filteredOut) { + if (boardSearchText.length) { return null; } return ( {(ref) => ( - } - openDelay={1000} - placement="left" - closeOnScroll - > + } openDelay={1000} placement="left" closeOnScroll> { alignItems="center" borderRadius="base" cursor="pointer" - px={2} py={1} - gap={2} + ps={1} + pe={4} + gap={4} bg={isSelected ? 'base.850' : undefined} _hover={_hover} + h={12} > - + {/* iconified from public/assets/images/invoke-symbol-wht-lrg.svg */} - + { - + {boardName} {autoAddBoardId === 'none' && } {imagesTotal} - {t('unifiedCanvas.move')}} /> + {t('unifiedCanvas.move')}} /> )} diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/DeleteBoardModal.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/DeleteBoardModal.tsx index 377636d0d04..2fe1963e76f 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/DeleteBoardModal.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/DeleteBoardModal.tsx @@ -35,7 +35,6 @@ type Props = { const DeleteBoardModal = (props: Props) => { const { boardToDelete, setBoardToDelete } = props; const { t } = useTranslation(); - const canRestoreDeletedImagesFromBin = useAppSelector((s) => s.config.canRestoreDeletedImagesFromBin); const { currentData: boardImageNames, isFetching: isFetchingBoardNames } = useListAllImageNamesForBoardQuery( boardToDelete?.board_id ?? skipToken ); @@ -120,10 +119,12 @@ const DeleteBoardModal = (props: Props) => { bottomMessage={t('boards.bottomMessage')} /> )} - {t('boards.deletedBoardsCannotbeRestored')} - {canRestoreDeletedImagesFromBin ? t('gallery.deleteImageBin') : t('gallery.deleteImagePermanent')} + {boardToDelete.is_private + ? t('boards.deletedPrivateBoardsCannotbeRestored') + : t('boards.deletedBoardsCannotbeRestored')} + {t('gallery.deleteImagePermanent')} diff --git a/invokeai/frontend/web/src/features/gallery/components/Gallery.tsx b/invokeai/frontend/web/src/features/gallery/components/Gallery.tsx new file mode 100644 index 00000000000..24fa0d0a6ad --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/Gallery.tsx @@ -0,0 +1,105 @@ +import type { ChakraProps } from '@invoke-ai/ui-library'; +import { + Box, + Collapse, + Flex, + IconButton, + Spacer, + Tab, + TabList, + Tabs, + Text, + useDisclosure, +} from '@invoke-ai/ui-library'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { useGallerySearchTerm } from 'features/gallery/components/ImageGrid/useGallerySearchTerm'; +import { galleryViewChanged } from 'features/gallery/store/gallerySlice'; +import type { CSSProperties } from 'react'; +import { useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; +import { PiMagnifyingGlassBold } from 'react-icons/pi'; +import { useBoardName } from 'services/api/hooks/useBoardName'; + +import GalleryImageGrid from './ImageGrid/GalleryImageGrid'; +import { GalleryPagination } from './ImageGrid/GalleryPagination'; +import { GallerySearch } from './ImageGrid/GallerySearch'; + +const BASE_STYLES: ChakraProps['sx'] = { + fontWeight: 'semibold', + fontSize: 'sm', + color: 'base.300', +}; + +const SELECTED_STYLES: ChakraProps['sx'] = { + borderColor: 'base.800', + borderBottomColor: 'base.900', + color: 'invokeBlue.300', +}; + +const COLLAPSE_STYLES: CSSProperties = { flexShrink: 0, minHeight: 0 }; + +export const Gallery = () => { + const { t } = useTranslation(); + const dispatch = useAppDispatch(); + const galleryView = useAppSelector((s) => s.gallery.galleryView); + const initialSearchTerm = useAppSelector((s) => s.gallery.searchTerm); + const searchDisclosure = useDisclosure({ defaultIsOpen: initialSearchTerm.length > 0 }); + const [searchTerm, onChangeSearchTerm, onResetSearchTerm] = useGallerySearchTerm(); + + const handleClickImages = useCallback(() => { + dispatch(galleryViewChanged('images')); + }, [dispatch]); + + const handleClickAssets = useCallback(() => { + dispatch(galleryViewChanged('assets')); + }, [dispatch]); + + const handleClickSearch = useCallback(() => { + searchDisclosure.onToggle(); + onResetSearchTerm(); + }, [onResetSearchTerm, searchDisclosure]); + + const selectedBoardId = useAppSelector((s) => s.gallery.selectedBoardId); + const boardName = useBoardName(selectedBoardId); + + return ( + + + + + {boardName} + + + + {t('parameters.images')} + + + {t('gallery.assets')} + + } + colorScheme={searchDisclosure.isOpen ? 'invokeBlue' : 'base'} + variant="link" + /> + + + + + + + + + + + + + + ); +}; diff --git a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx b/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx deleted file mode 100644 index 8ede311f9e4..00000000000 --- a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Flex, Text } from '@invoke-ai/ui-library'; -import { useAppSelector } from 'app/store/storeHooks'; -import { memo } from 'react'; -import { useBoardName } from 'services/api/hooks/useBoardName'; - -type Props = { - onClick: () => void; -}; - -const GalleryBoardName = (props: Props) => { - const selectedBoardId = useAppSelector((s) => s.gallery.selectedBoardId); - const boardName = useBoardName(selectedBoardId); - - return ( - - - {boardName} - - - ); -}; - -export default memo(GalleryBoardName); diff --git a/invokeai/frontend/web/src/features/gallery/components/GalleryHeader.tsx b/invokeai/frontend/web/src/features/gallery/components/GalleryHeader.tsx index 69c2c8fe352..ce9436811c6 100644 --- a/invokeai/frontend/web/src/features/gallery/components/GalleryHeader.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/GalleryHeader.tsx @@ -3,32 +3,21 @@ import { useStore } from '@nanostores/react'; import { $projectName, $projectUrl } from 'app/store/nanostores/projectId'; import { memo } from 'react'; -import GalleryBoardName from './GalleryBoardName'; - -type Props = { - onClickBoardName: () => void; -}; - -export const GalleryHeader = memo((props: Props) => { +export const GalleryHeader = memo(() => { const projectName = useStore($projectName); const projectUrl = useStore($projectUrl); if (projectName && projectUrl) { return ( - + {projectName} - ); } - return ( - - - - ); + return null; }); GalleryHeader.displayName = 'GalleryHeader'; diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/SingleSelectionMenuItems.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/SingleSelectionMenuItems.tsx index ab12684c114..1ae4b7b6bc3 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/SingleSelectionMenuItems.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/SingleSelectionMenuItems.tsx @@ -30,6 +30,7 @@ import { PiFlowArrowBold, PiFoldersBold, PiImagesBold, + PiPaintBrushBold, PiPlantBold, PiQuotesBold, PiShareFatBold, @@ -55,8 +56,17 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => { const { downloadImage } = useDownloadImage(); const templates = useStore($templates); - const { recallAll, remix, recallSeed, recallPrompts, hasMetadata, hasSeed, hasPrompts, isLoadingMetadata } = - useImageActions(imageDTO?.image_name); + const { + recallAll, + remix, + recallSeed, + recallPrompts, + hasMetadata, + hasSeed, + hasPrompts, + isLoadingMetadata, + createAsPreset, + } = useImageActions(imageDTO?.image_name); const { getAndLoadEmbeddedWorkflow, getAndLoadEmbeddedWorkflowResult } = useGetAndLoadEmbeddedWorkflow({}); @@ -182,6 +192,13 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => { > {t('parameters.useAll')} + : } + onClickCapture={createAsPreset} + isDisabled={isLoadingMetadata || !hasPrompts} + > + {t('stylePresets.useForTemplate')} + } onClickCapture={handleSendToImageToImage} id="send-to-img2img"> {t('parameters.sendToImg2Img')} diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index 5a096f5cefc..e8f42ae65e8 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -1,57 +1,28 @@ -import type { ChakraProps } from '@invoke-ai/ui-library'; -import { - Box, - Collapse, - Divider, - Flex, - IconButton, - Spacer, - Tab, - TabList, - Tabs, - useDisclosure, -} from '@invoke-ai/ui-library'; +import { Box, Button, Collapse, Divider, Flex, IconButton, useDisclosure } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { GalleryHeader } from 'features/gallery/components/GalleryHeader'; -import { galleryViewChanged } from 'features/gallery/store/gallerySlice'; +import { boardSearchTextChanged } from 'features/gallery/store/gallerySlice'; import ResizeHandle from 'features/ui/components/tabs/ResizeHandle'; import { usePanel, type UsePanelOptions } from 'features/ui/hooks/usePanel'; import type { CSSProperties } from 'react'; import { memo, useCallback, useMemo, useRef } from 'react'; import { useTranslation } from 'react-i18next'; -import { PiMagnifyingGlassBold } from 'react-icons/pi'; +import { PiCaretDownBold, PiCaretUpBold, PiMagnifyingGlassBold } from 'react-icons/pi'; import type { ImperativePanelGroupHandle } from 'react-resizable-panels'; import { Panel, PanelGroup } from 'react-resizable-panels'; -import BoardsList from './Boards/BoardsList/BoardsList'; +import BoardsListWrapper from './Boards/BoardsList/BoardsListWrapper'; import BoardsSearch from './Boards/BoardsList/BoardsSearch'; +import { Gallery } from './Gallery'; import GallerySettingsPopover from './GallerySettingsPopover/GallerySettingsPopover'; -import GalleryImageGrid from './ImageGrid/GalleryImageGrid'; -import { GalleryPagination } from './ImageGrid/GalleryPagination'; -import { GallerySearch } from './ImageGrid/GallerySearch'; const COLLAPSE_STYLES: CSSProperties = { flexShrink: 0, minHeight: 0 }; -const BASE_STYLES: ChakraProps['sx'] = { - fontWeight: 'semibold', - fontSize: 'sm', - color: 'base.300', -}; - -const SELECTED_STYLES: ChakraProps['sx'] = { - borderColor: 'base.800', - borderBottomColor: 'base.900', - color: 'invokeBlue.300', -}; - const ImageGalleryContent = () => { const { t } = useTranslation(); - const galleryView = useAppSelector((s) => s.gallery.galleryView); - const searchTerm = useAppSelector((s) => s.gallery.searchTerm); const boardSearchText = useAppSelector((s) => s.gallery.boardSearchText); const dispatch = useAppDispatch(); - const searchDisclosure = useDisclosure({ defaultIsOpen: false }); - const boardSearchDisclosure = useDisclosure({ defaultIsOpen: false }); + const boardSearchDisclosure = useDisclosure({ defaultIsOpen: !!boardSearchText.length }); const panelGroupRef = useRef(null); const boardsListPanelOptions = useMemo( @@ -67,42 +38,57 @@ const ImageGalleryContent = () => { ); const boardsListPanel = usePanel(boardsListPanelOptions); - const handleClickImages = useCallback(() => { - dispatch(galleryViewChanged('images')); - }, [dispatch]); + const handleClickBoardSearch = useCallback(() => { + if (boardSearchText.length) { + dispatch(boardSearchTextChanged('')); + } + boardSearchDisclosure.onToggle(); + boardsListPanel.expand(); + }, [boardSearchText.length, boardSearchDisclosure, boardsListPanel, dispatch]); - const handleClickAssets = useCallback(() => { - dispatch(galleryViewChanged('assets')); - }, [dispatch]); + const handleToggleBoardPanel = useCallback(() => { + if (boardSearchText.length) { + dispatch(boardSearchTextChanged('')); + } + boardSearchDisclosure.onClose(); + boardsListPanel.toggle(); + }, [boardSearchText.length, boardSearchDisclosure, boardsListPanel, dispatch]); return ( - - - - - } - variant="link" - /> - {boardSearchText && ( - - )} - + + + + + + + + } + colorScheme={boardSearchDisclosure.isOpen ? 'invokeBlue' : 'base'} + variant="link" + /> + + + + { > - + + + - + { onDoubleClick={boardsListPanel.onDoubleClickHandle} /> - - - - - {t('parameters.images')} - - - {t('gallery.assets')} - - - - } - variant="link" - /> - {searchTerm && ( - - )} - - - - - - - - - - - - - + diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryPagination.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryPagination.tsx index ddc23ebe4b4..27776ab77d8 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryPagination.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryPagination.tsx @@ -3,6 +3,8 @@ import { ELLIPSIS, useGalleryPagination } from 'features/gallery/hooks/useGaller import { useCallback } from 'react'; import { PiCaretLeftBold, PiCaretRightBold } from 'react-icons/pi'; +import { JumpTo } from './JumpTo'; + export const GalleryPagination = () => { const { goPrev, goNext, isPrevEnabled, isNextEnabled, pageButtons, goToPage, currentPage, total } = useGalleryPagination(); @@ -20,7 +22,7 @@ export const GalleryPagination = () => { } return ( - + { variant="ghost" /> - {pageButtons.map((page, i) => { - if (page === ELLIPSIS) { - return ( - - ); - } - return ( - - ); - })} + {pageButtons.map((page, i) => ( + + ))} { isDisabled={!isNextEnabled} variant="ghost" /> + ); }; + +type PageButtonProps = { + page: number | typeof ELLIPSIS; + currentPage: number; + goToPage: (page: number) => void; +}; + +const PageButton = ({ page, currentPage, goToPage }: PageButtonProps) => { + if (page === ELLIPSIS) { + return ( + + ); + } + return ( + + ); +}; diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GallerySearch.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GallerySearch.tsx index 9e3a1bf4877..bb2fe8ff29a 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GallerySearch.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GallerySearch.tsx @@ -1,59 +1,60 @@ import { IconButton, Input, InputGroup, InputRightElement, Spinner } from '@invoke-ai/ui-library'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { useAppSelector } from 'app/store/storeHooks'; import { selectListImagesQueryArgs } from 'features/gallery/store/gallerySelectors'; -import { searchTermChanged } from 'features/gallery/store/gallerySlice'; -import { debounce } from 'lodash-es'; -import type { ChangeEvent } from 'react'; -import { useCallback, useMemo, useState } from 'react'; +import type { ChangeEvent, KeyboardEvent } from 'react'; +import { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { PiXBold } from 'react-icons/pi'; import { useListImagesQuery } from 'services/api/endpoints/images'; -export const GallerySearch = () => { - const dispatch = useAppDispatch(); - const searchTerm = useAppSelector((s) => s.gallery.searchTerm); +type Props = { + searchTerm: string; + onChangeSearchTerm: (value: string) => void; + onResetSearchTerm: () => void; +}; + +export const GallerySearch = ({ searchTerm, onChangeSearchTerm, onResetSearchTerm }: Props) => { const { t } = useTranslation(); - const [searchTermInput, setSearchTermInput] = useState(searchTerm); const queryArgs = useAppSelector(selectListImagesQueryArgs); const { isPending } = useListImagesQuery(queryArgs, { selectFromResult: ({ isLoading, isFetching }) => ({ isPending: isLoading || isFetching }), }); - const debouncedSetSearchTerm = useMemo(() => { - return debounce((value: string) => { - dispatch(searchTermChanged(value)); - }, 1000); - }, [dispatch]); const handleChangeInput = useCallback( (e: ChangeEvent) => { - setSearchTermInput(e.target.value); - debouncedSetSearchTerm(e.target.value); + onChangeSearchTerm(e.target.value); }, - [debouncedSetSearchTerm] + [onChangeSearchTerm] ); - const handleClearInput = useCallback(() => { - setSearchTermInput(''); - dispatch(searchTermChanged('')); - }, [dispatch]); + const handleKeydown = useCallback( + (e: KeyboardEvent) => { + // exit search mode on escape + if (e.key === 'Escape') { + onResetSearchTerm(); + } + }, + [onResetSearchTerm] + ); return ( {isPending && ( )} - {!isPending && searchTermInput.length && ( + {!isPending && searchTerm.length && ( { + const { t } = useTranslation(); + const { goToPage, currentPage, pages } = useGalleryPagination(); + const [newPage, setNewPage] = useState(currentPage); + const { isOpen, onToggle, onClose } = useDisclosure(); + const ref = useRef(null); + + const onOpen = useCallback(() => { + setNewPage(currentPage); + setTimeout(() => { + const input = ref.current?.querySelector('input'); + input?.focus(); + input?.select(); + }, 0); + }, [currentPage]); + + const onChangeJumpTo = useCallback((v: number) => { + setNewPage(v - 1); + }, []); + + const onClickGo = useCallback(() => { + goToPage(newPage); + onClose(); + }, [newPage, goToPage, onClose]); + + useHotkeys( + 'enter', + () => { + onClickGo(); + }, + { enabled: isOpen, enableOnFormTags: ['input'] }, + [isOpen, onClickGo] + ); + + useHotkeys( + 'esc', + () => { + setNewPage(currentPage); + onClose(); + }, + { enabled: isOpen, enableOnFormTags: ['input'] }, + [isOpen, onClose] + ); + + useEffect(() => { + setNewPage(currentPage); + }, [currentPage]); + + return ( + + + + + + + + + + + + + + + + + ); +}; diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/useGallerySearchTerm.ts b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/useGallerySearchTerm.ts new file mode 100644 index 00000000000..52e6f8ec08f --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/useGallerySearchTerm.ts @@ -0,0 +1,37 @@ +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { useAssertSingleton } from 'common/hooks/useAssertSingleton'; +import { searchTermChanged } from 'features/gallery/store/gallerySlice'; +import { debounce } from 'lodash-es'; +import { useCallback, useMemo, useState } from 'react'; + +export const useGallerySearchTerm = () => { + // Highlander! + useAssertSingleton('gallery-search-state'); + + const dispatch = useAppDispatch(); + const searchTerm = useAppSelector((s) => s.gallery.searchTerm); + + const [localSearchTerm, setLocalSearchTerm] = useState(searchTerm); + + const debouncedSetSearchTerm = useMemo(() => { + return debounce((val: string) => { + dispatch(searchTermChanged(val)); + }, 1000); + }, [dispatch]); + + const onChange = useCallback( + (val: string) => { + setLocalSearchTerm(val); + debouncedSetSearchTerm(val); + }, + [debouncedSetSearchTerm] + ); + + const onReset = useCallback(() => { + debouncedSetSearchTerm.cancel(); + setLocalSearchTerm(''); + dispatch(searchTermChanged('')); + }, [debouncedSetSearchTerm, dispatch]); + + return [localSearchTerm, onChange, onReset] as const; +}; diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx index d500d692fe7..d1f874271d6 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx @@ -2,7 +2,7 @@ import { ButtonGroup, IconButton, Menu, MenuButton, MenuList } from '@invoke-ai/ import { useStore } from '@nanostores/react'; import { createSelector } from '@reduxjs/toolkit'; import { skipToken } from '@reduxjs/toolkit/query'; -import { upscaleRequested } from 'app/store/middleware/listenerMiddleware/listeners/upscaleRequested'; +import { adHocPostProcessingRequested } from 'app/store/middleware/listenerMiddleware/listeners/addAdHocPostProcessingRequestedListener'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { iiLayerAdded } from 'features/controlLayers/store/controlLayersSlice'; import { DeleteImageButton } from 'features/deleteImageModal/components/DeleteImageButton'; @@ -14,7 +14,7 @@ import { selectLastSelectedImage } from 'features/gallery/store/gallerySelectors import { selectGallerySlice } from 'features/gallery/store/gallerySlice'; import { parseAndRecallImageDimensions } from 'features/metadata/util/handlers'; import { $templates } from 'features/nodes/store/nodesSlice'; -import ParamUpscalePopover from 'features/parameters/components/Upscale/ParamUpscaleSettings'; +import { PostProcessingPopover } from 'features/parameters/components/PostProcessing/PostProcessingPopover'; import { useIsQueueMutationInProgress } from 'features/queue/hooks/useIsQueueMutationInProgress'; import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; import { selectSystemSlice } from 'features/system/store/systemSlice'; @@ -97,7 +97,7 @@ const CurrentImageButtons = () => { if (!imageDTO) { return; } - dispatch(upscaleRequested({ imageDTO })); + dispatch(adHocPostProcessingRequested({ imageDTO })); }, [dispatch, imageDTO]); const handleDelete = useCallback(() => { @@ -193,7 +193,7 @@ const CurrentImageButtons = () => { {isUpscalingEnabled && ( - {isUpscalingEnabled && } + {isUpscalingEnabled && } )} diff --git a/invokeai/frontend/web/src/features/gallery/hooks/useGalleryPagination.ts b/invokeai/frontend/web/src/features/gallery/hooks/useGalleryPagination.ts index 75bea2dcb1a..2350a6ccf59 100644 --- a/invokeai/frontend/web/src/features/gallery/hooks/useGalleryPagination.ts +++ b/invokeai/frontend/web/src/features/gallery/hooks/useGalleryPagination.ts @@ -1,6 +1,7 @@ import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { selectListImagesQueryArgs } from 'features/gallery/store/gallerySelectors'; import { offsetChanged } from 'features/gallery/store/gallerySlice'; +import { throttle } from 'lodash-es'; import { useCallback, useEffect, useMemo } from 'react'; import { useListImagesQuery } from 'services/api/endpoints/images'; @@ -80,32 +81,41 @@ export const useGalleryPagination = () => { return offset > 0; }, [count, offset]); + const onOffsetChanged = useCallback( + (arg: Parameters[0]) => { + dispatch(offsetChanged(arg)); + }, + [dispatch] + ); + + const throttledOnOffsetChanged = useMemo(() => throttle(onOffsetChanged, 500), [onOffsetChanged]); + const goNext = useCallback( (withHotkey?: 'arrow' | 'alt+arrow') => { - dispatch(offsetChanged({ offset: offset + (limit || 0), withHotkey })); + throttledOnOffsetChanged({ offset: offset + (limit || 0), withHotkey }); }, - [dispatch, offset, limit] + [throttledOnOffsetChanged, offset, limit] ); const goPrev = useCallback( (withHotkey?: 'arrow' | 'alt+arrow') => { - dispatch(offsetChanged({ offset: Math.max(offset - (limit || 0), 0), withHotkey })); + throttledOnOffsetChanged({ offset: Math.max(offset - (limit || 0), 0), withHotkey }); }, - [dispatch, offset, limit] + [throttledOnOffsetChanged, offset, limit] ); const goToPage = useCallback( (page: number) => { - dispatch(offsetChanged({ offset: page * (limit || 0) })); + throttledOnOffsetChanged({ offset: page * (limit || 0) }); }, - [dispatch, limit] + [throttledOnOffsetChanged, limit] ); const goToFirst = useCallback(() => { - dispatch(offsetChanged({ offset: 0 })); - }, [dispatch]); + throttledOnOffsetChanged({ offset: 0 }); + }, [throttledOnOffsetChanged]); const goToLast = useCallback(() => { - dispatch(offsetChanged({ offset: (pages - 1) * (limit || 0) })); - }, [dispatch, pages, limit]); + throttledOnOffsetChanged({ offset: (pages - 1) * (limit || 0) }); + }, [throttledOnOffsetChanged, pages, limit]); // handle when total/pages decrease and user is on high page number (ie bulk removing or deleting) useEffect(() => { diff --git a/invokeai/frontend/web/src/features/gallery/hooks/useImageActions.ts b/invokeai/frontend/web/src/features/gallery/hooks/useImageActions.ts index 2978e08f4f3..eba18a7a5d8 100644 --- a/invokeai/frontend/web/src/features/gallery/hooks/useImageActions.ts +++ b/invokeai/frontend/web/src/features/gallery/hooks/useImageActions.ts @@ -1,15 +1,25 @@ -import { useAppSelector } from 'app/store/storeHooks'; +import { skipToken } from '@reduxjs/toolkit/query'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { handlers, parseAndRecallAllMetadata, parseAndRecallPrompts } from 'features/metadata/util/handlers'; +import { $stylePresetModalState } from 'features/stylePresets/store/stylePresetModal'; +import { activeStylePresetIdChanged } from 'features/stylePresets/store/stylePresetSlice'; +import { toast } from 'features/toast/toast'; import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; import { useCallback, useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useGetImageDTOQuery } from 'services/api/endpoints/images'; import { useDebouncedMetadata } from 'services/api/hooks/useDebouncedMetadata'; export const useImageActions = (image_name?: string) => { + const dispatch = useAppDispatch(); + const { t } = useTranslation(); const activeTabName = useAppSelector(activeTabNameSelector); + const activeStylePresetId = useAppSelector((s) => s.stylePreset.activeStylePresetId); const { metadata, isLoading: isLoadingMetadata } = useDebouncedMetadata(image_name); const [hasMetadata, setHasMetadata] = useState(false); const [hasSeed, setHasSeed] = useState(false); const [hasPrompts, setHasPrompts] = useState(false); + const { data: imageDTO } = useGetImageDTOQuery(image_name ?? skipToken); useEffect(() => { const parseMetadata = async () => { @@ -42,14 +52,26 @@ export const useImageActions = (image_name?: string) => { parseMetadata(); }, [metadata]); + const clearStylePreset = useCallback(() => { + if (activeStylePresetId) { + dispatch(activeStylePresetIdChanged(null)); + toast({ + status: 'info', + title: t('stylePresets.promptTemplateCleared'), + }); + } + }, [dispatch, activeStylePresetId, t]); + const recallAll = useCallback(() => { parseAndRecallAllMetadata(metadata, activeTabName === 'generation'); - }, [activeTabName, metadata]); + clearStylePreset(); + }, [activeTabName, metadata, clearStylePreset]); const remix = useCallback(() => { // Recalls all metadata parameters except seed parseAndRecallAllMetadata(metadata, activeTabName === 'generation', ['seed']); - }, [activeTabName, metadata]); + clearStylePreset(); + }, [activeTabName, metadata, clearStylePreset]); const recallSeed = useCallback(() => { handlers.seed.parse(metadata).then((seed) => { @@ -59,7 +81,37 @@ export const useImageActions = (image_name?: string) => { const recallPrompts = useCallback(() => { parseAndRecallPrompts(metadata); - }, [metadata]); + clearStylePreset(); + }, [metadata, clearStylePreset]); + + const createAsPreset = useCallback(async () => { + if (image_name && metadata && imageDTO) { + const positivePrompt = await handlers.positivePrompt.parse(metadata); + const negativePrompt = await handlers.negativePrompt.parse(metadata); + + $stylePresetModalState.set({ + prefilledFormData: { + name: '', + positivePrompt, + negativePrompt, + imageUrl: imageDTO.image_url, + type: 'user', + }, + updatingStylePresetId: null, + isModalOpen: true, + }); + } + }, [image_name, metadata, imageDTO]); - return { recallAll, remix, recallSeed, recallPrompts, hasMetadata, hasSeed, hasPrompts, isLoadingMetadata }; + return { + recallAll, + remix, + recallSeed, + recallPrompts, + hasMetadata, + hasSeed, + hasPrompts, + isLoadingMetadata, + createAsPreset, + }; }; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/hooks/useControlNetOrT2IAdapterDefaultSettings.ts b/invokeai/frontend/web/src/features/modelManagerV2/hooks/useControlNetOrT2IAdapterDefaultSettings.ts index 826bec17b17..693cf3cf52d 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/hooks/useControlNetOrT2IAdapterDefaultSettings.ts +++ b/invokeai/frontend/web/src/features/modelManagerV2/hooks/useControlNetOrT2IAdapterDefaultSettings.ts @@ -1,15 +1,10 @@ -import { skipToken } from '@reduxjs/toolkit/query'; import { isNil } from 'lodash-es'; import { useMemo } from 'react'; -import { useGetModelConfigWithTypeGuard } from 'services/api/hooks/useGetModelConfigWithTypeGuard'; -import { isControlNetOrT2IAdapterModelConfig } from 'services/api/types'; - -export const useControlNetOrT2IAdapterDefaultSettings = (modelKey?: string | null) => { - const { modelConfig, isLoading } = useGetModelConfigWithTypeGuard( - modelKey ?? skipToken, - isControlNetOrT2IAdapterModelConfig - ); +import type { ControlNetModelConfig, T2IAdapterModelConfig } from 'services/api/types'; +export const useControlNetOrT2IAdapterDefaultSettings = ( + modelConfig: ControlNetModelConfig | T2IAdapterModelConfig +) => { const defaultSettingsDefaults = useMemo(() => { return { preprocessor: { @@ -19,5 +14,5 @@ export const useControlNetOrT2IAdapterDefaultSettings = (modelKey?: string | nul }; }, [modelConfig?.default_settings]); - return { defaultSettingsDefaults, isLoading }; + return defaultSettingsDefaults; }; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/hooks/useInstallModel.ts b/invokeai/frontend/web/src/features/modelManagerV2/hooks/useInstallModel.ts index 7636b9f314a..12141af2a5f 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/hooks/useInstallModel.ts +++ b/invokeai/frontend/web/src/features/modelManagerV2/hooks/useInstallModel.ts @@ -1,11 +1,9 @@ import { toast } from 'features/toast/toast'; import { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; -import { useInstallModelMutation } from 'services/api/endpoints/models'; +import { type InstallModelArg, useInstallModelMutation } from 'services/api/endpoints/models'; -type InstallModelArg = { - source: string; - inplace?: boolean; +type InstallModelArgWithCallbacks = InstallModelArg & { onSuccess?: () => void; onError?: (error: unknown) => void; }; @@ -15,8 +13,9 @@ export const useInstallModel = () => { const [_installModel, request] = useInstallModelMutation(); const installModel = useCallback( - ({ source, inplace, onSuccess, onError }: InstallModelArg) => { - _installModel({ source, inplace }) + ({ source, inplace, config, onSuccess, onError }: InstallModelArgWithCallbacks) => { + config ||= {}; + _installModel({ source, inplace, config }) .unwrap() .then((_) => { if (onSuccess) { diff --git a/invokeai/frontend/web/src/features/modelManagerV2/hooks/useMainModelDefaultSettings.ts b/invokeai/frontend/web/src/features/modelManagerV2/hooks/useMainModelDefaultSettings.ts index 6de99673e46..55ee40ada50 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/hooks/useMainModelDefaultSettings.ts +++ b/invokeai/frontend/web/src/features/modelManagerV2/hooks/useMainModelDefaultSettings.ts @@ -1,12 +1,9 @@ -import { skipToken } from '@reduxjs/toolkit/query'; import { createMemoizedSelector } from 'app/store/createMemoizedSelector'; import { useAppSelector } from 'app/store/storeHooks'; -import { getOptimalDimension } from 'features/parameters/util/optimalDimension'; import { selectConfigSlice } from 'features/system/store/configSlice'; import { isNil } from 'lodash-es'; import { useMemo } from 'react'; -import { useGetModelConfigWithTypeGuard } from 'services/api/hooks/useGetModelConfigWithTypeGuard'; -import { isNonRefinerMainModelConfig } from 'services/api/types'; +import type { MainModelConfig } from 'services/api/types'; const initialStatesSelector = createMemoizedSelector(selectConfigSlice, (config) => { const { steps, guidance, scheduler, cfgRescaleMultiplier, vaePrecision, width, height } = config.sd; @@ -22,9 +19,7 @@ const initialStatesSelector = createMemoizedSelector(selectConfigSlice, (config) }; }); -export const useMainModelDefaultSettings = (modelKey?: string | null) => { - const { modelConfig, isLoading } = useGetModelConfigWithTypeGuard(modelKey ?? skipToken, isNonRefinerMainModelConfig); - +export const useMainModelDefaultSettings = (modelConfig: MainModelConfig) => { const { initialSteps, initialCfg, @@ -81,5 +76,5 @@ export const useMainModelDefaultSettings = (modelKey?: string | null) => { initialHeight, ]); - return { defaultSettingsDefaults, isLoading, optimalDimension: getOptimalDimension(modelConfig) }; + return defaultSettingsDefaults; }; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/store/modelManagerV2Slice.ts b/invokeai/frontend/web/src/features/modelManagerV2/store/modelManagerV2Slice.ts index c637d30fd80..8a7e3a7aa85 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/store/modelManagerV2Slice.ts +++ b/invokeai/frontend/web/src/features/modelManagerV2/store/modelManagerV2Slice.ts @@ -1,6 +1,6 @@ import type { PayloadAction } from '@reduxjs/toolkit'; import { createSlice } from '@reduxjs/toolkit'; -import type { PersistConfig } from 'app/store/store'; +import type { PersistConfig, RootState } from 'app/store/store'; import type { ModelType } from 'services/api/types'; export type FilterableModelType = Exclude | 'refiner'; @@ -50,6 +50,8 @@ export const modelManagerV2Slice = createSlice({ export const { setSelectedModelKey, setSearchTerm, setFilteredModelType, setSelectedModelMode, setScanPath } = modelManagerV2Slice.actions; +export const selectModelManagerV2Slice = (state: RootState) => state.modelmanagerV2; + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ const migrateModelManagerState = (state: any): any => { if (!('_version' in state)) { diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceForm.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceForm.tsx index ee5960f7d26..7257c30007f 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceForm.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceForm.tsx @@ -1,13 +1,13 @@ import { Button, Flex, FormControl, FormErrorMessage, FormHelperText, FormLabel, Input } from '@invoke-ai/ui-library'; import { useInstallModel } from 'features/modelManagerV2/hooks/useInstallModel'; import type { ChangeEventHandler } from 'react'; -import { useCallback, useState } from 'react'; +import { memo, useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useLazyGetHuggingFaceModelsQuery } from 'services/api/endpoints/models'; import { HuggingFaceResults } from './HuggingFaceResults'; -export const HuggingFaceForm = () => { +export const HuggingFaceForm = memo(() => { const [huggingFaceRepo, setHuggingFaceRepo] = useState(''); const [displayResults, setDisplayResults] = useState(false); const [errorMessage, setErrorMessage] = useState(''); @@ -66,4 +66,6 @@ export const HuggingFaceForm = () => { {data && data.urls && displayResults && } ); -}; +}); + +HuggingFaceForm.displayName = 'HuggingFaceForm'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResultItem.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResultItem.tsx index 32970a3666a..5edb67eefa8 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResultItem.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResultItem.tsx @@ -1,13 +1,13 @@ import { Flex, IconButton, Text } from '@invoke-ai/ui-library'; import { useInstallModel } from 'features/modelManagerV2/hooks/useInstallModel'; -import { useCallback } from 'react'; +import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { PiPlusBold } from 'react-icons/pi'; type Props = { result: string; }; -export const HuggingFaceResultItem = ({ result }: Props) => { +export const HuggingFaceResultItem = memo(({ result }: Props) => { const { t } = useTranslation(); const [installModel] = useInstallModel(); @@ -27,4 +27,6 @@ export const HuggingFaceResultItem = ({ result }: Props) => { } onClick={onClick} size="sm" /> ); -}; +}); + +HuggingFaceResultItem.displayName = 'HuggingFaceResultItem'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResults.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResults.tsx index 826fd177eaa..25546c68229 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResults.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResults.tsx @@ -11,7 +11,7 @@ import { import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent'; import { useInstallModel } from 'features/modelManagerV2/hooks/useInstallModel'; import type { ChangeEventHandler } from 'react'; -import { useCallback, useMemo, useState } from 'react'; +import { memo, useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { PiXBold } from 'react-icons/pi'; @@ -21,7 +21,7 @@ type HuggingFaceResultsProps = { results: string[]; }; -export const HuggingFaceResults = ({ results }: HuggingFaceResultsProps) => { +export const HuggingFaceResults = memo(({ results }: HuggingFaceResultsProps) => { const { t } = useTranslation(); const [searchTerm, setSearchTerm] = useState(''); @@ -93,4 +93,6 @@ export const HuggingFaceResults = ({ results }: HuggingFaceResultsProps) => { ); -}; +}); + +HuggingFaceResults.displayName = 'HuggingFaceResults'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/InstallModelForm.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/InstallModelForm.tsx index cc052878bff..64eb725e5ed 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/InstallModelForm.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/InstallModelForm.tsx @@ -1,7 +1,7 @@ import { Button, Checkbox, Flex, FormControl, FormHelperText, FormLabel, Input } from '@invoke-ai/ui-library'; import { useInstallModel } from 'features/modelManagerV2/hooks/useInstallModel'; import { t } from 'i18next'; -import { useCallback } from 'react'; +import { memo, useCallback } from 'react'; import type { SubmitHandler } from 'react-hook-form'; import { useForm } from 'react-hook-form'; @@ -10,7 +10,7 @@ type SimpleImportModelConfig = { inplace: boolean; }; -export const InstallModelForm = () => { +export const InstallModelForm = memo(() => { const [installModel, { isLoading }] = useInstallModel(); const { register, handleSubmit, formState, reset } = useForm({ @@ -74,4 +74,6 @@ export const InstallModelForm = () => { ); -}; +}); + +InstallModelForm.displayName = 'InstallModelForm'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx index b3544af5b35..c2443dde6b0 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx @@ -2,12 +2,12 @@ import { Box, Button, Flex, Heading } from '@invoke-ai/ui-library'; import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent'; import { toast } from 'features/toast/toast'; import { t } from 'i18next'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import { useListModelInstallsQuery, usePruneCompletedModelInstallsMutation } from 'services/api/endpoints/models'; import { ModelInstallQueueItem } from './ModelInstallQueueItem'; -export const ModelInstallQueue = () => { +export const ModelInstallQueue = memo(() => { const { data } = useListModelInstallsQuery(); const [_pruneCompletedModelInstalls] = usePruneCompletedModelInstallsMutation(); @@ -61,4 +61,6 @@ export const ModelInstallQueue = () => { ); -}; +}); + +ModelInstallQueue.displayName = 'ModelInstallQueue'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx index 82a28b2d75b..b14b1fbc4ca 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx @@ -2,7 +2,7 @@ import { Flex, IconButton, Progress, Text, Tooltip } from '@invoke-ai/ui-library import { toast } from 'features/toast/toast'; import { t } from 'i18next'; import { isNil } from 'lodash-es'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import { PiXBold } from 'react-icons/pi'; import { useCancelModelInstallMutation } from 'services/api/endpoints/models'; import type { ModelInstallJob } from 'services/api/types'; @@ -25,7 +25,7 @@ const formatBytes = (bytes: number) => { return `${bytes.toFixed(2)} ${units[i]}`; }; -export const ModelInstallQueueItem = (props: ModelListItemProps) => { +export const ModelInstallQueueItem = memo((props: ModelListItemProps) => { const { installJob } = props; const [deleteImportModel] = useCancelModelInstallMutation(); @@ -124,7 +124,9 @@ export const ModelInstallQueueItem = (props: ModelListItemProps) => { /> ); -}; +}); + +ModelInstallQueueItem.displayName = 'ModelInstallQueueItem'; type TooltipLabelProps = { installJob: ModelInstallJob; @@ -132,7 +134,7 @@ type TooltipLabelProps = { source: string; }; -const TooltipLabel = ({ name, source, installJob }: TooltipLabelProps) => { +const TooltipLabel = memo(({ name, source, installJob }: TooltipLabelProps) => { const progressString = useMemo(() => { if (installJob.status !== 'downloading' || installJob.bytes === undefined || installJob.total_bytes === undefined) { return ''; @@ -156,4 +158,6 @@ const TooltipLabel = ({ name, source, installJob }: TooltipLabelProps) => { )} ); -}; +}); + +TooltipLabel.displayName = 'TooltipLabel'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderForm.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderForm.tsx index 2a8aec3285b..1cd036bf13c 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderForm.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderForm.tsx @@ -2,13 +2,13 @@ import { Button, Flex, FormControl, FormErrorMessage, FormHelperText, FormLabel, import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { setScanPath } from 'features/modelManagerV2/store/modelManagerV2Slice'; import type { ChangeEventHandler } from 'react'; -import { useCallback, useState } from 'react'; +import { memo, useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useLazyScanFolderQuery } from 'services/api/endpoints/models'; import { ScanModelsResults } from './ScanFolderResults'; -export const ScanModelsForm = () => { +export const ScanModelsForm = memo(() => { const scanPath = useAppSelector((state) => state.modelmanagerV2.scanPath); const dispatch = useAppDispatch(); const [errorMessage, setErrorMessage] = useState(''); @@ -56,4 +56,6 @@ export const ScanModelsForm = () => { {data && } ); -}; +}); + +ScanModelsForm.displayName = 'ScanModelsForm'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResultItem.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResultItem.tsx index 4f2f77470d9..9f8c1bdc843 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResultItem.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResultItem.tsx @@ -1,5 +1,5 @@ import { Badge, Box, Flex, IconButton, Text } from '@invoke-ai/ui-library'; -import { useCallback } from 'react'; +import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { PiPlusBold } from 'react-icons/pi'; import type { ScanFolderResponse } from 'services/api/endpoints/models'; @@ -8,7 +8,7 @@ type Props = { result: ScanFolderResponse[number]; installModel: (source: string) => void; }; -export const ScanModelResultItem = ({ result, installModel }: Props) => { +export const ScanModelResultItem = memo(({ result, installModel }: Props) => { const { t } = useTranslation(); const handleInstall = useCallback(() => { @@ -30,4 +30,6 @@ export const ScanModelResultItem = ({ result, installModel }: Props) => { ); -}; +}); + +ScanModelResultItem.displayName = 'ScanModelResultItem'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResults.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResults.tsx index 749ef4c8e00..ee8b834a29e 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResults.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResults.tsx @@ -14,7 +14,7 @@ import { import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent'; import { useInstallModel } from 'features/modelManagerV2/hooks/useInstallModel'; import type { ChangeEvent, ChangeEventHandler } from 'react'; -import { useCallback, useMemo, useState } from 'react'; +import { memo, useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { PiXBold } from 'react-icons/pi'; import type { ScanFolderResponse } from 'services/api/endpoints/models'; @@ -25,7 +25,7 @@ type ScanModelResultsProps = { results: ScanFolderResponse; }; -export const ScanModelsResults = ({ results }: ScanModelResultsProps) => { +export const ScanModelsResults = memo(({ results }: ScanModelResultsProps) => { const { t } = useTranslation(); const [searchTerm, setSearchTerm] = useState(''); const [inplace, setInplace] = useState(true); @@ -116,4 +116,6 @@ export const ScanModelsResults = ({ results }: ScanModelResultsProps) => { ); -}; +}); + +ScanModelsResults.displayName = 'ScanModelsResults'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StartModelsResultItem.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StartModelsResultItem.tsx index 754cbbd25ab..a3c9c82d0eb 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StartModelsResultItem.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StartModelsResultItem.tsx @@ -1,7 +1,7 @@ import { Badge, Box, Flex, IconButton, Text } from '@invoke-ai/ui-library'; import { useInstallModel } from 'features/modelManagerV2/hooks/useInstallModel'; import ModelBaseBadge from 'features/modelManagerV2/subpanels/ModelManagerPanel/ModelBaseBadge'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { PiPlusBold } from 'react-icons/pi'; import type { GetStarterModelsResponse } from 'services/api/endpoints/models'; @@ -9,20 +9,22 @@ import type { GetStarterModelsResponse } from 'services/api/endpoints/models'; type Props = { result: GetStarterModelsResponse[number]; }; -export const StarterModelsResultItem = ({ result }: Props) => { +export const StarterModelsResultItem = memo(({ result }: Props) => { const { t } = useTranslation(); const allSources = useMemo(() => { - const _allSources = [result.source]; + const _allSources = [{ source: result.source, config: { name: result.name, description: result.description } }]; if (result.dependencies) { - _allSources.push(...result.dependencies.map((d) => d.source)); + for (const d of result.dependencies) { + _allSources.push({ source: d.source, config: { name: d.name, description: d.description } }); + } } return _allSources; }, [result]); const [installModel] = useInstallModel(); const onClick = useCallback(() => { - for (const source of allSources) { - installModel({ source }); + for (const { config, source } of allSources) { + installModel({ config, source }); } }, [allSources, installModel]); @@ -45,4 +47,6 @@ export const StarterModelsResultItem = ({ result }: Props) => { ); -}; +}); + +StarterModelsResultItem.displayName = 'StarterModelsResultItem'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsForm.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsForm.tsx index 3198f1df787..837ef5c63b8 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsForm.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsForm.tsx @@ -1,10 +1,11 @@ import { Flex } from '@invoke-ai/ui-library'; import { FetchingModelsLoader } from 'features/modelManagerV2/subpanels/ModelManagerPanel/FetchingModelsLoader'; +import { memo } from 'react'; import { useGetStarterModelsQuery } from 'services/api/endpoints/models'; import { StarterModelsResults } from './StarterModelsResults'; -export const StarterModelsForm = () => { +export const StarterModelsForm = memo(() => { const { isLoading, data } = useGetStarterModelsQuery(); return ( @@ -13,4 +14,6 @@ export const StarterModelsForm = () => { {data && } ); -}; +}); + +StarterModelsForm.displayName = 'StarterModelsForm'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsResults.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsResults.tsx index ccaa29d5e25..e593ee5fc3c 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsResults.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsResults.tsx @@ -1,7 +1,7 @@ import { Flex, IconButton, Input, InputGroup, InputRightElement } from '@invoke-ai/ui-library'; import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent'; import type { ChangeEventHandler } from 'react'; -import { useCallback, useMemo, useState } from 'react'; +import { memo, useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { PiXBold } from 'react-icons/pi'; import type { GetStarterModelsResponse } from 'services/api/endpoints/models'; @@ -12,16 +12,23 @@ type StarterModelsResultsProps = { results: NonNullable; }; -export const StarterModelsResults = ({ results }: StarterModelsResultsProps) => { +export const StarterModelsResults = memo(({ results }: StarterModelsResultsProps) => { const { t } = useTranslation(); const [searchTerm, setSearchTerm] = useState(''); const filteredResults = useMemo(() => { return results.filter((result) => { const trimmedSearchTerm = searchTerm.trim().toLowerCase(); - const matchStrings = [result.name.toLowerCase(), result.type.toLowerCase(), result.description.toLowerCase()]; + const matchStrings = [ + result.name.toLowerCase(), + result.type.toLowerCase().replaceAll('_', ' '), + result.description.toLowerCase(), + ]; if (result.type === 'spandrel_image_to_image') { matchStrings.push('upscale'); + matchStrings.push('post-processing'); + matchStrings.push('postprocessing'); + matchStrings.push('post processing'); } return matchStrings.some((matchString) => matchString.includes(trimmedSearchTerm)); }); @@ -72,4 +79,6 @@ export const StarterModelsResults = ({ results }: StarterModelsResultsProps) => ); -}; +}); + +StarterModelsResults.displayName = 'StarterModelsResults'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/InstallModels.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/InstallModels.tsx index b5110722d5c..90f3a578da7 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/InstallModels.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/InstallModels.tsx @@ -2,7 +2,7 @@ import { Box, Flex, Heading, Tab, TabList, TabPanel, TabPanels, Tabs } from '@in import { useStore } from '@nanostores/react'; import { StarterModelsForm } from 'features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsForm'; import { atom } from 'nanostores'; -import { useCallback } from 'react'; +import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { HuggingFaceForm } from './AddModelPanel/HuggingFaceFolder/HuggingFaceForm'; @@ -12,7 +12,7 @@ import { ScanModelsForm } from './AddModelPanel/ScanFolder/ScanFolderForm'; export const $installModelsTab = atom(0); -export const InstallModels = () => { +export const InstallModels = memo(() => { const { t } = useTranslation(); const index = useStore($installModelsTab); const onChange = useCallback((index: number) => { @@ -49,4 +49,6 @@ export const InstallModels = () => { ); -}; +}); + +InstallModels.displayName = 'InstallModels'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManager.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManager.tsx index dbe02392db5..a07cb8c10b1 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManager.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManager.tsx @@ -1,14 +1,14 @@ import { Button, Flex, Heading } from '@invoke-ai/ui-library'; import { useAppDispatch } from 'app/store/storeHooks'; import { setSelectedModelKey } from 'features/modelManagerV2/store/modelManagerV2Slice'; -import { useCallback } from 'react'; +import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { PiPlusBold } from 'react-icons/pi'; import ModelList from './ModelManagerPanel/ModelList'; import { ModelListNavigation } from './ModelManagerPanel/ModelListNavigation'; -export const ModelManager = () => { +export const ModelManager = memo(() => { const { t } = useTranslation(); const dispatch = useAppDispatch(); const handleClickAddModel = useCallback(() => { @@ -29,4 +29,6 @@ export const ModelManager = () => { ); -}; +}); + +ModelManager.displayName = 'ModelManager'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx index b82917221ef..755a6e21fb2 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx @@ -21,7 +21,8 @@ import { FetchingModelsLoader } from './FetchingModelsLoader'; import { ModelListWrapper } from './ModelListWrapper'; const ModelList = () => { - const { searchTerm, filteredModelType } = useAppSelector((s) => s.modelmanagerV2); + const filteredModelType = useAppSelector((s) => s.modelmanagerV2.filteredModelType); + const searchTerm = useAppSelector((s) => s.modelmanagerV2.searchTerm); const { t } = useTranslation(); const [mainModels, { isLoading: isLoadingMainModels }] = useMainModels(); diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListItem.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListItem.tsx index a4a6d5c8335..8bfcbd73518 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListItem.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListItem.tsx @@ -1,7 +1,8 @@ import type { SystemStyleObject } from '@invoke-ai/ui-library'; import { ConfirmationAlertDialog, Flex, IconButton, Spacer, Text, useDisclosure } from '@invoke-ai/ui-library'; +import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { setSelectedModelKey } from 'features/modelManagerV2/store/modelManagerV2Slice'; +import { selectModelManagerV2Slice, setSelectedModelKey } from 'features/modelManagerV2/store/modelManagerV2Slice'; import ModelBaseBadge from 'features/modelManagerV2/subpanels/ModelManagerPanel/ModelBaseBadge'; import ModelFormatBadge from 'features/modelManagerV2/subpanels/ModelManagerPanel/ModelFormatBadge'; import { toast } from 'features/toast/toast'; @@ -23,15 +24,21 @@ const sx: SystemStyleObject = { "&[aria-selected='true']": { bg: 'base.700' }, }; -const ModelListItem = (props: ModelListItemProps) => { +const ModelListItem = ({ model }: ModelListItemProps) => { const { t } = useTranslation(); const dispatch = useAppDispatch(); - const selectedModelKey = useAppSelector((s) => s.modelmanagerV2.selectedModelKey); + const selectIsSelected = useMemo( + () => + createSelector( + selectModelManagerV2Slice, + (modelManagerV2Slice) => modelManagerV2Slice.selectedModelKey === model.key + ), + [model.key] + ); + const isSelected = useAppSelector(selectIsSelected); const [deleteModel] = useDeleteModelsMutation(); const { isOpen, onOpen, onClose } = useDisclosure(); - const { model } = props; - const handleSelectModel = useCallback(() => { dispatch(setSelectedModelKey(model.key)); }, [model.key, dispatch]); @@ -43,11 +50,6 @@ const ModelListItem = (props: ModelListItemProps) => { }, [onOpen] ); - - const isSelected = useMemo(() => { - return selectedModelKey === model.key; - }, [selectedModelKey, model.key]); - const handleModelDelete = useCallback(() => { deleteModel({ key: model.key }) .unwrap() diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListNavigation.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListNavigation.tsx index b256e8a70fd..766b4f27b88 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListNavigation.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListNavigation.tsx @@ -3,12 +3,12 @@ import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { setSearchTerm } from 'features/modelManagerV2/store/modelManagerV2Slice'; import { t } from 'i18next'; import type { ChangeEventHandler } from 'react'; -import { useCallback } from 'react'; +import { memo, useCallback } from 'react'; import { PiXBold } from 'react-icons/pi'; import { ModelTypeFilter } from './ModelTypeFilter'; -export const ModelListNavigation = () => { +export const ModelListNavigation = memo(() => { const dispatch = useAppDispatch(); const searchTerm = useAppSelector((s) => s.modelmanagerV2.searchTerm); @@ -49,4 +49,6 @@ export const ModelListNavigation = () => { ); -}; +}); + +ModelListNavigation.displayName = 'ModelListNavigation'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListWrapper.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListWrapper.tsx index e52bd12f259..bde79e45540 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListWrapper.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListWrapper.tsx @@ -1,4 +1,5 @@ import { StickyScrollable } from 'features/system/components/StickyScrollable'; +import { memo } from 'react'; import type { AnyModelConfig } from 'services/api/types'; import ModelListItem from './ModelListItem'; @@ -8,7 +9,7 @@ type ModelListWrapperProps = { modelList: AnyModelConfig[]; }; -export const ModelListWrapper = (props: ModelListWrapperProps) => { +export const ModelListWrapper = memo((props: ModelListWrapperProps) => { const { title, modelList } = props; return ( @@ -17,4 +18,6 @@ export const ModelListWrapper = (props: ModelListWrapperProps) => { ))} ); -}; +}); + +ModelListWrapper.displayName = 'ModelListWrapper'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelTypeFilter.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelTypeFilter.tsx index 1a2444870b5..9db3334e89e 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelTypeFilter.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelTypeFilter.tsx @@ -2,12 +2,12 @@ import { Button, Menu, MenuButton, MenuItem, MenuList } from '@invoke-ai/ui-libr import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import type { FilterableModelType } from 'features/modelManagerV2/store/modelManagerV2Slice'; import { setFilteredModelType } from 'features/modelManagerV2/store/modelManagerV2Slice'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { PiFunnelBold } from 'react-icons/pi'; import { objectKeys } from 'tsafe'; -export const ModelTypeFilter = () => { +export const ModelTypeFilter = memo(() => { const { t } = useTranslation(); const dispatch = useAppDispatch(); const MODEL_TYPE_LABELS: Record = useMemo( @@ -57,4 +57,6 @@ export const ModelTypeFilter = () => { ); -}; +}); + +ModelTypeFilter.displayName = 'ModelTypeFilter'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPane.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPane.tsx index 5f1a70e0fe9..eb85434d363 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPane.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPane.tsx @@ -1,14 +1,17 @@ import { Box } from '@invoke-ai/ui-library'; import { useAppSelector } from 'app/store/storeHooks'; +import { memo } from 'react'; import { InstallModels } from './InstallModels'; import { Model } from './ModelPanel/Model'; -export const ModelPane = () => { +export const ModelPane = memo(() => { const selectedModelKey = useAppSelector((s) => s.modelmanagerV2.selectedModelKey); return ( {selectedModelKey ? : } ); -}; +}); + +ModelPane.displayName = 'ModelPane'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ControlNetOrT2IAdapterDefaultSettings/ControlNetOrT2IAdapterDefaultSettings.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ControlNetOrT2IAdapterDefaultSettings/ControlNetOrT2IAdapterDefaultSettings.tsx index 9a84fbc7265..25005e76c95 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ControlNetOrT2IAdapterDefaultSettings/ControlNetOrT2IAdapterDefaultSettings.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ControlNetOrT2IAdapterDefaultSettings/ControlNetOrT2IAdapterDefaultSettings.tsx @@ -1,26 +1,28 @@ -import { Button, Flex, Heading, SimpleGrid, Text } from '@invoke-ai/ui-library'; -import { useAppSelector } from 'app/store/storeHooks'; +import { Button, Flex, Heading, SimpleGrid } from '@invoke-ai/ui-library'; import { useControlNetOrT2IAdapterDefaultSettings } from 'features/modelManagerV2/hooks/useControlNetOrT2IAdapterDefaultSettings'; import { DefaultPreprocessor } from 'features/modelManagerV2/subpanels/ModelPanel/ControlNetOrT2IAdapterDefaultSettings/DefaultPreprocessor'; import type { FormField } from 'features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings'; import { toast } from 'features/toast/toast'; -import { useCallback } from 'react'; +import { memo, useCallback } from 'react'; import type { SubmitHandler } from 'react-hook-form'; import { useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { PiCheckBold } from 'react-icons/pi'; import { useUpdateModelMutation } from 'services/api/endpoints/models'; +import type { ControlNetModelConfig, T2IAdapterModelConfig } from 'services/api/types'; export type ControlNetOrT2IAdapterDefaultSettingsFormData = { preprocessor: FormField; }; -export const ControlNetOrT2IAdapterDefaultSettings = () => { - const selectedModelKey = useAppSelector((s) => s.modelmanagerV2.selectedModelKey); +type Props = { + modelConfig: ControlNetModelConfig | T2IAdapterModelConfig; +}; + +export const ControlNetOrT2IAdapterDefaultSettings = memo(({ modelConfig }: Props) => { const { t } = useTranslation(); - const { defaultSettingsDefaults, isLoading: isLoadingDefaultSettings } = - useControlNetOrT2IAdapterDefaultSettings(selectedModelKey); + const defaultSettingsDefaults = useControlNetOrT2IAdapterDefaultSettings(modelConfig); const [updateModel, { isLoading: isLoadingUpdateModel }] = useUpdateModelMutation(); @@ -30,16 +32,12 @@ export const ControlNetOrT2IAdapterDefaultSettings = () => { const onSubmit = useCallback>( (data) => { - if (!selectedModelKey) { - return; - } - const body = { preprocessor: data.preprocessor.isEnabled ? data.preprocessor.value : null, }; updateModel({ - key: selectedModelKey, + key: modelConfig.key, body: { default_settings: body }, }) .unwrap() @@ -61,13 +59,9 @@ export const ControlNetOrT2IAdapterDefaultSettings = () => { } }); }, - [selectedModelKey, reset, updateModel, t] + [updateModel, modelConfig.key, t, reset] ); - if (isLoadingDefaultSettings) { - return {t('common.loading')}; - } - return ( <> @@ -89,4 +83,6 @@ export const ControlNetOrT2IAdapterDefaultSettings = () => { ); -}; +}); + +ControlNetOrT2IAdapterDefaultSettings.displayName = 'ControlNetOrT2IAdapterDefaultSettings'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ControlNetOrT2IAdapterDefaultSettings/DefaultPreprocessor.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ControlNetOrT2IAdapterDefaultSettings/DefaultPreprocessor.tsx index b2284336bf4..e446992779f 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ControlNetOrT2IAdapterDefaultSettings/DefaultPreprocessor.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ControlNetOrT2IAdapterDefaultSettings/DefaultPreprocessor.tsx @@ -4,7 +4,7 @@ import { InformationalPopover } from 'common/components/InformationalPopover/Inf import type { ControlNetOrT2IAdapterDefaultSettingsFormData } from 'features/modelManagerV2/subpanels/ModelPanel/ControlNetOrT2IAdapterDefaultSettings/ControlNetOrT2IAdapterDefaultSettings'; import type { FormField } from 'features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings'; import { SettingToggle } from 'features/modelManagerV2/subpanels/ModelPanel/SettingToggle'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import type { UseControllerProps } from 'react-hook-form'; import { useController } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; @@ -28,7 +28,7 @@ const OPTIONS = [ type DefaultSchedulerType = ControlNetOrT2IAdapterDefaultSettingsFormData['preprocessor']; -export function DefaultPreprocessor(props: UseControllerProps) { +export const DefaultPreprocessor = memo((props: UseControllerProps) => { const { t } = useTranslation(); const { field } = useController(props); @@ -63,4 +63,6 @@ export function DefaultPreprocessor(props: UseControllerProps ); -} +}); + +DefaultPreprocessor.displayName = 'DefaultPreprocessor'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgRescaleMultiplier.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgRescaleMultiplier.tsx index d16ce1460c2..cde1b8d7f33 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgRescaleMultiplier.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgRescaleMultiplier.tsx @@ -2,7 +2,7 @@ import { CompositeNumberInput, CompositeSlider, Flex, FormControl, FormLabel } f import { useAppSelector } from 'app/store/storeHooks'; import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { SettingToggle } from 'features/modelManagerV2/subpanels/ModelPanel/SettingToggle'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import type { UseControllerProps } from 'react-hook-form'; import { useController } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; @@ -11,7 +11,7 @@ import type { MainModelDefaultSettingsFormData } from './MainModelDefaultSetting type DefaultCfgRescaleMultiplierType = MainModelDefaultSettingsFormData['cfgRescaleMultiplier']; -export function DefaultCfgRescaleMultiplier(props: UseControllerProps) { +export const DefaultCfgRescaleMultiplier = memo((props: UseControllerProps) => { const { field } = useController(props); const sliderMin = useAppSelector((s) => s.config.sd.cfgRescaleMultiplier.sliderMin); @@ -74,4 +74,6 @@ export function DefaultCfgRescaleMultiplier(props: UseControllerProps ); -} +}); + +DefaultCfgRescaleMultiplier.displayName = 'DefaultCfgRescaleMultiplier'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx index 293261bc352..85d11daba88 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx @@ -2,7 +2,7 @@ import { CompositeNumberInput, CompositeSlider, Flex, FormControl, FormLabel } f import { useAppSelector } from 'app/store/storeHooks'; import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { SettingToggle } from 'features/modelManagerV2/subpanels/ModelPanel/SettingToggle'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import type { UseControllerProps } from 'react-hook-form'; import { useController } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; @@ -11,7 +11,7 @@ import type { MainModelDefaultSettingsFormData } from './MainModelDefaultSetting type DefaultCfgType = MainModelDefaultSettingsFormData['cfgScale']; -export function DefaultCfgScale(props: UseControllerProps) { +export const DefaultCfgScale = memo((props: UseControllerProps) => { const { field } = useController(props); const sliderMin = useAppSelector((s) => s.config.sd.guidance.sliderMin); @@ -74,4 +74,6 @@ export function DefaultCfgScale(props: UseControllerProps ); -} +}); + +DefaultCfgScale.displayName = 'DefaultCfgScale'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx index a19ae26ebe0..8dc00e6239f 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx @@ -2,7 +2,7 @@ import { CompositeNumberInput, CompositeSlider, Flex, FormControl, FormLabel } f import { useAppSelector } from 'app/store/storeHooks'; import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { SettingToggle } from 'features/modelManagerV2/subpanels/ModelPanel/SettingToggle'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import type { UseControllerProps } from 'react-hook-form'; import { useController } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; @@ -16,7 +16,7 @@ type Props = { optimalDimension: number; }; -export function DefaultHeight({ control, optimalDimension }: Props) { +export const DefaultHeight = memo(({ control, optimalDimension }: Props) => { const { field } = useController({ control, name: 'height' }); const sliderMin = useAppSelector((s) => s.config.sd.height.sliderMin); const sliderMax = useAppSelector((s) => s.config.sd.height.sliderMax); @@ -78,4 +78,6 @@ export function DefaultHeight({ control, optimalDimension }: Props) { ); -} +}); + +DefaultHeight.displayName = 'DefaultHeight'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx index 4397e35a51e..1ad8177cf61 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx @@ -4,7 +4,7 @@ import { InformationalPopover } from 'common/components/InformationalPopover/Inf import { SettingToggle } from 'features/modelManagerV2/subpanels/ModelPanel/SettingToggle'; import { SCHEDULER_OPTIONS } from 'features/parameters/types/constants'; import { isParameterScheduler } from 'features/parameters/types/parameterSchemas'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import type { UseControllerProps } from 'react-hook-form'; import { useController } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; @@ -13,7 +13,7 @@ import type { MainModelDefaultSettingsFormData } from './MainModelDefaultSetting type DefaultSchedulerType = MainModelDefaultSettingsFormData['scheduler']; -export function DefaultScheduler(props: UseControllerProps) { +export const DefaultScheduler = memo((props: UseControllerProps) => { const { t } = useTranslation(); const { field } = useController(props); @@ -51,4 +51,6 @@ export function DefaultScheduler(props: UseControllerProps ); -} +}); + +DefaultScheduler.displayName = 'DefaultScheduler'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx index 9c1912a0f78..5bfb268d08d 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx @@ -2,7 +2,7 @@ import { CompositeNumberInput, CompositeSlider, Flex, FormControl, FormLabel } f import { useAppSelector } from 'app/store/storeHooks'; import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { SettingToggle } from 'features/modelManagerV2/subpanels/ModelPanel/SettingToggle'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import type { UseControllerProps } from 'react-hook-form'; import { useController } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; @@ -11,7 +11,7 @@ import type { MainModelDefaultSettingsFormData } from './MainModelDefaultSetting type DefaultSteps = MainModelDefaultSettingsFormData['steps']; -export function DefaultSteps(props: UseControllerProps) { +export const DefaultSteps = memo((props: UseControllerProps) => { const { field } = useController(props); const sliderMin = useAppSelector((s) => s.config.sd.steps.sliderMin); @@ -74,4 +74,6 @@ export function DefaultSteps(props: UseControllerProps ); -} +}); + +DefaultSteps.displayName = 'DefaultSteps'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVae.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVae.tsx index 5517d7b3478..cf1578d9f4e 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVae.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVae.tsx @@ -4,7 +4,7 @@ import { skipToken } from '@reduxjs/toolkit/query'; import { useAppSelector } from 'app/store/storeHooks'; import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { SettingToggle } from 'features/modelManagerV2/subpanels/ModelPanel/SettingToggle'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import type { UseControllerProps } from 'react-hook-form'; import { useController } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; @@ -15,7 +15,7 @@ import type { MainModelDefaultSettingsFormData } from './MainModelDefaultSetting type DefaultVaeType = MainModelDefaultSettingsFormData['vae']; -export function DefaultVae(props: UseControllerProps) { +export const DefaultVae = memo((props: UseControllerProps) => { const { t } = useTranslation(); const { field } = useController(props); const selectedModelKey = useAppSelector((s) => s.modelmanagerV2.selectedModelKey); @@ -64,4 +64,6 @@ export function DefaultVae(props: UseControllerProps ); -} +}); + +DefaultVae.displayName = 'DefaultVae'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx index d33cf4e08da..b725d60968d 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx @@ -3,7 +3,7 @@ import { Combobox, Flex, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { SettingToggle } from 'features/modelManagerV2/subpanels/ModelPanel/SettingToggle'; import { isParameterPrecision } from 'features/parameters/types/parameterSchemas'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import type { UseControllerProps } from 'react-hook-form'; import { useController } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; @@ -17,7 +17,7 @@ const options = [ type DefaultVaePrecisionType = MainModelDefaultSettingsFormData['vaePrecision']; -export function DefaultVaePrecision(props: UseControllerProps) { +export const DefaultVaePrecision = memo((props: UseControllerProps) => { const { t } = useTranslation(); const { field } = useController(props); @@ -52,4 +52,6 @@ export function DefaultVaePrecision(props: UseControllerProps ); -} +}); + +DefaultVaePrecision.displayName = 'DefaultVaePrecision'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth.tsx index 851dba1edeb..8986b9820b5 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth.tsx @@ -2,7 +2,7 @@ import { CompositeNumberInput, CompositeSlider, Flex, FormControl, FormLabel } f import { useAppSelector } from 'app/store/storeHooks'; import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover'; import { SettingToggle } from 'features/modelManagerV2/subpanels/ModelPanel/SettingToggle'; -import { useCallback, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import type { UseControllerProps } from 'react-hook-form'; import { useController } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; @@ -16,7 +16,7 @@ type Props = { optimalDimension: number; }; -export function DefaultWidth({ control, optimalDimension }: Props) { +export const DefaultWidth = memo(({ control, optimalDimension }: Props) => { const { field } = useController({ control, name: 'width' }); const sliderMin = useAppSelector((s) => s.config.sd.width.sliderMin); const sliderMax = useAppSelector((s) => s.config.sd.width.sliderMax); @@ -78,4 +78,6 @@ export function DefaultWidth({ control, optimalDimension }: Props) { ); -} +}); + +DefaultWidth.displayName = 'DefaultWidth'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx index 233fc7bc6bd..095b452dfcb 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx @@ -1,16 +1,18 @@ -import { Button, Flex, Heading, SimpleGrid, Text } from '@invoke-ai/ui-library'; +import { Button, Flex, Heading, SimpleGrid } from '@invoke-ai/ui-library'; import { useAppSelector } from 'app/store/storeHooks'; import { useMainModelDefaultSettings } from 'features/modelManagerV2/hooks/useMainModelDefaultSettings'; import { DefaultHeight } from 'features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight'; import { DefaultWidth } from 'features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth'; import type { ParameterScheduler } from 'features/parameters/types/parameterSchemas'; +import { getOptimalDimension } from 'features/parameters/util/optimalDimension'; import { toast } from 'features/toast/toast'; -import { useCallback } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import type { SubmitHandler } from 'react-hook-form'; import { useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { PiCheckBold } from 'react-icons/pi'; import { useUpdateModelMutation } from 'services/api/endpoints/models'; +import type { MainModelConfig } from 'services/api/types'; import { DefaultCfgRescaleMultiplier } from './DefaultCfgRescaleMultiplier'; import { DefaultCfgScale } from './DefaultCfgScale'; @@ -35,16 +37,16 @@ export type MainModelDefaultSettingsFormData = { height: FormField; }; -export const MainModelDefaultSettings = () => { +type Props = { + modelConfig: MainModelConfig; +}; + +export const MainModelDefaultSettings = memo(({ modelConfig }: Props) => { const selectedModelKey = useAppSelector((s) => s.modelmanagerV2.selectedModelKey); const { t } = useTranslation(); - const { - defaultSettingsDefaults, - isLoading: isLoadingDefaultSettings, - optimalDimension, - } = useMainModelDefaultSettings(selectedModelKey); - + const defaultSettingsDefaults = useMainModelDefaultSettings(modelConfig); + const optimalDimension = useMemo(() => getOptimalDimension(modelConfig), [modelConfig]); const [updateModel, { isLoading: isLoadingUpdateModel }] = useUpdateModelMutation(); const { handleSubmit, control, formState, reset } = useForm({ @@ -94,10 +96,6 @@ export const MainModelDefaultSettings = () => { [selectedModelKey, reset, updateModel, t] ); - if (isLoadingDefaultSettings) { - return {t('common.loading')}; - } - return ( <> @@ -126,4 +124,6 @@ export const MainModelDefaultSettings = () => { ); -}; +}); + +MainModelDefaultSettings.displayName = 'MainModelDefaultSettings'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/Model.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/Model.tsx index fa7ca4c394d..2934ac916ad 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/Model.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/Model.tsx @@ -1,120 +1,47 @@ -import { Button, Flex, Heading, Spacer, Text } from '@invoke-ai/ui-library'; -import { skipToken } from '@reduxjs/toolkit/query'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { setSelectedModelMode } from 'features/modelManagerV2/store/modelManagerV2Slice'; -import { ModelConvertButton } from 'features/modelManagerV2/subpanels/ModelPanel/ModelConvertButton'; -import { ModelEditButton } from 'features/modelManagerV2/subpanels/ModelPanel/ModelEditButton'; -import { toast } from 'features/toast/toast'; -import { useCallback } from 'react'; -import type { SubmitHandler } from 'react-hook-form'; -import { useForm } from 'react-hook-form'; +import { useAppSelector } from 'app/store/storeHooks'; +import { IAINoContentFallback, IAINoContentFallbackWithSpinner } from 'common/components/IAIImageFallback'; +import { memo, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { PiCheckBold, PiXBold } from 'react-icons/pi'; -import type { UpdateModelArg } from 'services/api/endpoints/models'; -import { useGetModelConfigQuery, useUpdateModelMutation } from 'services/api/endpoints/models'; +import { PiExclamationMarkBold } from 'react-icons/pi'; +import { modelConfigsAdapterSelectors, useGetModelConfigsQuery } from 'services/api/endpoints/models'; -import ModelImageUpload from './Fields/ModelImageUpload'; import { ModelEdit } from './ModelEdit'; import { ModelView } from './ModelView'; -export const Model = () => { +export const Model = memo(() => { const { t } = useTranslation(); const selectedModelMode = useAppSelector((s) => s.modelmanagerV2.selectedModelMode); const selectedModelKey = useAppSelector((s) => s.modelmanagerV2.selectedModelKey); - const { data, isLoading } = useGetModelConfigQuery(selectedModelKey ?? skipToken); - const [updateModel, { isLoading: isSubmitting }] = useUpdateModelMutation(); - const dispatch = useAppDispatch(); - - const form = useForm({ - defaultValues: data, - mode: 'onChange', - }); - - const onSubmit = useCallback>( - (values) => { - if (!data?.key) { - return; - } - - const responseBody: UpdateModelArg = { - key: data.key, - body: values, - }; - - updateModel(responseBody) - .unwrap() - .then((payload) => { - form.reset(payload, { keepDefaultValues: true }); - dispatch(setSelectedModelMode('view')); - toast({ - id: 'MODEL_UPDATED', - title: t('modelManager.modelUpdated'), - status: 'success', - }); - }) - .catch((_) => { - form.reset(); - toast({ - id: 'MODEL_UPDATE_FAILED', - title: t('modelManager.modelUpdateFailed'), - status: 'error', - }); - }); - }, - [dispatch, data?.key, form, t, updateModel] - ); - - const handleClickCancel = useCallback(() => { - dispatch(setSelectedModelMode('view')); - }, [dispatch]); + const { data: modelConfigs, isLoading } = useGetModelConfigsQuery(); + const modelConfig = useMemo(() => { + if (!modelConfigs) { + return null; + } + if (selectedModelKey === null) { + return null; + } + const modelConfig = modelConfigsAdapterSelectors.selectById(modelConfigs, selectedModelKey); + + if (!modelConfig) { + return null; + } + + return modelConfig; + }, [modelConfigs, selectedModelKey]); if (isLoading) { - return {t('common.loading')}; + return ; + } + + if (!modelConfig) { + return ; } - if (!data) { - return {t('common.somethingWentWrong')}; + if (selectedModelMode === 'view') { + return ; } - return ( - - - - - - - {data.name} - - - {selectedModelMode === 'view' && } - {selectedModelMode === 'view' && } - {selectedModelMode === 'edit' && ( - - )} - {selectedModelMode === 'edit' && ( - - )} - - {data.source && ( - - {t('modelManager.source')}: {data?.source} - - )} - {data.description} - - - {selectedModelMode === 'view' ? : } - - ); -}; + return ; +}); + +Model.displayName = 'Model'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelAttrView.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelAttrView.tsx index ebdedffebf5..106e0a1df0f 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelAttrView.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelAttrView.tsx @@ -1,11 +1,12 @@ import { FormControl, FormLabel, Text } from '@invoke-ai/ui-library'; +import { memo } from 'react'; interface Props { label: string; value: string | null | undefined; } -export const ModelAttrView = ({ label, value }: Props) => { +export const ModelAttrView = memo(({ label, value }: Props) => { return ( {label} @@ -14,4 +15,6 @@ export const ModelAttrView = ({ label, value }: Props) => { ); -}; +}); + +ModelAttrView.displayName = 'ModelAttrView'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelConvertButton.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelConvertButton.tsx index 40ffca76b4d..70775842f80 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelConvertButton.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelConvertButton.tsx @@ -8,52 +8,46 @@ import { UnorderedList, useDisclosure, } from '@invoke-ai/ui-library'; -import { skipToken } from '@reduxjs/toolkit/query'; import { toast } from 'features/toast/toast'; -import { useCallback } from 'react'; +import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; -import { useConvertModelMutation, useGetModelConfigQuery } from 'services/api/endpoints/models'; +import { useConvertModelMutation } from 'services/api/endpoints/models'; +import type { CheckpointModelConfig } from 'services/api/types'; interface ModelConvertProps { - modelKey: string | null; + modelConfig: CheckpointModelConfig; } -export const ModelConvertButton = (props: ModelConvertProps) => { - const { modelKey } = props; +export const ModelConvertButton = memo(({ modelConfig }: ModelConvertProps) => { const { t } = useTranslation(); - const { data } = useGetModelConfigQuery(modelKey ?? skipToken); const [convertModel, { isLoading }] = useConvertModelMutation(); const { isOpen, onOpen, onClose } = useDisclosure(); const modelConvertHandler = useCallback(() => { - if (!data || isLoading) { + if (!modelConfig || isLoading) { return; } - const toastId = `CONVERTING_MODEL_${data.key}`; + const toastId = `CONVERTING_MODEL_${modelConfig.key}`; toast({ id: toastId, - title: `${t('modelManager.convertingModelBegin')}: ${data?.name}`, + title: `${t('modelManager.convertingModelBegin')}: ${modelConfig.name}`, status: 'info', }); - convertModel(data?.key) + convertModel(modelConfig.key) .unwrap() .then(() => { - toast({ id: toastId, title: `${t('modelManager.modelConverted')}: ${data?.name}`, status: 'success' }); + toast({ id: toastId, title: `${t('modelManager.modelConverted')}: ${modelConfig.name}`, status: 'success' }); }) .catch(() => { toast({ id: toastId, - title: `${t('modelManager.modelConversionFailed')}: ${data?.name}`, + title: `${t('modelManager.modelConversionFailed')}: ${modelConfig.name}`, status: 'error', }); }); - }, [data, isLoading, t, convertModel]); - - if (data?.format !== 'checkpoint') { - return; - } + }, [modelConfig, isLoading, t, convertModel]); return ( <> @@ -68,7 +62,7 @@ export const ModelConvertButton = (props: ModelConvertProps) => { 🧨 {t('modelManager.convert')} { ); -}; +}); + +ModelConvertButton.displayName = 'ModelConvertButton'; diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx index 8bc775c8724..da57c302381 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx @@ -1,4 +1,5 @@ import { + Button, Checkbox, Flex, FormControl, @@ -7,96 +8,154 @@ import { Heading, Input, SimpleGrid, - Text, Textarea, } from '@invoke-ai/ui-library'; -import { skipToken } from '@reduxjs/toolkit/query'; -import { useAppSelector } from 'app/store/storeHooks'; -import type { SubmitHandler, UseFormReturn } from 'react-hook-form'; +import { useAppDispatch } from 'app/store/storeHooks'; +import { setSelectedModelMode } from 'features/modelManagerV2/store/modelManagerV2Slice'; +import { ModelHeader } from 'features/modelManagerV2/subpanels/ModelPanel/ModelHeader'; +import { toast } from 'features/toast/toast'; +import { memo, useCallback } from 'react'; +import { type SubmitHandler, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; -import type { UpdateModelArg } from 'services/api/endpoints/models'; -import { useGetModelConfigQuery } from 'services/api/endpoints/models'; +import { PiCheckBold, PiXBold } from 'react-icons/pi'; +import { type UpdateModelArg, useUpdateModelMutation } from 'services/api/endpoints/models'; +import type { AnyModelConfig } from 'services/api/types'; import BaseModelSelect from './Fields/BaseModelSelect'; import ModelVariantSelect from './Fields/ModelVariantSelect'; import PredictionTypeSelect from './Fields/PredictionTypeSelect'; type Props = { - form: UseFormReturn; - onSubmit: SubmitHandler; + modelConfig: AnyModelConfig; }; const stringFieldOptions = { validate: (value?: string | null) => (value && value.trim().length > 3) || 'Must be at least 3 characters', }; -export const ModelEdit = ({ form }: Props) => { - const selectedModelKey = useAppSelector((s) => s.modelmanagerV2.selectedModelKey); - const { data, isLoading } = useGetModelConfigQuery(selectedModelKey ?? skipToken); +export const ModelEdit = memo(({ modelConfig }: Props) => { const { t } = useTranslation(); + const [updateModel, { isLoading: isSubmitting }] = useUpdateModelMutation(); + const dispatch = useAppDispatch(); - if (isLoading) { - return {t('common.loading')}; - } + const form = useForm({ + defaultValues: modelConfig, + mode: 'onChange', + }); - if (!data) { - return {t('common.somethingWentWrong')}; - } + const onSubmit = useCallback>( + (values) => { + const responseBody: UpdateModelArg = { + key: modelConfig.key, + body: values, + }; - return ( - -
- - - {t('modelManager.modelName')} - + updateModel(responseBody) + .unwrap() + .then((payload) => { + form.reset(payload, { keepDefaultValues: true }); + dispatch(setSelectedModelMode('view')); + toast({ + id: 'MODEL_UPDATED', + title: t('modelManager.modelUpdated'), + status: 'success', + }); + }) + .catch((_) => { + form.reset(); + toast({ + id: 'MODEL_UPDATE_FAILED', + title: t('modelManager.modelUpdateFailed'), + status: 'error', + }); + }); + }, + [dispatch, modelConfig.key, form, t, updateModel] + ); - {form.formState.errors.name?.message && ( - {form.formState.errors.name?.message} - )} - - + const handleClickCancel = useCallback(() => { + dispatch(setSelectedModelMode('view')); + }, [dispatch]); + + return ( + + + + + + + + + + {t('modelManager.modelName')} + - - - - {t('modelManager.description')} -