diff --git a/invokeai/frontend/web/package.json b/invokeai/frontend/web/package.json index 684c56451c..326213c4f2 100644 --- a/invokeai/frontend/web/package.json +++ b/invokeai/frontend/web/package.json @@ -89,6 +89,7 @@ "react-konva-utils": "^1.0.4", "react-redux": "^8.0.5", "react-transition-group": "^4.4.5", + "react-use": "^17.4.0", "react-zoom-pan-pinch": "^3.0.7", "reactflow": "^11.7.0", "redux-deep-persist": "^1.0.7", diff --git a/invokeai/frontend/web/src/app/types/invokeai.ts b/invokeai/frontend/web/src/app/types/invokeai.ts index bd9642491d..05e6e088d6 100644 --- a/invokeai/frontend/web/src/app/types/invokeai.ts +++ b/invokeai/frontend/web/src/app/types/invokeai.ts @@ -115,21 +115,6 @@ export type PostProcessedImageMetadata = ESRGANMetadata | FacetoolMetadata; // image: GeneratedImageMetadata | PostProcessedImageMetadata; // }; -// An Image has a UUID, url, modified timestamp, width, height and maybe metadata -export type _Image = { - uuid: string; - url: string; - thumbnail: string; - mtime: number; - metadata?: Metadata; - width: number; - height: number; - category: GalleryCategory; - isBase64?: boolean; - dreamPrompt?: 'string'; - name?: string; -}; - /** * ResultImage */ @@ -141,11 +126,6 @@ export type Image = { metadata: ImageResponseMetadata; }; -// GalleryImages is an array of Image. -export type GalleryImages = { - images: Array<_Image>; -}; - /** * Types related to the system status. */ @@ -310,27 +290,10 @@ export type ErrorResponse = { additionalData?: string; }; -export type GalleryImagesResponse = { - images: Array>; - areMoreImagesAvailable: boolean; - category: GalleryCategory; -}; - -export type ImageDeletedResponse = { - uuid: string; - url: string; - category: GalleryCategory; -}; - export type ImageUrlResponse = { url: string; }; -// export type UploadImagePayload = { -// file: File; -// destination?: ImageUploadDestination; -// }; - export type UploadOutpaintingMergeImagePayload = { dataURL: string; name: string; diff --git a/invokeai/frontend/web/src/features/gallery/components/CurrentImageButtons.tsx b/invokeai/frontend/web/src/features/gallery/components/CurrentImageButtons.tsx index 51de6bea2e..4fef811d46 100644 --- a/invokeai/frontend/web/src/features/gallery/components/CurrentImageButtons.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/CurrentImageButtons.tsx @@ -63,7 +63,6 @@ import { } from '../store/gallerySelectors'; import DeleteImageModal from './DeleteImageModal'; import { useCallback } from 'react'; -import useSetBothPrompts from 'features/parameters/hooks/usePrompt'; import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale'; import { useGetUrl } from 'common/util/getUrl'; import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; diff --git a/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/CancelButton.tsx b/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/CancelButton.tsx index a71e8a3638..4f6c2ecc1c 100644 --- a/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/CancelButton.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/CancelButton.tsx @@ -8,7 +8,7 @@ import { SystemState, cancelScheduled, cancelTypeChanged, - CancelType, + CancelStrategy, } from 'features/system/store/systemSlice'; import { isEqual } from 'lodash-es'; import { useCallback, memo } from 'react'; @@ -87,7 +87,7 @@ const CancelButton = ( const handleCancelTypeChanged = useCallback( (value: string | string[]) => { const newCancelType = Array.isArray(value) ? value[0] : value; - dispatch(cancelTypeChanged(newCancelType as CancelType)); + dispatch(cancelTypeChanged(newCancelType as CancelStrategy)); }, [dispatch] ); diff --git a/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx b/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx index 04adcdbe36..48418c9f19 100644 --- a/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx +++ b/invokeai/frontend/web/src/features/system/components/StatusIndicator.tsx @@ -1,19 +1,34 @@ -import { Text } from '@chakra-ui/react'; +import { Flex, Icon, Text } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { useAppSelector } from 'app/store/storeHooks'; import { isEqual } from 'lodash-es'; import { useTranslation } from 'react-i18next'; import { systemSelector } from '../store/systemSelectors'; +import { ResourceKey } from 'i18next'; +import { AnimatePresence, motion } from 'framer-motion'; +import { useMemo, useRef } from 'react'; +import { FaCircle } from 'react-icons/fa'; +import { useHoverDirty } from 'react-use'; const statusIndicatorSelector = createSelector( systemSelector, (system) => { + const { + isConnected, + isProcessing, + statusTranslationKey, + currentIteration, + totalIterations, + currentStatusHasSteps, + } = system; + return { - isConnected: system.isConnected, - isProcessing: system.isProcessing, - currentIteration: system.currentIteration, - totalIterations: system.totalIterations, - currentStatus: system.currentStatus, + isConnected, + isProcessing, + currentIteration, + totalIterations, + statusTranslationKey, + currentStatusHasSteps, }; }, { @@ -27,43 +42,69 @@ const StatusIndicator = () => { isProcessing, currentIteration, totalIterations, - currentStatus, + statusTranslationKey, + currentStatusHasSteps, } = useAppSelector(statusIndicatorSelector); const { t } = useTranslation(); + const ref = useRef(null); - let statusIdentifier; - - if (isConnected) { - statusIdentifier = 'ok'; - } else { - statusIdentifier = 'error'; - } - - let statusMessage = currentStatus; - - if (isProcessing) { - statusIdentifier = 'working'; - } - - if (statusMessage) + const statusColorScheme = useMemo(() => { if (isProcessing) { - if (totalIterations > 1) { - statusMessage = `${t( - statusMessage as keyof typeof t - )} (${currentIteration}/${totalIterations})`; - } + return 'working'; } + if (isConnected) { + return 'ok'; + } + + return 'error'; + }, [isProcessing, isConnected]); + + const iterationsText = useMemo(() => { + if (!(currentIteration && totalIterations)) { + return; + } + + return ` (${currentIteration}/${totalIterations})`; + }, [currentIteration, totalIterations]); + + const isHovered = useHoverDirty(ref); + return ( - - {t(statusMessage as keyof typeof t)} - + + + {isHovered && ( + + + {t(statusTranslationKey as ResourceKey)} + {iterationsText} + + + )} + + + ); }; diff --git a/invokeai/frontend/web/src/features/system/store/systemSlice.ts b/invokeai/frontend/web/src/features/system/store/systemSlice.ts index 6773314b6a..cfaffdb65c 100644 --- a/invokeai/frontend/web/src/features/system/store/systemSlice.ts +++ b/invokeai/frontend/web/src/features/system/store/systemSlice.ts @@ -1,9 +1,10 @@ -import { ExpandedIndex, UseToastOptions } from '@chakra-ui/react'; +import { UseToastOptions } from '@chakra-ui/react'; import type { PayloadAction } from '@reduxjs/toolkit'; import { createSlice } from '@reduxjs/toolkit'; import * as InvokeAI from 'app/types/invokeai'; import { generatorProgress, + graphExecutionStateComplete, invocationComplete, invocationError, invocationStarted, @@ -13,7 +14,6 @@ import { socketUnsubscribed, } from 'services/events/actions'; -import i18n from 'i18n'; import { ProgressImage } from 'services/events/types'; import { initialImageSelected } from 'features/parameters/store/generationSlice'; import { makeToast } from '../hooks/useToastWatcher'; @@ -22,8 +22,10 @@ import { receivedModels } from 'services/thunks/model'; import { parsedOpenAPISchema } from 'features/nodes/store/nodesSlice'; import { LogLevelName } from 'roarr'; import { InvokeLogLevel } from 'app/logging/useLogger'; +import { TFuncKey } from 'i18next'; +import { t } from 'i18next'; -export type CancelType = 'immediate' | 'scheduled'; +export type CancelStrategy = 'immediate' | 'scheduled'; export interface SystemState { isGFPGANAvailable: boolean; @@ -35,7 +37,6 @@ export interface SystemState { totalSteps: number; currentIteration: number; totalIterations: number; - currentStatus: string; currentStatusHasSteps: boolean; shouldDisplayGuides: boolean; isCancelable: boolean; @@ -55,7 +56,7 @@ export interface SystemState { /** * Cancel strategy */ - cancelType: CancelType; + cancelType: CancelStrategy; /** * Whether or not a scheduled cancelation is pending */ @@ -77,6 +78,7 @@ export interface SystemState { */ consoleLogLevel: InvokeLogLevel; shouldLogToConsole: boolean; + statusTranslationKey: TFuncKey; } const initialSystemState: SystemState = { @@ -90,9 +92,6 @@ const initialSystemState: SystemState = { totalSteps: 0, currentIteration: 0, totalIterations: 0, - currentStatus: i18n.isInitialized - ? i18n.t('common.statusDisconnected') - : 'Disconnected', currentStatusHasSteps: false, isCancelable: true, enableImageDebugging: false, @@ -109,6 +108,7 @@ const initialSystemState: SystemState = { wasSchemaParsed: false, consoleLogLevel: 'error', shouldLogToConsole: true, + statusTranslationKey: 'common.statusDisconnected', }; export const systemSlice = createSlice({ @@ -118,8 +118,8 @@ export const systemSlice = createSlice({ setIsProcessing: (state, action: PayloadAction) => { state.isProcessing = action.payload; }, - setCurrentStatus: (state, action: PayloadAction) => { - state.currentStatus = action.payload; + setCurrentStatus: (state, action: PayloadAction) => { + state.statusTranslationKey = action.payload; }, errorOccurred: (state) => { state.isProcessing = false; @@ -129,7 +129,7 @@ export const systemSlice = createSlice({ state.currentIteration = 0; state.totalIterations = 0; state.currentStatusHasSteps = false; - state.currentStatus = i18n.t('common.statusError'); + state.statusTranslationKey = 'common.statusError'; }, setIsConnected: (state, action: PayloadAction) => { state.isConnected = action.payload; @@ -155,7 +155,7 @@ export const systemSlice = createSlice({ state.currentIteration = 0; state.totalIterations = 0; state.currentStatusHasSteps = false; - state.currentStatus = i18n.t('common.statusProcessingCanceled'); + state.statusTranslationKey = 'common.statusProcessingCanceled'; }, generationRequested: (state) => { state.isProcessing = true; @@ -165,25 +165,25 @@ export const systemSlice = createSlice({ state.currentIteration = 0; state.totalIterations = 0; state.currentStatusHasSteps = false; - state.currentStatus = i18n.t('common.statusPreparing'); + state.statusTranslationKey = 'common.statusPreparing'; }, setIsCancelable: (state, action: PayloadAction) => { state.isCancelable = action.payload; }, modelChangeRequested: (state) => { - state.currentStatus = i18n.t('common.statusLoadingModel'); + state.statusTranslationKey = 'common.statusLoadingModel'; state.isCancelable = false; state.isProcessing = true; state.currentStatusHasSteps = false; }, modelConvertRequested: (state) => { - state.currentStatus = i18n.t('common.statusConvertingModel'); + state.statusTranslationKey = 'common.statusConvertingModel'; state.isCancelable = false; state.isProcessing = true; state.currentStatusHasSteps = false; }, modelMergingRequested: (state) => { - state.currentStatus = i18n.t('common.statusMergingModels'); + state.statusTranslationKey = 'common.statusMergingModels'; state.isCancelable = false; state.isProcessing = true; state.currentStatusHasSteps = false; @@ -197,9 +197,12 @@ export const systemSlice = createSlice({ clearToastQueue: (state) => { state.toastQueue = []; }, - setProcessingIndeterminateTask: (state, action: PayloadAction) => { + setProcessingIndeterminateTask: ( + state, + action: PayloadAction + ) => { state.isProcessing = true; - state.currentStatus = action.payload; + state.statusTranslationKey = action.payload; state.currentStatusHasSteps = false; }, setSearchFolder: (state, action: PayloadAction) => { @@ -229,7 +232,7 @@ export const systemSlice = createSlice({ /** * The cancel type was changed */ - cancelTypeChanged: (state, action: PayloadAction) => { + cancelTypeChanged: (state, action: PayloadAction) => { state.cancelType = action.payload; }, /** @@ -265,9 +268,15 @@ export const systemSlice = createSlice({ */ builder.addCase(socketConnected, (state, action) => { const { timestamp } = action.payload; - state.isConnected = true; - state.currentStatus = i18n.t('common.statusConnected'); + state.isCancelable = true; + state.isProcessing = false; + state.currentStatusHasSteps = false; + state.currentStep = 0; + state.totalSteps = 0; + state.currentIteration = 0; + state.totalIterations = 0; + state.statusTranslationKey = 'common.statusConnected'; }); /** @@ -277,17 +286,28 @@ export const systemSlice = createSlice({ const { timestamp } = action.payload; state.isConnected = false; - state.currentStatus = i18n.t('common.statusDisconnected'); + state.isProcessing = false; + state.isCancelable = true; + state.currentStatusHasSteps = false; + state.currentStep = 0; + state.totalSteps = 0; + // state.currentIteration = 0; + // state.totalIterations = 0; + state.statusTranslationKey = 'common.statusDisconnected'; }); /** * Invocation Started */ builder.addCase(invocationStarted, (state) => { - state.isProcessing = true; state.isCancelable = true; + state.isProcessing = true; state.currentStatusHasSteps = false; - state.currentStatus = i18n.t('common.statusGenerating'); + state.currentStep = 0; + state.totalSteps = 0; + // state.currentIteration = 0; + // state.totalIterations = 0; + state.statusTranslationKey = 'common.statusPreparing'; }); /** @@ -303,10 +323,15 @@ export const systemSlice = createSlice({ graph_execution_state_id, } = action.payload.data; + state.isProcessing = true; + state.isCancelable = true; + // state.currentIteration = 0; + // state.totalIterations = 0; state.currentStatusHasSteps = true; state.currentStep = step + 1; // TODO: step starts at -1, think this is a bug state.totalSteps = total_steps; state.progressImage = progress_image ?? null; + state.statusTranslationKey = 'common.statusGenerating'; }); /** @@ -315,11 +340,15 @@ export const systemSlice = createSlice({ builder.addCase(invocationComplete, (state, action) => { const { data, timestamp } = action.payload; - state.isProcessing = false; + state.isProcessing = true; + state.isCancelable = true; + // state.currentIteration = 0; + // state.totalIterations = 0; + state.currentStatusHasSteps = false; state.currentStep = 0; state.totalSteps = 0; state.progressImage = null; - state.currentStatus = i18n.t('common.statusProcessingComplete'); + state.statusTranslationKey = 'common.statusProcessingComplete'; }); /** @@ -328,11 +357,18 @@ export const systemSlice = createSlice({ builder.addCase(invocationError, (state, action) => { const { data, timestamp } = action.payload; - state.progressImage = null; state.isProcessing = false; + state.isCancelable = true; + // state.currentIteration = 0; + // state.totalIterations = 0; + state.currentStatusHasSteps = false; + state.currentStep = 0; + state.totalSteps = 0; + state.progressImage = null; + state.statusTranslationKey = 'common.statusError'; state.toastQueue.push( - makeToast({ title: i18n.t('toast.serverError'), status: 'error' }) + makeToast({ title: t('toast.serverError'), status: 'error' }) ); }); @@ -341,7 +377,7 @@ export const systemSlice = createSlice({ */ builder.addCase(sessionInvoked.pending, (state) => { - state.currentStatus = i18n.t('common.statusPreparing'); + state.statusTranslationKey = 'common.statusPreparing'; }); /** @@ -356,17 +392,33 @@ export const systemSlice = createSlice({ state.currentStep = 0; state.totalSteps = 0; state.progressImage = null; + state.statusTranslationKey = 'common.statusConnected'; state.toastQueue.push( - makeToast({ title: i18n.t('toast.canceled'), status: 'warning' }) + makeToast({ title: t('toast.canceled'), status: 'warning' }) ); }); + /** + * Session Canceled + */ + builder.addCase(graphExecutionStateComplete, (state, action) => { + const { timestamp } = action.payload; + + state.isProcessing = false; + state.isCancelable = false; + state.isCancelScheduled = false; + state.currentStep = 0; + state.totalSteps = 0; + state.progressImage = null; + state.statusTranslationKey = 'common.statusConnected'; + }); + /** * Initial Image Selected */ builder.addCase(initialImageSelected, (state) => { - state.toastQueue.push(makeToast(i18n.t('toast.sentToImageToImage'))); + state.toastQueue.push(makeToast(t('toast.sentToImageToImage'))); }); /** diff --git a/invokeai/frontend/web/yarn.lock b/invokeai/frontend/web/yarn.lock index bece7f0829..88fec64725 100644 --- a/invokeai/frontend/web/yarn.lock +++ b/invokeai/frontend/web/yarn.lock @@ -57,6 +57,13 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.1.2": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200" + integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== + dependencies: + regenerator-runtime "^0.13.11" + "@babel/types@^7.21.4", "@babel/types@^7.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" @@ -1837,6 +1844,11 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" +"@types/js-cookie@^2.2.6": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3" + integrity sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA== + "@types/json-schema@*", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -2048,6 +2060,11 @@ dependencies: "@swc/core" "^1.3.42" +"@xobotyi/scrollbar-width@^1.9.5": + version "1.9.5" + resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d" + integrity sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ== + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -2685,7 +2702,7 @@ convert-source-map@^1.5.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -copy-to-clipboard@3.3.3: +copy-to-clipboard@3.3.3, copy-to-clipboard@^3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== @@ -2736,7 +2753,22 @@ css-box-model@1.2.1: dependencies: tiny-invariant "^1.0.6" -csstype@^3.0.11, csstype@^3.0.2: +css-in-js-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" + integrity sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A== + dependencies: + hyphenate-style-name "^1.0.3" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +csstype@^3.0.11, csstype@^3.0.2, csstype@^3.0.6: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== @@ -3142,6 +3174,13 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.21.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" @@ -3481,6 +3520,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-loops@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.3.tgz#ce96adb86d07e7bf9b4822ab9c6fac9964981f75" + integrity sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g== + fast-printf@^1.6.9: version "1.6.9" resolved "https://registry.yarnpkg.com/fast-printf/-/fast-printf-1.6.9.tgz#212f56570d2dc8ccdd057ee93d50dd414d07d676" @@ -3488,6 +3532,16 @@ fast-printf@^1.6.9: dependencies: boolean "^3.1.4" +fast-shallow-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz#d4dcaf6472440dcefa6f88b98e3251e27f25628b" + integrity sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw== + +fastest-stable-stringify@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz#3757a6774f6ec8de40c4e86ec28ea02417214c76" + integrity sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q== + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -3966,6 +4020,11 @@ husky@^8.0.3: resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + i18next-browser-languagedetector@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz#ead34592edc96c6c3a618a51cb57ad027c5b5d87" @@ -4058,6 +4117,14 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +inline-style-prefixer@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz#4290ed453ab0e4441583284ad86e41ad88384f44" + integrity sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg== + dependencies: + css-in-js-utils "^3.1.0" + fast-loops "^1.1.3" + internal-slot@^1.0.3, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" @@ -4350,6 +4417,11 @@ jju@~1.4.0: resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + js-sdsl@^4.1.4: version "4.4.0" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" @@ -4667,6 +4739,11 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -4773,6 +4850,20 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +nano-css@^5.3.1: + version "5.3.5" + resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.3.5.tgz#3075ea29ffdeb0c7cb6d25edb21d8f7fa8e8fe8e" + integrity sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg== + dependencies: + css-tree "^1.1.2" + csstype "^3.0.6" + fastest-stable-stringify "^2.0.2" + inline-style-prefixer "^6.0.0" + rtl-css-js "^1.14.0" + sourcemap-codec "^1.4.8" + stacktrace-js "^2.0.2" + stylis "^4.0.6" + nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" @@ -5462,6 +5553,31 @@ react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" +react-universal-interface@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/react-universal-interface/-/react-universal-interface-0.6.2.tgz#5e8d438a01729a4dbbcbeeceb0b86be146fe2b3b" + integrity sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw== + +react-use@^17.4.0: + version "17.4.0" + resolved "https://registry.yarnpkg.com/react-use/-/react-use-17.4.0.tgz#cefef258b0a6c534a5c8021c2528ac6e1a4cdc6d" + integrity sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q== + dependencies: + "@types/js-cookie" "^2.2.6" + "@xobotyi/scrollbar-width" "^1.9.5" + copy-to-clipboard "^3.3.1" + fast-deep-equal "^3.1.3" + fast-shallow-equal "^1.0.0" + js-cookie "^2.2.1" + nano-css "^5.3.1" + react-universal-interface "^0.6.2" + resize-observer-polyfill "^1.5.1" + screenfull "^5.1.0" + set-harmonic-interval "^1.0.1" + throttle-debounce "^3.0.1" + ts-easing "^0.2.0" + tslib "^2.1.0" + react-zoom-pan-pinch@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.0.7.tgz#def52f6886bc11e1b160dedf4250aae95470b94d" @@ -5580,6 +5696,11 @@ reselect@^4.1.8: resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve-dependency-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-dependency-path/-/resolve-dependency-path-2.0.0.tgz#11700e340717b865d216c66cabeb4a2a3c696736" @@ -5696,6 +5817,13 @@ rollup@^3.21.0: optionalDependencies: fsevents "~2.3.2" +rtl-css-js@^1.14.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" + integrity sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg== + dependencies: + "@babel/runtime" "^7.1.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -5743,6 +5871,11 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" +screenfull@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" + integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -5786,6 +5919,11 @@ serialize-error@^11.0.0: dependencies: type-fest "^2.12.2" +set-harmonic-interval@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249" + integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -5884,6 +6022,11 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== + source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -5899,6 +6042,11 @@ source-map@^0.7.4: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + spawn-command@0.0.2-1: version "0.0.2-1" resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" @@ -5909,6 +6057,35 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +stack-generator@^2.0.5: + version "2.0.10" + resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.10.tgz#8ae171e985ed62287d4f1ed55a1633b3fb53bb4d" + integrity sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ== + dependencies: + stackframe "^1.3.4" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stacktrace-gps@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz#0c40b24a9b119b20da4525c398795338966a2fb0" + integrity sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ== + dependencies: + source-map "0.5.6" + stackframe "^1.3.4" + +stacktrace-js@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b" + integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg== + dependencies: + error-stack-parser "^2.0.6" + stack-generator "^2.0.5" + stacktrace-gps "^3.0.4" + 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" @@ -6035,7 +6212,7 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -stylis@4.1.4: +stylis@4.1.4, stylis@^4.0.6: version "4.1.4" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.4.tgz#9cb60e7153d8ac6d02d773552bf51c7a0344535b" integrity sha512-USf5pszRYwuE6hg9by0OkKChkQYEXfkeTtm0xKw+jqQhwyjCVLdYyMBK7R+n7dhzsblAWJnGxju4vxq5eH20GQ== @@ -6094,6 +6271,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +throttle-debounce@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" + integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== + through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -6148,6 +6330,11 @@ tree-kill@^1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +ts-easing@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec" + integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ== + ts-error@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/ts-error/-/ts-error-1.0.6.tgz#277496f2a28de6c184cfce8dfd5cdd03a4e6b0fc"