diff --git a/invokeai/app/api/routers/boards.py b/invokeai/app/api/routers/boards.py
index 55cd7c8ca2..94d8667ae4 100644
--- a/invokeai/app/api/routers/boards.py
+++ b/invokeai/app/api/routers/boards.py
@@ -5,6 +5,7 @@ from invokeai.app.services.board_record_storage import BoardChanges
from invokeai.app.services.image_record_storage import OffsetPaginatedResults
from invokeai.app.services.models.board_record import BoardDTO
+
from ..dependencies import ApiDependencies
boards_router = APIRouter(prefix="/v1/boards", tags=["boards"])
@@ -71,11 +72,19 @@ async def update_board(
@boards_router.delete("/{board_id}", operation_id="delete_board")
async def delete_board(
board_id: str = Path(description="The id of board to delete"),
+ include_images: Optional[bool] = Query(
+ description="Permanently delete all images on the board", default=False
+ ),
) -> None:
"""Deletes a board"""
-
try:
- ApiDependencies.invoker.services.boards.delete(board_id=board_id)
+ if include_images is True:
+ ApiDependencies.invoker.services.images.delete_images_on_board(
+ board_id=board_id
+ )
+ ApiDependencies.invoker.services.boards.delete(board_id=board_id)
+ else:
+ ApiDependencies.invoker.services.boards.delete(board_id=board_id)
except Exception as e:
# TODO: Does this need any exception handling at all?
pass
diff --git a/invokeai/app/cli_app.py b/invokeai/app/cli_app.py
index 26e058166b..07193c8500 100644
--- a/invokeai/app/cli_app.py
+++ b/invokeai/app/cli_app.py
@@ -18,8 +18,17 @@ config = InvokeAIAppConfig.get_config()
config.parse_args()
logger = InvokeAILogger().getLogger(config=config)
+from invokeai.app.services.board_image_record_storage import (
+ SqliteBoardImageRecordStorage,
+)
+from invokeai.app.services.board_images import (
+ BoardImagesService,
+ BoardImagesServiceDependencies,
+)
+from invokeai.app.services.board_record_storage import SqliteBoardRecordStorage
+from invokeai.app.services.boards import BoardService, BoardServiceDependencies
from invokeai.app.services.image_record_storage import SqliteImageRecordStorage
-from invokeai.app.services.images import ImageService
+from invokeai.app.services.images import ImageService, ImageServiceDependencies
from invokeai.app.services.metadata import CoreMetadataService
from invokeai.app.services.resource_name import SimpleNameService
from invokeai.app.services.urls import LocalUrlService
@@ -230,21 +239,49 @@ def invoke_cli():
image_file_storage = DiskImageFileStorage(f"{output_folder}/images")
names = SimpleNameService()
- images = ImageService(
- image_record_storage=image_record_storage,
- image_file_storage=image_file_storage,
- metadata=metadata,
- url=urls,
- logger=logger,
- names=names,
- graph_execution_manager=graph_execution_manager,
+ board_record_storage = SqliteBoardRecordStorage(db_location)
+ board_image_record_storage = SqliteBoardImageRecordStorage(db_location)
+
+ boards = BoardService(
+ services=BoardServiceDependencies(
+ board_image_record_storage=board_image_record_storage,
+ board_record_storage=board_record_storage,
+ image_record_storage=image_record_storage,
+ url=urls,
+ logger=logger,
+ )
)
+ board_images = BoardImagesService(
+ services=BoardImagesServiceDependencies(
+ board_image_record_storage=board_image_record_storage,
+ board_record_storage=board_record_storage,
+ image_record_storage=image_record_storage,
+ url=urls,
+ logger=logger,
+ )
+ )
+
+ images = ImageService(
+ services=ImageServiceDependencies(
+ board_image_record_storage=board_image_record_storage,
+ image_record_storage=image_record_storage,
+ image_file_storage=image_file_storage,
+ metadata=metadata,
+ url=urls,
+ logger=logger,
+ names=names,
+ graph_execution_manager=graph_execution_manager,
+ )
+ )
+
services = InvocationServices(
model_manager=model_manager,
events=events,
latents = ForwardCacheLatentsStorage(DiskLatentsStorage(f'{output_folder}/latents')),
images=images,
+ boards=boards,
+ board_images=board_images,
queue=MemoryInvocationQueue(),
graph_library=SqliteItemStorage[LibraryGraph](
filename=db_location, table_name="graphs"
diff --git a/invokeai/app/services/image_file_storage.py b/invokeai/app/services/image_file_storage.py
index b90b9b2f8b..f30499ea26 100644
--- a/invokeai/app/services/image_file_storage.py
+++ b/invokeai/app/services/image_file_storage.py
@@ -85,8 +85,10 @@ class DiskImageFileStorage(ImageFileStorageBase):
self.__cache_ids = Queue()
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.__thumbnails_folder = self.__output_folder / 'thumbnails'
+ self.__output_folder: Path = (
+ 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()
@@ -94,7 +96,7 @@ class DiskImageFileStorage(ImageFileStorageBase):
def get(self, image_name: str) -> PILImageType:
try:
image_path = self.get_path(image_name)
-
+
cache_item = self.__get_cache(image_path)
if cache_item:
return cache_item
@@ -155,7 +157,7 @@ class DiskImageFileStorage(ImageFileStorageBase):
# TODO: make this a bit more flexible for e.g. cloud storage
def get_path(self, image_name: str, thumbnail: bool = False) -> Path:
path = self.__output_folder / image_name
-
+
if thumbnail:
thumbnail_name = get_thumbnail_name(image_name)
path = self.__thumbnails_folder / thumbnail_name
@@ -166,7 +168,7 @@ class DiskImageFileStorage(ImageFileStorageBase):
"""Validates the path given for an image or thumbnail."""
path = path if isinstance(path, Path) else Path(path)
return path.exists()
-
+
def __validate_storage_folders(self) -> None:
"""Checks if the required output folders exist and create them if they don't"""
folders: list[Path] = [self.__output_folder, self.__thumbnails_folder]
@@ -179,7 +181,9 @@ class DiskImageFileStorage(ImageFileStorageBase):
def __set_cache(self, image_name: Path, image: PILImageType):
if not image_name in self.__cache:
self.__cache[image_name] = image
- self.__cache_ids.put(image_name) # TODO: this should refresh position for LRU cache
+ self.__cache_ids.put(
+ image_name
+ ) # TODO: this should refresh position for LRU cache
if len(self.__cache) > self.__max_cache_size:
cache_id = self.__cache_ids.get()
if cache_id in self.__cache:
diff --git a/invokeai/app/services/image_record_storage.py b/invokeai/app/services/image_record_storage.py
index c34d2ca5c8..066e6f8d5f 100644
--- a/invokeai/app/services/image_record_storage.py
+++ b/invokeai/app/services/image_record_storage.py
@@ -94,6 +94,11 @@ class ImageRecordStorageBase(ABC):
"""Deletes an image record."""
pass
+ @abstractmethod
+ def delete_many(self, image_names: list[str]) -> None:
+ """Deletes many image records."""
+ pass
+
@abstractmethod
def save(
self,
@@ -385,6 +390,25 @@ class SqliteImageRecordStorage(ImageRecordStorageBase):
finally:
self._lock.release()
+ def delete_many(self, image_names: list[str]) -> None:
+ try:
+ placeholders = ",".join("?" for _ in image_names)
+
+ self._lock.acquire()
+
+ # Construct the SQLite query with the placeholders
+ query = f"DELETE FROM images WHERE image_name IN ({placeholders})"
+
+ # Execute the query with the list of IDs as parameters
+ self._cursor.execute(query, image_names)
+
+ self._conn.commit()
+ except sqlite3.Error as e:
+ self._conn.rollback()
+ raise ImageRecordDeleteException from e
+ finally:
+ self._lock.release()
+
def save(
self,
image_name: str,
diff --git a/invokeai/app/services/images.py b/invokeai/app/services/images.py
index 542f874f1d..aeb5e520d8 100644
--- a/invokeai/app/services/images.py
+++ b/invokeai/app/services/images.py
@@ -112,6 +112,11 @@ class ImageServiceABC(ABC):
"""Deletes an image."""
pass
+ @abstractmethod
+ def delete_images_on_board(self, board_id: str):
+ """Deletes all images on a board."""
+ pass
+
class ImageServiceDependencies:
"""Service dependencies for the ImageService."""
@@ -341,6 +346,28 @@ class ImageService(ImageServiceABC):
self._services.logger.error("Problem deleting image record and file")
raise e
+ def delete_images_on_board(self, board_id: str):
+ try:
+ images = self._services.board_image_records.get_images_for_board(board_id)
+ image_name_list = list(
+ map(
+ lambda r: r.image_name,
+ images.items,
+ )
+ )
+ for image_name in image_name_list:
+ self._services.image_files.delete(image_name)
+ self._services.image_records.delete_many(image_name_list)
+ except ImageRecordDeleteException:
+ self._services.logger.error(f"Failed to delete image records")
+ raise
+ except ImageFileDeleteException:
+ self._services.logger.error(f"Failed to delete image files")
+ raise
+ except Exception as e:
+ self._services.logger.error("Problem deleting image records and files")
+ raise e
+
def _get_metadata(
self, session_id: Optional[str] = None, node_id: Optional[str] = None
) -> Union[ImageMetadata, None]:
diff --git a/invokeai/backend/install/migrate_to_3.py b/invokeai/backend/install/migrate_to_3.py
index 713f9c5a83..c8e024f484 100644
--- a/invokeai/backend/install/migrate_to_3.py
+++ b/invokeai/backend/install/migrate_to_3.py
@@ -326,7 +326,7 @@ class MigrateTo3(object):
vae_path = p
elif repo_id := vae.get('repo_id'):
if repo_id=='stabilityai/sd-vae-ft-mse': # this guy is already downloaded
- vae_path = 'models/core/convert/se-vae-ft-mse'
+ vae_path = 'models/core/convert/sd-vae-ft-mse'
else:
vae_path = self._download_vae(repo_id, vae.get('subfolder'))
diff --git a/invokeai/backend/model_management/models/vae.py b/invokeai/backend/model_management/models/vae.py
index b582f16b30..3f0d226687 100644
--- a/invokeai/backend/model_management/models/vae.py
+++ b/invokeai/backend/model_management/models/vae.py
@@ -137,7 +137,6 @@ def _convert_vae_ckpt_and_cache(
from .stable_diffusion import _select_ckpt_config
# all sd models use same vae settings
config_file = _select_ckpt_config(base_model, ModelVariantType.Normal)
-
else:
raise Exception(f"Vae conversion not supported for model type: {base_model}")
@@ -152,7 +151,7 @@ def _convert_vae_ckpt_and_cache(
if "state_dict" in checkpoint:
checkpoint = checkpoint["state_dict"]
- config = OmegaConf.load(config_file)
+ config = OmegaConf.load(app_config.root_path/config_file)
vae_model = convert_ldm_vae_to_diffusers(
checkpoint = checkpoint,
diff --git a/invokeai/frontend/web/config/common.ts b/invokeai/frontend/web/config/common.ts
index 2dce54e70a..4470224225 100644
--- a/invokeai/frontend/web/config/common.ts
+++ b/invokeai/frontend/web/config/common.ts
@@ -3,12 +3,10 @@ import { visualizer } from 'rollup-plugin-visualizer';
import { PluginOption, UserConfig } from 'vite';
import eslint from 'vite-plugin-eslint';
import tsconfigPaths from 'vite-tsconfig-paths';
-import { nodePolyfills } from 'vite-plugin-node-polyfills';
export const commonPlugins: UserConfig['plugins'] = [
react(),
eslint(),
tsconfigPaths(),
visualizer() as unknown as PluginOption,
- nodePolyfills(),
];
diff --git a/invokeai/frontend/web/package.json b/invokeai/frontend/web/package.json
index 8c66222584..786a721d5c 100644
--- a/invokeai/frontend/web/package.json
+++ b/invokeai/frontend/web/package.json
@@ -53,7 +53,6 @@
]
},
"dependencies": {
- "@apidevtools/swagger-parser": "^10.1.0",
"@chakra-ui/anatomy": "^2.1.1",
"@chakra-ui/icons": "^2.0.19",
"@chakra-ui/react": "^2.7.1",
@@ -155,7 +154,6 @@
"vite-plugin-css-injected-by-js": "^3.1.1",
"vite-plugin-dts": "^2.3.0",
"vite-plugin-eslint": "^1.8.1",
- "vite-plugin-node-polyfills": "^0.9.0",
"vite-tsconfig-paths": "^4.2.0",
"yarn": "^1.22.19"
}
diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json
index b69e3b82af..1b3b790222 100644
--- a/invokeai/frontend/web/public/locales/en.json
+++ b/invokeai/frontend/web/public/locales/en.json
@@ -24,16 +24,13 @@
},
"common": {
"hotkeysLabel": "Hotkeys",
- "themeLabel": "Theme",
+ "darkMode": "Dark Mode",
+ "lightMode": "Light Mode",
"languagePickerLabel": "Language",
"reportBugLabel": "Report Bug",
"githubLabel": "Github",
"discordLabel": "Discord",
"settingsLabel": "Settings",
- "darkTheme": "Dark",
- "lightTheme": "Light",
- "greenTheme": "Green",
- "oceanTheme": "Ocean",
"langArabic": "العربية",
"langEnglish": "English",
"langDutch": "Nederlands",
diff --git a/invokeai/frontend/web/src/app/components/App.tsx b/invokeai/frontend/web/src/app/components/App.tsx
index c93bd8791c..5b3cf5925f 100644
--- a/invokeai/frontend/web/src/app/components/App.tsx
+++ b/invokeai/frontend/web/src/app/components/App.tsx
@@ -25,6 +25,7 @@ import DeleteImageModal from 'features/gallery/components/DeleteImageModal';
import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale';
import UpdateImageBoardModal from '../../features/gallery/components/Boards/UpdateImageBoardModal';
import { useListModelsQuery } from 'services/api/endpoints/models';
+import DeleteBoardImagesModal from '../../features/gallery/components/Boards/DeleteBoardImagesModal';
const DEFAULT_CONFIG = {};
@@ -158,6 +159,7 @@ const App = ({
+
>
diff --git a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx
index 4d83a407c0..7259f6105d 100644
--- a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx
+++ b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx
@@ -24,6 +24,7 @@ import {
import UpdateImageBoardModal from '../../features/gallery/components/Boards/UpdateImageBoardModal';
import { AddImageToBoardContextProvider } from '../contexts/AddImageToBoardContext';
import { $authToken, $baseUrl } from 'services/api/client';
+import { DeleteBoardImagesContextProvider } from '../contexts/DeleteBoardImagesContext';
const App = lazy(() => import('./App'));
const ThemeLocaleProvider = lazy(() => import('./ThemeLocaleProvider'));
@@ -86,11 +87,13 @@ const InvokeAIUI = ({
-
+
+
+
diff --git a/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx b/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx
index 5eea4bb940..1e86e0ce1b 100644
--- a/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx
+++ b/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx
@@ -3,17 +3,10 @@ import {
createLocalStorageManager,
extendTheme,
} from '@chakra-ui/react';
-import { RootState } from 'app/store/store';
-import { useAppSelector } from 'app/store/storeHooks';
-import { ReactNode, useEffect } from 'react';
+import { ReactNode, useEffect, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { theme as invokeAITheme } from 'theme/theme';
-import { greenTeaThemeColors } from 'theme/colors/greenTea';
-import { invokeAIThemeColors } from 'theme/colors/invokeAI';
-import { lightThemeColors } from 'theme/colors/lightTheme';
-import { oceanBlueColors } from 'theme/colors/oceanBlue';
-
import '@fontsource-variable/inter';
import { MantineProvider } from '@mantine/core';
import { mantineTheme } from 'mantine-theme/theme';
@@ -24,29 +17,19 @@ type ThemeLocaleProviderProps = {
children: ReactNode;
};
-const THEMES = {
- dark: invokeAIThemeColors,
- light: lightThemeColors,
- green: greenTeaThemeColors,
- ocean: oceanBlueColors,
-};
-
const manager = createLocalStorageManager('@@invokeai-color-mode');
function ThemeLocaleProvider({ children }: ThemeLocaleProviderProps) {
const { i18n } = useTranslation();
- const currentTheme = useAppSelector(
- (state: RootState) => state.ui.currentTheme
- );
-
const direction = i18n.dir();
- const theme = extendTheme({
- ...invokeAITheme,
- colors: THEMES[currentTheme as keyof typeof THEMES],
- direction,
- });
+ const theme = useMemo(() => {
+ return extendTheme({
+ ...invokeAITheme,
+ direction,
+ });
+ }, [direction]);
useEffect(() => {
document.body.dir = direction;
diff --git a/invokeai/frontend/web/src/app/contexts/DeleteBoardImagesContext.tsx b/invokeai/frontend/web/src/app/contexts/DeleteBoardImagesContext.tsx
new file mode 100644
index 0000000000..38c89bfcf9
--- /dev/null
+++ b/invokeai/frontend/web/src/app/contexts/DeleteBoardImagesContext.tsx
@@ -0,0 +1,170 @@
+import { useDisclosure } from '@chakra-ui/react';
+import { PropsWithChildren, createContext, useCallback, useState } from 'react';
+import { BoardDTO } from 'services/api/types';
+import { useDeleteBoardMutation } from '../../services/api/endpoints/boards';
+import { defaultSelectorOptions } from '../store/util/defaultMemoizeOptions';
+import { createSelector } from '@reduxjs/toolkit';
+import { some } from 'lodash-es';
+import { canvasSelector } from '../../features/canvas/store/canvasSelectors';
+import { controlNetSelector } from '../../features/controlNet/store/controlNetSlice';
+import { selectImagesById } from '../../features/gallery/store/imagesSlice';
+import { nodesSelector } from '../../features/nodes/store/nodesSlice';
+import { generationSelector } from '../../features/parameters/store/generationSelectors';
+import { RootState } from '../store/store';
+import { useAppDispatch, useAppSelector } from '../store/storeHooks';
+import { ImageUsage } from './DeleteImageContext';
+import { requestedBoardImagesDeletion } from '../../features/gallery/store/actions';
+
+export const selectBoardImagesUsage = createSelector(
+ [
+ (state: RootState) => state,
+ generationSelector,
+ canvasSelector,
+ nodesSelector,
+ controlNetSelector,
+ (state: RootState, board_id?: string) => board_id,
+ ],
+ (state, generation, canvas, nodes, controlNet, board_id) => {
+ const initialImage = generation.initialImage
+ ? selectImagesById(state, generation.initialImage.imageName)
+ : undefined;
+ const isInitialImage = initialImage?.board_id === board_id;
+
+ const isCanvasImage = canvas.layerState.objects.some((obj) => {
+ if (obj.kind === 'image') {
+ const image = selectImagesById(state, obj.imageName);
+ return image?.board_id === board_id;
+ }
+ return false;
+ });
+
+ const isNodesImage = nodes.nodes.some((node) => {
+ return some(node.data.inputs, (input) => {
+ if (input.type === 'image' && input.value) {
+ const image = selectImagesById(state, input.value.image_name);
+ return image?.board_id === board_id;
+ }
+ return false;
+ });
+ });
+
+ const isControlNetImage = some(controlNet.controlNets, (c) => {
+ const controlImage = c.controlImage
+ ? selectImagesById(state, c.controlImage)
+ : undefined;
+ const processedControlImage = c.processedControlImage
+ ? selectImagesById(state, c.processedControlImage)
+ : undefined;
+ return (
+ controlImage?.board_id === board_id ||
+ processedControlImage?.board_id === board_id
+ );
+ });
+
+ const imageUsage: ImageUsage = {
+ isInitialImage,
+ isCanvasImage,
+ isNodesImage,
+ isControlNetImage,
+ };
+
+ return imageUsage;
+ },
+ defaultSelectorOptions
+);
+
+type DeleteBoardImagesContextValue = {
+ /**
+ * Whether the move image dialog is open.
+ */
+ isOpen: boolean;
+ /**
+ * Closes the move image dialog.
+ */
+ onClose: () => void;
+ imagesUsage?: ImageUsage;
+ board?: BoardDTO;
+ onClickDeleteBoardImages: (board: BoardDTO) => void;
+ handleDeleteBoardImages: (boardId: string) => void;
+ handleDeleteBoardOnly: (boardId: string) => void;
+};
+
+export const DeleteBoardImagesContext =
+ createContext({
+ isOpen: false,
+ onClose: () => undefined,
+ onClickDeleteBoardImages: () => undefined,
+ handleDeleteBoardImages: () => undefined,
+ handleDeleteBoardOnly: () => undefined,
+ });
+
+type Props = PropsWithChildren;
+
+export const DeleteBoardImagesContextProvider = (props: Props) => {
+ const [boardToDelete, setBoardToDelete] = useState();
+ const { isOpen, onOpen, onClose } = useDisclosure();
+ const dispatch = useAppDispatch();
+
+ // Check where the board images to be deleted are used (eg init image, controlnet, etc.)
+ const imagesUsage = useAppSelector((state) =>
+ selectBoardImagesUsage(state, boardToDelete?.board_id)
+ );
+
+ const [deleteBoard] = useDeleteBoardMutation();
+
+ // Clean up after deleting or dismissing the modal
+ const closeAndClearBoardToDelete = useCallback(() => {
+ setBoardToDelete(undefined);
+ onClose();
+ }, [onClose]);
+
+ const onClickDeleteBoardImages = useCallback(
+ (board?: BoardDTO) => {
+ console.log({ board });
+ if (!board) {
+ return;
+ }
+ setBoardToDelete(board);
+ onOpen();
+ },
+ [setBoardToDelete, onOpen]
+ );
+
+ const handleDeleteBoardImages = useCallback(
+ (boardId: string) => {
+ if (boardToDelete) {
+ dispatch(
+ requestedBoardImagesDeletion({ board: boardToDelete, imagesUsage })
+ );
+ closeAndClearBoardToDelete();
+ }
+ },
+ [dispatch, closeAndClearBoardToDelete, boardToDelete, imagesUsage]
+ );
+
+ const handleDeleteBoardOnly = useCallback(
+ (boardId: string) => {
+ if (boardToDelete) {
+ deleteBoard(boardId);
+ closeAndClearBoardToDelete();
+ }
+ },
+ [deleteBoard, closeAndClearBoardToDelete, boardToDelete]
+ );
+
+ return (
+
+ {props.children}
+
+ );
+};
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 eab5e53ad9..a36141fafc 100644
--- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts
@@ -83,6 +83,7 @@ import {
addImageRemovedFromBoardRejectedListener,
} from './listeners/imageRemovedFromBoard';
import { addReceivedOpenAPISchemaListener } from './listeners/receivedOpenAPISchema';
+import { addRequestedBoardImageDeletionListener } from './listeners/boardImagesDeleted';
export const listenerMiddleware = createListenerMiddleware();
@@ -124,6 +125,7 @@ addRequestedImageDeletionListener();
addImageDeletedPendingListener();
addImageDeletedFulfilledListener();
addImageDeletedRejectedListener();
+addRequestedBoardImageDeletionListener();
// Image metadata
addImageMetadataReceivedFulfilledListener();
@@ -198,7 +200,7 @@ addControlNetImageProcessedListener();
addControlNetAutoProcessListener();
// Update image URLs on connect
-addUpdateImageUrlsOnConnectListener();
+// addUpdateImageUrlsOnConnectListener();
// Boards
addImageAddedToBoardFulfilledListener();
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardImagesDeleted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardImagesDeleted.ts
new file mode 100644
index 0000000000..c4d3c5f0ba
--- /dev/null
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardImagesDeleted.ts
@@ -0,0 +1,79 @@
+import { requestedBoardImagesDeletion } from 'features/gallery/store/actions';
+import { startAppListening } from '..';
+import { imageSelected } from 'features/gallery/store/gallerySlice';
+import {
+ imagesRemoved,
+ selectImagesAll,
+ selectImagesById,
+} from 'features/gallery/store/imagesSlice';
+import { resetCanvas } from 'features/canvas/store/canvasSlice';
+import { controlNetReset } from 'features/controlNet/store/controlNetSlice';
+import { clearInitialImage } from 'features/parameters/store/generationSlice';
+import { nodeEditorReset } from 'features/nodes/store/nodesSlice';
+import { LIST_TAG, api } from 'services/api';
+import { boardsApi } from '../../../../../services/api/endpoints/boards';
+
+export const addRequestedBoardImageDeletionListener = () => {
+ startAppListening({
+ actionCreator: requestedBoardImagesDeletion,
+ effect: async (action, { dispatch, getState, condition }) => {
+ const { board, imagesUsage } = action.payload;
+
+ const { board_id } = board;
+
+ const state = getState();
+ const selectedImage = state.gallery.selectedImage
+ ? selectImagesById(state, state.gallery.selectedImage)
+ : undefined;
+
+ if (selectedImage && selectedImage.board_id === board_id) {
+ dispatch(imageSelected());
+ }
+
+ // We need to reset the features where the board images are in use - none of these work if their image(s) don't exist
+
+ if (imagesUsage.isCanvasImage) {
+ dispatch(resetCanvas());
+ }
+
+ if (imagesUsage.isControlNetImage) {
+ dispatch(controlNetReset());
+ }
+
+ if (imagesUsage.isInitialImage) {
+ dispatch(clearInitialImage());
+ }
+
+ if (imagesUsage.isNodesImage) {
+ dispatch(nodeEditorReset());
+ }
+
+ // Preemptively remove from gallery
+ const images = selectImagesAll(state).reduce((acc: string[], img) => {
+ if (img.board_id === board_id) {
+ acc.push(img.image_name);
+ }
+ return acc;
+ }, []);
+ dispatch(imagesRemoved(images));
+
+ // Delete from server
+ dispatch(boardsApi.endpoints.deleteBoardAndImages.initiate(board_id));
+ const result =
+ boardsApi.endpoints.deleteBoardAndImages.select(board_id)(state);
+ const { isSuccess } = result;
+
+ // Wait for successful deletion, then trigger boards to re-fetch
+ const wasBoardDeleted = await condition(() => !!isSuccess, 30000);
+
+ if (wasBoardDeleted) {
+ dispatch(
+ api.util.invalidateTags([
+ { type: 'Board', id: board_id },
+ { type: 'Image', id: LIST_TAG },
+ ])
+ );
+ }
+ },
+ });
+};
diff --git a/invokeai/frontend/web/src/common/components/IAICollapse.tsx b/invokeai/frontend/web/src/common/components/IAICollapse.tsx
index ec23793741..5db26f3841 100644
--- a/invokeai/frontend/web/src/common/components/IAICollapse.tsx
+++ b/invokeai/frontend/web/src/common/components/IAICollapse.tsx
@@ -1,6 +1,14 @@
import { ChevronUpIcon } from '@chakra-ui/icons';
-import { Box, Collapse, Flex, Spacer, Switch } from '@chakra-ui/react';
+import {
+ Box,
+ Collapse,
+ Flex,
+ Spacer,
+ Switch,
+ useColorMode,
+} from '@chakra-ui/react';
import { PropsWithChildren, memo } from 'react';
+import { mode } from 'theme/util/mode';
export type IAIToggleCollapseProps = PropsWithChildren & {
label: string;
@@ -11,6 +19,7 @@ export type IAIToggleCollapseProps = PropsWithChildren & {
const IAICollapse = (props: IAIToggleCollapseProps) => {
const { label, isOpen, onToggle, children, withSwitch = false } = props;
+ const { colorMode } = useColorMode();
return (
{
px: 4,
borderTopRadius: 'base',
borderBottomRadius: isOpen ? 0 : 'base',
- bg: isOpen ? 'base.750' : 'base.800',
- color: 'base.100',
+ bg: isOpen
+ ? mode('base.200', 'base.750')(colorMode)
+ : mode('base.150', 'base.800')(colorMode),
+ color: mode('base.900', 'base.100')(colorMode),
_hover: {
- bg: isOpen ? 'base.700' : 'base.750',
+ bg: isOpen
+ ? mode('base.250', 'base.700')(colorMode)
+ : mode('base.200', 'base.750')(colorMode),
},
fontSize: 'sm',
fontWeight: 600,
@@ -50,7 +63,13 @@ const IAICollapse = (props: IAIToggleCollapseProps) => {
)}
-
+
{children}
diff --git a/invokeai/frontend/web/src/common/components/IAIDndImage.tsx b/invokeai/frontend/web/src/common/components/IAIDndImage.tsx
index bdf22c2df1..d0652dc8b9 100644
--- a/invokeai/frontend/web/src/common/components/IAIDndImage.tsx
+++ b/invokeai/frontend/web/src/common/components/IAIDndImage.tsx
@@ -5,6 +5,7 @@ import {
Icon,
IconButtonProps,
Image,
+ useColorMode,
} from '@chakra-ui/react';
import { useDraggable, useDroppable } from '@dnd-kit/core';
import { useCombinedRefs } from '@dnd-kit/utilities';
@@ -20,6 +21,7 @@ import { v4 as uuidv4 } from 'uuid';
import IAIDropOverlay from './IAIDropOverlay';
import { PostUploadAction } from 'services/api/thunks/image';
import { useImageUploadButton } from 'common/hooks/useImageUploadButton';
+import { mode } from 'theme/util/mode';
type IAIDndImageProps = {
image: ImageDTO | null | undefined;
@@ -62,6 +64,7 @@ const IAIDndImage = (props: IAIDndImageProps) => {
} = props;
const dndId = useRef(uuidv4());
+ const { colorMode } = useColorMode();
const {
isOver,
@@ -99,10 +102,10 @@ const IAIDndImage = (props: IAIDndImageProps) => {
? {}
: {
cursor: 'pointer',
- bg: 'base.800',
+ bg: mode('base.200', 'base.800')(colorMode),
_hover: {
- bg: 'base.750',
- color: 'base.300',
+ bg: mode('base.300', 'base.650')(colorMode),
+ color: mode('base.500', 'base.300')(colorMode),
},
};
@@ -181,7 +184,7 @@ const IAIDndImage = (props: IAIDndImageProps) => {
borderRadius: 'base',
transitionProperty: 'common',
transitionDuration: '0.1s',
- color: 'base.500',
+ color: mode('base.500', 'base.500')(colorMode),
...uploadButtonStyles,
}}
{...getUploadButtonProps()}
diff --git a/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx b/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx
index 79105c00d6..8ae54c30ab 100644
--- a/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx
+++ b/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx
@@ -1,6 +1,7 @@
-import { Flex, Text } from '@chakra-ui/react';
+import { Flex, Text, useColorMode } from '@chakra-ui/react';
import { motion } from 'framer-motion';
import { memo, useRef } from 'react';
+import { mode } from 'theme/util/mode';
import { v4 as uuidv4 } from 'uuid';
type Props = {
@@ -11,6 +12,7 @@ type Props = {
export const IAIDropOverlay = (props: Props) => {
const { isOver, label = 'Drop' } = props;
const motionId = useRef(uuidv4());
+ const { colorMode } = useColorMode();
return (
{
insetInlineStart: 0,
w: 'full',
h: 'full',
- bg: 'base.900',
+ bg: mode('base.700', 'base.900')(colorMode),
opacity: 0.7,
borderRadius: 'base',
alignItems: 'center',
@@ -61,7 +63,9 @@ export const IAIDropOverlay = (props: Props) => {
h: 'full',
opacity: 1,
borderWidth: 2,
- borderColor: isOver ? 'base.200' : 'base.500',
+ borderColor: isOver
+ ? mode('base.50', 'base.200')(colorMode)
+ : mode('base.100', 'base.500')(colorMode),
borderRadius: 'base',
borderStyle: 'dashed',
transitionProperty: 'common',
@@ -75,7 +79,9 @@ export const IAIDropOverlay = (props: Props) => {
fontSize: '2xl',
fontWeight: 600,
transform: isOver ? 'scale(1.1)' : 'scale(1)',
- color: isOver ? 'base.100' : 'base.500',
+ color: isOver
+ ? mode('base.100', 'base.100')(colorMode)
+ : mode('base.200', 'base.500')(colorMode),
transitionProperty: 'common',
transitionDuration: '0.1s',
}}
diff --git a/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx b/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx
index 03a00d5b1c..4cff351aee 100644
--- a/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx
+++ b/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx
@@ -6,9 +6,10 @@ import {
IconProps,
Spinner,
SpinnerProps,
+ useColorMode,
} from '@chakra-ui/react';
-import { ReactElement } from 'react';
import { FaImage } from 'react-icons/fa';
+import { mode } from 'theme/util/mode';
type Props = FlexProps & {
spinnerProps?: SpinnerProps;
@@ -17,10 +18,11 @@ type Props = FlexProps & {
export const IAIImageLoadingFallback = (props: Props) => {
const { spinnerProps, ...rest } = props;
const { sx, ...restFlexProps } = rest;
+ const { colorMode } = useColorMode();
return (
{
const { sx: flexSx, ...restFlexProps } = props.flexProps ?? { sx: {} };
const { sx: iconSx, ...restIconProps } = props.iconProps ?? { sx: {} };
+ const { colorMode } = useColorMode();
+
return (
{
>
diff --git a/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx
index 90be25d04d..39ec6fd245 100644
--- a/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx
+++ b/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx
@@ -1,6 +1,8 @@
-import { Tooltip } from '@chakra-ui/react';
+import { Tooltip, useColorMode, useToken } from '@chakra-ui/react';
import { MultiSelect, MultiSelectProps } from '@mantine/core';
+import { useChakraThemeTokens } from 'common/hooks/useChakraThemeTokens';
import { memo } from 'react';
+import { mode } from 'theme/util/mode';
type IAIMultiSelectProps = MultiSelectProps & {
tooltip?: string;
@@ -8,71 +10,100 @@ type IAIMultiSelectProps = MultiSelectProps & {
const IAIMantineMultiSelect = (props: IAIMultiSelectProps) => {
const { searchable = true, tooltip, ...rest } = props;
+ const {
+ base50,
+ base100,
+ base200,
+ base300,
+ base400,
+ base500,
+ base600,
+ base700,
+ base800,
+ base900,
+ accent200,
+ accent300,
+ accent400,
+ accent500,
+ accent600,
+ } = useChakraThemeTokens();
+ const [boxShadow] = useToken('shadows', ['dark-lg']);
+ const { colorMode } = useColorMode();
+
return (
({
label: {
- color: 'var(--invokeai-colors-base-300)',
+ color: mode(base700, base300)(colorMode),
fontWeight: 'normal',
},
searchInput: {
- '::placeholder': {
- color: 'var(--invokeai-colors-base-700)',
+ ':placeholder': {
+ color: mode(base300, base700)(colorMode),
},
},
input: {
- backgroundColor: 'var(--invokeai-colors-base-900)',
+ backgroundColor: mode(base50, base900)(colorMode),
borderWidth: '2px',
- borderColor: 'var(--invokeai-colors-base-800)',
- color: 'var(--invokeai-colors-base-100)',
+ borderColor: mode(base200, base800)(colorMode),
+ color: mode(base900, base100)(colorMode),
paddingRight: 24,
fontWeight: 600,
- '&:hover': { borderColor: 'var(--invokeai-colors-base-700)' },
+ '&:hover': { borderColor: mode(base300, base600)(colorMode) },
'&:focus': {
- borderColor: 'var(--invokeai-colors-accent-600)',
+ borderColor: mode(accent300, accent600)(colorMode),
+ },
+ '&:is(:focus, :hover)': {
+ borderColor: mode(base400, base500)(colorMode),
},
'&:focus-within': {
- borderColor: 'var(--invokeai-colors-accent-600)',
+ borderColor: mode(accent200, accent600)(colorMode),
+ },
+ '&:disabled': {
+ backgroundColor: mode(base300, base700)(colorMode),
+ color: mode(base600, base400)(colorMode),
},
},
value: {
- backgroundColor: 'var(--invokeai-colors-base-800)',
- color: 'var(--invokeai-colors-base-100)',
+ backgroundColor: mode(base200, base800)(colorMode),
+ color: mode(base900, base100)(colorMode),
button: {
- color: 'var(--invokeai-colors-base-100)',
+ color: mode(base900, base100)(colorMode),
},
'&:hover': {
- backgroundColor: 'var(--invokeai-colors-base-700)',
+ backgroundColor: mode(base300, base700)(colorMode),
cursor: 'pointer',
},
},
dropdown: {
- backgroundColor: 'var(--invokeai-colors-base-800)',
- borderColor: 'var(--invokeai-colors-base-700)',
+ backgroundColor: mode(base200, base800)(colorMode),
+ borderColor: mode(base200, base800)(colorMode),
+ boxShadow,
},
item: {
- backgroundColor: 'var(--invokeai-colors-base-800)',
- color: 'var(--invokeai-colors-base-200)',
+ backgroundColor: mode(base200, base800)(colorMode),
+ color: mode(base800, base200)(colorMode),
padding: 6,
'&[data-hovered]': {
- color: 'var(--invokeai-colors-base-100)',
- backgroundColor: 'var(--invokeai-colors-base-750)',
+ color: mode(base900, base100)(colorMode),
+ backgroundColor: mode(base300, base700)(colorMode),
},
'&[data-active]': {
- backgroundColor: 'var(--invokeai-colors-base-750)',
+ backgroundColor: mode(base300, base700)(colorMode),
'&:hover': {
- color: 'var(--invokeai-colors-base-100)',
- backgroundColor: 'var(--invokeai-colors-base-750)',
+ color: mode(base900, base100)(colorMode),
+ backgroundColor: mode(base300, base700)(colorMode),
},
},
'&[data-selected]': {
- color: 'var(--invokeai-colors-base-50)',
- backgroundColor: 'var(--invokeai-colors-accent-650)',
+ backgroundColor: mode(accent400, accent600)(colorMode),
+ color: mode(base50, base100)(colorMode),
fontWeight: 600,
'&:hover': {
- backgroundColor: 'var(--invokeai-colors-accent-600)',
+ backgroundColor: mode(accent500, accent500)(colorMode),
+ color: mode('white', base50)(colorMode),
},
},
},
@@ -80,7 +111,7 @@ const IAIMantineMultiSelect = (props: IAIMultiSelectProps) => {
width: 24,
padding: 20,
button: {
- color: 'var(--invokeai-colors-base-100)',
+ color: mode(base900, base100)(colorMode),
},
},
})}
diff --git a/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx
index 5f02140904..9b023fd2d7 100644
--- a/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx
+++ b/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx
@@ -1,6 +1,8 @@
-import { Tooltip } from '@chakra-ui/react';
+import { Tooltip, useColorMode, useToken } from '@chakra-ui/react';
import { Select, SelectProps } from '@mantine/core';
+import { useChakraThemeTokens } from 'common/hooks/useChakraThemeTokens';
import { memo } from 'react';
+import { mode } from 'theme/util/mode';
export type IAISelectDataType = {
value: string;
@@ -14,61 +16,105 @@ type IAISelectProps = SelectProps & {
const IAIMantineSelect = (props: IAISelectProps) => {
const { searchable = true, tooltip, ...rest } = props;
+ const {
+ base50,
+ base100,
+ base200,
+ base300,
+ base400,
+ base500,
+ base600,
+ base700,
+ base800,
+ base900,
+ accent200,
+ accent300,
+ accent400,
+ accent500,
+ accent600,
+ } = useChakraThemeTokens();
+
+ const { colorMode } = useColorMode();
+
+ const [boxShadow] = useToken('shadows', ['dark-lg']);
+
return (
{
return (
diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/DeleteBoardImagesModal.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/DeleteBoardImagesModal.tsx
new file mode 100644
index 0000000000..736d72f862
--- /dev/null
+++ b/invokeai/frontend/web/src/features/gallery/components/Boards/DeleteBoardImagesModal.tsx
@@ -0,0 +1,114 @@
+import {
+ AlertDialog,
+ AlertDialogBody,
+ AlertDialogContent,
+ AlertDialogFooter,
+ AlertDialogHeader,
+ AlertDialogOverlay,
+ Divider,
+ Flex,
+ ListItem,
+ Text,
+ UnorderedList,
+} from '@chakra-ui/react';
+import IAIButton from 'common/components/IAIButton';
+import { memo, useContext, useRef } from 'react';
+import { useTranslation } from 'react-i18next';
+import { DeleteBoardImagesContext } from '../../../../app/contexts/DeleteBoardImagesContext';
+import { some } from 'lodash-es';
+import { ImageUsage } from '../../../../app/contexts/DeleteImageContext';
+
+const BoardImageInUseMessage = (props: { imagesUsage?: ImageUsage }) => {
+ const { imagesUsage } = props;
+
+ if (!imagesUsage) {
+ return null;
+ }
+
+ if (!some(imagesUsage)) {
+ return null;
+ }
+
+ return (
+ <>
+
+ An image from this board is currently in use in the following features:
+
+
+ {imagesUsage.isInitialImage && Image to Image}
+ {imagesUsage.isCanvasImage && Unified Canvas}
+ {imagesUsage.isControlNetImage && ControlNet}
+ {imagesUsage.isNodesImage && Node Editor}
+
+
+ If you delete images from this board, those features will immediately be
+ reset.
+
+ >
+ );
+};
+
+const DeleteBoardImagesModal = () => {
+ const { t } = useTranslation();
+
+ const {
+ isOpen,
+ onClose,
+ board,
+ handleDeleteBoardImages,
+ handleDeleteBoardOnly,
+ imagesUsage,
+ } = useContext(DeleteBoardImagesContext);
+
+ const cancelRef = useRef(null);
+
+ return (
+
+
+ {board && (
+
+
+ Delete Board
+
+
+
+
+
+
+ {t('common.areYouSure')}
+
+ This board has {board.image_count} image(s) that will be
+ deleted.
+
+
+
+
+
+ Cancel
+
+ handleDeleteBoardOnly(board.board_id)}
+ >
+ Delete Board Only
+
+ handleDeleteBoardImages(board.board_id)}
+ >
+ Delete Board and Images
+
+
+
+ )}
+
+
+ );
+};
+
+export default memo(DeleteBoardImagesModal);
diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/HoverableBoard.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/HoverableBoard.tsx
index ba43f792bf..118484f305 100644
--- a/invokeai/frontend/web/src/features/gallery/components/Boards/HoverableBoard.tsx
+++ b/invokeai/frontend/web/src/features/gallery/components/Boards/HoverableBoard.tsx
@@ -8,10 +8,11 @@ import {
Image,
MenuItem,
MenuList,
+ useColorMode,
} from '@chakra-ui/react';
import { useAppDispatch } from 'app/store/storeHooks';
-import { memo, useCallback } from 'react';
+import { memo, useCallback, useContext } from 'react';
import { FaFolder, FaTrash } from 'react-icons/fa';
import { ContextMenu } from 'chakra-ui-contextmenu';
import { BoardDTO, ImageDTO } from 'services/api/types';
@@ -29,6 +30,8 @@ import { useDroppable } from '@dnd-kit/core';
import { AnimatePresence } from 'framer-motion';
import IAIDropOverlay from 'common/components/IAIDropOverlay';
import { SelectedItemOverlay } from '../SelectedItemOverlay';
+import { DeleteBoardImagesContext } from '../../../../app/contexts/DeleteBoardImagesContext';
+import { mode } from 'theme/util/mode';
interface HoverableBoardProps {
board: BoardDTO;
@@ -42,8 +45,12 @@ const HoverableBoard = memo(({ board, isSelected }: HoverableBoardProps) => {
board.cover_image_name ?? skipToken
);
+ const { colorMode } = useColorMode();
+
const { board_name, board_id } = board;
+ const { onClickDeleteBoardImages } = useContext(DeleteBoardImagesContext);
+
const handleSelectBoard = useCallback(() => {
dispatch(boardIdSelected(board_id));
}, [board_id, dispatch]);
@@ -65,6 +72,11 @@ const HoverableBoard = memo(({ board, isSelected }: HoverableBoardProps) => {
deleteBoard(board_id);
}, [board_id, deleteBoard]);
+ const handleDeleteBoardAndImages = useCallback(() => {
+ console.log({ board });
+ onClickDeleteBoardImages(board);
+ }, [board, onClickDeleteBoardImages]);
+
const handleDrop = useCallback(
(droppedImage: ImageDTO) => {
if (droppedImage.board_id === board_id) {
@@ -92,8 +104,17 @@ const HoverableBoard = memo(({ board, isSelected }: HoverableBoardProps) => {
menuProps={{ size: 'sm', isLazy: true }}
renderMenu={() => (
+ {board.image_count > 0 && (
+ }
+ onClickCapture={handleDeleteBoardAndImages}
+ >
+ Delete Board and Images
+
+ )}
}
onClickCapture={handleDeleteBoard}
>
@@ -163,7 +184,9 @@ const HoverableBoard = memo(({ board, isSelected }: HoverableBoardProps) => {
>
{
/>
{
height: '100%',
width: '100%',
rowGap: 4,
- borderRadius: 'base',
alignItems: 'center',
justifyContent: 'center',
}}
diff --git a/invokeai/frontend/web/src/features/gallery/components/GalleryPanel.tsx b/invokeai/frontend/web/src/features/gallery/components/GalleryPanel.tsx
index f4bfee3ae1..9ab8ccb5c9 100644
--- a/invokeai/frontend/web/src/features/gallery/components/GalleryPanel.tsx
+++ b/invokeai/frontend/web/src/features/gallery/components/GalleryPanel.tsx
@@ -120,7 +120,7 @@ const GalleryDrawer = () => {
isResizable={true}
isOpen={shouldShowGallery}
onClose={handleCloseGallery}
- minWidth={200}
+ minWidth={337}
>
diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx
index 24a89604e1..a22eb6d20f 100644
--- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx
+++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx
@@ -9,6 +9,7 @@ import {
Text,
VStack,
forwardRef,
+ useColorMode,
useDisclosure,
} from '@chakra-ui/react';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
@@ -61,6 +62,7 @@ import BoardsList from './Boards/BoardsList';
import { boardsSelector } from '../store/boardSlice';
import { ChevronUpIcon } from '@chakra-ui/icons';
import { useListAllBoardsQuery } from 'services/api/endpoints/boards';
+import { mode } from 'theme/util/mode';
const itemSelector = createSelector(
[(state: RootState) => state],
@@ -135,6 +137,8 @@ const ImageGalleryContent = () => {
},
});
+ const { colorMode } = useColorMode();
+
const {
shouldPinGallery,
galleryImageMinimumWidth,
@@ -267,13 +271,17 @@ const ImageGalleryContent = () => {
alignItems: 'center',
px: 2,
_hover: {
- bg: 'base.800',
+ bg: mode('base.100', 'base.800')(colorMode),
},
}}
>
{selectedBoard ? selectedBoard.board_name : 'All Images'}
diff --git a/invokeai/frontend/web/src/features/gallery/components/SelectedItemOverlay.tsx b/invokeai/frontend/web/src/features/gallery/components/SelectedItemOverlay.tsx
index 7038b4b64f..3fabe706d6 100644
--- a/invokeai/frontend/web/src/features/gallery/components/SelectedItemOverlay.tsx
+++ b/invokeai/frontend/web/src/features/gallery/components/SelectedItemOverlay.tsx
@@ -1,26 +1,40 @@
+import { useColorMode, useToken } from '@chakra-ui/react';
import { motion } from 'framer-motion';
+import { mode } from 'theme/util/mode';
-export const SelectedItemOverlay = () => (
-
-);
+export const SelectedItemOverlay = () => {
+ const [accent400, accent500] = useToken('colors', [
+ 'accent.400',
+ 'accent.500',
+ ]);
+
+ const { colorMode } = useColorMode();
+
+ return (
+
+ );
+};
diff --git a/invokeai/frontend/web/src/features/gallery/store/actions.ts b/invokeai/frontend/web/src/features/gallery/store/actions.ts
index aa767b1422..4234778120 100644
--- a/invokeai/frontend/web/src/features/gallery/store/actions.ts
+++ b/invokeai/frontend/web/src/features/gallery/store/actions.ts
@@ -1,6 +1,6 @@
import { createAction } from '@reduxjs/toolkit';
import { ImageUsage } from 'app/contexts/DeleteImageContext';
-import { ImageDTO } from 'services/api/types';
+import { ImageDTO, BoardDTO } from 'services/api/types';
export type RequestedImageDeletionArg = {
image: ImageDTO;
@@ -11,6 +11,16 @@ export const requestedImageDeletion = createAction(
'gallery/requestedImageDeletion'
);
+export type RequestedBoardImagesDeletionArg = {
+ board: BoardDTO;
+ imagesUsage: ImageUsage;
+};
+
+export const requestedBoardImagesDeletion =
+ createAction(
+ 'gallery/requestedBoardImagesDeletion'
+ );
+
export const sentImageToCanvas = createAction('gallery/sentImageToCanvas');
export const sentImageToImg2Img = createAction('gallery/sentImageToImg2Img');
diff --git a/invokeai/frontend/web/src/features/gallery/store/imagesSlice.ts b/invokeai/frontend/web/src/features/gallery/store/imagesSlice.ts
index 4bdaa796cd..8041ffd5c5 100644
--- a/invokeai/frontend/web/src/features/gallery/store/imagesSlice.ts
+++ b/invokeai/frontend/web/src/features/gallery/store/imagesSlice.ts
@@ -60,6 +60,9 @@ const imagesSlice = createSlice({
imageRemoved: (state, action: PayloadAction) => {
imagesAdapter.removeOne(state, action.payload);
},
+ imagesRemoved: (state, action: PayloadAction) => {
+ imagesAdapter.removeMany(state, action.payload);
+ },
imageCategoriesChanged: (state, action: PayloadAction) => {
state.categories = action.payload;
},
@@ -117,6 +120,7 @@ export const {
imageUpserted,
imageUpdatedOne,
imageRemoved,
+ imagesRemoved,
imageCategoriesChanged,
} = imagesSlice.actions;
diff --git a/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeHeader.tsx b/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeHeader.tsx
index f944c6e463..74b883b1d6 100644
--- a/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeHeader.tsx
+++ b/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeHeader.tsx
@@ -12,15 +12,25 @@ const IAINodeHeader = (props: IAINodeHeaderProps) => {
const { nodeId, template } = props;
return (
-
+
{template.title}
@@ -30,7 +40,16 @@ const IAINodeHeader = (props: IAINodeHeaderProps) => {
hasArrow
shouldWrapChildren
>
-
+
);
diff --git a/invokeai/frontend/web/src/features/nodes/components/InvocationComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/InvocationComponent.tsx
index 909fd4b556..fc3a6377b2 100644
--- a/invokeai/frontend/web/src/features/nodes/components/InvocationComponent.tsx
+++ b/invokeai/frontend/web/src/features/nodes/components/InvocationComponent.tsx
@@ -72,7 +72,14 @@ export const InvocationComponent = memo((props: NodeProps) => {
return (
-
+
@@ -86,8 +93,9 @@ export const InvocationComponent = memo((props: NodeProps) => {
sx={{
flexDirection: 'column',
borderBottomRadius: 'md',
- bg: 'base.800',
py: 2,
+ bg: 'base.200',
+ _dark: { bg: 'base.800' },
}}
>
diff --git a/invokeai/frontend/web/src/features/nodes/components/NodeEditor.tsx b/invokeai/frontend/web/src/features/nodes/components/NodeEditor.tsx
index 05f8c2a893..2be98b1cb9 100644
--- a/invokeai/frontend/web/src/features/nodes/components/NodeEditor.tsx
+++ b/invokeai/frontend/web/src/features/nodes/components/NodeEditor.tsx
@@ -8,12 +8,12 @@ import { memo } from 'react';
const NodeEditor = () => {
return (
diff --git a/invokeai/frontend/web/src/features/nodes/components/NodeGraphOverlay.tsx b/invokeai/frontend/web/src/features/nodes/components/NodeGraphOverlay.tsx
index ef6f89bed0..1d498f19f5 100644
--- a/invokeai/frontend/web/src/features/nodes/components/NodeGraphOverlay.tsx
+++ b/invokeai/frontend/web/src/features/nodes/components/NodeGraphOverlay.tsx
@@ -11,17 +11,20 @@ const NodeGraphOverlay = () => {
return (
{JSON.stringify(graph, null, 2)}
diff --git a/invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx b/invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx
index 2d76e2911f..1ad4cc78ce 100644
--- a/invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx
+++ b/invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx
@@ -1,15 +1,25 @@
-import { RootState } from 'app/store/store';
-import { useAppSelector } from 'app/store/storeHooks';
-import { CSSProperties, memo } from 'react';
+import { useColorModeValue } from '@chakra-ui/react';
+import { memo } from 'react';
import { MiniMap } from 'reactflow';
-const MinimapStyle: CSSProperties = {
- background: 'var(--invokeai-colors-base-500)',
-};
-
const MinimapPanel = () => {
- const currentTheme = useAppSelector(
- (state: RootState) => state.ui.currentTheme
+ const miniMapStyle = useColorModeValue(
+ {
+ background: 'var(--invokeai-colors-base-200)',
+ },
+ {
+ background: 'var(--invokeai-colors-base-500)',
+ }
+ );
+
+ const nodeColor = useColorModeValue(
+ 'var(--invokeai-colors-accent-300)',
+ 'var(--invokeai-colors-accent-700)'
+ );
+
+ const maskColor = useColorModeValue(
+ 'var(--invokeai-colors-blackAlpha-300)',
+ 'var(--invokeai-colors-blackAlpha-600)'
);
return (
@@ -18,15 +28,9 @@ const MinimapPanel = () => {
pannable
zoomable
nodeBorderRadius={30}
- style={MinimapStyle}
- nodeColor={
- currentTheme === 'light'
- ? 'var(--invokeai-colors-accent-700)'
- : currentTheme === 'green'
- ? 'var(--invokeai-colors-accent-600)'
- : 'var(--invokeai-colors-accent-700)'
- }
- maskColor="var(--invokeai-colors-base-700)"
+ style={miniMapStyle}
+ nodeColor={nodeColor}
+ maskColor={maskColor}
/>
);
};
diff --git a/invokeai/frontend/web/src/features/nodes/types/types.ts b/invokeai/frontend/web/src/features/nodes/types/types.ts
index 6309d34b01..3faf2f9653 100644
--- a/invokeai/frontend/web/src/features/nodes/types/types.ts
+++ b/invokeai/frontend/web/src/features/nodes/types/types.ts
@@ -333,7 +333,7 @@ export type TypeHints = {
};
export type InvocationSchemaExtra = {
- output: OpenAPIV3.SchemaObject; // the output of the invocation
+ output: OpenAPIV3.ReferenceObject; // the output of the invocation
ui?: {
tags?: string[];
type_hints?: TypeHints;
diff --git a/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts b/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts
index 8f475ec708..f1ad731d32 100644
--- a/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts
@@ -349,11 +349,21 @@ export const getFieldType = (
if (typeHints && name in typeHints) {
rawFieldType = typeHints[name];
- } else if (!schemaObject.type && schemaObject.allOf) {
- // if schemaObject has no type, then it should have one of allOf
- rawFieldType =
- (schemaObject.allOf[0] as OpenAPIV3.SchemaObject).title ??
- 'Missing Field Type';
+ } else if (!schemaObject.type) {
+ // if schemaObject has no type, then it should have one of allOf, anyOf, oneOf
+ if (schemaObject.allOf) {
+ rawFieldType = refObjectToFieldType(
+ schemaObject.allOf![0] as OpenAPIV3.ReferenceObject
+ );
+ } else if (schemaObject.anyOf) {
+ rawFieldType = refObjectToFieldType(
+ schemaObject.anyOf![0] as OpenAPIV3.ReferenceObject
+ );
+ } else if (schemaObject.oneOf) {
+ rawFieldType = refObjectToFieldType(
+ schemaObject.oneOf![0] as OpenAPIV3.ReferenceObject
+ );
+ }
} else if (schemaObject.enum) {
rawFieldType = 'enum';
} else if (schemaObject.type) {
diff --git a/invokeai/frontend/web/src/features/nodes/util/parseSchema.ts b/invokeai/frontend/web/src/features/nodes/util/parseSchema.ts
index 623002f3dd..c77fdeca5e 100644
--- a/invokeai/frontend/web/src/features/nodes/util/parseSchema.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/parseSchema.ts
@@ -5,154 +5,127 @@ import {
InputFieldTemplate,
InvocationSchemaObject,
InvocationTemplate,
+ isInvocationSchemaObject,
OutputFieldTemplate,
} from '../types/types';
-import { buildInputFieldTemplate, getFieldType } from './fieldTemplateBuilders';
-import { O } from 'ts-toolbelt';
-
-// recursively exclude all properties of type U from T
-type DeepExclude = T extends U
- ? never
- : T extends object
- ? {
- [K in keyof T]: DeepExclude;
- }
- : T;
-
-// The schema from swagger-parser is dereferenced, and we know `components` and `components.schemas` exist
-type DereferencedOpenAPIDocument = DeepExclude<
- O.Required,
- OpenAPIV3.ReferenceObject
->;
+import {
+ buildInputFieldTemplate,
+ buildOutputFieldTemplates,
+} from './fieldTemplateBuilders';
const RESERVED_FIELD_NAMES = ['id', 'type', 'is_intermediate'];
const invocationDenylist = ['Graph', 'InvocationMeta'];
-const nodeFilter = (
- schema: DereferencedOpenAPIDocument['components']['schemas'][string],
- key: string
-) =>
- key.includes('Invocation') &&
- !key.includes('InvocationOutput') &&
- !invocationDenylist.some((denylistItem) => key.includes(denylistItem));
-
-export const parseSchema = (openAPI: DereferencedOpenAPIDocument) => {
+export const parseSchema = (openAPI: OpenAPIV3.Document) => {
// filter out non-invocation schemas, plus some tricky invocations for now
- const filteredSchemas = filter(openAPI.components.schemas, nodeFilter);
+ const filteredSchemas = filter(
+ openAPI.components!.schemas,
+ (schema, key) =>
+ key.includes('Invocation') &&
+ !key.includes('InvocationOutput') &&
+ !invocationDenylist.some((denylistItem) => key.includes(denylistItem))
+ ) as (OpenAPIV3.ReferenceObject | InvocationSchemaObject)[];
const invocations = filteredSchemas.reduce<
Record
- >((acc, s) => {
- // cast to InvocationSchemaObject, we know the shape
- const schema = s as InvocationSchemaObject;
+ >((acc, schema) => {
+ // only want SchemaObjects
+ if (isInvocationSchemaObject(schema)) {
+ const type = schema.properties.type.default;
- const type = schema.properties.type.default;
+ const title = schema.ui?.title ?? schema.title.replace('Invocation', '');
- const title = schema.ui?.title ?? schema.title.replace('Invocation', '');
+ const typeHints = schema.ui?.type_hints;
- const typeHints = schema.ui?.type_hints;
+ const inputs: Record = {};
- const inputs: Record = {};
-
- if (type === 'collect') {
- // Special handling for the Collect node
- const itemProperty = schema.properties['item'] as InvocationSchemaObject;
- inputs.item = {
- type: 'item',
- name: 'item',
- description: itemProperty.description ?? '',
- title: 'Collection Item',
- inputKind: 'connection',
- inputRequirement: 'always',
- default: undefined,
- };
- } else if (type === 'iterate') {
- // Special handling for the Iterate node
- const itemProperty = schema.properties[
- 'collection'
- ] as InvocationSchemaObject;
-
- inputs.collection = {
- type: 'array',
- name: 'collection',
- title: itemProperty.title ?? '',
- default: [],
- description: itemProperty.description ?? '',
- inputRequirement: 'always',
- inputKind: 'connection',
- };
- } else {
- // All other nodes
- reduce(
- schema.properties,
- (inputsAccumulator, property, propertyName) => {
- if (
- // `type` and `id` are not valid inputs/outputs
- !RESERVED_FIELD_NAMES.includes(propertyName) &&
- isSchemaObject(property)
- ) {
- const field: InputFieldTemplate | undefined =
- buildInputFieldTemplate(property, propertyName, typeHints);
-
- if (field) {
- inputsAccumulator[propertyName] = field;
- }
- }
- return inputsAccumulator;
- },
- inputs
- );
- }
-
- let outputs: Record;
-
- if (type === 'iterate') {
- // Special handling for the Iterate node output
- const iterationOutput =
- openAPI.components.schemas['IterateInvocationOutput'];
-
- outputs = {
- item: {
+ if (type === 'collect') {
+ const itemProperty = schema.properties[
+ 'item'
+ ] as InvocationSchemaObject;
+ // Handle the special Collect node
+ inputs.item = {
+ type: 'item',
name: 'item',
- title: iterationOutput.title ?? '',
- description: iterationOutput.description ?? '',
+ description: itemProperty.description ?? '',
+ title: 'Collection Item',
+ inputKind: 'connection',
+ inputRequirement: 'always',
+ default: undefined,
+ };
+ } else if (type === 'iterate') {
+ const itemProperty = schema.properties[
+ 'collection'
+ ] as InvocationSchemaObject;
+
+ inputs.collection = {
type: 'array',
- },
+ name: 'collection',
+ title: itemProperty.title ?? '',
+ default: [],
+ description: itemProperty.description ?? '',
+ inputRequirement: 'always',
+ inputKind: 'connection',
+ };
+ } else {
+ // All other nodes
+ reduce(
+ schema.properties,
+ (inputsAccumulator, property, propertyName) => {
+ if (
+ // `type` and `id` are not valid inputs/outputs
+ !RESERVED_FIELD_NAMES.includes(propertyName) &&
+ isSchemaObject(property)
+ ) {
+ const field: InputFieldTemplate | undefined =
+ buildInputFieldTemplate(property, propertyName, typeHints);
+
+ if (field) {
+ inputsAccumulator[propertyName] = field;
+ }
+ }
+ return inputsAccumulator;
+ },
+ inputs
+ );
+ }
+
+ const rawOutput = (schema as InvocationSchemaObject).output;
+
+ let outputs: Record;
+
+ // some special handling is needed for collect, iterate and range nodes
+ if (type === 'iterate') {
+ // this is guaranteed to be a SchemaObject
+ const iterationOutput = openAPI.components!.schemas![
+ 'IterateInvocationOutput'
+ ] as OpenAPIV3.SchemaObject;
+
+ outputs = {
+ item: {
+ name: 'item',
+ title: iterationOutput.title ?? '',
+ description: iterationOutput.description ?? '',
+ type: 'array',
+ },
+ };
+ } else {
+ outputs = buildOutputFieldTemplates(rawOutput, openAPI, typeHints);
+ }
+
+ const invocation: InvocationTemplate = {
+ title,
+ type,
+ tags: schema.ui?.tags ?? [],
+ description: schema.description ?? '',
+ inputs,
+ outputs,
};
- } else {
- // All other node outputs
- outputs = reduce(
- schema.output.properties as OpenAPIV3.SchemaObject,
- (outputsAccumulator, property, propertyName) => {
- if (!['type', 'id'].includes(propertyName)) {
- const fieldType = getFieldType(property, propertyName, typeHints);
- outputsAccumulator[propertyName] = {
- name: propertyName,
- title: property.title ?? '',
- description: property.description ?? '',
- type: fieldType,
- };
- }
-
- return outputsAccumulator;
- },
- {} as Record
- );
+ Object.assign(acc, { [type]: invocation });
}
- const invocation: InvocationTemplate = {
- title,
- type,
- tags: schema.ui?.tags ?? [],
- description: schema.description ?? '',
- inputs,
- outputs,
- };
-
- Object.assign(acc, { [type]: invocation });
-
return acc;
}, {});
diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImageDisplay.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImageDisplay.tsx
index 64974f0d35..19eb45a0a9 100644
--- a/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImageDisplay.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImageDisplay.tsx
@@ -4,17 +4,17 @@ import InitialImagePreview from './InitialImagePreview';
const InitialImageDisplay = () => {
return (
+ props: CancelButtonProps & Omit
) => {
const dispatch = useAppDispatch();
const { btnGroupWidth = 'auto', ...rest } = props;
@@ -145,6 +144,7 @@ const CancelButton = (
paddingY={0}
colorScheme="error"
minWidth={5}
+ {...rest}
/>
{
+ const { colorMode, toggleColorMode } = useColorMode();
+ const { t } = useTranslation();
+
+ return (
+
+ ) : (
+
+ )
+ }
+ onClick={toggleColorMode}
+ variant="link"
+ />
+ );
+};
+
+export default ColorModeButton;
diff --git a/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx b/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx
index dfba1da4ef..c9508bb5fe 100644
--- a/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx
+++ b/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx
@@ -1,5 +1,4 @@
import {
- ChakraProps,
Flex,
Heading,
Modal,
@@ -39,6 +38,7 @@ import { UIState } from 'features/ui/store/uiTypes';
import { isEqual } from 'lodash-es';
import {
ChangeEvent,
+ PropsWithChildren,
ReactElement,
cloneElement,
useCallback,
@@ -83,14 +83,6 @@ const selector = createSelector(
}
);
-const modalSectionStyles: ChakraProps['sx'] = {
- flexDirection: 'column',
- gap: 2,
- p: 4,
- bg: 'base.900',
- borderRadius: 'base',
-};
-
type ConfigOptions = {
shouldShowDeveloperSettings: boolean;
shouldShowResetWebUiText: boolean;
@@ -183,12 +175,12 @@ const SettingsModal = ({ children, config }: SettingsModalProps) => {
isCentered
>
-
+
{t('common.settingsLabel')}
-
+
{t('settings.general')}
{
dispatch(setShouldConfirmOnDelete(e.target.checked))
}
/>
-
+
-
+
{t('settings.generation')}
-
+
-
+
{t('settings.ui')}
{
)
}
/>
-
+
{shouldShowDeveloperSettings && (
-
+
{t('settings.developer')}
{
dispatch(setEnableImageDebugging(e.target.checked))
}
/>
-
+
)}
-
+
{t('settings.resetWebUI')}
{t('settings.resetWebUI')}
@@ -283,7 +275,7 @@ const SettingsModal = ({ children, config }: SettingsModalProps) => {
{t('settings.resetWebUIDesc2')}
>
)}
-
+
@@ -319,3 +311,19 @@ const SettingsModal = ({ children, config }: SettingsModalProps) => {
};
export default SettingsModal;
+
+const StyledFlex = (props: PropsWithChildren) => {
+ return (
+
+ {props.children}
+
+ );
+};
diff --git a/invokeai/frontend/web/src/features/system/components/SiteHeader.tsx b/invokeai/frontend/web/src/features/system/components/SiteHeader.tsx
index 66a2de325e..0c94c1d2f9 100644
--- a/invokeai/frontend/web/src/features/system/components/SiteHeader.tsx
+++ b/invokeai/frontend/web/src/features/system/components/SiteHeader.tsx
@@ -12,8 +12,8 @@ import InvokeAILogoComponent from './InvokeAILogoComponent';
import LanguagePicker from './LanguagePicker';
import ModelManagerModal from './ModelManager/ModelManagerModal';
import SettingsModal from './SettingsModal/SettingsModal';
-import ThemeChanger from './ThemeChanger';
import { useFeatureStatus } from '../hooks/useFeatureStatus';
+import ColorModeButton from './ColorModeButton';
const SiteHeader = () => {
const { t } = useTranslation();
@@ -63,8 +63,6 @@ const SiteHeader = () => {
/>
-
-
{isLocalizationEnabled && }
{isBugLinkEnabled && (
@@ -121,6 +119,8 @@ const SiteHeader = () => {
)}
+
+
{
/>
-
-
{isLocalizationEnabled && }
{isBugLinkEnabled && (
diff --git a/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx b/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx
index cd0a4eacc3..c5945140c3 100644
--- a/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx
+++ b/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx
@@ -35,6 +35,18 @@ const statusIndicatorSelector = createSelector(
defaultSelectorOptions
);
+const DARK_COLOR_MAP = {
+ ok: 'green.400',
+ working: 'yellow.400',
+ error: 'red.400',
+};
+
+const LIGHT_COLOR_MAP = {
+ ok: 'green.600',
+ working: 'yellow.500',
+ error: 'red.500',
+};
+
const StatusIndicator = () => {
const {
isConnected,
@@ -46,7 +58,7 @@ const StatusIndicator = () => {
const { t } = useTranslation();
const ref = useRef(null);
- const statusColorScheme = useMemo(() => {
+ const statusString = useMemo(() => {
if (isProcessing) {
return 'working';
}
@@ -90,9 +102,10 @@ const StatusIndicator = () => {
sx={{
fontSize: 'sm',
fontWeight: '600',
- color: `${statusColorScheme}.400`,
pb: '1px',
userSelect: 'none',
+ color: LIGHT_COLOR_MAP[statusString],
+ _dark: { color: DARK_COLOR_MAP[statusString] },
}}
>
{t(statusTranslationKey as ResourceKey)}
@@ -101,7 +114,14 @@ const StatusIndicator = () => {
)}
-
+
);
};
diff --git a/invokeai/frontend/web/src/features/system/components/ThemeChanger.tsx b/invokeai/frontend/web/src/features/system/components/ThemeChanger.tsx
deleted file mode 100644
index d9426eecf2..0000000000
--- a/invokeai/frontend/web/src/features/system/components/ThemeChanger.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import {
- IconButton,
- Menu,
- MenuButton,
- MenuItemOption,
- MenuList,
- MenuOptionGroup,
- Tooltip,
-} from '@chakra-ui/react';
-import { RootState } from 'app/store/store';
-import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
-import { setCurrentTheme } from 'features/ui/store/uiSlice';
-import i18n from 'i18n';
-import { map } from 'lodash-es';
-import { useTranslation } from 'react-i18next';
-import { FaPalette } from 'react-icons/fa';
-
-export const THEMES = {
- dark: i18n.t('common.darkTheme'),
- light: i18n.t('common.lightTheme'),
- green: i18n.t('common.greenTheme'),
- ocean: i18n.t('common.oceanTheme'),
-};
-
-export default function ThemeChanger() {
- const { t } = useTranslation();
-
- const dispatch = useAppDispatch();
- const currentTheme = useAppSelector(
- (state: RootState) => state.ui.currentTheme
- );
-
- return (
-
- );
-}
diff --git a/invokeai/frontend/web/src/features/ui/components/FloatingGalleryButton.tsx b/invokeai/frontend/web/src/features/ui/components/FloatingGalleryButton.tsx
index c816c9b39e..3e2c2153e6 100644
--- a/invokeai/frontend/web/src/features/ui/components/FloatingGalleryButton.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/FloatingGalleryButton.tsx
@@ -51,6 +51,7 @@ const FloatingGalleryButton = () => {
w: 8,
borderStartEndRadius: 0,
borderEndEndRadius: 0,
+ shadow: '2xl',
}}
>
diff --git a/invokeai/frontend/web/src/features/ui/components/FloatingParametersPanelButtons.tsx b/invokeai/frontend/web/src/features/ui/components/FloatingParametersPanelButtons.tsx
index 4f4995ffa7..0969426339 100644
--- a/invokeai/frontend/web/src/features/ui/components/FloatingParametersPanelButtons.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/FloatingParametersPanelButtons.tsx
@@ -19,6 +19,7 @@ import { FaSlidersH } from 'react-icons/fa';
const floatingButtonStyles: ChakraProps['sx'] = {
borderStartStartRadius: 0,
borderEndStartRadius: 0,
+ shadow: '2xl',
};
export const floatingParametersPanelButtonSelector = createSelector(
diff --git a/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx b/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx
index 420212fbd1..6bbeedcaaa 100644
--- a/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx
@@ -36,6 +36,7 @@ import { FaFont, FaImage } from 'react-icons/fa';
import ResizeHandle from './tabs/ResizeHandle';
import ImageTab from './tabs/ImageToImage/ImageToImageTab';
import AuxiliaryProgressIndicator from 'app/components/AuxiliaryProgressIndicator';
+import { useMinimumPanelSize } from '../hooks/useMinimumPanelSize';
export interface InvokeTabInfo {
id: InvokeTabName;
@@ -78,6 +79,9 @@ const enabledTabsSelector = createSelector(
}
);
+const MIN_GALLERY_WIDTH = 300;
+const DEFAULT_GALLERY_PCT = 20;
+
const InvokeTabs = () => {
const activeTab = useAppSelector(activeTabIndexSelector);
const activeTabName = useAppSelector(activeTabNameSelector);
@@ -150,6 +154,9 @@ const InvokeTabs = () => {
[enabledTabs]
);
+ const { ref: galleryPanelRef, minSizePct: galleryMinSizePct } =
+ useMinimumPanelSize(MIN_GALLERY_WIDTH, DEFAULT_GALLERY_PCT, 'app');
+
return (
{
{
<>
DEFAULT_GALLERY_PCT
+ ? galleryMinSizePct
+ : DEFAULT_GALLERY_PCT
+ }
+ minSize={galleryMinSizePct}
maxSize={50}
>
diff --git a/invokeai/frontend/web/src/features/ui/components/common/ResizableDrawer/ResizableDrawer.tsx b/invokeai/frontend/web/src/features/ui/components/common/ResizableDrawer/ResizableDrawer.tsx
index 760b910632..0eb4677182 100644
--- a/invokeai/frontend/web/src/features/ui/components/common/ResizableDrawer/ResizableDrawer.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/common/ResizableDrawer/ResizableDrawer.tsx
@@ -6,6 +6,7 @@ import {
useOutsideClick,
useTheme,
SlideDirection,
+ useColorMode,
} from '@chakra-ui/react';
import {
Resizable,
@@ -21,6 +22,7 @@ import {
getSlideDirection,
getStyles,
} from './util';
+import { mode } from 'theme/util/mode';
type ResizableDrawerProps = ResizableProps & {
children: ReactNode;
@@ -64,7 +66,7 @@ const ResizableDrawer = ({
sx = {},
}: ResizableDrawerProps) => {
const langDirection = useTheme().direction as LangDirection;
-
+ const { colorMode } = useColorMode();
const outsideClickRef = useRef(null);
const defaultWidth = useMemo(
@@ -160,11 +162,11 @@ const ResizableDrawer = ({
handleStyles={handleStyles}
{...minMaxDimensions}
sx={{
- borderColor: 'base.800',
+ borderColor: mode('base.200', 'base.800')(colorMode),
p: 4,
- bg: 'base.900',
+ bg: mode('base.100', 'base.900')(colorMode),
height: 'full',
- boxShadow: '0 0 4rem 0 rgba(0, 0, 0, 0.8)',
+ shadow: isOpen ? 'dark-lg' : undefined,
...containerStyles,
...sx,
}}
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx
index d53a4d4fef..7ef0b48784 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx
@@ -1,6 +1,7 @@
-import { Box, Flex, FlexProps } from '@chakra-ui/react';
+import { Box, Flex, FlexProps, useColorMode } from '@chakra-ui/react';
import { memo } from 'react';
import { PanelResizeHandle } from 'react-resizable-panels';
+import { mode } from 'theme/util/mode';
type ResizeHandleProps = FlexProps & {
direction?: 'horizontal' | 'vertical';
@@ -8,6 +9,7 @@ type ResizeHandleProps = FlexProps & {
const ResizeHandle = (props: ResizeHandleProps) => {
const { direction = 'horizontal', ...rest } = props;
+ const { colorMode } = useColorMode();
if (direction === 'horizontal') {
return (
@@ -21,7 +23,13 @@ const ResizeHandle = (props: ResizeHandleProps) => {
}}
{...rest}
>
-
+
);
@@ -38,7 +46,13 @@ const ResizeHandle = (props: ResizeHandleProps) => {
}}
{...rest}
>
-
+
);
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabMain.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabMain.tsx
index b6cfcf72c3..de21cb14eb 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabMain.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabMain.tsx
@@ -4,13 +4,13 @@ import CurrentImageDisplay from 'features/gallery/components/CurrentImageDisplay
const TextToImageTabMain = () => {
return (
{
if (shouldUseCanvasBetaLayout) {
return (
{
ref={setDroppableRef}
tabIndex={-1}
sx={{
+ layerStyle: 'first',
w: 'full',
h: 'full',
- borderRadius: 'base',
- bg: 'base.850',
p: 4,
+ borderRadius: 'base',
}}
>
; minSizePct: number } => {
+ const ref = useRef(null);
+ const [minSizePct, setMinSizePct] = useState(defaultSizePct);
+
+ const handleWindowResize = useCallback(() => {
+ const size = ref.current?.getSize();
+
+ if (size !== undefined && size < minSizePct) {
+ ref.current?.resize(minSizePct);
+ }
+ }, [minSizePct]);
+
+ useLayoutEffect(() => {
+ const panelGroup = document.querySelector(
+ `[data-panel-group-id="${groupId}"]`
+ );
+ const resizeHandles = document.querySelectorAll(
+ '[data-panel-resize-handle-id]'
+ );
+
+ if (!panelGroup) {
+ return;
+ }
+ const observer = new ResizeObserver(() => {
+ let dim =
+ orientation === 'horizontal'
+ ? panelGroup.getBoundingClientRect().width
+ : panelGroup.getBoundingClientRect().height;
+
+ resizeHandles.forEach((resizeHandle) => {
+ dim -=
+ orientation === 'horizontal'
+ ? resizeHandle.getBoundingClientRect().width
+ : resizeHandle.getBoundingClientRect().height;
+ });
+
+ // Minimum size in pixels is a percentage of the PanelGroup's width/height
+ setMinSizePct((minSizePx / dim) * 100);
+ });
+ observer.observe(panelGroup);
+ resizeHandles.forEach((resizeHandle) => {
+ observer.observe(resizeHandle);
+ });
+
+ window.addEventListener('resize', handleWindowResize);
+
+ return () => {
+ observer.disconnect();
+ window.removeEventListener('resize', handleWindowResize);
+ };
+ }, [groupId, handleWindowResize, minSizePct, minSizePx, orientation]);
+
+ return { ref, minSizePct };
+};
diff --git a/invokeai/frontend/web/src/features/ui/store/uiSlice.ts b/invokeai/frontend/web/src/features/ui/store/uiSlice.ts
index 36c514e995..38af668cac 100644
--- a/invokeai/frontend/web/src/features/ui/store/uiSlice.ts
+++ b/invokeai/frontend/web/src/features/ui/store/uiSlice.ts
@@ -8,7 +8,6 @@ import { SchedulerParam } from 'features/parameters/store/parameterZodSchemas';
export const initialUIState: UIState = {
activeTab: 0,
- currentTheme: 'dark',
shouldPinParametersPanel: true,
shouldShowParametersPanel: true,
shouldShowImageDetails: false,
@@ -30,9 +29,6 @@ export const uiSlice = createSlice({
setActiveTab: (state, action: PayloadAction) => {
setActiveTabReducer(state, action.payload);
},
- setCurrentTheme: (state, action: PayloadAction) => {
- state.currentTheme = action.payload;
- },
setShouldPinParametersPanel: (state, action: PayloadAction) => {
state.shouldPinParametersPanel = action.payload;
state.shouldShowParametersPanel = true;
@@ -110,7 +106,6 @@ export const uiSlice = createSlice({
export const {
setActiveTab,
- setCurrentTheme,
setShouldPinParametersPanel,
setShouldShowParametersPanel,
setShouldShowImageDetails,
diff --git a/invokeai/frontend/web/src/features/ui/store/uiTypes.ts b/invokeai/frontend/web/src/features/ui/store/uiTypes.ts
index 2a9a82fbe8..d55a1d8fcf 100644
--- a/invokeai/frontend/web/src/features/ui/store/uiTypes.ts
+++ b/invokeai/frontend/web/src/features/ui/store/uiTypes.ts
@@ -16,7 +16,6 @@ export type Rect = Coordinates & Dimensions;
export interface UIState {
activeTab: number;
- currentTheme: string;
shouldPinParametersPanel: boolean;
shouldShowParametersPanel: boolean;
shouldShowImageDetails: boolean;
diff --git a/invokeai/frontend/web/src/i18.d.ts b/invokeai/frontend/web/src/i18.d.ts
index 90cee53385..aac2653d4f 100644
--- a/invokeai/frontend/web/src/i18.d.ts
+++ b/invokeai/frontend/web/src/i18.d.ts
@@ -1,17 +1,20 @@
-import 'i18next';
+// TODO: Disabled for IDE performance issues with our translation JSON
-import en from '../public/locales/en.json';
+// import 'i18next';
-declare module 'i18next' {
- // Extend CustomTypeOptions
- interface CustomTypeOptions {
- // Setting Default Namespace As English
- defaultNS: 'en';
- // Custom Types For Resources
- resources: {
- en: typeof en;
- };
- // Never Return Null
- returnNull: false;
- }
-}
+// import en from '../public/locales/en.json';
+
+// declare module 'i18next' {
+// // Extend CustomTypeOptions
+// interface CustomTypeOptions {
+// // Setting Default Namespace As English
+// defaultNS: 'en';
+// // Custom Types For Resources
+// resources: {
+// en: typeof en;
+// };
+// // Never Return Null
+// returnNull: false;
+// }
+// }
+export default {};
diff --git a/invokeai/frontend/web/src/i18n.ts b/invokeai/frontend/web/src/i18n.ts
index 68b457eabe..706086cf51 100644
--- a/invokeai/frontend/web/src/i18n.ts
+++ b/invokeai/frontend/web/src/i18n.ts
@@ -3,6 +3,8 @@ import LanguageDetector from 'i18next-browser-languagedetector';
import Backend from 'i18next-http-backend';
import { initReactI18next } from 'react-i18next';
+// TODO: Disabled for IDE performance issues with our translation JSON
+// @ts-ignore
import translationEN from '../public/locales/en.json';
import { LOCALSTORAGE_PREFIX } from 'app/store/constants';
diff --git a/invokeai/frontend/web/src/index.ts b/invokeai/frontend/web/src/index.ts
index 274f9d5a0b..e70e756ed9 100644
--- a/invokeai/frontend/web/src/index.ts
+++ b/invokeai/frontend/web/src/index.ts
@@ -1,9 +1,9 @@
-export { default as InvokeAiLogoComponent } from './features/system/components/InvokeAILogoComponent';
-export { default as ThemeChanger } from './features/system/components/ThemeChanger';
-export { default as IAIPopover } from './common/components/IAIPopover';
-export { default as IAIIconButton } from './common/components/IAIIconButton';
-export { default as SettingsModal } from './features/system/components/SettingsModal/SettingsModal';
-export { default as StatusIndicator } from './features/system/components/StatusIndicator';
-export { default as ModelSelect } from './features/system/components/ModelSelect';
export { default as InvokeAIUI } from './app/components/InvokeAIUI';
export type { PartialAppConfig } from './app/types/invokeai';
+export { default as IAIIconButton } from './common/components/IAIIconButton';
+export { default as IAIPopover } from './common/components/IAIPopover';
+export { default as InvokeAiLogoComponent } from './features/system/components/InvokeAILogoComponent';
+export { default as ModelSelect } from './features/system/components/ModelSelect';
+export { default as SettingsModal } from './features/system/components/SettingsModal/SettingsModal';
+export { default as StatusIndicator } from './features/system/components/StatusIndicator';
+export { default as ColorModeButton } from './features/system/components/ColorModeButton';
diff --git a/invokeai/frontend/web/src/mantine-theme/theme.ts b/invokeai/frontend/web/src/mantine-theme/theme.ts
index 081b2c3457..21dbd285f1 100644
--- a/invokeai/frontend/web/src/mantine-theme/theme.ts
+++ b/invokeai/frontend/web/src/mantine-theme/theme.ts
@@ -2,7 +2,7 @@ import { MantineThemeOverride } from '@mantine/core';
export const mantineTheme: MantineThemeOverride = {
colorScheme: 'dark',
- fontFamily: `'InterVariable', sans-serif`,
+ fontFamily: `'Inter Variable', sans-serif`,
components: {
ScrollArea: {
defaultProps: {
diff --git a/invokeai/frontend/web/src/services/api/endpoints/boards.ts b/invokeai/frontend/web/src/services/api/endpoints/boards.ts
index 9816d88eb9..64ab21075d 100644
--- a/invokeai/frontend/web/src/services/api/endpoints/boards.ts
+++ b/invokeai/frontend/web/src/services/api/endpoints/boards.ts
@@ -82,11 +82,14 @@ export const boardsApi = api.injectEndpoints({
{ type: 'Board', id: arg.board_id },
],
}),
-
deleteBoard: build.mutation({
query: (board_id) => ({ url: `boards/${board_id}`, method: 'DELETE' }),
invalidatesTags: (result, error, arg) => [{ type: 'Board', id: arg }],
}),
+ deleteBoardAndImages: build.mutation({
+ query: (board_id) => ({ url: `boards/${board_id}`, method: 'DELETE', params: { include_images: true } }),
+ invalidatesTags: (result, error, arg) => [{ type: 'Board', id: arg }, { type: 'Image', id: LIST_TAG }],
+ }),
}),
});
@@ -96,4 +99,5 @@ export const {
useCreateBoardMutation,
useUpdateBoardMutation,
useDeleteBoardMutation,
+ useDeleteBoardAndImagesMutation
} = boardsApi;
diff --git a/invokeai/frontend/web/src/services/api/thunks/schema.ts b/invokeai/frontend/web/src/services/api/thunks/schema.ts
index b63a78943b..86d9f06eb4 100644
--- a/invokeai/frontend/web/src/services/api/thunks/schema.ts
+++ b/invokeai/frontend/web/src/services/api/thunks/schema.ts
@@ -1,7 +1,5 @@
-import SwaggerParser from '@apidevtools/swagger-parser';
import { createAsyncThunk } from '@reduxjs/toolkit';
import { log } from 'app/logging/useLogger';
-import { OpenAPIV3 } from 'openapi-types';
const schemaLog = log.child({ namespace: 'schema' });
@@ -29,12 +27,13 @@ export const receivedOpenAPISchema = createAsyncThunk(
'nodes/receivedOpenAPISchema',
async (_, { dispatch, rejectWithValue }) => {
try {
- const dereferencedSchema = (await SwaggerParser.dereference(
- 'openapi.json'
- )) as OpenAPIV3.Document;
+ const response = await fetch(`openapi.json`);
+ const openAPISchema = await response.json();
+
+ schemaLog.info({ openAPISchema }, 'Received OpenAPI schema');
const schemaJSON = JSON.parse(
- JSON.stringify(dereferencedSchema, getCircularReplacer())
+ JSON.stringify(openAPISchema, getCircularReplacer())
);
return schemaJSON;
diff --git a/invokeai/frontend/web/src/theme/colors/colors.ts b/invokeai/frontend/web/src/theme/colors/colors.ts
new file mode 100644
index 0000000000..bcb2e43c0b
--- /dev/null
+++ b/invokeai/frontend/web/src/theme/colors/colors.ts
@@ -0,0 +1,24 @@
+import { InvokeAIThemeColors } from 'theme/themeTypes';
+import { generateColorPalette } from 'theme/util/generateColorPalette';
+
+const BASE = { H: 220, S: 16 };
+const ACCENT = { H: 250, S: 52 };
+const WORKING = { H: 47, S: 50 };
+const WARNING = { H: 28, S: 50 };
+const OK = { H: 113, S: 50 };
+const ERROR = { H: 0, S: 50 };
+
+export const InvokeAIColors: InvokeAIThemeColors = {
+ base: generateColorPalette(BASE.H, BASE.S),
+ baseAlpha: generateColorPalette(BASE.H, BASE.S, true),
+ accent: generateColorPalette(ACCENT.H, ACCENT.S),
+ accentAlpha: generateColorPalette(ACCENT.H, ACCENT.S, true),
+ working: generateColorPalette(WORKING.H, WORKING.S),
+ workingAlpha: generateColorPalette(WORKING.H, WORKING.S, true),
+ warning: generateColorPalette(WARNING.H, WARNING.S),
+ warningAlpha: generateColorPalette(WARNING.H, WARNING.S, true),
+ ok: generateColorPalette(OK.H, OK.S),
+ okAlpha: generateColorPalette(OK.H, OK.S, true),
+ error: generateColorPalette(ERROR.H, ERROR.S),
+ errorAlpha: generateColorPalette(ERROR.H, ERROR.S, true),
+};
diff --git a/invokeai/frontend/web/src/theme/colors/greenTea.ts b/invokeai/frontend/web/src/theme/colors/greenTea.ts
deleted file mode 100644
index 318aecbc61..0000000000
--- a/invokeai/frontend/web/src/theme/colors/greenTea.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { InvokeAIThemeColors } from 'theme/themeTypes';
-import { generateColorPalette } from '../util/generateColorPalette';
-
-export const greenTeaThemeColors: InvokeAIThemeColors = {
- base: generateColorPalette(223, 10),
- baseAlpha: generateColorPalette(223, 10, false, true),
- accent: generateColorPalette(160, 60),
- accentAlpha: generateColorPalette(160, 60, false, true),
- working: generateColorPalette(47, 68),
- workingAlpha: generateColorPalette(47, 68, false, true),
- warning: generateColorPalette(28, 75),
- warningAlpha: generateColorPalette(28, 75, false, true),
- ok: generateColorPalette(122, 49),
- okAlpha: generateColorPalette(122, 49, false, true),
- error: generateColorPalette(0, 50),
- errorAlpha: generateColorPalette(0, 50, false, true),
- gridLineColor: 'rgba(255, 255, 255, 0.15)',
-};
diff --git a/invokeai/frontend/web/src/theme/colors/invokeAI.ts b/invokeai/frontend/web/src/theme/colors/invokeAI.ts
deleted file mode 100644
index 82db58bd35..0000000000
--- a/invokeai/frontend/web/src/theme/colors/invokeAI.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { InvokeAIThemeColors } from 'theme/themeTypes';
-import { generateColorPalette } from 'theme/util/generateColorPalette';
-
-export const invokeAIThemeColors: InvokeAIThemeColors = {
- base: generateColorPalette(220, 15),
- baseAlpha: generateColorPalette(220, 15, false, true),
- accent: generateColorPalette(250, 50),
- accentAlpha: generateColorPalette(250, 50, false, true),
- working: generateColorPalette(47, 67),
- workingAlpha: generateColorPalette(47, 67, false, true),
- warning: generateColorPalette(28, 75),
- warningAlpha: generateColorPalette(28, 75, false, true),
- ok: generateColorPalette(113, 70),
- okAlpha: generateColorPalette(113, 70, false, true),
- error: generateColorPalette(0, 76),
- errorAlpha: generateColorPalette(0, 76, false, true),
- gridLineColor: 'rgba(150, 150, 180, 0.15)',
-};
diff --git a/invokeai/frontend/web/src/theme/colors/lightTheme.ts b/invokeai/frontend/web/src/theme/colors/lightTheme.ts
deleted file mode 100644
index 2fdbd1a769..0000000000
--- a/invokeai/frontend/web/src/theme/colors/lightTheme.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { InvokeAIThemeColors } from 'theme/themeTypes';
-import { generateColorPalette } from '../util/generateColorPalette';
-
-export const lightThemeColors: InvokeAIThemeColors = {
- base: generateColorPalette(223, 10, true),
- baseAlpha: generateColorPalette(223, 10, true, true),
- accent: generateColorPalette(40, 80, true),
- accentAlpha: generateColorPalette(40, 80, true, true),
- working: generateColorPalette(47, 68, true),
- workingAlpha: generateColorPalette(47, 68, true, true),
- warning: generateColorPalette(28, 75, true),
- warningAlpha: generateColorPalette(28, 75, true, true),
- ok: generateColorPalette(122, 49, true),
- okAlpha: generateColorPalette(122, 49, true, true),
- error: generateColorPalette(0, 50, true),
- errorAlpha: generateColorPalette(0, 50, true, true),
- gridLineColor: 'rgba(0, 0, 0, 0.15)',
-};
diff --git a/invokeai/frontend/web/src/theme/colors/oceanBlue.ts b/invokeai/frontend/web/src/theme/colors/oceanBlue.ts
deleted file mode 100644
index 952e0a5066..0000000000
--- a/invokeai/frontend/web/src/theme/colors/oceanBlue.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { InvokeAIThemeColors } from 'theme/themeTypes';
-import { generateColorPalette } from '../util/generateColorPalette';
-
-export const oceanBlueColors: InvokeAIThemeColors = {
- base: generateColorPalette(220, 30),
- baseAlpha: generateColorPalette(220, 30, false, true),
- accent: generateColorPalette(210, 80),
- accentAlpha: generateColorPalette(210, 80, false, true),
- working: generateColorPalette(47, 68),
- workingAlpha: generateColorPalette(47, 68, false, true),
- warning: generateColorPalette(28, 75),
- warningAlpha: generateColorPalette(28, 75, false, true),
- ok: generateColorPalette(122, 49),
- okAlpha: generateColorPalette(122, 49, false, true),
- error: generateColorPalette(0, 100),
- errorAlpha: generateColorPalette(0, 100, false, true),
- gridLineColor: 'rgba(136, 148, 184, 0.15)',
-};
diff --git a/invokeai/frontend/web/src/theme/components/accordion.ts b/invokeai/frontend/web/src/theme/components/accordion.ts
index 3477548c70..912e55d35b 100644
--- a/invokeai/frontend/web/src/theme/components/accordion.ts
+++ b/invokeai/frontend/web/src/theme/components/accordion.ts
@@ -3,6 +3,7 @@ import {
createMultiStyleConfigHelpers,
defineStyle,
} from '@chakra-ui/styled-system';
+import { mode } from '@chakra-ui/theme-tools';
const { definePartsStyle, defineMultiStyleConfig } =
createMultiStyleConfigHelpers(parts.keys);
@@ -18,16 +19,16 @@ const invokeAIButton = defineStyle((props) => {
fontSize: 'sm',
border: 'none',
borderRadius: 'base',
- bg: `${c}.800`,
- color: 'base.100',
+ bg: mode(`${c}.200`, `${c}.700`)(props),
+ color: mode(`${c}.900`, `${c}.100`)(props),
_hover: {
- bg: `${c}.700`,
+ bg: mode(`${c}.250`, `${c}.650`)(props),
},
_expanded: {
- bg: `${c}.750`,
+ bg: mode(`${c}.250`, `${c}.650`)(props),
borderBottomRadius: 'none',
_hover: {
- bg: `${c}.700`,
+ bg: mode(`${c}.300`, `${c}.600`)(props),
},
},
};
@@ -36,7 +37,7 @@ const invokeAIButton = defineStyle((props) => {
const invokeAIPanel = defineStyle((props) => {
const { colorScheme: c } = props;
return {
- bg: `${c}.800`,
+ bg: mode(`${c}.100`, `${c}.800`)(props),
borderRadius: 'base',
borderTopRadius: 'none',
};
diff --git a/invokeai/frontend/web/src/theme/components/button.ts b/invokeai/frontend/web/src/theme/components/button.ts
index 879b3dba96..75662f7d42 100644
--- a/invokeai/frontend/web/src/theme/components/button.ts
+++ b/invokeai/frontend/web/src/theme/components/button.ts
@@ -1,44 +1,117 @@
import { defineStyle, defineStyleConfig } from '@chakra-ui/react';
+import { mode } from '@chakra-ui/theme-tools';
const invokeAI = defineStyle((props) => {
const { colorScheme: c } = props;
// must specify `_disabled` colors if we override `_hover`, else hover on disabled has no styles
+
+ if (c === 'base') {
+ const _disabled = {
+ bg: mode('base.200', 'base.700')(props),
+ color: mode('base.500', 'base.150')(props),
+ svg: {
+ fill: mode('base.500', 'base.150')(props),
+ },
+ opacity: 1,
+ };
+
+ return {
+ bg: mode('base.200', 'base.600')(props),
+ color: mode('base.850', 'base.100')(props),
+ borderRadius: 'base',
+ textShadow: mode(
+ '0 0 0.3rem var(--invokeai-colors-base-50)',
+ '0 0 0.3rem var(--invokeai-colors-base-900)'
+ )(props),
+ svg: {
+ fill: mode('base.850', 'base.100')(props),
+ filter: mode(
+ 'drop-shadow(0px 0px 0.3rem var(--invokeai-colors-base-100))',
+ 'drop-shadow(0px 0px 0.3rem var(--invokeai-colors-base-800))'
+ )(props),
+ },
+ _disabled,
+ _hover: {
+ bg: mode('base.300', 'base.500')(props),
+ color: mode('base.900', 'base.50')(props),
+ svg: {
+ fill: mode('base.900', 'base.50')(props),
+ },
+ _disabled,
+ },
+ _checked: {
+ bg: mode('accent.400', 'accent.600')(props),
+ color: mode('base.50', 'base.100')(props),
+ svg: {
+ fill: mode(`${c}.50`, `${c}.100`)(props),
+ filter: mode(
+ `drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${c}-600))`,
+ `drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${c}-800))`
+ )(props),
+ },
+ _disabled,
+ _hover: {
+ bg: mode('accent.500', 'accent.500')(props),
+ color: mode('white', 'base.50')(props),
+ svg: {
+ fill: mode('white', 'base.50')(props),
+ },
+ _disabled,
+ },
+ },
+ };
+ }
+
const _disabled = {
- bg: `${c}.600`,
- color: `${c}.100`,
+ bg: mode(`${c}.200`, `${c}.700`)(props),
+ color: mode(`${c}.100`, `${c}.150`)(props),
svg: {
- fill: `${c}.100`,
+ fill: mode(`${c}.100`, `${c}.150`)(props),
},
+ opacity: 1,
+ filter: mode(undefined, 'saturate(65%)')(props),
};
return {
- bg: `${c}.700`,
- color: `${c}.100`,
+ bg: mode(`${c}.400`, `${c}.600`)(props),
+ color: mode(`base.50`, `base.100`)(props),
borderRadius: 'base',
+ textShadow: mode(
+ `0 0 0.3rem var(--invokeai-colors-${c}-600)`,
+ `0 0 0.3rem var(--invokeai-colors-${c}-900)`
+ )(props),
svg: {
- fill: `${c}.100`,
+ fill: mode(`base.50`, `base.100`)(props),
+ filter: mode(
+ `drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${c}-600))`,
+ `drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${c}-800))`
+ )(props),
},
_disabled,
_hover: {
- bg: `${c}.650`,
- color: `${c}.50`,
+ bg: mode(`${c}.500`, `${c}.500`)(props),
+ color: mode('white', `base.50`)(props),
svg: {
- fill: `${c}.50`,
+ fill: mode('white', `base.50`)(props),
},
_disabled,
},
_checked: {
- bg: 'accent.700',
- color: 'accent.100',
+ bg: mode('accent.400', 'accent.600')(props),
+ color: mode('base.50', 'base.100')(props),
svg: {
- fill: 'accent.100',
+ fill: mode(`base.50`, `base.100`)(props),
+ filter: mode(
+ `drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${c}-600))`,
+ `drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${c}-800))`
+ )(props),
},
_disabled,
_hover: {
- bg: 'accent.600',
- color: 'accent.50',
+ bg: mode('accent.500', 'accent.500')(props),
+ color: mode('white', 'base.50')(props),
svg: {
- fill: 'accent.50',
+ fill: mode('white', 'base.50')(props),
},
_disabled,
},
diff --git a/invokeai/frontend/web/src/theme/components/checkbox.ts b/invokeai/frontend/web/src/theme/components/checkbox.ts
index ec61706715..58871237e5 100644
--- a/invokeai/frontend/web/src/theme/components/checkbox.ts
+++ b/invokeai/frontend/web/src/theme/components/checkbox.ts
@@ -3,6 +3,7 @@ import {
createMultiStyleConfigHelpers,
defineStyle,
} from '@chakra-ui/styled-system';
+import { mode } from '@chakra-ui/theme-tools';
const { definePartsStyle, defineMultiStyleConfig } =
createMultiStyleConfigHelpers(parts.keys);
@@ -11,14 +12,18 @@ const invokeAIControl = defineStyle((props) => {
const { colorScheme: c } = props;
return {
+ bg: mode('base.200', 'base.700')(props),
+ borderColor: mode('base.200', 'base.700')(props),
+ color: mode('base.900', 'base.100')(props),
+
_checked: {
- bg: `${c}.200`,
- borderColor: `${c}.200`,
- color: 'base.900',
+ bg: mode(`${c}.300`, `${c}.600`)(props),
+ borderColor: mode(`${c}.300`, `${c}.600`)(props),
+ color: mode(`${c}.900`, `${c}.100`)(props),
_hover: {
- bg: `${c}.300`,
- borderColor: `${c}.300`,
+ bg: mode(`${c}.400`, `${c}.500`)(props),
+ borderColor: mode(`${c}.400`, `${c}.500`)(props),
},
_disabled: {
@@ -29,9 +34,9 @@ const invokeAIControl = defineStyle((props) => {
},
_indeterminate: {
- bg: `${c}.200`,
- borderColor: `${c}.200`,
- color: 'base.900',
+ bg: mode(`${c}.300`, `${c}.600`)(props),
+ borderColor: mode(`${c}.300`, `${c}.600`)(props),
+ color: mode(`${c}.900`, `${c}.100`)(props),
},
_disabled: {
@@ -44,7 +49,7 @@ const invokeAIControl = defineStyle((props) => {
},
_invalid: {
- borderColor: 'red.300',
+ borderColor: mode('error.600', 'error.300')(props),
},
};
});
diff --git a/invokeai/frontend/web/src/theme/components/formLabel.ts b/invokeai/frontend/web/src/theme/components/formLabel.ts
index 0ff7c6cdea..866bb7beb1 100644
--- a/invokeai/frontend/web/src/theme/components/formLabel.ts
+++ b/invokeai/frontend/web/src/theme/components/formLabel.ts
@@ -1,6 +1,7 @@
import { defineStyle, defineStyleConfig } from '@chakra-ui/styled-system';
+import { mode } from '@chakra-ui/theme-tools';
-const invokeAI = defineStyle((_props) => {
+const invokeAI = defineStyle((props) => {
return {
fontSize: 'sm',
marginEnd: 0,
@@ -12,7 +13,7 @@ const invokeAI = defineStyle((_props) => {
_disabled: {
opacity: 0.4,
},
- color: 'base.300',
+ color: mode('base.700', 'base.300')(props),
};
});
diff --git a/invokeai/frontend/web/src/theme/components/menu.ts b/invokeai/frontend/web/src/theme/components/menu.ts
index 597e989953..02f75087ed 100644
--- a/invokeai/frontend/web/src/theme/components/menu.ts
+++ b/invokeai/frontend/web/src/theme/components/menu.ts
@@ -1,38 +1,40 @@
import { menuAnatomy } from '@chakra-ui/anatomy';
import { createMultiStyleConfigHelpers } from '@chakra-ui/react';
+import { mode } from '@chakra-ui/theme-tools';
const { definePartsStyle, defineMultiStyleConfig } =
createMultiStyleConfigHelpers(menuAnatomy.keys);
// define the base component styles
-const invokeAI = definePartsStyle({
+const invokeAI = definePartsStyle((props) => ({
// define the part you're going to style
button: {
// this will style the MenuButton component
- fontWeight: '600',
- bg: 'base.500',
- color: 'base.200',
+ fontWeight: 500,
+ bg: mode('base.300', 'base.500')(props),
+ color: mode('base.900', 'base.100')(props),
_hover: {
- bg: 'base.600',
- color: 'white',
+ bg: mode('base.400', 'base.600')(props),
+ color: mode('base.900', 'base.50')(props),
+ fontWeight: 600,
},
},
list: {
zIndex: 9999,
- bg: 'base.800',
+ bg: mode('base.200', 'base.800')(props),
},
item: {
// this will style the MenuItem and MenuItemOption components
fontSize: 'sm',
- bg: 'base.800',
+ bg: mode('base.200', 'base.800')(props),
_hover: {
- bg: 'base.750',
+ bg: mode('base.300', 'base.700')(props),
},
_focus: {
- bg: 'base.700',
+ bg: mode('base.400', 'base.600')(props),
},
},
-});
+}));
export const menuTheme = defineMultiStyleConfig({
variants: {
diff --git a/invokeai/frontend/web/src/theme/components/modal.ts b/invokeai/frontend/web/src/theme/components/modal.ts
index 1f6900278a..8310d9d46c 100644
--- a/invokeai/frontend/web/src/theme/components/modal.ts
+++ b/invokeai/frontend/web/src/theme/components/modal.ts
@@ -3,28 +3,31 @@ import {
createMultiStyleConfigHelpers,
defineStyle,
} from '@chakra-ui/styled-system';
+import { mode } from '@chakra-ui/theme-tools';
const { defineMultiStyleConfig, definePartsStyle } =
createMultiStyleConfigHelpers(parts.keys);
-const invokeAIOverlay = defineStyle({
- bg: 'blackAlpha.600',
-});
+const invokeAIOverlay = defineStyle((props) => ({
+ bg: mode('blackAlpha.700', 'blackAlpha.700')(props),
+}));
const invokeAIDialogContainer = defineStyle({});
-const invokeAIDialog = defineStyle((_props) => {
+const invokeAIDialog = defineStyle((props) => {
return {
- bg: 'base.850',
+ layerStyle: 'first',
maxH: '80vh',
};
});
-const invokeAIHeader = defineStyle((_props) => {
+const invokeAIHeader = defineStyle((props) => {
return {
fontWeight: '600',
fontSize: 'lg',
- color: 'base.200',
+ layerStyle: 'first',
+ borderTopRadius: 'base',
+ borderInlineEndRadius: 'base',
};
});
@@ -37,7 +40,7 @@ const invokeAIBody = defineStyle({
const invokeAIFooter = defineStyle({});
export const invokeAI = definePartsStyle((props) => ({
- overlay: invokeAIOverlay,
+ overlay: invokeAIOverlay(props),
dialogContainer: invokeAIDialogContainer,
dialog: invokeAIDialog(props),
header: invokeAIHeader(props),
diff --git a/invokeai/frontend/web/src/theme/components/numberInput.ts b/invokeai/frontend/web/src/theme/components/numberInput.ts
index 935f21077b..681fa6f566 100644
--- a/invokeai/frontend/web/src/theme/components/numberInput.ts
+++ b/invokeai/frontend/web/src/theme/components/numberInput.ts
@@ -5,6 +5,7 @@ import {
} from '@chakra-ui/styled-system';
import { getInputOutlineStyles } from '../util/getInputOutlineStyles';
+import { mode } from '@chakra-ui/theme-tools';
const { defineMultiStyleConfig, definePartsStyle } =
createMultiStyleConfigHelpers(parts.keys);
@@ -33,7 +34,7 @@ const invokeAIStepperGroup = defineStyle((_props) => {
};
});
-const invokeAIStepper = defineStyle((_props) => {
+const invokeAIStepper = defineStyle((props) => {
return {
border: 'none',
// expand arrow hitbox
@@ -43,11 +44,11 @@ const invokeAIStepper = defineStyle((_props) => {
my: 0,
svg: {
- color: 'base.300',
+ color: mode('base.700', 'base.300')(props),
width: 2.5,
height: 2.5,
_hover: {
- color: 'base.50',
+ color: mode('base.900', 'base.100')(props),
},
},
};
diff --git a/invokeai/frontend/web/src/theme/components/popover.ts b/invokeai/frontend/web/src/theme/components/popover.ts
index c8d6ae20d8..a28e2bfbc4 100644
--- a/invokeai/frontend/web/src/theme/components/popover.ts
+++ b/invokeai/frontend/web/src/theme/components/popover.ts
@@ -3,7 +3,7 @@ import {
createMultiStyleConfigHelpers,
defineStyle,
} from '@chakra-ui/styled-system';
-import { cssVar } from '@chakra-ui/theme-tools';
+import { cssVar, mode } from '@chakra-ui/theme-tools';
const { defineMultiStyleConfig, definePartsStyle } =
createMultiStyleConfigHelpers(parts.keys);
@@ -12,15 +12,20 @@ const $popperBg = cssVar('popper-bg');
const $arrowBg = cssVar('popper-arrow-bg');
const $arrowShadowColor = cssVar('popper-arrow-shadow-color');
-const invokeAIContent = defineStyle((_props) => {
+const invokeAIContent = defineStyle((props) => {
return {
- [$arrowBg.variable]: `colors.base.800`,
- [$popperBg.variable]: `colors.base.800`,
- [$arrowShadowColor.variable]: `colors.base.600`,
+ [$arrowBg.variable]: mode('colors.base.100', 'colors.base.800')(props),
+ [$popperBg.variable]: mode('colors.base.100', 'colors.base.800')(props),
+ [$arrowShadowColor.variable]: mode(
+ 'colors.base.400',
+ 'colors.base.600'
+ )(props),
minW: 'unset',
width: 'unset',
p: 4,
- bg: 'base.800',
+ bg: mode('base.100', 'base.800')(props),
+ border: 'none',
+ shadow: 'dark-lg',
};
});
diff --git a/invokeai/frontend/web/src/theme/components/select.ts b/invokeai/frontend/web/src/theme/components/select.ts
index 2fad17e1b4..72bb896238 100644
--- a/invokeai/frontend/web/src/theme/components/select.ts
+++ b/invokeai/frontend/web/src/theme/components/select.ts
@@ -1,13 +1,14 @@
import { selectAnatomy as parts } from '@chakra-ui/anatomy';
import { createMultiStyleConfigHelpers, defineStyle } from '@chakra-ui/react';
import { getInputOutlineStyles } from '../util/getInputOutlineStyles';
+import { mode } from '@chakra-ui/theme-tools';
const { definePartsStyle, defineMultiStyleConfig } =
createMultiStyleConfigHelpers(parts.keys);
-const invokeAIIcon = defineStyle((_props) => {
+const invokeAIIcon = defineStyle((props) => {
return {
- color: 'base.300',
+ color: mode('base.200', 'base.300')(props),
};
});
diff --git a/invokeai/frontend/web/src/theme/components/slider.ts b/invokeai/frontend/web/src/theme/components/slider.ts
index e706aab7b8..397dea786a 100644
--- a/invokeai/frontend/web/src/theme/components/slider.ts
+++ b/invokeai/frontend/web/src/theme/components/slider.ts
@@ -1,12 +1,13 @@
import { sliderAnatomy as parts } from '@chakra-ui/anatomy';
import { createMultiStyleConfigHelpers, defineStyle } from '@chakra-ui/react';
+import { mode } from '@chakra-ui/theme-tools';
const { definePartsStyle, defineMultiStyleConfig } =
createMultiStyleConfigHelpers(parts.keys);
-const invokeAITrack = defineStyle((_props) => {
+const invokeAITrack = defineStyle((props) => {
return {
- bg: 'base.400',
+ bg: mode('base.400', 'base.600')(props),
h: 1.5,
};
});
@@ -14,23 +15,24 @@ const invokeAITrack = defineStyle((_props) => {
const invokeAIFilledTrack = defineStyle((props) => {
const { colorScheme: c } = props;
return {
- bg: `${c}.600`,
+ bg: mode(`${c}.400`, `${c}.600`)(props),
h: 1.5,
};
});
-const invokeAIThumb = defineStyle((_props) => {
+const invokeAIThumb = defineStyle((props) => {
return {
w: 2,
h: 4,
+ bg: mode('base.50', 'base.100')(props),
};
});
-const invokeAIMark = defineStyle((_props) => {
+const invokeAIMark = defineStyle((props) => {
return {
fontSize: 'xs',
fontWeight: '500',
- color: 'base.400',
+ color: mode('base.700', 'base.400')(props),
mt: 2,
insetInlineStart: 'unset',
};
diff --git a/invokeai/frontend/web/src/theme/components/switch.ts b/invokeai/frontend/web/src/theme/components/switch.ts
index 6f13888442..b803e58b3b 100644
--- a/invokeai/frontend/web/src/theme/components/switch.ts
+++ b/invokeai/frontend/web/src/theme/components/switch.ts
@@ -3,6 +3,7 @@ import {
createMultiStyleConfigHelpers,
defineStyle,
} from '@chakra-ui/styled-system';
+import { mode } from '@chakra-ui/theme-tools';
const { defineMultiStyleConfig, definePartsStyle } =
createMultiStyleConfigHelpers(parts.keys);
@@ -11,13 +12,13 @@ const invokeAITrack = defineStyle((props) => {
const { colorScheme: c } = props;
return {
- bg: 'base.600',
+ bg: mode('base.300', 'base.600')(props),
_focusVisible: {
boxShadow: 'none',
},
_checked: {
- bg: `${c}.600`,
+ bg: mode(`${c}.400`, `${c}.500`)(props),
},
};
});
@@ -26,7 +27,7 @@ const invokeAIThumb = defineStyle((props) => {
const { colorScheme: c } = props;
return {
- bg: `${c}.50`,
+ bg: mode(`${c}.50`, `${c}.50`)(props),
};
});
diff --git a/invokeai/frontend/web/src/theme/components/tabs.ts b/invokeai/frontend/web/src/theme/components/tabs.ts
index daf6e18cab..adcce73bbc 100644
--- a/invokeai/frontend/web/src/theme/components/tabs.ts
+++ b/invokeai/frontend/web/src/theme/components/tabs.ts
@@ -3,6 +3,7 @@ import {
createMultiStyleConfigHelpers,
defineStyle,
} from '@chakra-ui/styled-system';
+import { mode } from '@chakra-ui/theme-tools';
const { defineMultiStyleConfig, definePartsStyle } =
createMultiStyleConfigHelpers(parts.keys);
@@ -16,30 +17,53 @@ const invokeAIRoot = defineStyle((_props) => {
const invokeAITab = defineStyle((_props) => ({}));
-const invokeAITablist = defineStyle((_props) => ({
- display: 'flex',
- flexDirection: 'column',
- gap: 1,
- color: 'base.700',
- button: {
- fontSize: 'sm',
- padding: 2,
- borderRadius: 'base',
- _selected: {
- borderBottomColor: 'base.800',
- bg: 'accent.700',
- color: 'accent.100',
+const invokeAITablist = defineStyle((props) => {
+ const { colorScheme: c } = props;
+
+ return {
+ display: 'flex',
+ flexDirection: 'column',
+ gap: 1,
+ color: mode('base.700', 'base.400')(props),
+ button: {
+ fontSize: 'sm',
+ padding: 2,
+ borderRadius: 'base',
+ textShadow: mode(
+ `0 0 0.3rem var(--invokeai-colors-accent-100)`,
+ `0 0 0.3rem var(--invokeai-colors-accent-900)`
+ )(props),
+ svg: {
+ fill: mode('base.700', 'base.300')(props),
+ },
+ _selected: {
+ bg: mode('accent.400', 'accent.600')(props),
+ color: mode('base.50', 'base.100')(props),
+ svg: {
+ fill: mode(`base.50`, `base.100`)(props),
+ filter: mode(
+ `drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${c}-600))`,
+ `drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${c}-800))`
+ )(props),
+ },
+ _hover: {
+ bg: mode('accent.500', 'accent.500')(props),
+ color: mode('white', 'base.50')(props),
+ svg: {
+ fill: mode('white', 'base.50')(props),
+ },
+ },
+ },
_hover: {
- bg: 'accent.600',
- color: 'accent.50',
+ bg: mode('base.100', 'base.800')(props),
+ color: mode('base.900', 'base.50')(props),
+ svg: {
+ fill: mode(`base.800`, `base.100`)(props),
+ },
},
},
- _hover: {
- bg: 'base.600',
- color: 'base.50',
- },
- },
-}));
+ };
+});
const invokeAITabpanel = defineStyle((_props) => ({
padding: 0,
@@ -59,5 +83,6 @@ export const tabsTheme = defineMultiStyleConfig({
},
defaultProps: {
variant: 'invokeAI',
+ colorScheme: 'accent',
},
});
diff --git a/invokeai/frontend/web/src/theme/components/text.ts b/invokeai/frontend/web/src/theme/components/text.ts
index 88f5f23f7e..2404bf0594 100644
--- a/invokeai/frontend/web/src/theme/components/text.ts
+++ b/invokeai/frontend/web/src/theme/components/text.ts
@@ -1,7 +1,8 @@
import { defineStyle, defineStyleConfig } from '@chakra-ui/react';
+import { mode } from '@chakra-ui/theme-tools';
-const subtext = defineStyle((_props) => ({
- color: 'base.400',
+const subtext = defineStyle((props) => ({
+ color: mode('colors.base.500', 'colors.base.400')(props),
}));
export const textTheme = defineStyleConfig({
diff --git a/invokeai/frontend/web/src/theme/components/tooltip.ts b/invokeai/frontend/web/src/theme/components/tooltip.ts
new file mode 100644
index 0000000000..511e0fecf0
--- /dev/null
+++ b/invokeai/frontend/web/src/theme/components/tooltip.ts
@@ -0,0 +1,17 @@
+import { defineStyle, defineStyleConfig } from '@chakra-ui/react';
+import { mode } from '@chakra-ui/theme-tools';
+import { cssVar } from '@chakra-ui/theme-tools';
+
+const $arrowBg = cssVar('popper-arrow-bg');
+
+// define the base component styles
+const baseStyle = defineStyle((props) => ({
+ borderRadius: 'base',
+ shadow: 'dark-lg',
+ bg: mode('base.700', 'base.200')(props),
+ [$arrowBg.variable]: mode('colors.base.700', 'colors.base.200')(props),
+ pb: 1.5,
+}));
+
+// export the component theme
+export const tooltipTheme = defineStyleConfig({ baseStyle });
diff --git a/invokeai/frontend/web/src/theme/theme.ts b/invokeai/frontend/web/src/theme/theme.ts
index 90f26387ab..76b4aaaacc 100644
--- a/invokeai/frontend/web/src/theme/theme.ts
+++ b/invokeai/frontend/web/src/theme/theme.ts
@@ -1,7 +1,6 @@
import { ThemeOverride } from '@chakra-ui/react';
-import type { StyleFunctionProps } from '@chakra-ui/styled-system';
-import { invokeAIThemeColors } from 'theme/colors/invokeAI';
+import { InvokeAIColors } from './colors/colors';
import { accordionTheme } from './components/accordion';
import { buttonTheme } from './components/button';
import { checkboxTheme } from './components/checkbox';
@@ -12,13 +11,14 @@ import { modalTheme } from './components/modal';
import { numberInputTheme } from './components/numberInput';
import { popoverTheme } from './components/popover';
import { progressTheme } from './components/progress';
-import { no_scrollbar, scrollbar as _scrollbar } from './components/scrollbar';
+import { no_scrollbar } from './components/scrollbar';
import { selectTheme } from './components/select';
import { sliderTheme } from './components/slider';
import { switchTheme } from './components/switch';
import { tabsTheme } from './components/tabs';
import { textTheme } from './components/text';
import { textareaTheme } from './components/textarea';
+import { tooltipTheme } from './components/tooltip';
export const theme: ThemeOverride = {
config: {
@@ -26,30 +26,32 @@ export const theme: ThemeOverride = {
initialColorMode: 'dark',
useSystemColorMode: false,
},
+ layerStyles: {
+ body: {
+ bg: 'base.50',
+ color: 'base.900',
+ '.chakra-ui-dark &': { bg: 'base.900', color: 'base.50' },
+ },
+ first: {
+ bg: 'base.100',
+ color: 'base.900',
+ '.chakra-ui-dark &': { bg: 'base.850', color: 'base.100' },
+ },
+ second: {
+ bg: 'base.200',
+ color: 'base.900',
+ '.chakra-ui-dark &': { bg: 'base.800', color: 'base.100' },
+ },
+ },
styles: {
- global: (_props: StyleFunctionProps) => ({
- body: {
- bg: 'base.900',
- color: 'base.50',
- overflow: {
- base: 'scroll',
- xl: 'hidden',
- },
- },
+ global: () => ({
+ layerStyle: 'body',
'*': { ...no_scrollbar },
}),
},
direction: 'ltr',
fonts: {
- body: `'InterVariable', sans-serif`,
- },
- breakpoints: {
- base: '0em', // 0px and onwards
- sm: '30em', // 480px and onwards
- md: '48em', // 768px and onwards
- lg: '62em', // 992px and onwards
- xl: '80em', // 1280px and onwards
- '2xl': '96em', // 1536px and onwards
+ body: `'Inter Variable', sans-serif`,
},
shadows: {
light: {
@@ -68,9 +70,7 @@ export const theme: ThemeOverride = {
},
nodeSelectedOutline: `0 0 0 2px var(--invokeai-colors-base-500)`,
},
- colors: {
- ...invokeAIThemeColors,
- },
+ colors: InvokeAIColors,
components: {
Button: buttonTheme, // Button and IconButton
Input: inputTheme,
@@ -88,5 +88,6 @@ export const theme: ThemeOverride = {
Checkbox: checkboxTheme,
Menu: menuTheme,
Text: textTheme,
+ Tooltip: tooltipTheme,
},
};
diff --git a/invokeai/frontend/web/src/theme/themeTypes.d.ts b/invokeai/frontend/web/src/theme/themeTypes.d.ts
index 46144f39ab..c85ebd33ce 100644
--- a/invokeai/frontend/web/src/theme/themeTypes.d.ts
+++ b/invokeai/frontend/web/src/theme/themeTypes.d.ts
@@ -11,7 +11,6 @@ export type InvokeAIThemeColors = {
okAlpha: Partial;
error: Partial;
errorAlpha: Partial;
- gridLineColor: string;
};
export type InvokeAIPaletteSteps = {
diff --git a/invokeai/frontend/web/src/theme/util/generateColorPalette.ts b/invokeai/frontend/web/src/theme/util/generateColorPalette.ts
index 4cb5fbd57d..6d90a070c0 100644
--- a/invokeai/frontend/web/src/theme/util/generateColorPalette.ts
+++ b/invokeai/frontend/web/src/theme/util/generateColorPalette.ts
@@ -2,46 +2,35 @@ import { InvokeAIPaletteSteps } from 'theme/themeTypes';
/**
* Add two numbers together
- * @param {String | Number} hue Hue of the color (0-360) - Reds 0, Greens 120, Blues 240
- * @param {String | Number} saturation Saturation of the color (0-100)
- * @param {boolean} light True to generate light color palette
+ * @param {String | Number} H Hue of the color (0-360) - Reds 0, Greens 120, Blues 240
+ * @param {String | Number} L Saturation of the color (0-100)
+ * @param {Boolean} alpha Whether or not to generate this palette as a transparency palette
*/
export function generateColorPalette(
- hue: string | number,
- saturation: string | number,
- light = false,
+ H: string | number,
+ S: string | number,
alpha = false
) {
- hue = String(hue);
- saturation = String(saturation);
+ H = String(H);
+ S = String(S);
const colorSteps = Array.from({ length: 21 }, (_, i) => i * 50);
+
const lightnessSteps = [
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 59, 64, 68, 73, 77, 82, 86,
95, 100,
];
- const darkPalette: Partial = {};
- const lightPalette: Partial = {};
-
- colorSteps.forEach((colorStep, index) => {
+ const p = colorSteps.reduce((palette, step, index) => {
const A = alpha ? lightnessSteps[index] / 100 : 1;
// Lightness should be 50% for alpha colors
- const darkPaletteLightness = alpha
- ? 50
- : lightnessSteps[colorSteps.length - 1 - index];
+ const L = alpha ? 50 : lightnessSteps[colorSteps.length - 1 - index];
- darkPalette[
- colorStep as keyof typeof darkPalette
- ] = `hsl(${hue} ${saturation}% ${darkPaletteLightness}% / ${A})`;
+ palette[step as keyof typeof palette] = `hsl(${H} ${S}% ${L}% / ${A})`;
- const lightPaletteLightness = alpha ? 50 : lightnessSteps[index];
+ return palette;
+ }, {} as InvokeAIPaletteSteps);
- lightPalette[
- colorStep as keyof typeof lightPalette
- ] = `hsl(${hue} ${saturation}% ${lightPaletteLightness}% / ${A})`;
- });
-
- return light ? lightPalette : darkPalette;
+ return p;
}
diff --git a/invokeai/frontend/web/src/theme/util/getInputOutlineStyles.ts b/invokeai/frontend/web/src/theme/util/getInputOutlineStyles.ts
index 7d818cb6a4..8cf64cbd94 100644
--- a/invokeai/frontend/web/src/theme/util/getInputOutlineStyles.ts
+++ b/invokeai/frontend/web/src/theme/util/getInputOutlineStyles.ts
@@ -1,40 +1,40 @@
-import { StyleFunctionProps } from '@chakra-ui/theme-tools';
+import { StyleFunctionProps, mode } from '@chakra-ui/theme-tools';
-export const getInputOutlineStyles = (_props?: StyleFunctionProps) => ({
+export const getInputOutlineStyles = (props: StyleFunctionProps) => ({
outline: 'none',
borderWidth: 2,
borderStyle: 'solid',
- borderColor: 'base.800',
- bg: 'base.900',
+ borderColor: mode('base.200', 'base.800')(props),
+ bg: mode('base.50', 'base.900')(props),
borderRadius: 'base',
- color: 'base.100',
+ color: mode('base.900', 'base.100')(props),
boxShadow: 'none',
_hover: {
- borderColor: 'base.600',
+ borderColor: mode('base.300', 'base.600')(props),
},
_focus: {
- borderColor: 'accent.700',
+ borderColor: mode('accent.200', 'accent.600')(props),
boxShadow: 'none',
_hover: {
- borderColor: 'accent.600',
+ borderColor: mode('accent.300', 'accent.500')(props),
},
},
_invalid: {
- borderColor: 'error.700',
+ borderColor: mode('error.300', 'error.600')(props),
boxShadow: 'none',
_hover: {
- borderColor: 'error.600',
+ borderColor: mode('error.400', 'error.500')(props),
},
},
_disabled: {
- borderColor: 'base.700',
- bg: 'base.700',
- color: 'base.400',
+ borderColor: mode('base.300', 'base.700')(props),
+ bg: mode('base.300', 'base.700')(props),
+ color: mode('base.600', 'base.400')(props),
_hover: {
- borderColor: 'base.700',
+ borderColor: mode('base.300', 'base.700')(props),
},
},
_placeholder: {
- color: 'base.500',
+ color: mode('base.700', 'base.400')(props),
},
});
diff --git a/invokeai/frontend/web/src/theme/util/mode.ts b/invokeai/frontend/web/src/theme/util/mode.ts
new file mode 100644
index 0000000000..fbaabecb6c
--- /dev/null
+++ b/invokeai/frontend/web/src/theme/util/mode.ts
@@ -0,0 +1,3 @@
+export const mode =
+ (light: string, dark: string) => (colorMode: 'light' | 'dark') =>
+ colorMode === 'light' ? light : dark;
diff --git a/invokeai/frontend/web/tsconfig.json b/invokeai/frontend/web/tsconfig.json
index 8276f461eb..6f74cf3681 100644
--- a/invokeai/frontend/web/tsconfig.json
+++ b/invokeai/frontend/web/tsconfig.json
@@ -11,7 +11,8 @@
"forceConsistentCasingInFileNames": true,
"module": "ESNext",
"moduleResolution": "Node",
- "resolveJsonModule": true,
+ // TODO: Disabled for IDE performance issues with our translation JSON
+ // "resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
diff --git a/invokeai/frontend/web/yarn.lock b/invokeai/frontend/web/yarn.lock
index bdd20af86a..45bdf25fae 100644
--- a/invokeai/frontend/web/yarn.lock
+++ b/invokeai/frontend/web/yarn.lock
@@ -2,15 +2,6 @@
# yarn lockfile v1
-"@apidevtools/json-schema-ref-parser@9.0.6":
- version "9.0.6"
- resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz#5d9000a3ac1fd25404da886da6b266adcd99cf1c"
- integrity sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==
- dependencies:
- "@jsdevtools/ono" "^7.1.3"
- call-me-maybe "^1.0.1"
- js-yaml "^3.13.1"
-
"@apidevtools/json-schema-ref-parser@9.0.9":
version "9.0.9"
resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz#d720f9256e3609621280584f2b47ae165359268b"
@@ -21,29 +12,6 @@
call-me-maybe "^1.0.1"
js-yaml "^4.1.0"
-"@apidevtools/openapi-schemas@^2.1.0":
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz#9fa08017fb59d80538812f03fc7cac5992caaa17"
- integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==
-
-"@apidevtools/swagger-methods@^3.0.2":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267"
- integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==
-
-"@apidevtools/swagger-parser@^10.1.0":
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.1.0.tgz#a987d71e5be61feb623203be0c96e5985b192ab6"
- integrity sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==
- dependencies:
- "@apidevtools/json-schema-ref-parser" "9.0.6"
- "@apidevtools/openapi-schemas" "^2.1.0"
- "@apidevtools/swagger-methods" "^3.0.2"
- "@jsdevtools/ono" "^7.1.3"
- ajv "^8.6.3"
- ajv-draft-04 "^1.0.0"
- call-me-maybe "^1.0.1"
-
"@babel/code-frame@^7.0.0":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658"
@@ -1621,15 +1589,6 @@
globalthis "^1.0.2"
liqe "^3.6.0"
-"@rollup/plugin-inject@^5.0.3":
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz#0783711efd93a9547d52971db73b2fb6140a67b1"
- integrity sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==
- dependencies:
- "@rollup/pluginutils" "^5.0.1"
- estree-walker "^2.0.2"
- magic-string "^0.27.0"
-
"@rollup/pluginutils@^4.2.1":
version "4.2.1"
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d"
@@ -1638,7 +1597,7 @@
estree-walker "^2.0.1"
picomatch "^2.2.2"
-"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.0.2":
+"@rollup/pluginutils@^5.0.2":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33"
integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==
@@ -2269,11 +2228,6 @@ aggregate-error@^3.0.0:
clean-stack "^2.0.0"
indent-string "^4.0.0"
-ajv-draft-04@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8"
- integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==
-
ajv@^6.10.0, ajv@^6.11.0, ajv@^6.12.4, ajv@~6.12.6:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
@@ -2284,16 +2238,6 @@ ajv@^6.10.0, ajv@^6.11.0, ajv@^6.12.4, ajv@~6.12.6:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ajv@^8.6.3:
- version "8.12.0"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1"
- integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
- dependencies:
- fast-deep-equal "^3.1.1"
- json-schema-traverse "^1.0.0"
- require-from-string "^2.0.2"
- uri-js "^4.2.2"
-
ansi-colors@^4.1.3:
version "4.1.3"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
@@ -2353,18 +2297,18 @@ app-module-path@^2.2.0:
resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5"
integrity sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==
-argparse@^1.0.7, argparse@~1.0.9:
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+argparse@~1.0.9:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
dependencies:
sprintf-js "~1.0.2"
-argparse@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
- integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-
aria-hidden@^1.1.3, aria-hidden@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954"
@@ -2417,26 +2361,6 @@ array.prototype.tosorted@^1.1.1:
es-shim-unscopables "^1.0.0"
get-intrinsic "^1.1.3"
-asn1.js@^5.2.0:
- version "5.4.1"
- resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
- integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
- dependencies:
- bn.js "^4.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
- safer-buffer "^2.1.0"
-
-assert@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32"
- integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==
- dependencies:
- es6-object-assign "^1.1.0"
- is-nan "^1.2.1"
- object-is "^1.0.1"
- util "^0.12.0"
-
ast-module-types@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-2.7.1.tgz#3f7989ef8dfa1fdb82dfe0ab02bdfc7c77a57dd3"
@@ -2527,16 +2451,6 @@ bl@^4.1.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
- version "4.12.0"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
- integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
-
-bn.js@^5.0.0, bn.js@^5.1.1:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
- integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
-
boolean@^3.1.4:
version "3.2.0"
resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
@@ -2564,90 +2478,12 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
-brorand@^1.0.1, brorand@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
- integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
-
-browser-resolve@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b"
- integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==
- dependencies:
- resolve "^1.17.0"
-
-browserify-aes@^1.0.0, browserify-aes@^1.0.4:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
- integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
- dependencies:
- buffer-xor "^1.0.3"
- cipher-base "^1.0.0"
- create-hash "^1.1.0"
- evp_bytestokey "^1.0.3"
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-browserify-cipher@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
- integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
- dependencies:
- browserify-aes "^1.0.4"
- browserify-des "^1.0.0"
- evp_bytestokey "^1.0.0"
-
-browserify-des@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
- integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
- dependencies:
- cipher-base "^1.0.1"
- des.js "^1.0.0"
- inherits "^2.0.1"
- safe-buffer "^5.1.2"
-
-browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
- integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
- dependencies:
- bn.js "^5.0.0"
- randombytes "^2.0.1"
-
-browserify-sign@^4.0.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
- integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
- dependencies:
- bn.js "^5.1.1"
- browserify-rsa "^4.0.1"
- create-hash "^1.2.0"
- create-hmac "^1.1.7"
- elliptic "^6.5.3"
- inherits "^2.0.4"
- parse-asn1 "^5.1.5"
- readable-stream "^3.6.0"
- safe-buffer "^5.2.0"
-
-browserify-zlib@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
- integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
- dependencies:
- pako "~1.0.5"
-
buffer-from@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-buffer-xor@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
- integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==
-
-buffer@^5.5.0, buffer@^5.7.1:
+buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
@@ -2655,11 +2491,6 @@ buffer@^5.5.0, buffer@^5.7.1:
base64-js "^1.3.1"
ieee754 "^1.1.13"
-builtin-status-codes@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
- integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==
-
busboy@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
@@ -2745,14 +2576,6 @@ ci-info@^3.7.0:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91"
integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==
-cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
- integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
classcat@^5.0.3, classcat@^5.0.4:
version "5.0.4"
resolved "https://registry.yarnpkg.com/classcat/-/classcat-5.0.4.tgz#e12d1dfe6df6427f260f03b80dc63571a5107ba6"
@@ -2953,16 +2776,6 @@ concurrently@^8.2.0:
tree-kill "^1.2.2"
yargs "^17.7.2"
-console-browserify@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
- integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
-
-constants-browserify@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
- integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==
-
convert-source-map@^1.5.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
@@ -2986,42 +2799,6 @@ cosmiconfig@^7.0.0:
path-type "^4.0.0"
yaml "^1.10.0"
-create-ecdh@^4.0.0:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
- integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
- dependencies:
- bn.js "^4.1.0"
- elliptic "^6.5.3"
-
-create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
- integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
- dependencies:
- cipher-base "^1.0.1"
- inherits "^2.0.1"
- md5.js "^1.3.4"
- ripemd160 "^2.0.1"
- sha.js "^2.4.0"
-
-create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
- integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
- dependencies:
- cipher-base "^1.0.3"
- create-hash "^1.1.0"
- inherits "^2.0.1"
- ripemd160 "^2.0.0"
- safe-buffer "^5.0.1"
- sha.js "^2.4.8"
-
-create-require@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
- integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
-
cross-fetch@3.1.6:
version "3.1.6"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c"
@@ -3038,23 +2815,6 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
-crypto-browserify@^3.11.0:
- version "3.12.0"
- resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
- integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
- dependencies:
- browserify-cipher "^1.0.0"
- browserify-sign "^4.0.0"
- create-ecdh "^4.0.0"
- create-hash "^1.1.0"
- create-hmac "^1.1.0"
- diffie-hellman "^5.0.0"
- inherits "^2.0.1"
- pbkdf2 "^3.0.3"
- public-encrypt "^4.0.0"
- randombytes "^2.0.0"
- randomfill "^1.0.3"
-
css-box-model@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1"
@@ -3229,14 +2989,6 @@ dependency-tree@^9.0.0:
precinct "^9.0.0"
typescript "^4.0.0"
-des.js@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da"
- integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==
- dependencies:
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
-
detect-node-es@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493"
@@ -3387,15 +3139,6 @@ detective-typescript@^9.0.0, detective-typescript@^9.1.1:
node-source-walk "^5.0.1"
typescript "^4.9.5"
-diffie-hellman@^5.0.0:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
- integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
- dependencies:
- bn.js "^4.1.0"
- miller-rabin "^4.0.0"
- randombytes "^2.0.0"
-
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@@ -3422,11 +3165,6 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
-domain-browser@^4.22.0:
- version "4.22.0"
- resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.22.0.tgz#6ddd34220ec281f9a65d3386d267ddd35c491f9f"
- integrity sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==
-
downshift@^7.6.0:
version "7.6.0"
resolved "https://registry.yarnpkg.com/downshift/-/downshift-7.6.0.tgz#de04fb2962bd6c4ea94589c797c91f34aa9816f3"
@@ -3443,19 +3181,6 @@ eastasianwidth@^0.2.0:
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
-elliptic@^6.5.3:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
- integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
- dependencies:
- bn.js "^4.11.9"
- brorand "^1.1.0"
- hash.js "^1.0.0"
- hmac-drbg "^1.0.1"
- inherits "^2.0.4"
- minimalistic-assert "^1.0.1"
- minimalistic-crypto-utils "^1.0.1"
-
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
@@ -3569,11 +3294,6 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
-es6-object-assign@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
- integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==
-
esbuild@^0.17.18, esbuild@^0.17.5:
version "0.17.19"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955"
@@ -3786,19 +3506,6 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
-events@^3.0.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
- integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-
-evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
- integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
- dependencies:
- md5.js "^1.3.4"
- safe-buffer "^5.1.1"
-
execa@^7.0.0:
version "7.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43"
@@ -4294,32 +4001,6 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
-hash-base@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
- integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
- dependencies:
- inherits "^2.0.4"
- readable-stream "^3.6.0"
- safe-buffer "^5.2.0"
-
-hash.js@^1.0.0, hash.js@^1.0.3:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
- integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
- dependencies:
- inherits "^2.0.3"
- minimalistic-assert "^1.0.1"
-
-hmac-drbg@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
- integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==
- dependencies:
- hash.js "^1.0.3"
- minimalistic-assert "^1.0.0"
- minimalistic-crypto-utils "^1.0.1"
-
hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
@@ -4334,11 +4015,6 @@ html-parse-stringify@^3.0.1:
dependencies:
void-elements "3.1.0"
-https-browserify@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
- integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==
-
human-signals@^4.3.0:
version "4.3.1"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
@@ -4426,7 +4102,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4:
+inherits@2, inherits@^2.0.3, inherits@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -4460,14 +4136,6 @@ invariant@^2.2.4:
dependencies:
loose-envify "^1.0.0"
-is-arguments@^1.0.4:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
- integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
- dependencies:
- call-bind "^1.0.2"
- has-tostringtag "^1.0.0"
-
is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
@@ -4548,13 +4216,6 @@ is-fullwidth-code-point@^4.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88"
integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
-is-generator-function@^1.0.7:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
- integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
- dependencies:
- has-tostringtag "^1.0.0"
-
is-glob@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@@ -4581,14 +4242,6 @@ is-invalid-path@^0.1.0:
dependencies:
is-glob "^2.0.0"
-is-nan@^1.2.1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d"
- integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==
- dependencies:
- call-bind "^1.0.0"
- define-properties "^1.1.3"
-
is-negative-zero@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
@@ -4660,7 +4313,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
dependencies:
has-symbols "^1.0.2"
-is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9:
+is-typed-array@^1.1.10, is-typed-array@^1.1.9:
version "1.1.10"
resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f"
integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==
@@ -4712,11 +4365,6 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
-isomorphic-timers-promises@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598"
- integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==
-
its-fine@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/its-fine/-/its-fine-1.1.1.tgz#e74b93fddd487441f978a50f64f0f5af4d2fc38e"
@@ -4739,14 +4387,6 @@ js-cookie@^2.2.1:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@^3.13.1:
- version "3.14.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
- integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
- dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
-
js-yaml@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
@@ -4771,11 +4411,6 @@ json-schema-traverse@^0.4.1:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-json-schema-traverse@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
- integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
-
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
@@ -5000,13 +4635,6 @@ madge@^6.1.0:
ts-graphviz "^1.5.0"
walkdir "^0.4.1"
-magic-string@^0.27.0:
- version "0.27.0"
- resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3"
- integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==
- dependencies:
- "@jridgewell/sourcemap-codec" "^1.4.13"
-
magic-string@^0.29.0:
version "0.29.0"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.29.0.tgz#f034f79f8c43dba4ae1730ffb5e8c4e084b16cf3"
@@ -5014,15 +4642,6 @@ magic-string@^0.29.0:
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.13"
-md5.js@^1.3.4:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
- integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
- dependencies:
- hash-base "^3.0.0"
- inherits "^2.0.1"
- safe-buffer "^5.1.2"
-
mdn-data@2.0.14:
version "2.0.14"
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
@@ -5046,14 +4665,6 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5:
braces "^3.0.2"
picomatch "^2.3.1"
-miller-rabin@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
- integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
- dependencies:
- bn.js "^4.0.0"
- brorand "^1.0.1"
-
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
@@ -5076,16 +4687,6 @@ mimic-fn@^4.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
-minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
- integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
-
-minimalistic-crypto-utils@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
- integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
-
minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
@@ -5217,39 +4818,6 @@ node-source-walk@^5.0.0, node-source-walk@^5.0.1:
dependencies:
"@babel/parser" "^7.21.4"
-node-stdlib-browser@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz#5ddcfdf4063b88fb282979a1aa6ddab9728d5e4c"
- integrity sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==
- dependencies:
- assert "^2.0.0"
- browser-resolve "^2.0.0"
- browserify-zlib "^0.2.0"
- buffer "^5.7.1"
- console-browserify "^1.1.0"
- constants-browserify "^1.0.0"
- create-require "^1.1.1"
- crypto-browserify "^3.11.0"
- domain-browser "^4.22.0"
- events "^3.0.0"
- https-browserify "^1.0.0"
- isomorphic-timers-promises "^1.0.1"
- os-browserify "^0.3.0"
- path-browserify "^1.0.1"
- pkg-dir "^5.0.0"
- process "^0.11.10"
- punycode "^1.4.1"
- querystring-es3 "^0.2.1"
- readable-stream "^3.6.0"
- stream-browserify "^3.0.0"
- stream-http "^3.2.0"
- string_decoder "^1.0.0"
- timers-browserify "^2.0.4"
- tty-browserify "0.0.1"
- url "^0.11.0"
- util "^0.12.4"
- vm-browserify "^1.0.1"
-
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@@ -5272,14 +4840,6 @@ object-inspect@^1.12.3, object-inspect@^1.9.0:
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
-object-is@^1.0.1:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
- integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
- dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
-
object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
@@ -5440,11 +5000,6 @@ ora@^5.4.1:
strip-ansi "^6.0.0"
wcwidth "^1.0.1"
-os-browserify@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
- integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==
-
os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
@@ -5481,11 +5036,6 @@ p-map@^4.0.0:
dependencies:
aggregate-error "^3.0.0"
-pako@~1.0.5:
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
- integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
-
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -5493,17 +5043,6 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
-parse-asn1@^5.0.0, parse-asn1@^5.1.5:
- version "5.1.6"
- resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
- integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
- dependencies:
- asn1.js "^5.2.0"
- browserify-aes "^1.0.0"
- evp_bytestokey "^1.0.0"
- pbkdf2 "^3.0.3"
- safe-buffer "^5.1.1"
-
parse-json@^5.0.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
@@ -5574,17 +5113,6 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
-pbkdf2@^3.0.3:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
- integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
- dependencies:
- create-hash "^1.1.2"
- create-hmac "^1.1.4"
- ripemd160 "^2.0.1"
- safe-buffer "^5.0.1"
- sha.js "^2.4.8"
-
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
@@ -5600,13 +5128,6 @@ pidtree@^0.6.0:
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c"
integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==
-pkg-dir@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760"
- integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==
- dependencies:
- find-up "^5.0.0"
-
pluralize@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
@@ -5710,11 +5231,6 @@ pretty-ms@^7.0.1:
dependencies:
parse-ms "^2.1.0"
-process@^0.11.10:
- version "0.11.10"
- resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
- integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
-
prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
@@ -5729,35 +5245,11 @@ proxy-from-env@^1.1.0:
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
-public-encrypt@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
- integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
- dependencies:
- bn.js "^4.1.0"
- browserify-rsa "^4.0.0"
- create-hash "^1.1.0"
- parse-asn1 "^5.0.0"
- randombytes "^2.0.1"
- safe-buffer "^5.1.2"
-
-punycode@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
- integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==
-
punycode@^2.1.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
-qs@^6.11.0:
- version "6.11.2"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9"
- integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==
- dependencies:
- side-channel "^1.0.4"
-
query-string@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-8.1.0.tgz#e7f95367737219544cd360a11a4f4ca03836e115"
@@ -5767,11 +5259,6 @@ query-string@^8.1.0:
filter-obj "^5.1.0"
split-on-first "^3.0.0"
-querystring-es3@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
- integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==
-
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
@@ -5795,21 +5282,6 @@ randexp@0.4.6:
discontinuous-range "1.0.0"
ret "~0.1.10"
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
- integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
- dependencies:
- safe-buffer "^5.1.0"
-
-randomfill@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
- integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
- dependencies:
- randombytes "^2.0.5"
- safe-buffer "^5.1.0"
-
rc@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
@@ -6035,7 +5507,7 @@ reactflow@^11.7.4:
"@reactflow/node-resizer" "2.1.1"
"@reactflow/node-toolbar" "1.2.3"
-readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0:
+readable-stream@^3.4.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
@@ -6092,11 +5564,6 @@ require-directory@^2.1.1:
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
-require-from-string@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
- integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
-
requirejs-config-file@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz#4244da5dd1f59874038cc1091d078d620abb6ebc"
@@ -6130,7 +5597,7 @@ resolve-from@^4.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-resolve@^1.17.0, resolve@^1.19.0, resolve@^1.21.0, resolve@~1.22.1:
+resolve@^1.19.0, resolve@^1.21.0, resolve@~1.22.1:
version "1.22.2"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f"
integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
@@ -6193,14 +5660,6 @@ rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
-ripemd160@^2.0.0, ripemd160@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
- integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
- dependencies:
- hash-base "^3.0.0"
- inherits "^2.0.1"
-
roarr@^7.15.0:
version "7.15.0"
resolved "https://registry.yarnpkg.com/roarr/-/roarr-7.15.0.tgz#09b792f0cd31b4a7f91030bb1c47550ceec98ee4"
@@ -6258,7 +5717,7 @@ rxjs@^7.8.0, rxjs@^7.8.1:
dependencies:
tslib "^2.1.0"
-safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -6277,11 +5736,6 @@ safe-stable-stringify@^2.4.1:
resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886"
integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==
-safer-buffer@^2.1.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-
sass-lookup@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/sass-lookup/-/sass-lookup-3.0.0.tgz#3b395fa40569738ce857bc258e04df2617c48cac"
@@ -6342,19 +5796,6 @@ set-harmonic-interval@^1.0.1:
resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249"
integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==
-setimmediate@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
- integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
-
-sha.js@^2.4.0, sha.js@^2.4.8:
- version "2.4.11"
- resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
- integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -6522,24 +5963,6 @@ stacktrace-js@^2.0.2:
stack-generator "^2.0.5"
stacktrace-gps "^3.0.4"
-stream-browserify@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f"
- integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==
- dependencies:
- inherits "~2.0.4"
- readable-stream "^3.5.0"
-
-stream-http@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5"
- integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==
- dependencies:
- builtin-status-codes "^3.0.0"
- inherits "^2.0.4"
- readable-stream "^3.6.0"
- xtend "^4.0.2"
-
stream-to-array@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353"
@@ -6621,7 +6044,7 @@ string.prototype.trimstart@^1.0.6:
define-properties "^1.1.4"
es-abstract "^1.20.4"
-string_decoder@^1.0.0, string_decoder@^1.1.1:
+string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
@@ -6750,13 +6173,6 @@ through@^2.3.8:
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
-timers-browserify@^2.0.4:
- version "2.0.12"
- resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee"
- integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==
- dependencies:
- setimmediate "^1.0.4"
-
tiny-invariant@^1.0.6:
version "1.3.1"
resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642"
@@ -6866,11 +6282,6 @@ tsutils@^3.21.0:
dependencies:
tslib "^1.8.1"
-tty-browserify@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
- integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==
-
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@@ -6968,14 +6379,6 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
-url@^0.11.0:
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32"
- integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==
- dependencies:
- punycode "^1.4.1"
- qs "^6.11.0"
-
use-callback-ref@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5"
@@ -7023,17 +6426,6 @@ util-deprecate@^1.0.1:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
-util@^0.12.0, util@^0.12.4:
- version "0.12.5"
- resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc"
- integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==
- dependencies:
- inherits "^2.0.3"
- is-arguments "^1.0.4"
- is-generator-function "^1.0.7"
- is-typed-array "^1.1.3"
- which-typed-array "^1.1.2"
-
uuid@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
@@ -7074,14 +6466,6 @@ vite-plugin-eslint@^1.8.1:
"@types/eslint" "^8.4.5"
rollup "^2.77.2"
-vite-plugin-node-polyfills@^0.9.0:
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.9.0.tgz#181d096c43e22cae219c6c2434a204b665044de0"
- integrity sha512-+i+WPUuIBhJy+ODfxx6S6FTl28URCxUszbl/IL4GwrZvbqqY/8VDIp+zpjMS8Us/a7GwN4Iaqr/fVIBtkNQojQ==
- dependencies:
- "@rollup/plugin-inject" "^5.0.3"
- node-stdlib-browser "^1.2.0"
-
vite-tsconfig-paths@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz#bd2647d3eadafb65a10fc98a2ca565211f2eaf63"
@@ -7102,11 +6486,6 @@ vite@^4.3.9:
optionalDependencies:
fsevents "~2.3.2"
-vm-browserify@^1.0.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
- integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
-
void-elements@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09"
@@ -7148,7 +6527,7 @@ which-boxed-primitive@^1.0.2:
is-string "^1.0.5"
is-symbol "^1.0.3"
-which-typed-array@^1.1.2, which-typed-array@^1.1.9:
+which-typed-array@^1.1.9:
version "1.1.9"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6"
integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==
@@ -7210,11 +6589,6 @@ xmlhttprequest-ssl@~2.0.0:
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67"
integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==
-xtend@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
- integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
-
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"